
Прочитав несколько глав учебника, я знаю, что tex съедает входные строки из командной строки или файлов, а затем преобразует их в токены. Когда эти токены попадают в его желудочно-кишечный тракт, tex готовится переварить их, преобразуя их в коробки, клеи и прочее, а затем конструирует некоторые списки.
Что касается макросов, на каком этапе tex сохраняет свое макроопределение, на каком этапе tex выполняет макрорасширение для замены tex?
решение1
Это просто! TeX всегда выполняет макрорасширение, за исключением случаев, когда это не так.
На странице 215, во втором дважды опасном абзаце, мы читаем:
Расширение подавляется в следующих случаях:
- При удалении токенов во время восстановления после ошибки (см. Главу 6).
- Когда токены пропускаются, поскольку условный текст игнорируется.
- Когда TeX считывает аргументы макроса.
- Когда TeX считывает управляющую последовательность, определяемую с помощью
\let
,\futurelet
,\def
,\gdef
,\edef
,\xdef
,\chardef
,\mathchardef
,\countdef
,\dimendef
,\skipdef
,\muskipdef
,\toksdef
,\read
, и\font
.- Когда TeX считывает токены аргументов для
\expandafter
,\noexpand
,\string
,\meaning
,\let
,\futurelet
,\ifx
,\show
,\afterassignment
,\aftergroup
.- Когда TeX поглощает текст параметра
\def
,\gdef
,\edef
, или\xdef
.- Когда TeX поглощает текст замены или
\def
или\gdef
;\read
или текст переменной токена, например\everypar
или\toks0
; или список токенов для\uppercase
или\lowercase
или\write
. (Список токенов для\write
будет расширен позже, когда он фактически будет выведен в файл.)- Когда TeX читает преамбулу выравнивания, за исключением случаев после токена для примитивной команды
\span
или при чтении после\tabskip
.- Сразу после токена, например,
$
3 , который начинает математический режим, нужно проверить, следует ли другой токен категории 3.- Сразу после токена
`
12 , с которого начинается буквенная константа.
Не неразумно, не правда ли? При определении мы хотим, чтобы ничего не было расширено (кроме \edef
и \xdef
), и четвертый, пятый, шестой и седьмой пункты занимаются этим. Аналогично, если мы хотим сохранить список токенов в регистре или в \write
.
Аналогично, токен после \expandafter
, \noexpand
или не \afterassignment
должен \aftergroup
быть расширен по очевидным причинам; это произойдет позже, когда TeX снова проверит его в подходящее время.
Последний пункт имеет техническую причину: если вы хотите сослаться на буквенную константу, которая соответствует символу с \catcode
0, 5, 9, 13, 14 или 15, ее можно «экранировать» с помощью обратной косой черты перед ней, но на самом деле это не образует управляющую последовательность. Так что вы можете сделать, `\^^M
если хотите сослаться на константу 13 или do \chardef\%=`\%
.
Второй пункт можно дополнить важным замечанием: несмотря на то, что TeX не выполняет расширения при пропуске условного текста, онделаетпроверить токены, чтобы сопоставить условные операторы с их \else
или \fi
. Любой токен, который является \let
примитивным условным оператором, \else
или \fi
учитывается в этом отношении.
решение2
В текстеTeX в двух словахкоманды и их параметры написаны синим цветом, но если параметр не развернут, то он написан красным цветом. Параметры, написанные здесь синим цветом, считываются после развертывания. См. этот текст со страницы 9, где начинается сводка примитивных конструкций TeX.