TeX言語の参考書において「カテゴリコード(category code)」を扱った箇所を見ると、大抵の場合「0~15のカテゴリコードについて、LaTeX(あるいはplain TeX)の初期状態で当該のカテゴリコードをもつ文字の例」が挙げられている。それを見ればASCIIの印字可能(printable)の文字(つまり文字コード32~126の範囲)については「各文字がどういうカテゴリコードをもつか」も全て判るようになっている。一方で印字可能文字以外(制御文字など)については情報が載っていない場合が多い。これには「plainとLaTeXで初期値が異なる」「LaTeXに限ってもカーネルのバージョンにより異なる」「Unicode TeXとそれ以外でも異なる」などの要因で扱いにくいという理由があり、またそもそも「非印字可能文字のカテゴリコードはユーザが直接利用する機会が乏しい」という事情もある。
本記事では、イマドキ(TeX Live 2025)のplain TeX・LaTeX・iniTeXについて、初期状態1での各文字のカテゴリコードの値をまとめてみる。
非Unicodeなエンジンの場合
まずはレガシー(欧文が8ビット)ななTeXエンジン、つまり欧文TeX・pdfTeX・pTeX・upTeXの系列2のエンジンを扱う。これらのエンジンでのカテゴリコードの初期値は以下の通りである。
| 文字コード | 文字 | plain TeX | LaTeX | iniTeX |
|---|---|---|---|---|
| 0 | NUL | 9(無視) | 15(無効) | 9 |
| 1 | SOH | 8(下添字) | 13(アクティブ) | 12 |
| 2~8 | STX | 12(その他) | 13(アクティブ) | 12 |
| 9 | HT | 10(空白) | 10(空白) | 12 |
| 10 | LF | 12(その他) | 12(その他) | 12 |
| 11 | VT | 7(上添字) | 13(アクティブ) | 12 |
| 12 | FF | 13(アクティブ) | 13(アクティブ) | 12 |
| 13 | CR | 5(改行) | 5(改行) | 5 |
| 14~31 | SO~US | 12(その他) | 13(アクティブ) | 12 |
| 32 | ␣ |
10(空白) | 10(空白) | 10 |
| 33~34 | !~" |
12(その他) | 12(その他) | 12 |
| 35 | # |
6(パラメタ文字) | 6(パラメタ文字) | 12 |
| 36 | $ |
3(数式切替) | 3(数式切替) | 12 |
| 37 | % |
14(コメント) | 14(コメント) | 14 |
| 38 | & |
4(配列タブ) | 4(配列タブ) | 12 |
| 39~64 | '~@ |
12(その他) | 12(その他) | 12 |
| 65~90 | A~Z |
11(英字) | 11(英字) | 11 |
| 91 | [ |
12(その他) | 12(その他) | 12 |
| 92 | \ |
0(エスケープ) | 0(エスケープ) | 0 |
| 93 | ] |
12(その他) | 12(その他) | 12 |
| 94 | ^ |
7(上添字) | 7(上添字) | 12 |
| 95 | _ |
8(下添字) | 8(下添字) | 12 |
| 96 | ` |
12(その他) | 12(その他) | 12 |
| 97~122 | a~z |
11(英字) | 11(英字) | 11 |
| 123 | { |
1(グループ開始) | 1(グループ開始) | 12 |
| 124 | | |
12(その他) | 12(その他) | 12 |
| 125 | } |
2(グループ終了) | 2(グループ終了) | 12 |
| 126 | ~ |
13(アクティブ) | 13(アクティブ) | 12 |
| 127 | DEL | 15(無効) | 15(無効) | 15 |
| 128~255 | 高位バイト | 12(その他) | 13(アクティブ) | 12 |
補足説明
新しいpTeX・upTeXに関する補足
実はTeX Live 2025のpTeX・upTeX系列のエンジン(e-upTeXの2.00版3)では欧文文字コードの範囲が0x2E7Fまでに拡大されている。ただしこれはまだ実験的な機能であり、実用のマクロパッケージでこの機能が利用される予定はまだない4ので、今のところは気にしなくてよいだろう。
文字コード256以降の(欧文)カテゴリコードの初期値は全て12である。
| 文字コード | 文字 | plain TeX | LaTeX | iniTeX |
|---|---|---|---|---|
| 256~0x2E7F | 12(その他) | 12(その他) | 12 |
Unicodeなエンジンの場合
続いて、Unicodeエンジン、つまりXeTeX・LuaTeX系のエンジンを扱う。文字コード32~127の範囲はレガシーエンジンと同じなので、それ以外の部分に限る。
文字コード0~31の範囲は以下の通り。
※レガシーエンジンとの相違点を太字で示した。
| 文字コード | 文字 | plain TeX | LaTeX | iniTeX |
|---|---|---|---|---|
| 0 | NUL | 9(無視) | 15(無効) | 9 |
| 1 | SOH | 8(下添字) | 15(無効) | 12 |
| 2~8 | STX | 12(その他) | 15(無効) | 12 |
| 9 | HT | 10(空白) | 10(空白) | 12 |
| 10 | LF | 12(その他) | 12(その他) | 12 |
| 11 | VT | 7(上添字) | 15(無効) | 12 |
| 12 | FF | 13(アクティブ) | 13(アクティブ) | 12 |
| 13 | CR | 5(改行) | 5(改行) | 5 |
| 14~31 | SO~US | 12(その他) | 15(無効) | 12 |
文字コード128~0x10FFFFの範囲は以下の通り。
| 文字コード | 文字 | plain TeX | LaTeX | iniTeX |
|---|---|---|---|---|
| 173 | SHY | 12(その他) | 13(アクティブ) | 12 |
| 0xFEFF (※1) | BOM | 9(無視) | 9(無視) | 9 |
| “文字”(※2) | 11(英字) | 11(英字) | 12 | |
| その他 | 12(その他) | 12(その他) | 12 |
※1 LuaTeXのみ。XeTeXではこの行は無視する(つまり12となる)。
※2 UnicodeでのGeneral Categoryの1文字目がLまたはMの符号位置。
補足事項
- レガシーなLaTeXで文字コード31以下の文字をアクティブにしている理由はinputencのためである。Unicode LaTeXではinputencは不要なので、これらの文字コードのカテゴリコードは15に変更されている。ただしFFはplainと同じ定義(改段落)にするため13のままである。
- LaTeXでは文字コード173(ソフトハイフン、SHY)を「
\-に展開されるマクロ」に定義している。 - LuaTeXで文字コード0xFEFF(BOM)のカテゴリコードを9(無視)にしているのは、恐らくBOMが付加されたファイルを読めるようにするためだろう。ただし、TeX Liveで配布される実行ファイルではファイル先頭のBOMは入力段階で無視されるように調整されている。
- ASCII外の文字はplainでもLaTeXでも“特殊”ではないが、制御語(control word)を構成する文字としてASCII英字以外の“文字”(アクセント付きラテン文字やギリシャ文字や漢字など)も使えるのが望ましいため、Unicodeの規定に従って“文字”のカテゴリコードを11(英字)に設定している。
まとめ
春のTeX言語キャンペーン🌸はまだまだ開催中です🙂
(画像🤮省略)
-
本記事でいう「初期状態」というのは「メインの文書ファイルの先頭における状態」のことを指すものとする。LaTeXの場合は
\everyjobの実行直後の状態である。iniTeXというのは「何もフォーマットを読み込まない状態のTeX」のことであり、iniTeXの初期状態というのはTeX処理系の“本当の初期状態”に相当する。↩ - 厳密にいうと、現在のTeX Liveにおいてこれらの“系列”の実体として用いられているエンジンはTeX・pdfTeX・e-upTeXの3種類である。ただしレガシーTeXの“系列”の間で((u)pTeX系の文字コード256以降を除いて)カテゴリコードの初期値に違いはないので、この辺りの話は気にしなくてよい。↩
- イマドキのTeX配布ではpTeX系列のエンジンの実体はe-upTeXである。↩
- LaTeXにおける欧文Unicodeの扱いを今更変更するのは難しいので、将来のLaTeXにおいて実用される可能性は低いと自分は思っている。↩