Comment prendre la main sur un registre de liste d’unités lexicales ?#

Manipuler un registre de liste d’unités lexicales utilisé par d’autres commandes peut parfois être nécessaire. Par exemple, lorsque vous voulez ajouter quelque chose à un tel registre du système (\output ou \every*), mais que vous savez que d’autres commandes utilisent également ce registre. C’est un cas fréquent avec \everypar car change \everypar à chaque fois que l’on touche à quelque chose.

La technique suivante, due à David Kastrup, fait ce dont vous avez besoin, et permet à une autre extension d’obtenir un résultat identique :

\let\monpkg@@everypar\everypar
\newtoks\monpkg@everypar
\monpkg@everypar\expandafter{\the\everypar}
\monpkg@@everypar{\monpkg@ajout\the\monpkg@everypar}
\def\monpkg@ajout{%
  ⟨choses à faire au début du registre⟩%
}
\let\everypar\monpkg@everypar

Comme vous pouvez le voir, ce code pour notre extension monpkg :

  • crée un alias pour le registre système \everypar (figé dans n’importe quel environnement, et continuant à utiliser l’original) ;

  • crée un registre pour récupérer \everypar et l’initialise avec le contenu actuel de \everypar ;

  • définit l’ancien \everypar pour qu’il exécute son propre code supplémentaire, ainsi que le contenu de son propre registre de jetons ;

  • définit la commande \monpkg@ajout pour le code supplémentaire ; et

  • fait pointer le registre \everypar vers le nouveau registre.

Les noms de la forme \monpkg@... sont recommandés pour les noms internes des commandes des extensions c’est pourquoi cet exemple utilise des macros de cette forme.