Розумно використовуйте місцеві {
... }
групи
Як зазначено у цій відповіді , активні символи на зразок ~
можуть використовуватися як ім’я макросу. На жаль, ~
єдиний активний символ за замовчуванням, а зміна кодового коду на інший символ коштує дорого: \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 пробілів і продовжуйте використовувати х = 3.
Ця поведінка групування особливо важлива, якщо ви хочете використовувати стандартні макроси TeX для циклічного \loop ... \repeat
вкладеності. Ці макроси визначають внутрішні команди та використовують їх для визначення способу дії. Вклавши їх, не ставлячи внутрішню петлю в дужки, буде заплутати внутрішні команди та призведе до несподіваної поведінки.