> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md).

# 「TeXトークン」とは何ですか？

## TeX トークンと関連概念に関する連載の動機

TeX トークンと関連概念に関する一連の記事を作成するために用いた動機と方法論について、この記事で述べます [新しい記事シリーズ：TeX トークンと関連概念――しかし、なぜ（そしてどうやって）？](https://www.overleaf.com/blog/521-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how) その記事で述べたように、この連載全体を通して、Knuth のオリジナル TeX プログラムを独自にビルドして得られた知見に基づいて議論と説明を行っています――そのプログラムを使って、TeX の主要概念を簡潔に説明し、追いやすく解説する記事シリーズを作成しています。

## はじめに：私たちの目的は何か？

本記事では、入力ファイル中の文字から TeX トークンが実際に生成されるまでの処理の流れをたどることで、TeX トークンとは何かを正確に明らかにします。実際にはかなり複雑なので、技術的な正確さを保ちながら、たどりやすく理解しやすいように、その過程を核心となる要点まで絞り込みます。

まず、TeX の重要な内部概念をいくつか紹介します： *プリミティブ*, *コマンドコード* と *コマンド修飾子*。そこから、とても単純なマクロ例を用いて、TeX がそのコマンドをどのように処理するのかを正確に見ていきます `\def` そして、TeX がそのコマンドを表すために作成する結果のトークンを見ていきます。

最後に、TeX が文字を表すトークンをどのように作成するのか、また文字の `\catcode` 値が実際に文字トークンに永続的に結び付くのか――TeX の本ではよく言及されますが、ここではそれがどのように実現されるのかを正確に見ていきます。

次の図は、入力テキストから TeX トークンまでの流れを示しています：

![TeX 入力から TeX トークンへの流れ。](/files/cd2563b14310e3b725889e5f5e0dadbc023fbd08)

## その前に：プリミティブとコマンドコード

すべての TeX エンジン（Knuth 版 TeX、pdfTeX、XeTeX、LuaTeX）は、いくつかの組み込みコマンド、いわゆる *プリミティブ*TeX のプログラマビリティを支える基本構成部品となるコマンドです。これらが「プリミティブ」と呼ばれるのは、ユーザー定義マクロと違って他のコマンドから構成されておらず、さらに単純な命令へ分解できないからです。Knuth の TeX ではおよそ 320 個のプリミティブがあります――ただし pdfTeX、XeTeX、LuaTeX など他の TeX エンジンは Knuth の元のプログラムに新しいコマンドを追加しており、Knuth の TeX ソフトウェアには存在しないプリミティブを含んでいます。

TeX は内部的に数値の *コマンドコード* をすべてのコマンドに割り当てます――それがユーザー定義マクロであれ組み込みプリミティブであれ同じです。これらのコマンドコードは TeX ユーザーからは直接参照できず、TeX の処理内部の仕組みの一部にすぎませんが、後で TeX トークンを説明する際に知っておくと役立ちます。

関連する機能を持つコマンド群は同じコマンドコードを共有します。たとえば、 `\def`, `\gdef`, `\edef` と `\xdef` その 4 つのプリミティブはすべてマクロの定義に使われ、（Knuth の TeX では）コマンドコード 97 を共有します。明らかに、この 4 つのマクロ定義コマンドはそれぞれ少しずつ異なる方法でマクロを作成します。そのため、処理中に TeX はそれらを区別する方法を必要とします。

コマンドコードだけでは（たとえば 97 だけでは）、いま検討しているのがどのマクロ作成コマンドなのかは分かりません。ですから、予想どおり、各 TeX コマンドには *コマンド修飾子* が付随します（下の例を参照）。

### コマンド修飾子：2 種類

ここでは「タイプ 1」と「タイプ 2」と呼ぶ 2 つのカテゴリに分けられます――TeX 自体はこの用語を使いませんが、ここでは便宜上そう呼びます：

* **タイプ 1**：必要に応じて、同じコマンドコードを共有するコマンドを区別するために TeX が使える単純な整数値です。
* **タイプ 2**：TeX のメモリ上の数値位置を表す整数値で、そのコマンドに関する情報を探しに TeX がどこへ行けばよいかを示します。たとえば、ユーザー定義コマンド（マクロ）では、コマンド修飾子がマクロ定義がメモリのどこに保存されているかを TeX に伝えます。

#### タイプ 1 のコマンド修飾子（例）

述べたように、Knuth の TeX ではマクロ定義用の 4 つのプリミティブコマンドは： `\def`, `\gdef`, `\edef`, `\xdef` すべてコマンドコード 97 を共有しています。これらはコマンド修飾子によって区別され、以下の表に示します：

| コマンド    | コマンド\nコード | コマンド\n修飾子 |
| ------- | --------- | --------- |
| `\def`  | 97        | 0         |
| `\gdef` | 97        | 1         |
| `\edef` | 97        | 2         |
| `\xdef` | 97        | 3         |

2 つ目の例として、Knuth は次のコマンドを実装することにしました。 `\openout`, `\write`, `\closeout`, `\special`, `\immediate` と `\setlanguage` を TeX の「拡張」として実装しました。これは、TeX に新しいプリミティブを追加する方法を示すためだけのものです。この場合、これらのコマンドは Knuth が TeX の拡張方法を説明する目的でまとめただけで、実際には「似た機能」を共有しているわけではありません。この 6 つのコマンドは「拡張」と分類され、コマンドコード値 59 としてまとめられますが、それぞれは他と区別するために適切なコマンド修飾子を持っています：

| コマンド           | コマンド\nコード | コマンド\n修飾子 |
| -------------- | --------- | --------- |
| `\openout`     | 59        | 0         |
| `\write`       | 59        | 1         |
| `\closeout`    | 59        | 2         |
| `\special`     | 59        | 3         |
| `\immediate`   | 59        | 4         |
| `\setlanguage` | 59        | 5         |

#### タイプ 2 のコマンド修飾子（簡単な説明）

すべてのコマンド修飾子は整数ですが、タイプ 2 の修飾子にはもう少し説明が必要です。これらのコマンド修飾子は TeX では「ポインタ」と呼ばれます。なぜなら、そのコマンドに関する追加情報が見つかるメモリ上の場所を指し示すからです。少し曖昧に聞こえるかもしれませんが、TeX がこれらのポインタを使って情報を参照する方法は非常に多様で、詳しく説明するとこの記事の中心的な目的からそれてしまいます。ひとつ例を挙げると、マクロです。マクロコマンドが定義されると、TeX は置換テキストをどこかのメモリに保存する必要があります。後で見るように、ユーザー定義マクロのコマンドコードは 111 から 114 の範囲にあり、コマンド修飾子はメモリへのポインタで、置換テキスト（マクロ定義）がどこに保存されているかを TeX に伝えます。

### コマンドコード：展開可能と非展開

Knuth の TeX のソースコードでは、コマンドコードは 0 から 120 まであります――この範囲の一部のコードは専門的な内部用途のためだけのもので、ユーザーがアクセスできるコマンドには割り当てられていない点に注意してください。pdfTeX、XeTeX、LuaTeX など他の TeX エンジンは Knuth の元の集合に新しいコマンドを追加しており、より多くのプリミティブとそれに対応するコマンドコードを含んでいますが、ここで述べる原理は Knuth のソースコードから派生したすべての TeX ベースエンジンに共通する基本です。

コマンドコードの集合は主に 2 つに分かれます：

* *非展開コマンド*：コマンドコードは 100 以下です；
* *展開コマンド*：コマンドコードは 100 より大きく、最大 120 です。101 から 120 の範囲にはユーザー定義マクロに加えて、次のようなコマンドが含まれます。 `\csname`, `\expandafter` と `\the`.

非展開コマンドは通常、内部パラメータに値を代入したり、そのまま組版可能な内容を直接生成したりします。展開コマンドは通常、トークンの流れを TeX の現在の処理に「注入」したり、トークン処理の順序を変更したりします。

上で述べたように、すべてのマクロ（ユーザー定義コマンド）には 111 から 114 の間のコマンドコードが与えられます。値の違いは、そのマクロが `\long`, `\outer`として定義されたか、両方か、あるいはどちらでもないかを表します。以下に例を示します：

| マクロの種類             | 例                              | コメント                  |
| ------------------ | ------------------------------ | --------------------- |
| long でも outer でもない | `\def\ohyeah{....}`            | `\ohyeah` コマンドコード=111 |
| long、non-outer     | `\long\def\ohyeah{....}`       | `\ohyeah` コマンドコード=112 |
| long ではなく outer    | `\outer\def\ohyeah{....}`      | `\ohyeah` コマンドコード=113 |
| long outer         | `\long\outer\def\ohyeah{....}` | `\ohyeah` コマンドコード=114 |

コマンド修飾子についての確認ですが、マクロが定義されると TeX はそのマクロ定義をメモリのどこかに保存します。その場所（ポインタ）がそのマクロコマンドのコマンド修飾子となり、定義方法に応じて 111 から 114 のコマンドとともに保存されます。ユーザー定義マクロに割り当てる実際の名前はそれほど重要ではありません。入力の処理が終わると、それらはすべて 111～114 の範囲のコマンドコードとして割り当てられ、最終的には TeX があなたの入力から読み取るすべてのコマンド――それがプリミティブであれユーザー定義マクロであれ――は、やがて数値表現に変換されます。これは *トークン*.

## 入力テキストから TeX トークンへの道のり

この節では、とても単純なマクロ例を用いて、TeX がコマンド `\def` を処理して、次を表すトークンを作成する様子を正確に見ていきます `\def` コマンド。TeX の詳細な処理は極めて複雑になり得るので、マクロ引数や区切り文字は使いません。というのも、それでは複雑さが増して、この道のりから注意がそれてしまうからです。

たとえば、TeX 入力ファイルに次の行が含まれているとします：

```latex
\def\ohyeah{Overleaf はすごい！}
```

TeX がこの入力行の処理を始めると、各文字の `\catcode` を調べ、最初の文字が `\` （最初の文字の `\def`）であることが分かります。TeX は、（内部表で調べて） `\` は `\catcode` 0 を持っていることを検出し、これは *制御綴り*。もちろん、任意の文字に `\catcode` 0 を再定義できますが、ここでは plain TeX や LaTeX の標準的な定義が使われていると仮定します。

厳密には、用語 *制御綴り* には 2 つの下位分類があります： *制御語* と *制御記号*:

* *制御語*： `\catcode` 文字（11）の文字列；
* *制御記号*：単一の文字で、その `\catcode` は *、* 文字（11）です。

この時点で、 `\` その文字は役目を終え、ここで用済みになります。エスケープ文字を検出すると、TeX は制御語または制御記号を検出するために、その後続のすべての文字の読み取りを始めます。

最初の `\`の後、TeX はすぐに `d`：その `\catcode` が 11 であり、これは TeX に、それが *制御語*の最初の文字を見つけたことを知らせます。TeX は後続の文字の走査を続け、最終的に次の条件を満たす文字を検出するまで進みます： *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* 持たない `\catcode` 文字（11）を。最初の `\`の後に続くすべての文字で、 `\catcode` 11（letter）を持つものは、制御語の名前、すなわちコマンドの名前――マクロかプリミティブかもしれませんが、TeX はまだそれがどの種類のコマンドか分かりません。この時点では、それは単なる文字列です。

したがって、この例では TeX は各文字を確認しながら順に走査し、最初の `\` の `\ohyeah` も持つ `\catcode` 0 に達するまで進みます。TeX は読みすぎたことを認識し、その `\` をテキストストリームに戻し、以降のテキスト走査で次に現れる文字にします。この時点で TeX は文字列（`def`最初の `\catcode` 11 (`d`, `e` と `f`）を識別しており、それが 3 文字からなる制御語のテキストであることを知っています。各文字はそれぞれ `def` が実際に何を意味するのか、つまり何をするのかです。お察しのとおり、TeX は `def` に対するコマンドコードとコマンド識別子を見つけ出し、このコマンドをどう扱うかを判断する必要があります。

## ハッシュ化する

制御語（`def`）を検出すると、TeX が最初に行うことは、文字列（`def` （この例では）ハッシュ関数と呼ばれるものを使って整数値に「変換」することです。細部を気にする必要はなく、概要だけで十分です。要するに、TeX は今検出した制御語の各文字を見て、それぞれの文字の ASCII コード値（XeTeX/LuaTeX では Unicode 値）を使って、ハッシュ値と呼ばれる数値を計算します。これは単なる整数です。

このハッシュ計算の過程の一部として、TeX は新たに検出した制御語の文字列がすでに既知かどうかも確認します。プリミティブであれユーザー定義マクロであれ、すべてのコマンドの人間が読めるテキストは、次のように呼ばれる内部記憶領域に保存されています。 *文字列プール*。TeX がこれを行うのは、コマンドの人間が読める名前を出力する必要があるかもしれないからです。たとえば、TeX がエラーを報告し、問題のコマンド名を示す必要があるときです。たとえば、私たちのマクロ `\def\ohyeah{Overleaf はすごい！}` は、新しいコマンド `\ohyeah` を定義しています。TeX は（後の段階で） `ohyeah` (*ことなく* （最初の `\` 文字）についてハッシュ値を計算するだけでなく、エラー報告（または他の作業）に使う必要がある場合に備えて、テキスト文字列（人間可読形式）も保存します。

TeX の文字列処理についてさらに詳しく知りたいなら、私はこれについて自分の [個人ブログサイト](http://www.readytext.co.uk/?p=3590).

最終的には、コマンドを表す文字列 `def` は 1218 という数値に変わります（これが TeX によって実際に計算された値です）。この時点で個々の文字 `d`, `e` と `f` はもはや物語の中心ではありません――入力から読み取られ、役目を果たしたからです。ここから先は整数と *トークン*――トークンが実際には何か、すぐに見ていきます！内部的に TeX はこれらのハッシュ値を *現在の制御綴り* と呼びますが、ソースコードではその用語が `curcs`という変数名に短縮されています。TeX のソースコードには、非常に短く、ときにはかなり不可解な変数名があふれています。

では TeX は *実際に何をするのでしょうか* この生まれたての整数値 1218 をどう扱うのでしょうか？TeX は元の文字列 `def`、いまや整数 1218 で表されているものが、実際にはマクロ定義の命令を指していることをどうやって見つけるのでしょうか？答えは、TeX には内部の「ファイルキャビネット」のようなものがあり、現在知っているすべてのコマンド――それがユーザー定義マクロであれ組み込みプリミティブであれ――の現在の意味と値をそこに保存しているからです。TeX が `def` を 1218 のハッシュ値へ変換する手間をかけた理由は、これを `curcs`に保存されています）を使って *意味* の `def`を検索するためです。もちろん TeX は、入力中で検出するすべての制御語についてこのハッシュ計算を繰り返します――そして当然ながら、異なる制御語はハッシュ関数から異なる整数値を返します。それがまさに狙いです。

TeX の内部「ファイルキャビネット」は *等価表* と呼ばれ、次節の話題です。

### 等価表を参照する

簡単に振り返って、ここまで学んだことを確認しましょう：

* `\` は制御綴りの開始を示します（ *制御記号* または *制御語*).
* の直後の最初の文字が `\` は `\catcode` 11（letter）なら、それは *制御語*.
* については *制御語* TeX は、後続の入力文字のうち `\catcode` 11 を持つものをすべて確認し、最初に *、* を持たない文字を見つけた時点で走査を止めます。 `\catcode` の 11 を。
* 入力文字列（ `\`の後に続く、 `\catcode` 11 を持つ文字は *制御語* ユーザーが入力したものです：TeX に「何かをして」と求めるコマンドです。
* 「何かをする」処理を始めるために、TeX は制御語の文字列を整数に変換します。これは、整数を出力するいわゆるハッシュ関数を使って行われます。
* その整数（計算されたハッシュ値）は *現在の制御綴り*と呼ばれますが、TeX はこれにより短い名前を与えて `curcs`.
* この例では、制御語 `def` は 1218 の値に変換されます――これは `curcs`という変数に保存されます。つまり、 `curcs=1218`.

TeX は今、新しく検出された *現在の制御綴り* が実際に何を意味するのか――TeX はそれをどう扱うのか――を知る必要があります。

#### グループ化についての補足：情報を保存・復元する必要

ここでは少し寄り道して、TeX には情報を保存・復元する能力、つまり何らかの組み込み「メモリ」があることを思い出しておきます。

最も単純なマクロを書いたことがある人なら、TeX のグループ化機構を知っているはずです――たとえば、 `\def` を使ってグループ内にマクロを作成する場合です。 `\global` プレフィックスを `\def`で作成した、グループ内で定義されたマクロに付けない限り、そのマクロの値や意味はそのグループ（およびその下位グループ）内にしか残りません。グループが終わるとその定義は失われます。たとえば、グループ内で単純なマクロを次のように定義すると：

```latex
{\def\foo{ハロー}}
```

そして `\foo` をグループの外で使おうとすると

```latex
{\def\foo{ハロー}}% \foo はグループ内で定義された（注意：\global は使っていない）
\foo %<--- もはや定義されていない、未定義になった
```

おなじみのエラーが出ます： `未定義の制御綴り`. `\foo` は、それが定義されたグループ（およびそのサブグループ）内でのみ意味を持ちます。さらに、グループ内でマクロを再定義すると、グループ終了時に新しい値は失われ、以前の意味（グループ外に存在していたもの）が復元されることがあります。

```latex
\def\foo{さようなら}
\foo\par% さようならを出力
{\def\foo{ハロー}% グループ内で再定義：
{2 階層目のグループ内： \foo\par}}% 2 階層目のグループ内で使用：\foo はハローを出力
グループ外では古い値が復元される：\foo\par% さようならを出力
```

これらの単純な例の目的は、TeX に何らかの「保存機構」または「メモリ」があり、コマンドの「意味」を保存・復元していることを示すことです――そして、もちろん実際にそうです。前節ですでに触れたように、その「保存機構」または「ファイルキャビネット」は *等価表*という大きな内部表です。そこに TeX は、現在知っているすべてのコマンド――組み込みプリミティブとユーザー定義マクロ――の現在の意味や値を保存しています。

### 等価表：たとえて言うなら

等価表を説明するために、たとえて考えてみます。何千もの小さな引き出しを持つファイルキャビネットを引き続き使い、それぞれの引き出しには一意の整数ラベルが付いているものとします。処理のこの段階で TeX は、実質的にこう言っているのです：

「よし、いま計算して変数 `curcs`curcs に保存した 1218 という整数値がある。これが何を意味するのかを知る必要がある。そこでファイルキャビネットの 1218 番の引き出しを見に行って、そこに何と書いてあるかを確認しよう。」

TeX は 1218 を使って正しい引き出しを見つけ、そこにある小さなメモから、TeX のソースコードで使われている名前の 3 つの情報を得ます：

* **`eq_level：`** この項目が定義されたグループ化のレベル（レベル 1 = グローバル定義）。上でグループ化の効果を見ましたが、ここではそのグループ化レベル情報が保存されています；
* **`eq_type：`** この項目のコマンドコード；
* **`equiv：`** この項目の現在の「値」――上で述べたコマンド修飾子のような単純な整数の場合もあれば、メモリ上の領域へのポインタの場合もあります。たとえば、マクロ定義を表すトークン集合のメモリ位置です。

したがって、1218 のハッシュ値（変数 `curcs`に保存されています）は、実質的に *キー* 私たちが最初に文字列として入力したコマンドの現在の意味と値を含む引き出しへアクセスするために使われています。 `\def`.

TeX プログラムのソースコード内では、 `eq_type` どのコマンドでも `curcmd` であり、 `equiv` の値は `curchr`.

### 等価表は def について何と言っているのでしょうか？

述べたように、どのコマンドについても計算されたハッシュ値は `curcs`という変数に保存されます。したがって `def` があります `curcs=1218`。等価表の 1218 番地を見ると、TeX は次の情報を見つけます：

* `curcmd`=97。これは `\def`;
* `curchr`=0。これは `\def`.

`\def` はプリミティブ（組み込み）TeX コマンドであり、どこかで再定義されていない限り、3 つ目で最後の情報は `eq_level=1` となり、の意味が `\def` がグローバルに定義され、より下位のグループ化レベルに制限されていないことを示します。内部的には、 `eq_level` コマンドに付随する eq\_level の値は TeX のグループ化機構の中で非常に重要な役割を果たしますが、これ以上は扱いません。

次の図は、ここまでの説明を要約したものです：

![TeX 入力から TeX トークンへの流れ。](/files/cd2563b14310e3b725889e5f5e0dadbc023fbd08)

## コマンドの TeX トークン

上の説明をひとしきり見てきましたが、制御綴りに対する TeX トークンの実際の計算は、実はとても簡単です。TeX は `curcs` ハッシュ関数の値（1218）を使って、TeX が *トークン*トークンと呼ぶ単純な整数を作ります。 `curcs` の計算式は：

```c
curtok = 4095 + curcs
```

TeX は現在のトークン（直近に計算したもの）の値を `curtok`.

したがって結論として、TeX トークンが表すのは `\def` コマンドの一般形は `4095 + 1218 = 5313`コマンド列を表す TeX トークンはこれでおしまいです：それらは単に、ハッシュ表の値に 4095 を足して計算される整数です。

## 文字の TeX トークン

TeX が文字を表すトークンを作成する必要があるときは、同じく簡単な次の計算を使います：

```c
curtok = 256*catcode + (文字の ASCII 値)
```

LuaTeX のような Unicode 対応エンジンでは、少し異なる計算が使われることに注意してください。

たとえば、スペース文字を表す TeX トークンは `\catcode` 10、ASCII 値 32 の場合、次のようになります：

```c
256*10 + 32 = 2592
```

### 文字を含むトークンリスト

たとえば、次のように単純なトークンリストを作成すると、

```latex
\toks100={ハロー}
```

TeX は次のトークン列を作成し、後で使うためにメモリへ保存します：

* H→ 256 × 11 + 72 = 2888
* e→ 256 × 11 + 101 = 2917
* l→ 256 × 11 +108 = 2924
* l→ 256 × 11 +108 = 2924
* o→256 × 11 + 111 = 2927

TeX のメモリの奥深くでは、トークンレジスタ 100 が「ハロー」の保存場所にアクセスします。これは 5 つのトークン値、2888、2917、2924、2924、2927 として保存されています。これらのトークンは、各文字の ASCII コードとその `\catcode`の値を組み合わせたものです。文字はトークンに変換される時点で（トークン化されるときに）その値を用います。文字が文字トークンに変換されると、 `\catcode` 付随する値は恒久的なものとなり、ユーザーがたとえば `\the\toks100`.

述べたように、文字トークンは次の式から計算されます： `256*catcode + (ASCII 値)` 一方、制御綴りのトークンは次の式から計算されます： `4095 + curcs` ここで `curcs` は、TeX が入力中で検出した制御語（ユーザーが入力したコマンドのテキスト文字列）のハッシュ値です。文字トークンは常に 4095 未満であることに注意してください。そのため TeX は、あるトークンが制御綴り（コマンド）なのか文字なのかを簡単に判別でき、そのうえでどの制御綴りまたは文字なのか、さらに `\catcode` そのトークンにどの catcode と文字の組み合わせが符号化されているのかを判断できます。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
