TeXにこれほど多くのカテゴリコードがあるのはなぜですか?

Dec 21 2020

カテゴリコードの長いリストを見ると、なぜそれらがすべて必要なのか理解できません。例えば:

  • $^_、と&簡単代わりにアクティブな文字として定義されている可能性があります。
  • と言えば&、なぜタブの配置にそのような一般的な記号を無駄にするのですか?\nc「新コラム」のようなものを使ってみませんか?

回答

6 egreg Dec 21 2020 at 07:46

もちろん、特別なカテゴリコードを持つすべての文字をアクティブな文字に置き換えることができるわけではありません。

カテゴリコードはトークン化フェーズで割り当てられ、文字トークンに永続的に添付されます。ただし、カテゴリコード0の文字は、制御シーケンスを形成するメカニズムをトリガーするだけなので、文字トークンになることはありません。同様に、カテゴリコード5(行末)、9(無視)、14(コメント)、15(無効)の文字トークンを持つことはできません。

コード0、5、9、14、および15はすべて、特別なアクションをトリガーします。履歴メモ:TeX78では、のカテゴリコード%は5でした(これまでのようにコメントは許可されませんでした)。

カテゴリコード11と12の区別は、制御シーケンスの形成時に不可欠です。\aは制御ワード(およびスペースは後で無視されます)であり、\?は制御シンボル(およびスペースは無視されません)です。

コード1と2も同様に、マクロの定義と引数の取得(およびグループ化)に不可欠です。コード10は、スペースの正規化とコードのインデントの基本です。コード14はコメントに対応し、同様に重要です。コード6も、マクロ定義(および配置)のパラメーターを示すために重要です。

今度はコード3、4、7を調べてみましょう、8は存在可能性が彼らのためにプリミティブが、言うこと\mathshift\alignment\superscript\subscripts。実際には、次のように定義することが可能です。

\let\mathshift=$
\let\alignment=&
\let\superscript=^
\let\subscript=_

そして実際に、プレーンTeXとLaTeXのは、持っている\sp\sbまったく同じように定義されます。

なぜアクティブなキャラクターを使わないのですか?さて、アクティブなキャラクターは、カテゴリコードとのビジネスが始まったかなり後の1980年に導入されました。TeX78には13個のコードしかないため、アクティブなキャラクターが次のスロットを獲得しました。現在わかっているコメントにはスロット14があり、ASCII 127(カードを無駄にしないためにエラーが発生した場合に前のバイトを削除するためにパンチカードで使用された)などの奇妙な文字に対処するためにコード15が追加されました。

しかし、本当の理由は、アクティブな文字はマクロ(より正確には制御シーケンス)のようなものであり、いつでも新しい意味を割り当てることができるということです。

と言うと\def\b{foo}\def\a{\b}\def\b{baz}、の呼び出しはで\abazなく、を生成しfooます。

同様に、

\def\splat{\hbox{$\otimes$}}

$アクティブなキャラクターを使用すると、後で機能する場合に備えて機能しません\def${foo}。;のような定義を行うための\mathshift代わりにプリミティブが必要になります。しかし、問題はただ前進するでしょう:誰かが再定義するためのやむを得ない必要性を感じたらどうなるでしょうか?$\splat\mathshift

また、#TeXのコアを変更せずにアクティブキャラクターとして実装することはできません。のためにできるかもしれませんが&、最初の意味のプリミティブが必要であり、問​​題は以前と同じです。

パラノイア?どういたしまして。\foreach \number in {1,2,...,10} {...}何かがおかしいと使って不平を言った人々からサイトに質問がありました。または\foreach \color in {<color list>}{...}そして地獄が解き放たれた。