末尾の空白を削除するには、割り当てに % を追加する必要がありますか?

末尾の空白を削除するには、割り当てに % を追加する必要がありますか?

以下は、 から抜粋したコード スニペットです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}

そしてスペーストークンはない無視されます。制御ワードの後に​​続くという事実は無関係です。トークン化フェーズはすでに実行されています。\relaxafter を使用すると、スペース トークンの代わりに#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、前と同じ理由で、 ではなく が最後にある必要があります。これは、などの%引数によって、代入が実行される前にの展開がトリガーされるためです。#22pt\multido@dimtonum

答え2

TeXが次元をスキャンしているとき、格納されている量がレジスタの形式で提示されていない限り、スペースまたは不適切な文字に到達するまで、数値と単位(途中で拡張)を探し続けます。スペースは削除されます。したがって、機能的に示されているように記述された割り当ては、後続の空白を削除する制御語と同じ動作をします。そしてもちろん、次元がレジスタの場合、レジスタ名は制御ワード自体 (したがってスペースを消費します) になるか、TeX がスキャンする番号になります...

そうは言っても、いくつかのあなたが示した割り当ての多くは、次元に引数 ( など#2) を使用します。 ずる賢い人や非常に賢い人は、そのためにレジスタを使用する可能性があり、その場合、制御ワードが読み取られる前にマクロ定義に書き込まれるため、スペースが消費されることはありません。 実際には、そのようなデータがプログラマーの制御下にない場合は、 でスペースを削除する方が適切です\relax

関連情報