> 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/20-how-tex-macros-actually-work-part-2.md).

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

[第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)

## はじめに: 画像で見る物語

第1部で述べたように、TeX はあなたの `.tex` ファイル内のすべての文字を「読む」必要があり、その読み取り処理は、より正確には *スキャン*と呼ばれます。伝統的に、TeX の入力処理（スキャン）は、TeX が入力を観察するための「目」を持っていることになぞらえられるので、以下の図ではその昔ながらの比喩を採用します。

### 図1: 目が準備完了

TeX が何らかの入力を `.tex` ファイルから受け取り、私たちの文字列を処理しようとしていると仮定します `Hello World \jobname` これはテキストの段落内に含まれています。TeX は各文字を順に確認し、そのカテゴリコードを調べます。

![テキストの行をスキャンする準備ができた TeX の目](/files/216323a0b528303b8de4803a63c82cda62b75c1b)

### 図2: カテゴリコードの処理

次の図では、TeX がさまざまなカテゴリコードにどう反応するかを、概略（詳細は下）で示します。カテゴリコードは全部で 16 個ありますが、わかりやすくするため、ここでは 11、10、0 の 3 つだけを示しています。他の文字コードは、表の作成、数式の組版、マクロ引数の認識など、TeX の組版処理で重要になります。

![いくつかの異なるカテゴリコードに反応する TeX](/files/54e84840a411df603ada5d8c20dd430233881fb5)

#### 図2 の注記

ここでは、TeX がテキスト段落の一部を構成する文字を読み取っている（スキャンしている）様子を考えます。TeX は各文字を調べ、そのカテゴリコードを確認し、カテゴリコードと TeX の「モード」（現在何をしているかに基づく状態）に応じて適切な処理を行います。

* **（緑の目）** TeX はそれらの文字のそれぞれがカテゴリコード 11（「文字」）であることを認識し、構築中の段落の一部としてそれらの文字を組版へ回します。ただし、TeX は文字コードだけを渡す（使う）わけではなく、代わりに数の組（文字コード、カテゴリコード）を用いて、 *文字トークン* と呼ばれる複合整数値を計算します（以下参照）。その文字トークンが生成されると、TeX の内部の組版処理／アルゴリズムへ入ります。
* **（青い目）** TeX はカテゴリコード 10（「スペーサー」）の空白文字（ASCII 32）を見ます—なお、前述のとおり、空白（ASCII 32）や任意の文字のカテゴリコードは、TeX に読み込まれる前に別の値へ変更されている可能性があります。

カテゴリコード 10（「スペーサー」）を持つ文字を TeX が実際にどう処理するかは、TeX がそれをいつ／どこで目にするか—つまり TeX の現在の「モード」—によって異なります。たとえば、TeX が単にそれらを飛ばすだけの場面もあります。ここでは、TeX は段落テキストを処理している最中にカテゴリコード 10 の文字（たまたま空白、ASCII 32 です）を検出したことを認識するので、最終的にはいわゆる interword glue に変換します。これは、伸び縮みできる柔軟な空白の一種です。

* **（赤い目）** ここでは、TeX が非常に重要なカテゴリコード 0（エスケープ文字）を持つ文字を認識したところです。

エスケープ文字—*任意の* カテゴリコード 0 を持つ文字は、TeX に特別な読み取りモードへ切り替えさせ、その後続の文字を注意深くスキャン（読み取り）するよう指示します。なぜなら、それらの文字が *コマンド*、組版されるテキストではありません。TeX の文献では、「command」という用語はまた *制御綴り*。エスケープ文字を見た後、TeX はその直後に続く文字のカテゴリコードを確認します *直後に続く*; これは、TeX が 2 種類のコマンドを認識するからです：

* 複数文字のコマンドは「 *制御語*」と呼ばれます：エスケープ文字の直後に続く文字のカテゴリコードは 11 です。カテゴリコード 11 を持つそれ以降の文字は、コマンド名の一部とみなされます。TeX は、コマンド名の一部をなす文字を探すのを、ある文字を検出した時点で停止します。その文字が *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* カテゴリコード 11 を持たない—たとえばカテゴリコード 10 の空白文字のような文字です。
* 単一文字のコマンドは「 *制御記号*」と呼ばれます：エスケープ文字の直後に続く文字は *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* カテゴリコード 11 を持ちません。

エスケープ文字は、TeX に通常のスキャン動作から「逃が」して、次のいくつかの文字に対して別の扱いを採らせる引き金だと考えることができます—これは赤い点線の枠で示されており、TeX が **コマンドのスキャンを開始する**.

### 図3: カテゴリコード 11（「文字」）の処理

このシリーズの第1部で、TeX が入力から読み取る各文字は 2 つの整数で表されると述べました：

* 文字コード: 文字の数値表現を定める整数；
* カテゴリコード: TeX が入力に現れうるすべての文字に割り当てる 0 から 15 までの値。

TeX は処理の次の段階、つまり文字トークンの生成でこの 2 つの情報を使います。

図3 は図2を拡張し、カテゴリコード 11（文字）を持つこれらの入力文字に TeX が何をするかを示します：TeX は *文字トークン*を生成します—それは、その文字のカテゴリコードと文字コードの組み合わせを使って TeX が計算する整数値です。

**注**：この例ではカテゴリコード 11 を持つ文字だけを扱っていますが、TeX は他のカテゴリコードを持つ入力文字についてもトークン値を生成することに注意してください—ただし、カテゴリコード 0 は例外で、これは決してトークンには変換されません。エスケープ文字は単に特別な処理を引き起こすための「スイッチ」として働くだけです。

![カテゴリコード 11 を持つ文字を処理する TeX](/files/79c364b66bc702e5c492a07a4fd325a0ad6fc3bf)

下の図 5 では、TeX がカテゴリコード 0（エスケープ文字）を持つ文字を見たときに何をするかを示します。

#### 図3の注記: カテゴリコード 11（「文字」）の処理

ここでは、 **green** 動作に焦点を当てます：TeX がカテゴリコード 11（「文字」）を持つ文字を見たときに何が起こるか。TeX が文字を読み取り、そのカテゴリコード（ここでは 11）を判定した後、次に TeX が行うのは *結合することです* この数の組を「文字トークン」と呼ばれる 1 つの整数にまとめます。これらのトークン（整数）は TeX の内部組版アルゴリズム／処理の次の段階へ渡されます。前述のとおり、TeX は他のカテゴリコード（つまり 11 以外）を持つ文字についても文字トークンを生成しますが、ここでは例としてカテゴリコード 11 だけを使っています。

各文字トークン（整数）は、入力文字と、その文字に割り当てられたカテゴリコードを永久に結び付けます **TeX にスキャン（読み取り）された時点で**：TeX／LaTeX マクロの振る舞いを理解するうえで、その事実は極めて重要です。もちろん、後続の処理では、TeX がそのトークンを構成した (文字コード、カテゴリコード) の組を特定するために、文字トークンを分解する必要が生じることがあります。しかし、一度文字が TeX の入力（スキャン）処理によって読み込まれると、TeX が計算した文字トークン値によって、その文字は *永久に* 割り当てられたカテゴリコードと結び付けられます *読み込まれた時点で*.

**文字トークンの計算**

TeX エンジンは、 $$T$$、カテゴリコードが $$C$$ で文字コードが $$A$$:

$$T = \text{constant} \times C + A$$

pdfTeX などの 8 ビットエンジンでは次の式を使います：

$$T = 256\times C + A$$

Unicode 対応エンジン、たとえば XeTeX や LuaTeX は、別の式を使わなければなりません。というのも、Unicode では文字コードが、古い 8 ビット ASCII エンコーディングの世界における最大値 255 よりもはるかに大きくなり得るからです。たとえば XeTeX では次の式を使います：

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

繰り返しになりますが、カテゴリコード 0 を持つ文字は文字トークンには変換されないことに注意する価値があります：カテゴリコード 0 は TeX の入力フィルタリングにおいて非常に特別な位置を占めており、TeX を次の数文字を特別モードでスキャンさせるための純粋な「スイッチ」としてのみ使われます。図5 がこれを扱います。

### 図4: カテゴリコード 10（「スペーサー」）の処理

カテゴリコード 10（「スペーサー」）の文字を TeX がどう扱うかは、入力の中でカテゴリコード 10 の文字を検出したときに TeX が現在何をしているかによって決まります。この例では、TeX は通常の段落処理を行っており、カテゴリコード 10 の空白文字は interword glue に変換されます。

![カテゴリコード 10 の文字を処理する TeX](/files/bc82d033f53e3d6e8751bd6ee3e2723f6050ae9c)

TeX の空白の扱いはかなり独特に見えるかもしれませんが、 [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) Victor Eijkhout による [無料の PDF 版をダウンロードできます](https://bitbucket.org/VictorEijkhout/tex-by-topic) 彼のウェブサイトから。

たとえば、TeX がカテゴリコード 10 の文字を見ると、TeX が次のことをする場面があります：

* それらをすべて飛ばす（無視する）—たとえば TeX が縦モードにあるとき；
* 複数のスペーサーを 1 つのスペーサーに変換する—段落を処理しているときの余分な空白を飛ばす；
* それらを吸収する—たとえば、コマンド名の後ろにある 1 つの空白を吸収する；

さらに、TeX が次のこともする場面があることに注意してください *生成する* —行末文字を空白に変換して空白を生成します。空白文字（カテゴリコード 10 を持つ任意の文字）の振る舞い／扱いは、TeX の「癖」の 1 つです。この TeX の側面に慣れ（快適に扱えるよう）になるには、時間と練習が必要です。

### 図5a: カテゴリコード 0（「エスケープ文字」）の処理

この図では、TeX は `\` カテゴリコード 0 を持つ文字までのすべての文字を処理しています。その文字は「エスケープ文字」です—TeX がエスケープ文字をどのように処理し、コマンド名をどのように特定するかを示すために、さらに別の図の連続を使います。

![カテゴリコード 0 の文字を処理する TeX](/files/c4ddd4c5064c2b7f2649ecedc77574d1fa32cd9b)

### 図5b: コマンド名を探す

この図では、赤い点線の枠の部分（**コマンドのスキャンを開始する**）を拡大して、TeX がエスケープ文字を見た後に何をするかを見ます。

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

**図5b の注記**

* 認識されると、エスケープ文字は役目を終えます。スイッチとして働き、その後の処理には一切関与しません—具体的には、 **、** 文字トークンに変換されません。
* 便宜上、先ほど触れた詳細をいくつか繰り返します。エスケープ文字を見た後、TeX はその後に続く文字のカテゴリコードを確認します *直後に続く*; これは、TeX が 2 種類のコマンドを認識するからです：
* * 複数文字のコマンドは「 *制御語*：エスケープ文字の直後に続く文字のカテゴリコードは 11 です。カテゴリコード 11 を持つそれ以降の文字は、コマンドの名前を構成するものとみなされます（*制御語*）。TeX は、コマンド名の一部をなす文字を探すのを、ある文字を検出した時点で停止します。その文字が *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* カテゴリコード 11 を持たない—たとえばカテゴリコード 10 の空白文字のような文字です。
  * 単一文字のコマンドは「 *制御記号*」と呼ばれます：エスケープ文字の直後に続く文字は *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* カテゴリコード 11 を持ちません。
* この例では、 `\` の後の最初の文字は `j` （カテゴリコード 11）であり、TeX に対して、カテゴリコード 11 を持つ文字からなる複数文字の並びである可能性があるコマンドを探すよう指示します。
* TeX はカテゴリコード 11 を持つ文字をさらに探し続けます。カテゴリコード 10 の空白のような、他のカテゴリコードを持つ文字を検出するとすぐに、TeX はコマンド名の終わりに達したことを知ります。強調しておくと、ここでは空白文字（カテゴリコード 10）がコマンドの終わりを「終了」させましたが、そうではない **もの** カテゴリコード 11 を持ちません。

## 第3部

はカテゴリコード 11 を持たない—たとえば、

[第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/20-how-tex-macros-actually-work-part-2.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.
