На первой странице книги Стефана БехтольшейнаСтатья о TUGboatо \expandafter
, он описал правила исполнения \expandafter
.
Я думаю, что случай iii не должен быть здесь указан, так как открывающая фигурная скобка должна быть токеном e , а не токеном 1. То есть автор должен был поместить iii на самом внешнем шаге 1. Я прав?
решение1
К сожалению, учебник не очень точен. На самом деле, пункт 2.iii полностью неверен: если ⟨токен 1 ⟩ равен {
, то он просто не расширяется, потому что ни один токен символа не расширяем.
Но пункт 2. вообще неверен во многих отношениях. Другие примитивы расширяемы, не только \expandafter
, \csname
и \the
. Например, всеусловные предложениярасширяемы, включая \else
, \fi
и \or
среди них. Это функция, которая позволяет делать
⟨primitive if⟩⟨condition⟩
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{⟨first⟩}{⟨second⟩}%
что является очень полезным фрагментом кода, который Бехтольшейм, похоже, игнорирует (насколько я помню, он даже не описан в его четырехтомной книге о TeX). Также \number
расширяем, просто чтобы упомянуть еще один примитив.
Гораздо проще: когда TeX расширяет токены (то есть всегда, если только расширение не подавляется, например, при чтении текста замены в определении макроса с помощью \def
) и находит \expandafter
, он переходит через следующий токен, назовем его ⟨tokenе⟩, и пытается расширить следующий. Если токен расширяемый, он заменяется его расширением (возможно, с поиском аргументов). Расширение недействительно, \expandafter
и процесс перезапускается с ⟨токенае⟩ который будет либо расширен (если он расширяемый), либо выполнен.
Никакой разницы, когда ⟨токене⟩ {
относится ко всем возможным другим токенам.
Также пример 8 немного вводит в заблуждение, поскольку он пропускает фундаментальную особенность, а именно то, что при назначении регистру токена за (необязательно) =
может следовать ⟨заполнитель⟩, что означает, что TeX будет расширять токены, игнорируя пробел и \relax
токены, пока не найдет {
. Это позволяет сделать
\tb=\expandafter{\the\ta}
Возможномелочи. По моему мнению, либо правило выше упомянуто, либо случай следует рассматривать не как пример, а как самостоятельную особенность.