In dieser Übung wird gefragt, wie die Erweiterung von gespeichert werden soll , \chapno
wenn \write
verarbeitet wird, aber \the\count0
zum Zeitpunkt von erweitert werden muss \shipout
. Hier ist ein vollständiges Beispiel:
\def\chapno{5}
\newwrite\cont \openout\cont=out.txt
\edef\next{\write\cont{\chapno,\noexpand\the\count0}}\next
\def\chapno{6}
\count0=100
\bye
Bei der Antwort wird eine merkwürdige Technik verwendet:
{\let\the=0\edef\next{\write\cont{<token list>}}\next}
Ist die Verwendung \noexpand
gleichwertig mit dem \let
-Trick? Und warum \noexpand
wird in der Antwort nicht verwendet – nur um die Möglichkeiten aufzuzeigen?
Antwort1
So \protected@write
funktioniert im Wesentlichen auch das Latex:
\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
}
Normalerweise können Sie in einer solchen Konstruktion \noexpand
vor Token verwenden, über die Sie beim Schreiben des Makros Kontrolle haben, aber das <token list>
in Ihrem Beispiel stammt normalerweise #1
aus einem Abschnittstitelargument im Dokument, Sie möchten jedoch die Erweiterungen aller Register unterdrücken, bis \shipout
und der Text auf eines davon verweisen kann. Wenn Sie es also \the
nicht erweiterbar machen (es spielt keine große Rolle, worauf Sie \let
es setzen, 0
oder \relax
oder ein anderes nicht erweiterbares Token, bleibt es in der erhalten, \edef
hat aber in der seine normale erweiterbare Definition \write
.
Beachten Sie, dass die Übung den einfachen Fall hat, in dem die Kapitelnummer ein erweiterbares Makro ist. In den meisten Formaten würden Kapitel automatisch nummeriert, sodass ein Zählregister verwendet und möglicherweise auch letztendlich darauf zugegriffen werden würde . \the
In diesem Fall wäre das Unterdrücken aller \the
Erweiterungen möglicherweise zu viel. (Beachten Sie, dass LaTeX nur \thepage
das Erweitern anderer Zähler zum Zeitpunkt der Verwendung unterdrückt, nicht beim endgültigen Versand.)