以下は、 から抜粋したコード スニペットですmultido.tex
。割り当てが で終わっていないことに気付きました%
。
見る
\dimen@=#1\advance\dimen@#2
\def\multido@step@d#1#2{% \dimen@=#1\advance\dimen@#2 \edef#1{\number\dimen@ sp}}%
もう一度
\count@=#1\advance\count@ by #2
見る\def\multido@step@i#1#2{% \count@=#1\advance\count@ by #2 \edef#1{\the\count@}}
もう一度見てください
\dimen@=#1pt
、\dimen@=#2pt
そして\dimen@=#1pt\advance\dimen@#2
\def\multido@init@r#1#2#3{% \dimen@=#1pt \multido@dimtonum\dimen@#3% \dimen@=#2pt \ifnum\multido@count<\z@\dimen@=-\dimen@\fi \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}} \def\multido@step@r#1#2{% \dimen@=#1pt\advance\dimen@#2 \multido@dimtonum\dimen@#1}
代入によって末尾に空白が生成されますが、これは で終わる必要がありますか%
?
答え1
例1
\def\multido@step@d#1#2{%
\dimen@=#1\advance\dimen@#2
\edef#1{\number\dimen@ sp}}%
の後に#2
があるはずです\relax
。実際、 が#2
レジスタまたは\z@
やなどのパラメータである場合\lineskip
、行末によって提供されるスペースはない無視されます。この場合も%
、次のトークンが展開不可能なため ( \edef
) が使用される可能性があります。 から取得されるトークンリストは\multido@step@d{\x}{2pt}
次のようになります (スペーストークンを • で示します)
\dimen@=\x\advance\dimen@2pt•\edef\x{\number\dimen@ sp}
そして、その前のスペース\edef
は無視されます。しかし、`\multido@step@d{\x}{\parindent} を使用すると、
\dimen@=\x\advance\dimen@\parindent•\edef\x{\number\dimen@ sp}
そしてスペーストークンはない無視されます。制御ワードの後に続くという事実は無関係です。トークン化フェーズはすでに実行されています。\relax
after を使用すると、スペース トークンの代わりに#2
が続きます。\relax
例2
\relax
同じです。#2
例3
わかりやすくするために行に番号を付けます。
1 \def\multido@init@r#1#2#3{%
2 \dimen@=#1pt
3 \multido@dimtonum\dimen@#3%
4 \dimen@=#2pt
5 \ifnum\multido@count<\z@\dimen@=-\dimen@\fi
6 \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}}
7 \def\multido@step@r#1#2{%
8 \dimen@=#1pt\advance\dimen@#2
9 \multido@dimtonum\dimen@#1}
2 行目と 4 行目を で終了する必要はありません%
。実際、4 行目の末尾に があると、TeX はへの割り当てを実行する前に%
展開を開始するため、誤りになります(この特定のケースでは、おそらく無害です)。\ifnum
\dimen@
前と同じ問題が 3 行目にもあります。 は%
ここでは適切ですが、後続のトークンは であり\dimen@
、展開できないため、 の\relax
方が適切です。
8 行目は\relax
、前と同じ理由で、 ではなく が最後にある必要があります。これは、などの%
引数によって、代入が実行される前にの展開がトリガーされるためです。#2
2pt
\multido@dimtonum
答え2
TeXが次元をスキャンしているとき、格納されている量がレジスタの形式で提示されていない限り、スペースまたは不適切な文字に到達するまで、数値と単位(途中で拡張)を探し続けます。スペースは削除されます。したがって、機能的に示されているように記述された割り当ては、後続の空白を削除する制御語と同じ動作をします。そしてもちろん、次元がはレジスタの場合、レジスタ名は制御ワード自体 (したがってスペースを消費します) になるか、TeX がスキャンする番号になります...
そうは言っても、いくつかのあなたが示した割り当ての多くは、次元に引数 ( など#2
) を使用します。 ずる賢い人や非常に賢い人は、そのためにレジスタを使用する可能性があり、その場合、制御ワードが読み取られる前にマクロ定義に書き込まれるため、スペースが消費されることはありません。 実際には、そのようなデータがプログラマーの制御下にない場合は、 でスペースを削除する方が適切です\relax
。