> 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/sononotopikku/21-how-tex-macros-actually-work-part-3.md).

# TeXマクロは実際にどのように動作するのか: 第3部

[第1部](/latex/ja/sononotopikku/19-how-tex-macros-actually-work-part-1.md) [第2部](/latex/ja/sononotopikku/20-how-tex-macros-actually-work-part-2.md) [第3部](/latex/ja/sononotopikku/21-how-tex-macros-actually-work-part-3.md) [第4部](/latex/ja/sononotopikku/22-how-tex-macros-actually-work-part-4.md) [第5部](/latex/ja/sononotopikku/23-how-tex-macros-actually-work-part-5.md) [第6部](/latex/ja/sononotopikku/24-how-tex-macros-actually-work-part-6.md)

## 休憩の時間です！

この物語の次の部分に進む前に、ここまでの復習をしましょう。これからどこへ向かうのかを思い出し、重要な考えがすべて揃っていることを確認するために、考えを整理します。念のために言うと、私たちの作例は、TeXが次の内容を含むテキストの1行を読み取ったという仮定に基づいています `Hello World \jobname` そして、TeXが段落を組み立てるためにこれを組版していると仮定します。

### 究極の目的

私たちの目標は、TeXマクロの本質とその仕組みについて、より深く理解することです。しかし、そのためにはまず、TeXが入力ファイルをどのように読み取り、その中の文字を処理するのかを理解する必要があります。ここまでに扱ったトピックを要約すると次のとおりです。

* TeXは入力中の各文字を読み取り（走査し）、文字ごとにTeXは2つの情報を持っています：
* **文字コード**：その文字を識別するために使われる整数値。たとえば、.tex入力ファイルに保存されている場合など。
* **カテゴリコード**：TeX内部の別の整数で、入力から読み取った各文字に意味を割り当てるために使います。
* TeXが文字を読み込んだ瞬間、その文字のカテゴリコードは *完全に* 文字トークンの生成によって、その個々の文字に関連付けられます：
* TeXは単純な式を使って、文字コードと対応するカテゴリコードを「ひとまとめ」にし、文字トークンと呼ばれる整数にします。
* TeXがまだ *読み込んでいない* 任意の文字の振る舞いを変えたい場合、その文字に別のカテゴリコードを割り当てることで、その文字の意味を変更できます。つまり、TeXがその文字をどのように扱うかを変更するのです。
* カテゴリコードの再定義（再マッピング）は、TeXの原始命令 `\catcode` コマンド。
* TeXがカテゴリコード0を見ると、特別な走査モードに切り替わり、コマンドを探し始めます。つまり、（場合によっては複数文字の *制御語* または単一文字の *制御記号*.

ここまでで、TeXの入力走査プロセスが個々の文字を識別し、各文字のカテゴリコードを使って次に何をするかを判断する様子を見てきました。いくつかの文字は単なる組版用の通常のテキスト項目ですが（たとえばカテゴリコード11）、空白文字（カテゴリコード10）やエスケープ文字（カテゴリコード0）も見てきました。簡潔さのためにここでは扱わなかった他のカテゴリコードもあります。たとえばカテゴリコード1（「グループ開始」、例： `{`）、カテゴリコード2（「グループ終了」、例： `}`）などです。各カテゴリコードは、TeXの入力走査と、その後TeX内部のソフトウェア処理/アルゴリズムによる後続処理の中で、それぞれ固有の役割を担っています。

### トークン：簡単なおさらい

「トークン」という概念はTeXの動作の中心です。TeXに関する書籍、記事、オンラインコミュニティ全体で「トークン」という語が登場したり参照されたりするので、この話題を簡単に復習しておく価値があります。詳細は、以前公開した記事で見ることができます [「TeX トークン」とは何か？](/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md)

すでに見たように、TeXは文字コードとカテゴリコードを1つの複合整数にまとめることで、入力文字をトークンに変換します。TeXはコマンドに対しても同様のことを行います。コマンド名を使って、TeXは *コマンドトークン* と呼ばれる整数を計算します（これについてはさらに詳しく見ていきます）。目安としては、トークンを、TeXが入力から読み取った項目を「梱包」し、TeXの処理の次の段階へ送る準備を整える方法だと考えるとよいでしょう。すべての項目（文字またはコマンド）が1つの数値表現にきちんとまとめられていれば、後の処理がしやすくなります。たとえば、TeXが後で使うために入力の一部を保存したい場合、たとえばマクロ定義のように、TeXは複雑なものでもあなたのマクロ定義を、マクロの定義の一部である（内包される）文字やコマンドを表す各整数がトークンであるような整数列として保存するだけで済みます。

## では、次は？

パート2の最後の節では、エスケープ文字（カテゴリコード0）がTeXを特別な処理モードに切り替え、そこでコマンドの名前を探す様子を見ました。私たちの例では、TeXは次の文字列を検出しました `jobname` そして、パート2は、TeXがその文字列（コマンド名）に対して「何かをする」つもりの地点で終わりました。このパートでは、TeXが次に何をするのかを詳しく見ていきます。

TeXが入力ファイル内の特定の文字列がコマンド名を表していると識別すると（ここでは `jobname`）、TeXは、何をしているかに応じて、そのコマンドを実行する必要があるかもしれません。ここで「かもしれません」と言うのは、TeXがすぐにはコマンドの実行を試みない場合があるからです。たとえば、TeXがマクロを定義しているとき（TeXはトークン列を構築しています）などで、これらは後で扱うトピックです。しかし、ここでは引き続き、TeXが段落を組版していて *は*この状況では、 `\jobname`.

### 文字列からコマンドを実行するまで：どうやって？

まず、パート2の図5bを再確認しましょう。そこでは、TeXが入力中の特定の文字列がコマンド名を構成していると識別しています： `jobname`。図5bでは、TeXが「内部テーブルを確認する...」必要があることを示しています。それは *実際にはどういう意味なのでしょうか*?

![コマンド名を探すTeX](/files/1f73efd3739bcc104c2b4bf179e6e5ef83bab886)

TeXが「内部テーブルを確認する」ことで、文字列（たとえば `jobname`）を、コマンドが正確に何であり、何を意味するのかを突き止める過程について、より詳しく説明した別の記事があります [「TeX トークン」とは何か？](/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md) ここでは、重複をできるだけ避けつつ、重要な考えを要約します。

まずはたとえ話から始めましょう。あなたが本を読んでいて、見慣れない単語に出会ったとします。どうしますか？今日なら、ほぼ確実に「Googleで調べる」でしょうが、ここではもっと古い方法を好むと仮定しましょう。つまり、単語が一覧になっており、その意味が示されている辞書を手に取るのです。TeXにも似た仕組みがあります。TeXに現在知られているすべてのコマンドと、それらのコマンドの「意味」を一覧にした内部の「辞書」です。ここでいう「意味」とは、そのコマンドがどの種類のコマンドか、何をするのか、さらにそのコマンドを実行するためにTeXが必要とするかもしれないその他の情報を指します。また、「コマンド」という用語には、ユーザー/TeXプログラマが書いたTeX/LaTeXマクロや [何百もの組み込み原始命令](/latex/ja/sononotopikku/46-tex-primitives-listed-by-tex-engine.md).

ということも念頭に置きつつ、辞書のたとえを続けましょう。人間の読者として単語の意味を調べる必要があるときは、辞書に載っているアルファベット順の単語一覧を使って探します――もちろんTeXはまったく同じようには動きません。元の `jobname` 例に戻ると、TeXは自分の「辞書」の中で、どのように `jobname`の「意味」を見つけるのでしょうか。そして、その「意味」はTeXに実際には何を与えるのでしょうか。

TeXが知っているすべてのコマンドの内部的な「アルファベット順一覧」を提供する代わりに、少し違うことをします。TeXは、コマンド名に含まれる文字列全体を、それを識別（表現）するために使われる1つの整数に変換します。内部では、TeXは既知のコマンドすべての大きな「辞書」を保持しており、その中に *整数* を保存します。これらはコマンド名から計算されたものであり、この辞書には実際のコマンド名そのものは、文字の並び（ *文字列*）としては保存されていないことに注意してください。TeXはこの辞書を、すべての組み込みコマンド（原始命令）に対して使います。 *や* また、ユーザーが作成したマクロ（コマンド）の詳細を保存するためにもこれを使います。あなたのマクロの名前は整数に変換され、その整数がTeXの辞書の中に「登録」されます。

TeXが入力中で使われているコマンドを検出し、そのコマンドについて何かを知る必要があるたびに、コマンド名に含まれる文字列を「等価な」整数に変換し、その整数を使ってTeXの「大きな辞書」の中からそのコマンドを検索します。プログラマの皆さんは、TeXがこの変換に [ハッシュ関数](https://en.wikipedia.org/wiki/Hash_function) の一種を使っていることを知りたいかもしれません。

![ハッシュ関数の図](/files/39761ae9d22ba59f5a4e8fb62d54123154d2d47d)

### 図6：文字からコマンドの意味へ

次の図は、TeXがコマンドの名前に含まれる文字列を **curcs**と呼ばれる等価な整数に変換し、その整数を使ってTeXの「大きな辞書」でコマンドの意味を検索する過程を示しています。その検索結果は2つの情報、つまり **curcmd** や **curchr**と呼ばれる2つの整数で、TeXはそれらを使って、そのコマンドが正確に何をし、どのようにその後実行するかを判断できます。

![TeXが文字列を等価な整数に変換してコマンドの意味を検索する様子](/files/273c005799628c387d95c6f5d1e8b2ca29190924)

内部では、TeXは **curcs** (**cur**rent **c**ontrol **s**equence) と呼ばれる変数を保持しており、TeXが現在処理しているコマンドの整数値、つまり **curcs** コマンド名から計算された整数を保存するために使われます。話はそれだけではなく、もう1つ重要な点があります。TeXがコマンドではなく文字をちょうど読み取った/処理したところであれば、最後に読み込んだものが文字であってコマンドではないことを覚えておくために、 **curcs** を0に設定します。

### TeXにとってのコマンドの意味

TeXエンジンが提供する [組み込みコマンドの集合](/latex/ja/sononotopikku/46-tex-primitives-listed-by-tex-engine.md) を見ると、それらのコマンドの中には密接に関連しているものがあることが分かります。つまり、似たタスクを実行するのです。たとえば、すべてのTeXエンジンがマクロを定義（作成）するために使う原始命令は4つあります： `\def`, `\gdef`, `\edef`, `\xdef`。その4つのコマンドはいずれもマクロを定義しますが、もちろんそれぞれ少しずつ違う方法でそれを行います。これをプログラミングの観点から考えると、広い意味では同じことをするマクロ定義コマンドが4つあるわけですが、それぞれ個別の動作に対応するためにどれを使うか選ぶ必要があります。

これに対処するため、TeXは各コマンドに2つの値を割り当てます。そしてその2つの値が、TeXにとってのコマンドの「意味」（その役割/何をするか）を表します。これら2つの値はTeX内部の、ソフトウェアの深部にあるもので、ユーザーからはアクセスできない「内部機構」の一部です。組み込みの原始命令であろうとユーザー定義コマンドであろうと、すべてのTeXコマンドには2つの値が割り当てられ、TeXにとってその動作を定義/分類します。TeXがその「大きな辞書」を使ってコマンドを検索すると、次の2つの重要な情報が見つかります：

* **コマンドコード**：そのコマンドがどの「種類」に属するのかを示す一種の「一般分類」――たとえば「マクロ定義」コマンド（ `\def`, `\gdef`, `\edef`, `\xdef`の1つ）、「ボックス作成」コマンド（ `\hbox`, `\vbox` または `\vcenter`の1つ）など、TeXエンジンがサポートする何百ものコマンドに対してです。マクロ（ユーザー定義コマンド）にもコマンドコードが割り当てられます。
* **コマンド修飾子**：これはTeXにコマンドに関する具体的情報を与える補助情報です。マクロ（ユーザー定義コマンド）にもコマンド修飾子が割り当てられますが、マクロではコマンド修飾子は原始命令の場合とは少し異なる役割を果たします（マクロでは、コマンド修飾子はマクロ定義がメモリ上のどこに保存されているかを示します）。

2つを合わせると、コマンドコードとコマンド修飾子によって各コマンドが一意に識別されます。ここでは、クヌースの元のTeXソフトウェアで使われているマクロ定義コマンドのコマンドコードとコマンド修飾子を示します。なお、他のTeXエンジンでは異なる値を使う場合がありますが、原理はまったく同じです：

|          |                                                      |                                                      |
| -------- | ---------------------------------------------------- | ---------------------------------------------------- |
| **コマンド** | <p><strong>コマンド</strong><br><strong>コード</strong></p> | <p><strong>コマンド</strong><br><strong>修飾子</strong></p> |
| `\def`   | 97                                                   | 0                                                    |
| `\gdef`  | 97                                                   | 1                                                    |
| `\edef`  | 97                                                   | 2                                                    |
| `\xdef`  | 97                                                   | 3                                                    |

### おさらい：これらの変数/値をどう理解するか

ここまでで、値、変数、コマンド値、その他いろいろな細部についてたくさんの情報が出てきて、すぐに混乱しがちです。そこで、私たちが知っていることを整理しましょう。TeXが入力から何かを読むと、それは文字かコマンドのどちらかです。TeXが入力から何かを読むたびに、直前に読み取った（走査した）ものに関する情報を保存する必要があります：

* 〜については **文字**：文字コードとカテゴリコードを記録する必要があります。また、TeXがそれらの値を使って計算するトークン値も作成して保存する必要があります。
* 〜については **コマンド**：TeXは、コマンド名から計算した数値の等価値、 **curcs**を知る必要があります。さらに、TeXの「辞書」でコマンドを検索して取得した「意味」、つまりコマンドコードとコマンド修飾子を保存する必要があるかもしれません。これに加えて、TeXはこのコマンドを表すトークン値も計算する必要があります。

そう、混乱します。たくさんの変数やトークンの考えが飛び交っているので、これを整理してみましょう。

内部では、TeXは直近に読み込んだ（または現在「処理中」の）項目に関する情報を保存するために4つのグローバル変数を使います。これらの変数を詳しく扱うことはしませんが、その存在を知っておくと、実際に何が起きているのかを理解するための少し背景になります：

* **curcmd**：（現在のコマンド）整数変数です。処理中のコマンドの *現在のコマンド* の値を保存するために使われます *または* 直前に読み込まれた *カテゴリコード* であり、処理中の文字の
* **curchr**：（現在の文字）整数変数ですが、何を保存するかはTeXが入力から直前に何を読み取ったかによって異なります：
* **文字**：直近に読み込まれた項目が文字であれば、 **curchr** が現在の *文字コード*.
* **コマンド**を保存します：直近に読み込まれた項目がコマンドであれば、 **curchr** を保存します *コマンド修飾子*：TeXが **curcmd**を支援/明確化するために使う追加情報――というのも、上で見たように、いくつかのコマンドは同じ **curcmd**
* **curcs**：（現在の制御綴り）文字列のコマンド名に含まれる文字から計算された値を保存する整数変数です。 **curcs** ＝ もし最後に読み取った項目が個々の文字であり、制御綴り（コマンド名）ではなかった場合、0になります；
* **curtok**：（現在のトークン）現在のトークンの値を保持する整数変数です。これはコマンドトークンか文字トークンのいずれかです。

上の情報を表にすると次のとおりです：

|                        |                                                                                                                                                                 |                                                                                                              |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| **TeX内部で使われるグローバル変数：** | **TeXが文字をスキャンするとき：**                                                                                                                                            | **TeXがコマンドをスキャンするとき：**                                                                                       |
| **curcmd**             | 現在の文字のカテゴリコードを保存する                                                                                                                                              | を保存する *コマンドコード*――これは現在のコマンドの「種類」を識別する                                                                        |
| **curchr**             | 現在の文字の文字コードを保存する                                                                                                                                                | 補助データ（ *コマンド修飾子*と呼ばれる）を保存する。これは現在のコマンドに関する追加情報を与える                                                           |
| **curcs**              | 0                                                                                                                                                               | コマンド名に含まれる文字列を使って（ハッシュ関数を介して）計算されるゼロでない正の整数です。TeXの「辞書」にアクセスして、現在のコマンドの意味を検索し、そのコマンドコードとコマンド修飾子を取得するために使われます。 |
| **curtok**             | 8ビットTeXエンジンでは、 *文字トークン* は次の式で計算されます： $$\text{curtok}=256\times \text{curcmd} + \text{curchr}$$ ここで $$\text{curcmd}$$ は文字のカテゴリコードであり、 $$\text{curchr}$$ は文字コードです | 8ビットTeXエンジンでは、 *コマンドトークン* は次の式で計算されます： $$\text{curtok}=4095 + \text{curcs}$$                                 |

### 現在のトークンについての補足

文字については、最大のカテゴリコード（15）と、8ビットTeXエンジンでの最大の文字コード255を使うと、可能なトークン値の最大値が得られます。理論上（8ビットTeXエンジンでは）、最大の文字トークン値、 $$\text{curtok}\_{\text{max}}$$、は次のとおりです：

$$\text{curtok}\_{\text{max}}= 256\times 15 + 255 = 4095$$

「理論上」と言うのは、カテゴリコード15が「無効文字」を表すために使われ、TeXがエラーを生成するからです。無効文字はTeXの入力走査プロセスを通過できないため、文字トークンになることはありません。

コマンドについては、現在のトークン（$$\text{curtok}$$）は $$\text{curtok}=4095 + \text{curcs}$$ から計算されますが、コマンドの場合は $$\text{curcs}$$ は *常に* が0以外なので、TeXはそのトークンが何を表すかを簡単に判断できます：

* もし $$\text{curtok} > 4095$$ ならば、それはコマンドトークンです；
* もし $$\text{curtok} < 4095$$ それは文字トークンです。

実際には、TeXは入力から読み取った項目について知る必要があるすべての情報を、単純な整数値であるトークンを使って「まとめ」ています。

## 第4部

パート4では、一連の例のマクロを取り上げ、マクロの `<parameter text>` 節が、区切りトークンの使用によって構成できる「トークンテンプレート」として機能する役割と目的を示します。

[第1部](/latex/ja/sononotopikku/19-how-tex-macros-actually-work-part-1.md) [第2部](/latex/ja/sononotopikku/20-how-tex-macros-actually-work-part-2.md) [第3部](/latex/ja/sononotopikku/21-how-tex-macros-actually-work-part-3.md) [第4部](/latex/ja/sononotopikku/22-how-tex-macros-actually-work-part-4.md) [第5部](/latex/ja/sononotopikku/23-how-tex-macros-actually-work-part-5.md) [第6部](/latex/ja/sononotopikku/24-how-tex-macros-actually-work-part-6.md)


---

# 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/sononotopikku/21-how-tex-macros-actually-work-part-3.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.
