The TeXbookの演習21.10に関する質問

The TeXbookの演習21.10に関する質問

この演習では、が処理される\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\let0\relax\edef\write

この演習では、章番号が展開可能なマクロである簡単なケースを取り上げます。ほとんどの形式では、章は自動的に番号付けされるため、カウント レジスタを使用し、最終的には によってアクセスされる可能性があります。\theその場合、すべての展開を抑制するのはやりすぎかもしれません。(LaTeX は、最終的な出荷時ではなく、使用時に他のカウンターの展開を\the抑制するだけであることに注意してください)。\thepage

関連情報