В этом упражнении спрашивается, как сохранить расширение \chapno
в момент, когда \write
обрабатывается, но \the\count0
должно быть развернуто в момент \shipout
. Вот полный пример:
\def\chapno{5}
\newwrite\cont \openout\cont=out.txt
\edef\next{\write\cont{\chapno,\noexpand\the\count0}}\next
\def\chapno{6}
\count0=100
\bye
В ответе использован любопытный прием:
{\let\the=0\edef\next{\write\cont{<token list>}}\next}
\noexpand
Эквивалентно ли использование \let
-трюку? И почему \noexpand
не используется в ответе - просто чтобы показать возможности?
решение1
По сути, латекс \protected@write
действует следующим образом:
\long\def \protected@write#1#2#3{%
\begingroup
\let\thepage\relax
#2%
\let\protect\@unexpandable@protect
\edef\reserved@a{\write#1{#3}}%
\reserved@a
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
Обычно в такой конструкции вы можете использовать \noexpand
перед токенами, которыми вы управляете при написании макроса, но <token list>
в вашем примере обычно будет поступать как #1
из некоторого аргумента заголовка раздела в документе, но вы хотите подавить расширения всех регистров до тех пор, пока \shipout
текст не может ссылаться на любой из них. поэтому делая \the
нерасширяемым (не имеет значения, к чему вы \let
его относите, 0
или \relax
или любой другой нерасширяемый токен, то он останется самим собой в , \edef
но будет иметь свое обычное расширяемое определение в \write
.
Обратите внимание, что упражнение имеет простой случай, когда номер главы является расширяемым макросом. В большинстве форматов главы будут автоматически пронумерованы, поэтому использование регистра счетчика, а также, возможно, в конечном итоге доступ к нему, \the
в этом случае подавление всех \the
расширений может оказаться слишком большим. (Примечание: LaTeX просто подавляет \thepage
возможность расширения других счетчиков в точке использования, а не при окончательной отправке).