誰かフューチャーレットを説明してくれませんか内で環境を揃えますか?
例:
コマンド \A は、次の文字が { の場合は "A" を返し、& の場合は "B" を返し、それ以外の場合は "C" を返します。
\gdef\A{\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}
通常のテキストやインライン数式の場合には、問題なく動作します。
\A{a},\A&,\A a % -> "A,B,C"
$\A{a}$,$\A&$,$\A a$ % -> "A,B,C"
しかしalign* 環境 (amsmath) 内でこれを使用した瞬間に、「不完全な \ifx」エラーが発生します。
\begin{align*} \A{a},\A&,\A a \end{align*}% --> error.
誰か私に説明してくれませんか?ありがとう!
クリス
PS: align環境のfutureletについて、私が理解していないことがまだあります。定義すると
\gdef\A{\futurelet\thesymbol\alpha}
\gdef\D#1{\detokenize{#1}}
それから
\begin{align*}
\D&,\A a % -> "&,alpha a" (okay)
\A a,\D{&} % -> "alpha a,&" (okay)
\A a,\D& % -> error: "Argument of D has an extra }." (???)
\end{align*}
答え1
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}
TeX が を見つけると、LaTeX のケースなどで指定されている&
ように、テンプレートの残りの部分を と交換します。そのため、テンプレートの最初の 2 つのトークン (おそらく ) が比較され、その後セル (およびグループ) が終了し、問題が発生します。\halign
c
r
\ifx
\unskip
\hfil
&
フューチャーレットの前にグループを開始し、テスト後に終了するときに非表示にしたい場合は、
{\ifnum0=`}
...
\ifnum0=`{\fi}
あらゆる表形式のコード上に表示されるフォーム。
これにより、A、B、C が生成されますが、これが意図した結果であると思います。
\documentclass{article}
\usepackage{amsmath}
\gdef\A{{\ifnum0=`}\fi\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi \ifnum0=`{\fi}}
\begin{document}
\begin{align*} \A{a},\A&,\A a \end{align*}
\end{document}
2番目の例では、&
グループが終了することに注意してください。
a,\D&
は{\D}
、どちらも同じエラーが発生します。
! Argument of \D has an extra }.
<inserted text>
\par
l.15 {\D}
何をしたいのかが明確ではないため、修正方法が明確ではありません{\D}
。
答え2
私はDavidのTeXコードの理解力にはかなわないので、あなたのマクロを修正しようとはしません(ただし、あなたのやっていることは根本的に賢明ではないというのが私の意見です)。しかし、彼の「TeXが 」を見たときのコメントは、&
次のように展開できます。アラインメントをスキャンする際、TeXは、ほとんどのユーザー(経験豊富で知識のあるユーザーでさえ)が実行時に持つメンタルモデルとは多少矛盾した方法で動作します。つまり、想像するTeX は常に次の 3 つのうちのいずれかを実行します。
入力をスキャンして文字をトークン化し、マクロ パーサー「口」に情報を提供します。
マクロの拡張。
拡張不可能なトークンの実行:
\def
または のようなプログラミング ディレクティブ\hbox
、または 文字などの完全なタイプセット コマンド。
このモデルでは、誰もがアラインメント(TeXプリミティブ\halign
または\valign
)内でタブ文字が&
ポイント3の実行でアクションを起こすことを期待しています。しかし、これは実際には当てはまりません。実際、TeXはポイント1でタブ文字を「認識」します。TeX今まで読んだアンパサンド (または同等の文字カテゴリ) を入力すると、現在のセルが直ちに終了し、グループが閉じられ、v
テンプレートの「部分」が挿入されるなどの処理が行われます。
(編集:私はざっと目を通しただけでerrorlog.pdf
(つまり、texdoc errorlog
)、1978 年 3 月 18 日のデバッグ セッションからの関連するコメントを見つけました。
get next ルーチンを intercept
&
およびtokens にします。私は、単にand を[つまり、TeX の目ではなく、胃の中に]入れること\cr
ができると思っていましたが、それは大きな間違いでした。&
\cr
big_switch
これは、Knuth がこれらの配列トークンの動作に関して上記の、一見奇妙な選択をするに至った理由についての興味深い部分的な洞察であり、これが実際にその動作であるという確認でもあります。
もちろん、例外は、TeX が未完成の括弧グループ内にある場合です (\begingroup
このグループを開始するのは暗黙の括弧や , ではなく、実際の括弧文字である必要があります)。この場合、David の{\ifnum0=
}` 構文が、マクロ定義内に配置される可能性のある場所に不均衡な括弧を実際に作成することなく、展開上は開き括弧と同等になります。
この奇妙な解析ルールの結果、テーブルセル内のマクロによって読み取られるもの、または環境によって囲まれたものには細心の注意を払う必要があります。マクロ引数解析ではなく代入によって引数を効果的に読み取るマクロは、必要な囲み括弧がなければ、読み取られるタブがない保護されます。表互換の環境には、\ifnum
内部に出現する可能性のあるタブ文字を保護するための機能が含まれています。より単純なものはセルに分割されるため、失敗する可能性があります。