私はTeXプログラミングに関するこのチュートリアルを読んでいました:
http://pgfplots.sourceforge.net/TeX-プログラミングノート.pdf
ここでの2番目の回答で推奨されています:LaTeX プログラミングはどこから始めればよいですか?
それはこう言います:
\toks<number>
特殊な文字列変数として考えられるトークン レジスタも 255 個あります。もちろん、すべてのマクロ割り当て\def\macro{ content }
も何らかの文字列変数ですが、トークン レジスタは特殊です。つまり、\the\toks
数値とともに使用してもその内容は展開されません。これは、きめ細かい展開制御に使用できます。以下のセクション 2.3 を参照してください。
しかし、レジスタの使用例はありません\toks
。「特別な文字列変数」とはどういう意味でしょうか? 以前の 2 種類のレジスタには、値を割り当てることができます。
\count0=12
\dimen0=1.102pt
そしてそれを印刷します:
Value1: \the\count0
Value2: \the\dimen0
でも、使い方が分かりません\toks
。
答え1
トークン レジスタは引数のないマクロと非常に似ていますが、構文と展開ルールに違いがあります。
のプレーンな定義とLaTeX定義を使用すると、 トークンを次のように\toks@
保存できます。\toks 0
abc
\toks@{abc}
または
\def\tmp{abc}
マクロにはマクロを設定するための特定のコマンド(\def
または、そのラッパーなど\newcommand
)がありますが、トークンレジスタはレジスタ名の後にバランスのとれたテキストグループ。
逆に、名前を参照するだけで展開されるマクロとは異なり、トークン レジスタは他のレジスタと同様に展開できず、その内容は を展開することによってアクセスされます\the
。
それで
\the\toks@
そして
\tmp
それぞれ に展開しますabc
。
これらの構文上の違いとは別に、トークン レジスタの拡張は、マクロとは 2 つの重要な点で異なります。
およびその他の拡張のみのコンテキストでの拡張は
\edef
1 つのレベルに制限されます。\def\tmp{aaa} \def\tmpb{xx \tmp} \toks@{xx \tmp} \edef\A{\tmpb} \edef\B{\the\toks@}
現在、 と
\tmpb
は\toks@
同じトークンリストを含んでいますxx \tmp
が、\A
は完全に拡張可能なトークンによって定義されており、 の定義も持っていますxx aaa
が、 によって返されるトークンは\the
でさらに拡張されず、 の定義も持っています\edef
。\B
xx \tmp
2 番目の違いは、トークン レジスタには引数がないため、
#
レジスタを定義または拡張するときに特別な処理をする必要がない (また、特別な処理をしない) ことです。\toks@{#1}
は、2 つのトークンのリストとで構成されるトークン レジスタです
#
。1
これは LaTeX のマクロで使用されます\g@addto@macro
。
\g@addto@macro@\foo{abc}
abc
の現在の定義の末尾に追加することになっています\foo
。
簡単な(そして私の記憶が正しければオリジナルの)定義は
\makeatletter
\gdef\foo{123}
\def\gaA#1#2{%
\expandafter\gdef\expandafter#1\expandafter{#1#2}}
\gaA\foo{abc}
\show\foo
これはうまく動作し、定義は と表示されます123abc
。しかし、
\gaA\foo{#}
そしてあなたは
! Illegal parameter number in definition of \foo.
#
しかし、 toksレジスタでは特別なものではなく、レジスタの内容は一度だけ展開されるという事実を利用できる。
\long\def\g@addto@macro#1#2{%
\begingroup
\toks@\expandafter{#1#2}%
\xdef#1{\the\toks@}%
\endgroup}
まず、\toks@
レジスタは最初の引数で渡されたマクロの展開を含むように定義され、その後に 2 番目の引数の内容が続きます。は、 toks 割り当てで安全に使用できます。次に、マクロは、トークンが含まれていてもそれ以上の展開なしでの内容とまったく同じ の#
展開になるようにグローバルに定義されます。\thetoks
\toks@
#
\makeatletter
\gdef\foo{123}
\g@addto@macro\foo{abc}
\show\foo
\g@addto@macro\foo{#}
\show\foo
生産する
> \foo=macro:
->123abc.
l.7 \show\foo
?
> \foo=macro:
->123abc##.
l.11 \show\foo
は意図したとおり#
に追加されています (#
追加されたのは 1 つだけで、重複しているのは##
を使用した結果です\show
)。