Mądrze używaj lokalnych {
... }
grup
Jak wskazano w tej odpowiedzi , aktywne znaki, takie jak, ~
mogą być użyte jako nazwa makra. Niestety,~
jest to domyślnie jedyny aktywny znak, a zmiana kodu cat dla innego znaku jest kosztowna:\catcode`!13
zajmuje 12 bajtów. Jeśli nowa definicja makra jest potrzebna tylko w małym regionie kodu, lokalne grupy mogą być rozwiązaniem.
Kiedy TeX wchodzi do nowej grupy lokalnej otwartej przez {
, tworzy nowy poziom grupowania na wewnętrznym stosie zapisu. Oznacza to, że wszystkie bieżące makra i rejestry są zapisywane. Wszelkie ich modyfikacje (chyba że wyraźnie oznaczone jako \global
) są teraz aktywne tylko do momentu zamknięcia grupy przez }
. To znaczy że~
można go przedefiniować w grupie, użyć tam z nową definicją, a stara definicja zostanie automatycznie przywrócona po zakończeniu grupy.
Oto przykład:
\def~{abc}
~ -- {\def~{123}~} -- ~
To wychodzi
abc - 123 - abc
Ciekawym efektem ubocznym tego mechanizmu grupowania jest to, że stare wartości są nadal dostępne w grupie, dopóki się tam nie zmienią. Aby to zilustrować, wyobraźmy sobie, że chcemy wydrukować pewną liczbę znaków na podstawie wartości licznika, uzupełnić je spacjami do ustalonej długości i kontynuować z oryginalną wartością licznika. Można to osiągnąć poprzez:
\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.
które wyjścia
Wydrukuj znak 3 razy, wstaw 7 spacji i kontynuuj z x = 3.
To zachowanie grupowania jest szczególnie ważne, jeśli chcesz używać standardowych makr TeXa do \loop ... \repeat
zagnieżdżania w pętli . Te makra definiują wewnętrzne polecenia i używają ich do określania sposobu postępowania. Zagnieżdżenie ich bez wstawiania pętli wewnętrznej w nawiasy klamrowe spowoduje zamieszanie wewnętrznych poleceń i doprowadzi do nieoczekiwanego zachowania.