Используйте местные {
... }
группы с умом
Как указано в этом ответе , активные символы наподобие ~
могут использоваться в качестве имени макроса. К сожалению, ~
по умолчанию является единственным активным символом, и изменение кода для другого символа стоит дорого: \catcode`!13
занимает 12 байт. Если новое определение макроса необходимо только в небольшой области вашего кода, локальные группы могут быть решением.
Когда TeX входит в новую открытую локальную группу {
, он создает новый уровень группировки во внутреннем стеке сохранения. Это означает, что все текущие макросы и регистры сохранены. Любые изменения к ним (если явно не помечены как \global
) теперь активны только до тех пор, пока группа не будет закрыта }
. Это означает, что ~
его можно переопределить в группе, использовать там с новым определением, а старое определение будет автоматически восстановлено после завершения группы.
Вот пример:
\def~{abc}
~ -- {\def~{123}~} -- ~
Это выводы
ABC - 123 - ABC
Интересным побочным эффектом этого механизма группировки является то, что старые значения по-прежнему доступны внутри группы, пока они там не будут изменены. Чтобы проиллюстрировать это, представьте, что мы хотим напечатать количество символов на основе значения счетчика, дополнить их пробелами до фиксированной длины и продолжить с исходным значением счетчика. Это может быть достигнуто следующим:
\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.
какие выводы
Напечатайте символ 3 раза, добавьте 7 пробелов и продолжайте с x = 3.
Такое групповое поведение особенно важно, если вы хотите использовать стандартные макросы TeX для циклических \loop ... \repeat
вложений. Эти макросы определяют внутренние команды и используют их для определения дальнейших действий. Вложение их без помещения внутреннего цикла в фигурные скобки приведет к путанице во внутренних командах и приведет к неожиданному поведению.