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

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

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

## はじめにと概要

第4部では、TeXマクロの基本的な性質をいくつか確認しました。これは、TeXマクロの基盤となる仕組み、つまり特殊なトークンリストを詳しく見る次の2本の記事に備えるためです。最後の2本の記事では、ノードリストと呼ばれる図を使います。これらは、Knuth の元の TeX ソフトウェアを特別に改変した版で生成されたデータから作成したものです。これらの改変は、通常はユーザーからアクセスできない TeX の内部データ構造にアクセスするためのものでした。TeX の内部のマクロ処理および実行ルーチンに「フックする」ことで、図表データを書き出すことができ、それにより TeX のマクロ処理の動作をより詳細かつ正確に説明できるようになりました。Overleaf は、これらの図が、TeX マクロが実際にどのように動作するのかを読者がより深く理解する助けになることを願っています。

### 追加の背景資料として読めるかもしれないもの

Overleaf では、TeX トークンと TeX トークンリストについての追加情報を提供する、トークン関連の2本の記事をすでに公開しています。この連載の第5部と第6部を最大限に活用できるよう、理解の抜けを埋める必要がある場合は、ぜひ時間を取って読んでみてください。

* [「TeX トークン」とは何か？](/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md)
* [TeX トークンリストとは何か？](/latex/ja/xiang-xi-ji-shi/54-what-is-a-tex-token-list.md)

## トークンリストとしてのマクロ

TeX がマクロ作成コマンド（`\def`, `\edef`, `\gdef` または `\xdef`）を入力ストリーム内で検出すると、 `<parameter text><replacement text>` の両方を、1つの長いトークンリストに変換する処理が始まります。ただし、これは非常に特殊な種類のトークンリストです。

マクロ用のトークンリストは、TeX の中で使われる他のトークンリストとは少し異なります。なぜなら、TeX 自身の内部処理だけが作成・生成できる「特別な」トークン値を含んでいるからです。これらの特別なトークンは、.tex ファイルに含められるどのコマンドからも直接作成できません。TeX は、以下で説明するように、マクロ呼び出しの処理を助けるために、こうした「特別な」トークン値を作成して使用します。

### トークンリストの保存方法についての簡単な説明：ノード

トークン（整数値）のリストを保存するために、TeX は [連結リスト](https://en.wikipedia.org/wiki/Linked_list)と呼ばれるデータ構造を使います。TeX の場合、それは *ノード*と呼ばれる要素のリストから成ります。ノードは、データ項目の集合を保存するために使える、コンピュータメモリの小さなパッケージのようなものだと考えてください。マクロを保存する際、これらのノードは鎖のようにつながれ、各ノード（鎖のリンク）はトークン値や、リスト内の次のノードのメモリアドレスなど、いくつかの情報を保持できます。さらに詳しく知りたい場合は、記事 [TeX トークンリストとは何か](/latex/ja/xiang-xi-ji-shi/54-what-is-a-tex-token-list.md) を読むことができますが、次の図はトークンリストとして保存されたマクロの主要な特徴を要約しています。

![連結されたノードリストとして保存された TeX マクロのトークンリストの図](/files/f73153afe43c15266c82f13ad74e7054ef15708d)

### 復習：マクロ定義の4つの部分

第4部で説明したように、どんなマクロでもその構造は次のように書けます。

```
<TeX macro primitive><macro name><parameter text>{<replacement text>}
```

次のとおりです：

* `<TeX macro primitive>` = 次のいずれか `\def`, `\edef`, `\gdef` または `\xdef`;
* `<macro name>`= マクロの名前。たとえば `\foo`;
* `<parameter text>` は「空」（存在しない）こともあれば、区切りトークンとマクロパラメータトークンの文字列であることもあります。
* `<replacement text>` はマクロの実際の本体であり、マクロを呼び出したときに「実行」される部分です。

**注意**： （第4部でも見たように）以下の説明全体では、 `<macro name>` の後にはカテゴリコード10の空白文字が続き、 `<macro name>`を終端する区切りとして機能するものと仮定しています。 *ない* ことを明示的には本文や説明の中で示していませんが、そこにあるものとして扱います。厳密には、次のように表すべきでしょう。

```
<TeX macro primitive><macro name><space><parameter text>{<replacement text>}
```

ただし、 `<空白>` 文字を明示的に含めることは省き、その存在を暗黙に仮定します。

**注意**： 文字 `{` や `}` *は* マクロトークンリストの一部にはなりません。その目的は、単に TeX の入力スキャナ（トークンを作成するもの）に対して、 `<replacement text>` がどこで始まりどこで終わるかを知らせることです。

TeX がマクロを定義するとき、 `<parameter text><replacement text>` の各部分は1つの長い連続したトークンリストに変換されます。そのリストに含まれるトークン総数は、マクロの複雑さに依存します。前述のように、 `<replacement text>`.

には「トークンのテンプレート」あるいは「設計図」としての特定の役割があり、TeX はこれを使って、実際のマクロに用いる引数（値）を構成するトークン、つまり

```
に渡すトークンを取り出します。
```

これらの考えをはっきりさせるために、短めにして後続の図があまりごちゃごちゃしないような、例のマクロを使ってみましょう。 `\foo`

* `<parameter text>` = `A#1\fake`
* `<replacement text>` = `123 #1`

この例は単純なマクロですが、調べるのに必要な要素はすべて含まれています。

すでに述べたように、TeX は `<parameter text><replacement text>` を1つの長いトークンリストに変換します。その様子は下の図で見ることができます。この例では、 `A#1\fake{123 #1}` から形成されたトークンは、トークンリスト（ノードの連結リスト）内に連続したトークン列として変換されています。

## 実際のマクロトークンリストを示す図

次の図は、マクロ `に渡すトークンを取り出します。` がどのように保存されるかを示しており、TeX エンジン内部の実データを使っています。これは、 [Knuth の TeX を改変したカスタマイズ版](/latex/ja/xiang-xi-ji-shi/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) で作成され、マクロ呼び出しを横取りし、TeX の内部データを調べて、 [Graphviz](https://www.graphviz.org/).

次の図は [PDF ファイル](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) （675 KB）または [SVG ファイル](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) （1.8 MB）としてダウンロードできます。

![注釈付き TeX トークンリストの図](/files/c98f66837ede616757d19506ae92d92c3f1b6621)

#### ノードを理解する

上の図では、各ノードに **次ノード** と **現在のノード**と呼ばれる2つのデータ項目が含まれているのがわかります。これらは単なる整数値で、TeX 内部のメモリ位置、つまり他のノードが保存されている場所を表しています。 **次ノード** や **現在のノード** の値

![次ノードと現在のノードの意味](/files/d9acbe425a20c4e8ec75dcda2102739c6856dd10)

#### 例に戻る

ノード図では、 `A#1\fake{123 #1}` から形成されたトークンリストには、本記事の冒頭で導入したいくつかの「特別なトークン」が含まれています。さらに、私たちのマクロを表すノードリストは「特別な最初のノード」から始まります。これらが何か、そして何をするのかを見ていきましょう。

マクロのトークンリストの最初の項目は、（他のいくつかの種類のトークンリストでも同様に）トークン値を保存するのではなく、マクロの *参照カウント* というデータ項目を保存します。これは TeX がマクロの使用状況を追跡するために使います。

![参照カウントノードはトークンリストの最初のノードです](/files/42180f620ed282d05f2053b2e1e0d66276a94d86)

の最初のトークンは `<parameter text>` のすぐ後に続くノードに保存されます。そこには、カテゴリコード11の文字 `ある` を表すトークンが入っているのがわかります。第2部および第3部での説明から、文字トークンは

$$\text{token value}=256\times \text{category code} + \text{character code}$$

を使って計算されることがわかっています。 `ある` の場合、カテゴリコード11の文字

$$\text{token value}=256\times 11 + 65$$

では

#### ノード図に示されているように、2881 という値になります。

\foo に使われる「コマンド」\fake `に渡すトークンを取り出します。` 私たちのマクロ定義の中では、区切り文字の1つが *未定義の* コマンド `\fake` であり、これはトークンリストの `<parameter text>` 部分の一部として保存されています。ご覧のとおり、マクロ全体のトークンリストの中では `\fake` は `19491`という値をもつトークンです。これは第3部で説明した式を使って TeX が計算した整数値です。TeX が `\foo` の実行を試みると、 `\fake` 部分の末尾で `<parameter text>` のトークン値を見つけることを期待します。TeX は *しません* 、 `\fake` コマンドを実行しようとはしません。なぜなら、その役割は `<parameter text>` 「トークンのテンプレート」内で単なる一種の「句読点」として機能することだからです。

![コマンドトークンをマクロ区切りとして使う](/files/010fe095b65e72549f6ef61e4bc592f6543ffb05)

#### トークンリスト内の特別なトークン

**「終端一致」トークン**

マクロを呼び出すと、TeX の最初の仕事は、ユーザーが入力したマクロを読み取り、ユーザーの `<parameter text>` 部分にあるトークンと、メモリに保存されたテンプレート `<parameter text>` （マクロ定義時に作成されたもの）に含まれるトークンとを比較することです。 `<parameter text><replacement text>` から構成されるマクロの完全な定義は、1つの長い連続したトークン列として保存されているため、TeX はそのトークン列の中で `<parameter text>` *終わる* がどこで、また `<replacement text>` *始まる*がどこであるかを知る必要があります。これを実現するために、TeX がマクロを定義するとき（トークンリストを構築するとき）には、 **終端一致** トークンと呼ばれる特別な終端トークンを、 `<parameter text>`と呼ばれます。 **終端一致** から生成されたトークン集合の最後のトークンとして挿入します。この `<parameter text>`.

![TeX トークンリストにおける終端一致トークンの表示](/files/d229e6b24811f61f978db203fc16dc12e1a999eb)

ここでは、 **終端一致** の直後に続く最初のトークンが、カテゴリコード12の数字 `1` を表すトークンであることがわかります。これは想定どおりです。なぜなら、 `<replacement text>` 私たちのマクロの `\foo` は `123 #1`は、つまりカテゴリコード12の数字 `1` を表すトークンで始まるからです。

第2部および第3部での説明から、文字トークンは

$$\text{token value}=256\times \text{category code} + \text{character code}$$

を使って計算されることがわかっています。 `1` の場合、カテゴリコード12の数字

$$\text{token value}=256\times 12 + 49$$

では

**「match parameter」トークン**

TeX がマクロ定義を保存するとき、パラメータトークン（`#1`, `#2`… `#9`）を `<parameter text>` というトークン、つまり **match parameter** トークンに変換します。これらのトークンは、TeX に対して、ユーザーのマクロ呼び出しの中から、マクロの引数となるトークンを探し始める必要があることを知らせます。

![TeX トークンリストにおける match parameter トークンの表示](/files/e2aeb032af1bb48e1f57a1a0f2fc4fed28687d5e)

### トークンリスト内の特別なトークン

#### 「出力パラメータ」トークン

TeX がすべてを処理し終えて、実際にマクロを実行（展開）できる状態になると、 **出力パラメータ** トークンは、TeX に対して `<replacement text>` 内のどこに、ユーザーがマクロ呼び出し時に提供した引数を表すトークンを流し込む必要があるかを指示します。実質的には、「この位置に、ユーザーの引数 n を表すトークンを挿入せよ。ここで n=1...9」です。

の中には `<replacement text>` として保存されたマクロ定義トークンリストの **出力パラメータ** に対応するトークンが、各 `#1`, `#2`... `#9` について存在します。

![TeX トークンリストにおける出力パラメータトークンの表示](/files/f34610e1a5d5ba86114fdc86de95c046a8eecc29)

私たちの `\foo` (`に渡すトークンを取り出します。`の定義を見ると、マクロパラメータは1つだけ（`#1`（\cite コマンドを通じて） `<parameter text>` (`A#1\fake`）で、その後に続くマクロパラメータ（`#1`）も1つだけが `<replacement text>` (`123 #1`に現れます。したがって、トークンリストに現れる **出力パラメータ** トークンは1つだけです。 `<replacement text>`.

次の点に注意してください。 `\foo`のノードリストでは、 `<replacement text>`:

* の直前のトークンが **出力パラメータ** トークンは空白文字（カテゴリコード10、文字コード32）を表します。これは、 `123` とマクロパラメータ（`#1`）の間に空白があるからです。 `\foo`;
* その **出力パラメータ** はリストの最後のトークンです。 **次ノード** は「null」（「空」を意味する）という特別な値を持ち、リストを終端するために使われます。 **出力パラメータ** の後にはもうノードはありません。これは最後のトークンであり、 `<replacement text>` の終わり、したがってマクロ定義の終わりを示しているからです。

## 第6部

第6部では、マクロ展開の正確な意味と、TeX がマクロ引数をマクロに渡す前にトークン化することの結果を説明し、詳しく見ていくために、いくつかの詳細な図を使います。 `<replacement 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/23-how-tex-macros-actually-work-part-5.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.
