Когда tex выполняет макрорасширение?

Когда tex выполняет макрорасширение?

Прочитав несколько глав учебника, я знаю, что 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 снова проверит его в подходящее время.

Последний пункт имеет техническую причину: если вы хотите сослаться на буквенную константу, которая соответствует символу с \catcode0, 5, 9, 13, 14 или 15, ее можно «экранировать» с помощью обратной косой черты перед ней, но на самом деле это не образует управляющую последовательность. Так что вы можете сделать, `\^^Mесли хотите сослаться на константу 13 или do \chardef\%=`\%.

Второй пункт можно дополнить важным замечанием: несмотря на то, что TeX не выполняет расширения при пропуске условного текста, онделаетпроверить токены, чтобы сопоставить условные операторы с их \elseили \fi. Любой токен, который является \letпримитивным условным оператором, \elseили \fiучитывается в этом отношении.

решение2

В текстеTeX в двух словахкоманды и их параметры написаны синим цветом, но если параметр не развернут, то он написан красным цветом. Параметры, написанные здесь синим цветом, считываются после развертывания. См. этот текст со страницы 9, где начинается сводка примитивных конструкций TeX.

Связанный контент