> 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/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md).

# \expandafter はどのように動作するか：TeXトークン入門

[第1部](/latex/ja/xiang-xi-ji-shi/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [第2部](/latex/ja/xiang-xi-ji-shi/22-how-does-expandafter-work-the-meaning-of-expansion.md) [第3部](/latex/ja/xiang-xi-ji-shi/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [第4部](/latex/ja/xiang-xi-ji-shi/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [第5部](/latex/ja/xiang-xi-ji-shi/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [第6部](/latex/ja/xiang-xi-ji-shi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## 「\expandafter」の背景：TeXトークンとトークンリスト

どのように `\expandafter` 実際にどのように動作するのかを理解するために、TeXの動作に不可欠な2つの要素を見ていきます。 `\expandafter`：TeXトークン（整数）とトークンリスト（整数のリスト）。これらの話題をさらに詳しく知りたい読者は、Overleafが公開している次の記事を読むとよいでしょう：

* [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マクロは実際にどのように動くのか？](/latex/ja/sononotopikku/01-a-six-part-series-how-do-tex-macros-actually-work.md)

### トークンデータはどこから来たのか？

この記事全体を通して、TeXが計算した実際のトークン値を使います。これは通常ユーザーにはアクセスできないデータです。このトークン値データがどのように得られたのか気になる読者のために、Overleafでは研究用にいくつかのTeXエンジンを独自ビルドしています。これらのエンジンは、TeXの内部処理活動に関する情報を出力するように改変されており、私たちが制作する一部の記事のための追加の背景資料の提供に役立っています。数値のトークン値を示したり議論したりすることで、読者が「TeXトークン」をよりよく理解できるような詳細を盛り込み、この重要な概念を少しでもわかりやすくすることを目指しています。

## TeXトークン入門（および展開の概念）

TeXが入力ファイルを処理するとき、テキストを読み取り、個々の文字や文字列（コマンド）をいわゆる *トークン*トークンに変換します。TeXトークンとは、TeXが計算する単なる整数値であり、現在の入力ソースから読み取った項目についてTeXが保存する必要のあるデータを「符号化」するために使われます。トークンは、TeXが後続の処理段階へ渡す準備として記録すべきデータをひとまとめにした、小さな情報の小包だと考えてください。内部的には、TeXはこれらの整数トークン値を使って動作しており、入力ファイルに元々含まれていた実際の文字、記号、数字などは使いません。すべてがトークン（整数）に変換され、TeXはそれらを使って処理します。

## TeXがトークン値をどのように計算するか

ここでは、KnuthのオリジナルTeX、e-TeX、pdfTeXで使われるトークン計算を見ていきます。ほかのTeXエンジン、特にXeTeXやLuaTeXでは、Unicodeの使用に対応するためトークン計算は少し異なりますが、計算方法は以下で説明するものと似ています。

### 文字トークン（非アクティブ文字）

非アクティブ文字のトークン値の計算は単純です：

$$\text{character token} = 256\times \text{(category code)} + \text{character (ASCII) code}$$

**例**：文字Aに [カテゴリコード](/latex/ja/sononotopikku/43-table-of-tex-category-codes.md) カテゴリコード11、文字コード65は、TeXでは次の文字トークン値で表されます： $$256\times 11 + 65 = 2881$$.

TeXの文献では、TeXがいったん文字を入力すると、そのカテゴリコード値がその文字に「恒久的に結び付けられる」と説明されることがあります。上のトークン値の計算は、それがなぜ成り立つのかを示しています。ただし、TeXの後続処理では、文字トークンを「展開して」、そのトークンが構成された元の（文字コード、カテゴリコード）の組を取り出すことができます。TeXがその「展開」を行っても、その文字のカテゴリコード自体は変更されず、その後の処理でその情報を使うだけです。

### コマンドトークン

TeXの入力処理とトークン生成では、コマンドには2種類あると認識されます：

* カテゴリコード11を持つ1文字以上から構成されるコマンド；
* その文字のカテゴリコードが11ではない単一文字コマンド。たとえば `\$` または `\#`.

どちらの場合も、TeXは先頭の `\` 文字を除外し、残りの各文字の文字コードを使って、TeXが `curcs` (**cur**rent **c**ontrol **s**equence)。TeXはその値を用いて `curcs` コマンドのトークン値を計算します。

#### カテゴリコード11の文字から作られるコマンド

先頭の `\` 文字を除いたコマンドが、次の文字列から構成されているとします： $$\mathrm{C\_1C\_2C\_3...C\_N}$$ ここで $$\mathrm{C}\_i$$ は各文字の文字コードです。たとえばAの文字コードは65です。TeXはすべての文字コードを使って $$\mathrm{C}\_i$$ 整数を計算します `curcs` （ [ハッシュ関数](https://en.wikipedia.org/wiki/Hash_function)）。TeXが `curcs` その値を計算すると、単純に4095を足して、次のトークン値を得ます：

$$\text{command token} = \text{curcs + 4095}$$

変数 `curcs` はTeXの内部処理活動で非常に重要な役割を果たします。

#### 単一文字コマンド

次のようなコマンドを表すトークンは `\$`, `\#` などとは少し異なる計算の対象になります。整数 `curcs` の計算式はより単純です：

$$\text{curcs} = 257 + \text{character (ASCII) code}$$

たとえば `\$`, $$\text{curcs}=257 + 36 = 293$$。TeXはこの値にも（ $$\text{command token} = \text{curcs} + 4095$$）を用いて4095を加え、 `\$` はトークン値 $$293 + 4095 = 4388$$.

カテゴリコード11の文字で構成されるコマンドと比べると、ここでの唯一の違いは、TeXが次の値を計算する方法です： `curcs`.

**注**：整数 `curcs` は文字トークンでは計算されません。TeXが文字トークンを作成するとき、または扱うときは常に0に設定されます。

#### アクティブ文字トークン

TeXにはいわゆる *アクティブ文字*という概念があります。カテゴリコード13が割り当てられた任意の文字です。この特殊な文字クラスのトークンは、通常の文字とは異なる計算の対象になります。

アクティブ文字の仕組みにより、TeXは実質的には1文字マクロを作成でき、それを *ことなく* アクティブ文字の前にエスケープ文字（通常は `\`）を付ける必要なく使えます。単独の文字がそのマクロとしての挙動を引き起こします。典型例は、TeX/LaTeXで改行不可スペースに使われるチルダ文字（\~）で、次のように定義／有効化できます：

```
\catcode`~=13 % ~ にカテゴリコード13を割り当てる
\def~{\penalty100000\ } % ~ をマクロとして動作するよう定義
```

TeXがその後 `~` 文字を読むと、そのカテゴリコードが13であることを検出し、「ミニマクロ」として処理します。アクティブ文字を表すトークンを計算するために、TeXは次の計算の別バージョンを適用します： `curcs`:

$$\begin{align\*} \text{curcs} &= \text{character code} + 1\ \text{active character token} &= \text{curcs} + 4095\ \end{align\*}$$

たとえば、\~文字の文字コードは126なので、そのアクティブ文字トークン値の表現は次のように計算されます：

$$\begin{align\*} \text{curcs} &= 126 + 1\ \text{active character token} &= 127 + 4095\ &=4222\ \end{align\*}$$

なお、コマンドと同様に、アクティブ文字を表すトークンは4095より大きくなります。

### 結果／注意点

* 値が4095を超えるトークンは、ただちにコマンドトークンとして識別できます。したがってTeXは、特定のトークンが文字を表すのかコマンドを表すのかを非常に簡単に判別できます。
* どのトークン値でも、必要に応じてTeXはそのトークンを「展開」し、元々あなたの `.tex` ファイルにあった文字（およびそのカテゴリコード）、あるいはコマンドを明らかにできます。これらはマクロ定義に保存されていたり、別のトークンリストに含まれていたりします。
* いわば中間量である `curcs`—TeXがコマンドトークン値を計算するために用いるもの—は、TeXの低レベル処理で重要な役割を果たします。 `curcs` は、TeXがコマンドの現在の意味を保存・検索するために使う「索引値」として機能します。任意のコマンドトークンについて、 $$\mathrm{T}$$、TeXは4095を引くだけで `curcs`: $$\text{curcs} = \mathrm{T}-4095$$

ちなみにTeXは、コマンドトークンを生成した人間可読な文字列も保存しています。これはエラー報告や、次のような他のコマンドに不可欠です： `\string` これは展開するとトークン値の人間可読版になります。ただし、TeX内部に保存されているそれらの人間可読な文字列は、要求されたときにのみ使用・出力されます。それ以外のすべての処理ではトークンの整数値が使われます。

## 実際のトークンを見てみる

トークンという概念を少しでも分かりやすくするために、次の簡単なマクロを定義し、TeXが生成するトークンを見てみましょう：

```
\def\hello{Greetings, from \TeX. \hskip 10pt}
```

〜については `\hello` マクロでは、TeXは次の文字を使って `h`, `e`, `l`, `l`, `o` の値3745を計算します： `curcs`；その後TeXは4095を加えて、次のトークン値を作成します： $$3745 + 4095 = 7840$$ （KnuthのTeX、e-TeX、pdfTeXの場合）。

を表すトークンを作成した後、 `\hello`で述べたように、 `\def` コマンドにより、TeXは続くトークンを読み取り、それらを使ってトークンリストを作成し、それを *定義* として `\hello` コマンドに保存します。その保存された定義（トークンリスト）は、TeXにそのコマンドを使うよう指示したときにいつでも取り出せます。 `\hello` コマンドで囲めるようになります。

次の表は、以下の中に含まれる各項目（文字、マクロ、あるいはプリミティブ）について実際に作成されたトークン値を示しています： `\hello` マクロ定義—このトークン（整数）のリストこそが、TeXがメモリに保存するものです（ [連結リスト](https://en.wikipedia.org/wiki/Linked_list)というデータ構造として）。トークンリストをさらに詳しく理解したい読者は、Overleafの記事 [TeXトークンリストとは何か？](/latex/ja/xiang-xi-ji-shi/54-what-is-a-tex-token-list.md)

|              |            |
| ------------ | ---------- |
| **TeXトークン値** | **表される項目** |
| 2887         | G          |
| 2930         | r          |
| 2917         | e          |
| 2917         | e          |
| 2932         | t          |
| 2921         | i          |
| 2926         | n          |
| 2919         | g          |
| 2931         | s          |
| 3116         | ,          |
| 2592         |            |
| 2918         | f          |
| 2930         | r          |
| 2927         | o          |
| 2925         | m          |
| 2592         |            |
| 5235         | \TeX       |
| 3118         | .          |
| 2592         |            |
| 7943         | \hskip     |
| 3121         | 1          |
| 3120         | 0          |
| 2928         | p          |
| 2932         | t          |

上のトークンリストでは、文字のカテゴリコードは10、11、または12です。たとえば：

* 文字はカテゴリコード10、文字コード32を持ち、トークン値は $$256\times 10 + 32 = 2592$$
* `,` と `.` はカテゴリコード12で、文字コードはそれぞれ44と46です。そのためトークンは次のようになります：
* 〜のトークン `,` $$= 256 \times 12 + 44 = 3116$$
* 〜のトークン `.` $$= 256\times 12+ 46 = 3118$$

TeXが後でトークン値7840（ `\hello`を表す）に出会うたび、必要ならそのトークンを「展開」して `curcs` 次の単純な計算によって $$\text{curcs} = \text{token value} - 4095$$ （上記参照）。 `curcs` TeXは内部データ表を参照して、コマンドトークン7840がマクロコマンドを表すことを判断できます。さらに、再び `curcs`を通じて、TeXは保存された `\hello`.

TeXがトークン7840を完全に処理する必要がある、つまり `\hello` マクロを実行するときには、もはやトークン7840は必要ありません。そのトークンは *役目を終えています*—つまり、TeXにマクロを実行させたのです `\hello`。TeXはこれでトークン7840を破棄し、メモリに保存された定義（トークンリスト）を表すトークンを取り出せます。実際には、 `\hello` マクロコマンド（トークン7840）は *取り除かれ* TeXの現在の入力ソースから *置き換えられ* て、次の定義に含まれるトークンに `\hello`。ここまで説明したのは、トークン展開の一形態です。 *トークン展開*.

その `\TeX` コマンド（上に挙げたトークン値5235）は、 `\hello` それ自体がさらに多くのトークンから構成されたマクロなので、その定義もトークンリストとして保存されています：

|              |            |
| ------------ | ---------- |
| **TeXトークン値** | **表される項目** |
| 2900         | T          |
| 19598        | \kern      |
| 3117         | -          |
| 3118         | .          |
| 3121         | 1          |
| 3126         | 6          |
| 3126         | 6          |
| 3127         | 7          |
| 2917         | e          |
| 2925         | m          |
| 19597        | \lower     |
| 3118         | .          |
| 3125         | 5          |
| 2917         | e          |
| 2936         | x          |
| 6175         | \hbox      |
| 379          | {          |
| 2885         | E          |
| 637          | }          |
| 19598        | \kern      |
| 3117         | -          |
| 3118         | .          |
| 3121         | 1          |
| 3122         | 2          |
| 3125         | 5          |
| 2917         | e          |
| 2925         | m          |
| 2904         | X          |

もし `\hello` コマンドを、それを構成するトークンの完全なリストに置き換え、さらに `\TeX` マクロも展開すると、かなり長いリストになります。つまり、 *展開した* その `\TeX` マクロも含めて展開すると、次のようになります：

![TeXマクロに保存されたトークンのリスト](/files/763088bde2ba0b54c791d6f8d3125d0d56a8fa0a)

要するに、単一のトークン値7840（ `\hello`を表す）は、完全に展開すると、文字とプリミティブコマンドを表す合計51個のトークン（整数）を生成します。以下の一覧では、各トークンが表す文字またはコマンドを括弧「(...)」に入れて示しています。これらはTeXのトークンリストに直接保存されているわけではなく、読者の理解を助けるために表示しています：

```
2887 (G), 2930 (r), 2917 (e), 2917 (e), 2932 (t), 2921 (i), 2926 (n), 2919 (g), 2931 (s), 3116 (,), 2592 (<space>), 2918 (f), 2930 (r), 2927 (o), 2925 (m), 2592 (<space>),  2900 (T), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3126 (6), 3126 (6), 3127 (7), 2917 (e), 2925 (m), 19597 (\lower), 3118 (.), 3125 (5), 2917 (e), 2936 (x), 6175 (\hbox), 379 ({), 2885 (E), 637 (}), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3122 (2), 3125 (5), 2917 (e), 2925 (m), 2904 (X), 3118 (.), 2592 (<space>), 7943 (\hskip), 3121 (1), 3120 (0), 2928 (p), 2932 (t)
```

人間の読者には単なる整数の列ですが、TeXにとっては多くの情報を符号化しています。

## 今トークンを読み取り、後で使うために保存する

TeXが入力を読み進める際、特定のトークン群の完全な処理を遅らせる必要がある（あるいはそう指示される）ことがあります。そう指示されると、TeXは停止するよう言われるまで入力からトークンを作成し続けますが、それらは後で使うために保存され、その後、組版処理の一部として取り出して処理します。そうして保存されたトークンは、いわゆる *トークンリスト* これは実質的に、TeXにおける唯一の（内部）トークンデータ保存機構です。

すでにトークンリストの例を見ました。つまり、 `\hello` と `\TeX` 上に挙げたマクロです。これらのマクロの定義は、TeXのメモリにトークンのリストとして保存されています。TeXは、あなたがそれらのマクロを呼び出すと決めたときにのみ、そのようなトークンリストを処理（実行）します。また、各トークン（整数値）には、マクロ定義に保存された各トークンが文字を表すのかコマンドを表すのかをTeXが簡単に判別できるだけの十分な情報が符号化されていることも覚えておいてください。

### トークンをトークンレジスタに保存する

トークン保存の別の例は、いわゆる *トークンレジスタ*です。これは、TeXがユーザーのために提供する、トークンリストを保存する専用の内部記憶領域です。TeXのプリミティブ `\toksdef` はトークンレジスタを使う一つの方法です。たとえば、トークンレジスタ `100` を使い、次のコマンドで参照します `\mylist`:

```
        \toksdef\mylist=100
        \mylist={some \TeX{} tokens here}
```

`\mylist` は実質的には、レジスタ位置に保存されたトークンのリストに付ける名前にすぎません `100`。マクロ定義と同様に、 `\mylist` には次のトークンリストが含まれます：

|              |            |
| ------------ | ---------- |
| **TeXトークン値** | **表される項目** |
| 2931         | s          |
| 2927         | o          |
| 2925         | m          |
| 2917         | e          |
| 2592         |            |
| 5235         | \TeX       |
| 379          | {          |
| 637          | }          |
| 2592         |            |
| 2932         | t          |
| 2927         | o          |
| 2923         | k          |
| 2917         | e          |
| 2926         | n          |
| 2931         | s          |
| 2592         |            |
| 2920         | h          |
| 2917         | e          |
| 2930         | r          |
| 2917         | e          |

**注**：次の `\TeX` マクロを終了させ、続く `<space>` 文字を取り込まないようにするため、波括弧のペアを使いました `{}` の直後に `\TeX`— `{` (379)と `}` (637)がトークンリストに保存されます。別の方法として、「制御スペース」トークン `\<space>` を使う方法もあり、トークンリストには下のように表示されます（太字）：

|              |            |
| ------------ | ---------- |
| **TeXトークン値** | **表される項目** |
| 2931         | s          |
| 2927         | o          |
| 2925         | m          |
| 2917         | e          |
| 2592         |            |
| 5235         | \TeX       |
| **4384**     | **\\**     |
| 2932         | t          |
| 2927         | o          |
| 2923         | k          |
| 2917         | e          |
| 2926         | n          |
| 2931         | s          |
| 2592         |            |
| 2920         | h          |
| 2917         | e          |
| 2930         | r          |
| 2917         | e          |

なお、 `<space>` 文字は *文字トークン* 値の $$256\times 10 + 32 = 2592$$ しかし `\﻿<space>` は単一文字の *コマンドトークン* （値4384）として扱われ、上で示した式で計算されます：

\begin{align\*} \text{curcs} & = 257 + \text{character (ASCII) code}\\\ & = 257 + 32\\\ &=289\\\ \text{command token for} \left<\text{\\\space}\right> & = \text{curcs + 4095}\\\ & = 289+4095\\\ &=4384\\\ \end{align\*}

要するに `\mylist={some \TeX{} tokens here}` はTeXにこう伝えます。入力ファイルを走査して、以下の文字／コマンドをトークンに変換し、後で使うために保存してください。TeXはそれに応じて、そのトークンを `\the\mylist`と書くことでアクセスできるメモリ位置に保存します。これによりTeXに、トークンレジスタ `\mylist`に含まれるトークンのコピーを挿入するよう指示します。TeXエンジンには、トークンリストを明示的に生成・保存するプリミティブコマンドがいくつかあります。たとえば `\everyjob`, `\everypar`, `\mark`、その他多数があります。

[第1部](/latex/ja/xiang-xi-ji-shi/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [第2部](/latex/ja/xiang-xi-ji-shi/22-how-does-expandafter-work-the-meaning-of-expansion.md) [第3部](/latex/ja/xiang-xi-ji-shi/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [第4部](/latex/ja/xiang-xi-ji-shi/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [第5部](/latex/ja/xiang-xi-ji-shi/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [第6部](/latex/ja/xiang-xi-ji-shi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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/xiang-xi-ji-shi/19-how-does-expandafter-work-an-introduction-to-tex-tokens.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.
