Вопрос в статье Стефана на TUGboat о \expandafter

Вопрос в статье Стефана на TUGboat о \expandafter

На первой странице книги Стефана БехтольшейнаСтатья о 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}

Возможномелочи. По моему мнению, либо правило выше упомянуто, либо случай следует рассматривать не как пример, а как самостоятельную особенность.

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