この演習では、が処理される\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}
を使用することは-trick\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
その場合、すべての展開を抑制するのはやりすぎかもしれません。(LaTeX は、最終的な出荷時ではなく、使用時に他のカウンターの展開を\the
抑制するだけであることに注意してください)。\thepage