マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TeX コマンドの引数を理解したい話(補足)

前回の続き)
蛇足事項

コマンド行の引数の先頭が「\」で無ければ、“\input を”挿入する、という規則についての、諸々の蛇足。

  • ここの“\input”は「\input という制御綴のトークン」ではなく「プリミティブの \inputトークン」のことである。例えば
    latex {foo}
    のコマンド行を起動した場合、「\input{foo}」が実行される。この \input が「LaTeX で再定義された \input」であれば、“foo” が読み込まれるはずだが、実際はプリミティブの \input が使われるので“{foo}”が読み込まれる。((「LaTeX\input」は実体はマクロであるから、「引数を波括弧で囲む」という規則に従う、一方、既に述べたように、プリミティブの \input は引数を波括弧で囲まない。))
  • 先頭が「\」という条件であるが、どうやら文字ではなくトークンのレベルで判断しているようである。少し実験して得た推定としては、先頭のトークが制御綴であれば \input は挿入されず、文字トークンであれば挿入される、という規則のようである。*1これは、カテゴリコード設定が変態であるフォーマットを作成すれば実験できる。そんな変態な設定を考えることに実用的な意味はまるで無いので、これ以上の詳細については徒らなる読者への課題としておこう。
  • 引数列がそのまま TeX コード文字列となる、と言ったが、もちろん実際には、コマンド行の文字列をコマンドシェルが分析している。恐らくは、その結果の“引数文字列の列”を空白区切りで連接したものとなるだろう。例えば、コマンドプロンプト
    pdftex \obey"spaces a  b"c  d"e"f        g"  "h  "i  j"
    として起動したとすると、引数は「\obeyspaces a bc」「def」「g␣␣h」「i␣␣j」であるので、結果的に
    \obeyspaces a  bc def g  h i  j
    が実行されて「*」のプロンプトが出ることになるに違いない。((\obeyspaces は空白文字をアクティブ(カテゴリコード 13)にして、連続する空白文字の列が 1 個に潰されないようにする命令。))ここで“\bye”を入力して終了させた後、出力が予想通りになったか確かめてみよう……。

    アレレ、なんで最後の引数だけクオートが付いたままなんだ?(混乱中)

*1:トークンの意味は関係しないようである。制御綴やアクティブ文字が展開可能であっても、展開せずに判断されている。