Utilisez judicieusement les groupes locaux {
...}
Comme indiqué dans cette réponse , les caractères actifs comme ~
peuvent être utilisés comme nom de macro. Malheureusement, ~
c'est le seul caractère actif par défaut, et changer le catcode pour un autre caractère coûte cher: \catcode`!13
prend 12 octets. Si la nouvelle définition de macro n'est nécessaire que dans une petite région de votre code, les groupes locaux peuvent être une solution.
Lorsque TeX entre dans un nouveau groupe local ouvert par {
, il crée un nouveau niveau de regroupement sur la pile de sauvegarde interne. Cela signifie que toutes les macros et tous les registres actuels sont enregistrés. Toutes les modifications qui y sont apportées (sauf si elles sont explicitement marquées comme \global
) ne sont désormais actives que jusqu'à la fermeture du groupe }
. Cela signifie qu'il ~
peut être redéfini au sein d'un groupe, utilisé avec la nouvelle définition, et l'ancienne définition sera automatiquement restaurée une fois le groupe terminé.
Voici un exemple:
\def~{abc}
~ -- {\def~{123}~} -- ~
Cette sorties
abc - 123 - abc
Un effet secondaire intéressant de ce mécanisme de regroupement est que les anciennes valeurs sont toujours disponibles à l'intérieur du groupe jusqu'à ce qu'elles y soient modifiées. Pour illustrer cela, imaginez que nous voulons imprimer un certain nombre de caractères en fonction de la valeur d'un compteur, les remplir avec des espaces jusqu'à une longueur fixe et continuer avec la valeur du compteur d'origine. Cela pourrait être réalisé par les moyens suivants:
\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.
qui sort
Imprimez un caractère 3 fois, complétez avec 7 espaces et continuez avec x = 3.
Ce comportement de regroupement est particulièrement important si vous souhaitez utiliser les macros standard de TeX pour les boucles \loop ... \repeat
imbriquées. Ces macros définissent des commandes internes et les utilisent pour déterminer comment procéder. Les imbriquer sans mettre la boucle intérieure entre accolades confondra les commandes internes et conduira à un comportement inattendu.