%3F.png)
TeX が区切りのない引数として使用しないトークンはどれですか (カテゴリ コード 1 の明示的な文字トークンとカテゴリ コード 2 の明示的な文字トークンの間にネストされていない限り)。
TeXbook の演習 20.4 の前の最後から 2 番目の危険な曲がり角の段落に、次の文があります。
' ' と書いた後は
\def\row#1#2{...}
、引数の間にスペースを入れることができます(例: '\row x n
')。TeXでは単一スペース区切られていない引数として。
TeXbook の演習 20.5 の前の double dangeorus bend 段落に次の文があります。
TeX はどのようにして引数の終了位置を決定するのでしょうか。回答:[...]区切りのないパラメータは、⟨パラメータテキスト⟩パラメータトークンによって、またはパラメータテキストの最後に出現する。この場合、対応する引数は次の非空白トークンただし、そのトークンが '
{
' である場合は、引数は{...}
それに続くグループ全体になります。
TeXbook では、「単一スペース」という用語や「非空白トークン」という用語の正確な定義は見つかりませんでした。
TeX が区切りのない引数として使用しないすべてのトークンを列挙してください (カテゴリ コード 1 の明示的な文字トークンとカテゴリ コード 2 の明示的な文字トークンの間にネストされていない限り)。
これまでに、TeX はカテゴリ コード 10 と文字コード 32 の明示的な文字トークンを区切られていない引数として使用しないことが分かりました。TeX が\macro
の 2 番目の引数として何を受け取るかに注目する必要があります。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A B
\show\macrob
\bye
カテゴリ コード 10 および文字コード 32 の暗黙的な文字トークンは、区切られていないマクロ引数として使用されます。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\X=13
\uppercase{\let\space= } %
\uppercase{\letX= } %
\macro A\space B
\show\macrob
\macro AXB
\show\macrob
\bye
明示的な奇妙なスペースは、区切られていないマクロ引数として使用されます。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\uccode`\ =`\a
\uppercase{\macro A B}%
\show\macrob
\bye
暗黙的な奇妙なスペースは、区切られていないマクロ引数として使用されます。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\def\letcs#1#2{\let#1= #2}%
\catcode`\X=13
\uccode`\ =`\a
\uppercase{\letcs\space{ }}%
\uppercase{\letcsX{ }}%
\macro A\space B
\show\macrob
\macro AXB
\show\macrob
\bye
カテゴリ コード 12 および文字コード 32 の暗黙的/明示的な文字トークンは、区切られていないマクロ引数として使用されます。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\ =12\relax%
\let\space= %
\macro{A} {B}%
\show\macrob
\macro{A}\space{B}%
\show\macrob
\bye
制御スペースは、区切られていないマクロ引数として使用されます。
\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A\ B
\show\macrob
\bye
そこで、いくつかのケースをテストしましたが、エッジケースをテストしても、「単一スペース」という用語の正確な定義は得られず、「非空白トークン」という用語の正確な定義も得られませんでした。 ;-)
言い換えると、TeX が区切りのない引数として使用しないトークンが正確にはわかりません (カテゴリ コード 1 の文字トークンとカテゴリ コード 2 の文字トークンの間にネストされていない限り)。
量は⟨スペーストークン⟩「単一のスペース」/「非空白トークン」と等しくありません:
TeXbook の第 24 章「垂直モードの概要」には次のように書かれています。
数量⟨スペーストークン⟩の構文で使用されていた⟨オプションのスペース⟩上記の は、明示的または暗黙的なスペースを表します。言い換えると、カテゴリ 10 の文字トークン、または または によって現在の意味がそのようなトークンと等しくされた制御シーケンスまたはアクティブ文字のいずれかを表し
\let
ます\futurelet
。
前述の「制御シーケンスまたはアクティブ文字」は、⟨スペーストークン⟩は、区切りのないマクロ引数として使用されます (上記の例で示されています)。一方、「単一のスペース」/「非空白トークン」は、区切りのないマクロ引数として使用されません。
おそらく「シングルスペース」/「非空白トークン」は厳密なサブセットです⟨スペーストークン⟩?
もしそうなら、正確にはどのサブセットですか?
答え1
TeXbook のスタイルは、正しいことを述べることが多いですが、完全な真実ではありません。
「シングルスペース」の正式な定義は存在しません。なぜなら、それが必要ないからです。
確かに、試してみると
\begingroup\def\\{\global\let\spacetoken= }\\ \endgroup
\def\foo#1#2{(First is #1)(Second is #2)}
\foo AB
\foo A B
\edef\two{\space\space}
\expandafter\foo\expandafter A\two B
\foo A\spacetoken B
\bye
3つのインスタンスが表示されます
(最初はA)(次はB)
そして最後の行は代わりに
(最初はA)(次は)B
このトリックは、と\expandafter
の間に複数のスペースを挿入するために使用されます。次の演習は「より正確」であることがわかります。TeXは、A
B
明示的な区切られていない引数を探すときはスペース トークンを使用します。
最後の例は、暗黙スペーストークンはスキップされません。コードの最初の行は演習24.6から借用したもので、\spacetoken
暗黙のスペーストークンを作成します。これは、 のように単純に行うことができないためです。を\let\bgroup={
追加すると、\show\spacetoken
> \spacetoken=blank space .
しかしこれはない区切られていない引数を検索する場合は無視されます。
明示的なスペース トークンは、カテゴリ コード 10 の文字トークンです (通常の設定ではスペースまたはタブですが、詳細については後で説明します)。通常の設定では、これは入力内の空白スペースまたはタブ、または入力がトークン化される時点でカテゴリ コード 10 が割り当てられている任意の文字によって生成される可能性があります。
しかし、落とし穴があります。いつも落とし穴があるのです!
TeXはカテゴリコード10の文字を吸収し、元の文字コードとは独立して文字コード32を割り当てることを考慮する必要があります。したがって、タブはスペースと違いはありません。はトークン化が実行された後も同様です。
それで、何が問題なの?
\uccode` =`x \uppercase{\foo A B}
面白い空間を無視しない?それは実際には違う
\catcode`*=10 \foo A*B
カテゴリ コードが 10 であるため、アスタリスクは無視されます。
事実、カテゴリコード10の文字は正規化された文字コード32を持つトークン化中ただし、\uppercase
が適用されると、トークン化はすでに実行されており、スペースの文字コードは 32 になります。ただし、\uppercase
文字がx
10になると、文字コード 32 がないため、無視することはできなくなります。
したがって、文字コード 32 およびカテゴリ コード 10 の文字のみが無視されるという答えは正しいですが、正規化を考慮しない場合は誤解を招きます。
答え2
tex.webには
begin if cur_tok=space_token then
無視されるトークンをスキップするにはspace_token
、
@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}
答え3
文字コード 32 およびカテゴリ 10 (スペース) の明示的な文字トークンのシーケンスは、区切られていない引数の開始を「探す」ときに TeX がスキップする唯一のものです。
数量⟨スペーストークン⟩確かに、あなたが引用した TeXbook の段落の意味での「単一のスペース」/「非空白トークン」と同じではありません。
数量⟨オプションのスペース 1 つ⟩と定義されている:
⟨オプションのスペース 1 つ⟩→⟨スペーストークン⟩|⟨空の⟩
どこでも⟨オプションのスペース 1 つ⟩許可されている場合、暗黙的なスペース トークンになることもあります。
例えば、
\lowercase{\let\sptoken = } %
\edef\result{\number1234 }
\show\result
\edef\result{\number1234\sptoken}
\show\result
\let\result\sptoken\sptoken=\sptoken\TeX
\bye
(ここでは、\lowercase
中括弧を削除するだけです。この方法では、「=」の後ろに文字コード 32 の 2 つの明示的なスペース トークンが得られます。\let
-assignments では「=」の後ろに 1 つのスペースがオプションであるため、最初のスペース トークンは破棄されます。2 番目のスペース トークンは破棄されず、 に意味が割り当てられるトークンになります\sptoken
。)
\sptoken
は暗黙のスペーストークンです。明示的なスペーストークンと同様に
TeXの評価中に破棄されます。 また、他の\number
⟨オプションスペース⟩2 番目の\let
-assignment を実行している間。ただし、TeX は、区切られていない引数の先頭を「探す」間は
スキップしません。\sptoken
この例は、量が⟨スペーストークン⟩あなたが引用したTeXbook段落の意味での「単一のスペース」/「非空白トークン」と同じではありません。
ところで:
あなたの質問は、区切られていない引数の開始を探すときに TeX がトークンをどのように扱うかに焦点を当てています。
あなたの質問は、トークン化がすでに行われている処理の段階に関するものです。
それでも、.tex-input をトークン化するプロセスに関連する事実について言及する価値はあります。
.tex-input をトークン化するプロセス中に、読み取り装置が状態 M (行の中央) にあるときに、TeX がカテゴリ コードが 10 (スペース) の文字に遭遇すると、TeX はカテゴリ 10 (スペース) と文字コード 32 の明示的な文字トークンをトークン ストリームに追加します。つまり、結果のトークンは、問題の入力文字のコード ポイントの番号に関係なく、文字コード 32 になります。
たとえば、水平タブ (ASCII では水平タブのコード ポイント番号は 9) には、通常、カテゴリ コード 10 も割り当てられます。したがって、水平タブをトークン化すると、通常、カテゴリ 10 (スペース) と文字コード 32 の明示的な文字トークンが生成されます。つまり、区切りのない引数の開始を「探す」ときに TeX によってスキップされるトークンです。