> 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/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# \expandafter はどのように動作するか：展開の意味

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

## TeXの「展開」という概念の紹介

これまでに見てきた [TeXのトークンとトークン列](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true)、次に私たちの背景トピック一覧で取り上げるのは `\expandafter` は、TeXの *の展開*：TeXの中核的な処理 `\expandafter` が扱うように設計されています。

### 展開を説明する難しさについて...

私たちの多くにとって、TeXの展開という概念や、その背後にある理由・仕組みは、混乱しがちです。簡単かつ簡潔に *完全に* 説明するのは容易ではありません。TeXの内部操作や処理の多くは非常に複雑に相互関連しており、TeXの動作のある側面を「解剖」しようとするとき、つまりプログラム全体から切り離して論じようとすると、難しさが生じます。展開はまさにその種の概念に当てはまります。なぜなら、それは *基本的な* TeXの動作を構成する要素であり、TeXの内部処理全体に深く組み込まれているからです。しかし、本記事では展開の説明を組み立てようと試み、読者がそこから発展させていける土台を提供します。

TeXの展開機構を説明するために、私たちは段階的に進め、関連するさまざまなトピックを見渡して、それらを組み合わせながら、TeXのこの重要な要素に対する理解を深めていきます。記事の後半では、細部好きで少し冒険心のある読者向けに、TeXそのものの内部をのぞき込み、展開プロセスを動かしている主要なソースコードを要約して紹介します。

### TeXトークンの要点

以下の議論を通して忘れてはならない重要な点は、TeXが次の入力項目を2つの供給源から取得できることです：

1. **物理的なテキストファイル**：生成する *新しいトークン* これらのファイル内の文字やコマンドを読み取り／走査することによって、あるいは
2. **トークン列**：既存の *あらかじめ用意された*トークンを、TeXのメモリに保存された状態から読み取ることで入力を得ること。

また、TeXは、読み込んだあらゆる項目（文字またはコマンド）に関する情報をきれいに「梱包」する便利な方法としてトークンを用いることも思い出してください。

TeXが *新しいトークン* トークンを生成しているとき、それは *トークン生成の時点で*、そのトークン値を計算している項目に関する情報へ即座にアクセスできます。たとえば、新しいコマンドトークンを生成する際、TeXはまず `curcs` という値を計算し、これにより、これから生成しようとしているトークンが表すコマンドに関する情報を検索できるようにします。

しかし、TeXがトークン列（ *保存されたトークン*の並び）から読み取っている場合、その列にあるトークンが何を表すのかを判定する前に、まずそのトークンを「開梱」する必要があります。たとえば、TeXがマクロ定義の一部として保存されたトークンを読んでいる場合、それらのトークンは、ずっと前に読み込まれ、トークンへ変換されて保存されたテキストから生成されたものです。トークンの種類（文字またはコマンド）によって、TeXの「開梱」が実際に何を意味するかが決まります：

* の *コマンドトークン* （トークン値が4095より大きい）： `curcs` を通じて $$\text{curcs}=\text{token value}-4095$$ を用いて `curcs` コマンドに関する情報を検索する；
* の *文字トークン* （トークン値が4095未満）：文字トークンを、その構成要素である（文字コード、カテゴリコード）の組に分解する。

### はじめに...

展開の探究を始めるにあたり、TeXエンジンが、処理可能なコマンド群をどのように分類、あるいはカテゴリ分けしているかを見てみましょう。今のところ、「展開可能」とは、TeXコマンドの、まだ説明されていない何らかの「属性」にすぎないと仮定してください。

### 「展開可能」なコマンドの概念

TeXベースの組版プログラムすべて（TeX「エンジン」）は、主に2つの「クラス」のコマンドを理解します：

* 実行可能ファイルであるエンジン本体に組み込まれたコマンド：いわゆる *プリミティブ*;
* ユーザー定義のコマンド：いわゆる *マクロ*.

TeXエンジンはまた、すべてのコマンドを2つの समूहに分類する仕組みとして、コマンドの「振る舞い」の一種である「展開可能であること」も用います：

* 展開可能なコマンド；
* 展開不可能なコマンド。

したがって、すべてのコマンド（プリミティブ＋マクロ）の集合は、次の図のように分類できると考えられます：

![TeXコマンド全体の分類を示す図](/files/c04f255c9f80c6f131c0c105c0a2f584ff63cd43)

まだ展開／展開可能が実際に何を意味するのかは分かっていませんが、次のことは見て取れます：

* すべてのマクロは展開可能なコマンドに分類される；
* いくつかのプリミティブ（組み込み）コマンドも展開可能に分類される（大部分はそうではない）。

**アクティブ文字についての注意**：プリミティブとマクロに加えて、もう1つの「展開可能」な項目のクラスがあります。アクティブ文字です。カテゴリコード13が割り当てられた任意の文字も、「ミニ・マクロ」として処理されるため「展開可能」と見なされます。

#### TeXはどうやってコマンドが「展開可能」かどうかを知るのか？

TeXトークンに関する [議論から](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) 、トークンとは、TeXが計算し、入力項目（文字またはコマンド）に関する情報を「梱包」するために用いる整数にほかならないことが分かります。また、任意のトークン（整数）値が与えられれば、TeXは必要に応じて、トークン化の過程を逆にたどって、そのトークンを「開梱」し、それが表すコマンドや文字に関するデータを取り出せることも見ました。

TeXが新しいトークンを作成するときに生成されるデータ、あるいは既存のトークン――たとえば、マクロや別のトークン列に保存されたもの――から取り出したデータを使って、TeXは内部のデータ保存表を調べ、そのトークンが表すコマンド（または文字）に関する詳細情報を見つけることができます。次の図は、コマンドトークンを作成する（「梱包する」）過程と、その後TeXが何らかの情報を必要としたときに、その過程を逆にして（トークンを「開梱」して）特定のトークン値が表すコマンドに関するデータを得る流れを要約しています。

![TeXがトークンを梱包／開梱する仕組みを示す図](/files/83194044d707954ee60529177739e467086ea3aa)

### コマンドコード

TeXが各コマンド（プリミティブまたはマクロ）について保存している情報の一部には、 *コマンドコード*と呼ばれるものがあります。これは、TeXエンジンが内部的にコマンドを分類するために用いる整数値で、似た挙動・機能を持つコマンドは同じコマンドコードを共有します。

**注**：個々の *非アクティブな*文字について、そのコマンドコードは *カテゴリコード* です。これは、TeXがそれを読み込んだ（走査した）時点で割り当てられていたものです。なお、文字を除けば、コマンドコードはTeX内部のものであり、マクロやプリミティブコマンドから直接アクセスすることはできません。そうした詳細を知るにはTeXのソースコードを読む必要があります！

コマンドコードの例をいくつか挙げます：

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` （など）はすべて「箱作成」コマンドに分類され、コマンドコード20を共有します；
* `\def`, `\edef`, `\gdef`, `\xdef` はすべて「マクロ定義」コマンドで、コマンドコード97を共有します；
* すべてのマクロは、111、112、113、114のいずれかのコマンドコードに分類されます。異なるコマンドコードは、マクロを定義するときに `\long` または `\outer` を使うかどうかによって決まります：
* 111：非long・非outerのマクロのコマンドコード（例： `\def\foo{...}`)
* 112：longで非outerのマクロのコマンドコード（例： `\long\def\foo{...}`)
* 113：非longのouterマクロのコマンドコード（例： `\outer\def\foo{...}`)
* 114：longでouterのマクロのコマンドコード（例： `\long\outer\def\foo{...}`)

TeXはまた、コマンドのうち「展開可能」と分類される部分集合を識別するためにもコマンドコードを使います。そのためにTeXは、展開可能なコマンドに、しきい値100を超えるコマンドコード値を対応させます（この値は、KnuthのオリジナルTeX、e-TeX、pdfTeXで用いられています）。その結果：

* *展開不可能な* コマンド（大多数）はコマンドコードが100以下であり
* *展開可能な* コマンドはコマンドコードが100より大きくなります

したがって、TeXがあるコマンドの詳細を調べて、そのコマンドコードが100より大きいと分かれば、TeXはそれが展開可能だと即座に認識します。すべてのマクロと、少数のプリミティブ（組み込みコマンド）には、それが展開可能であることを示すコマンドコードが割り当てられます。では、なぜTeXはこの「展開可能」分類をわざわざ使うのでしょうか？おそらくお察しのとおり、これはそれらのコマンドがある種「特別」である、つまりTeXの *の展開*.

**注意（文字）**：文字がアクティブ（カテゴリコード13）として定義されていない限り、すべての文字は展開不可能です。アクティブ文字は、1文字の「ミニ・マクロ」と考えることができます。

## はいはい、でも展開って何？？？

トークン値が4095より大きいものはコマンドを表すために使われること、したがってTeXは必要に応じてそのトークンを「開梱」し、そのトークンが表すTeXコマンドに関する情報にアクセスできることを見てきました。TeXはそのコマンドのコマンドコード値を調べて、それが展開可能という特別なカテゴリに入るかどうかを判定できます。ではTeXはその情報をどう扱うのか、そして「展開可能であること」、すなわち展開は *実際には何を意味するのか*?

### 展開：一連の操作に対する総称

TeXの処理のある段階では、あるトークンが展開可能なコマンドを表すかどうかを知る必要があります：

* **いいえ**：そのコマンドトークンが *終了しません* 展開可能なカテゴリに入らないなら、TeXは単にそれを次の処理段階へ「渡す」だけです。
* **はい**：そのコマンドトークンが *は* 展開可能なカテゴリに入るなら、TeXはその特定のトークンを「ふるい落とす」結果になるような処理を行う必要があると考えることができます。TeXはそれを、そのトークンを「展開する」と呼ぶ処理、つまり展開の実行によって行います。

要するに、展開とはTeXが *取り除き* そのトークンを入力から *置き換える* ことであり、そのコマンド、または同じコマンドコードを共有するコマンド群に固有の「展開プロセス」から生じるトークンによって置き換えます。

TeXがいつトークン展開を行うのか、また行わないのかを知るには経験と慣れが必要です。The TeXbook の215ページには、展開可能なトークンが展開されない状況が列挙されています。実際、TeXの展開処理は複雑で、細かなニュアンスがあります。

#### どのコマンドが展開可能なのか？

TeXエンジンが展開可能だと分類するプリミティブ（組み込み）コマンドの一覧（たとえば The TeXbook の212〜215ページ）を見ると、実際には展開とは、TeXがやや雑多なコマンド群の振る舞いを表すために使うかなり一般的な用語であることが分かります。特定の（展開可能な）コマンドの展開結果はさまざまであり、機能ごとにグループ化した展開可能コマンドの集合を挙げることでそれが分かります。個々のコマンドの厳密な意味論はここでは重要ではありません。より注目すべきなのは、その動作の一般的な帰結、つまりその展開が実際に *行うこと、または実現すること*.

| **コマンド**                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | **説明**                                                                                   | **展開の振る舞い**                                                                                                                                                                                                                                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>すべてのマクロ</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                  | コマンド／文字トークンの保存された列                                                                       | <p>実質的には、マクロ展開とはTeXに読ませるためのトークン列を挿入することを意味します。これには次が含まれます：</p><ul><li>マクロ引数用のトークン列を作成すること――この過程には区切りトークンの識別／吸収が含まれます；</li><li>保存されたトークン列（マクロ定義）を取り出し、最初の段階で作成したパラメータトークンを（マクロ定義の中に）挿入する準備をすること。</li></ul><p>要するに、マクロ展開は <em>マクロトークンを取り除き</em> 入力から <em>それを</em> 定義に含まれるトークンで置き換えます。</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | 展開の順序を変える                                                                                | トークンのふるい分け／並べ替え                                                                                                                                                                                                                                                                         |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | 展開を防ぐ（はい、意外にもこれは展開可能なコマンドに分類されます）                                                        | 展開を遅らせる（ある種のトークンのふるい分け）                                                                                                                                                                                                                                                                 |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | ソースファイルを介して新しいトークンの供給源を入力することに関連する――はい、 `\scantokens` いわゆる「擬似ファイル」の使用によりこのカテゴリに入る        | 新しいトークンの供給源として機能する                                                                                                                                                                                                                                                                      |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | 条件式を開始する                                                                                 | トークンの「ふるい分け」を開始する：続くトークンのうち、どれを処理するかを決める。                                                                                                                                                                                                                                               |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | 条件式を終了する                                                                                 | トークンの「ふるい分け」を停止する：どのトークンを処理するかを決める                                                                                                                                                                                                                                                      |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | コマンドトークンを構築／生成する                                                                         | 一連のトークンを単一のコマンドトークンに変換する                                                                                                                                                                                                                                                                |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | 何かをトークン列へ変換する                                                                            | いくつかのトークン（内部の量や値を表すもの）を生成する                                                                                                                                                                                                                                                             |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` トークンの挿入など、さまざまな用途がある； `\detokenize` トークン列を文字トークンの列に変換する； `\unexpanded` トークンの展開を防ぐ | いくつかのトークンを挿入／生成する、または展開を制御する                                                                                                                                                                                                                                                            |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | 特殊な用途を持つトークン列にアクセスするためのコマンド                                                              | 保存されたトークンの供給源（トークン列）にアクセスする                                                                                                                                                                                                                                                             |

上の一覧から、コマンドのこの集合から何らかの「一般的な振る舞い」を抽出し、展開についての理解をさらに精密化できるでしょうか。かなり大ざっぱに言えば、コマンドを展開した結果は、いくつかの主要な活動に分けられます：

* トークン生成
* トークン挿入
* トークンのふるい分け
* 次のトークンの展開を変更／制御する

### そして最後に：展開の意味とは？

コマンドトークン（アクティブ文字を含む）の展開とは、TeXが **取り除き** そのコマンドトークンを入力から取り除き、 **置き換える** そのトークンを、その展開挙動から生じる他のトークン――トークンの生成／挿入、トークンのふるい分け、あるいは次のトークンの展開の変更／制御――で置き換えることだと考えられます。トークンが一度展開されると、TeXはその展開プロセスから生じた任意のトークンを引き続き読み取り／処理します。TeXがいつ、どこで展開を行うのかという問題はまったく別です。TeXの処理には多くの нюアンスと複雑さがあるため、本記事でそれを完全に扱うことは望めませんが、TeXの主要な入力処理動作の概要は示せます。

## 展開とTeXの構造

おそらく、TeXが展開可能なコマンドと展開不可能なコマンドをどのように、どこで区別しているかを見る最善の方法は、TeXのソースコードを見ることです。

内部的には、TeXはきわめて複雑なソフトウェアです。その結果、TeXの動作に本質的に備わる多くの微妙な挙動を完全に記述しようとするのは現実的ではありません。前述のとおり、TeXがトークンを読みながら実際にいつ展開を行うのかは「かなり複雑」です。したがって、以下の議論では、TeXが展開を行う必要がある状態にあるものと仮定します。TeXがトークンを読み取ったり生成したりするが展開は行わない状況には、 `\def` マクロ定義コマンドのためのトークンの生成／保存や、 `\toks` レジスタ

以下の図は、入力とトークン処理を扱うTeXの構造の中核部分を簡略化して示したものです。目的は、TeXの入力処理中に展開可能なトークンと展開不可能なトークンがどのように「ふるい分け」られるかを明らかにすることです。各主要関数の説明にはCプログラミング言語が使われていますが、Cに馴染みがなくても、基本構造は理解できるはずです。

![](/files/b8c5da2d0d4d1b4e8a04e4622b1c2b6dcda5f099)

### TeX構造図の説明

概略的には、TeXの処理は `maincontrol()` という関数によって駆動されます。TeXのソースコードの中でKnuthはこれを「chief executive（最高責任者）」と呼び、次のように説明しています：

> 「さて、 `maincontrol` ルーチンに来ました。ここにはマスター・スイッチが含まれており、TeXのさまざまな部分を正しい順序で仕事させます……ここがプログラムの大団円です……私たちは今や、網の中心、他のほとんどの部分に触れ、それらを結びつける中枢神経系の位置にいます。」

以下の説明はやや単純化されていますが、TeXベースのソフトウェアの根底にある構造の雰囲気を伝えます。展開可能なコマンドがTeXの入力処理の中でどのように識別され（「捕捉」され）てふるい落とされるか、ということです。

要するに、TeXの入力処理の最も初期の段階では、現在のコマンド（トークン）のコマンドコード値を使って、展開可能なコマンド（マクロ、展開可能なプリミティブ、アクティブ文字）を検出します。もしそれが見つかれば、そのようなコマンドは「捕捉」され、展開されることで「前処理」されます。このふるい分け（展開）プロセスによって、TeXは展開可能なコマンドを入力から取り除き、それぞれの展開挙動から生じるトークンで置き換えます。展開プロセスが完了すると、TeXはその展開から生じたトークンを読み取ります。次の段階へ渡されるのは展開不可能な項目だけです。そこはTeXの「ビッグ・スイッチ」であり、TeXはすべての展開不可能なプリミティブコマンドを実行し、文字を組版します。

### maincontrol()を理解する

この `maincontrol()` 関数には大きな、いわゆる [switch文](https://en.wikipedia.org/wiki/Switch_statement)――Knuthはこれを「ビッグ・スイッチ」と呼びます――が含まれており、TeXはこれを使ってすべての *展開不可能な* プリミティブコマンド（コマンドコードが100以下のもの）を実行します。

特定のコマンド（または文字）を実行するために、この「ビッグ・スイッチ」文はTeXの現在のモードの組み合わせを使います：

* 内部／外部垂直モード、または
* 制限付き／段落水平モード、または
* 行中／ディスプレイ数式モード

*と* および各プリミティブまたは文字のコマンドコードの値――文字のコマンドコードは *非アクティブな* その *カテゴリコード* 値です。念のため言うと、TeXの6つのモードはすべて整数値が割り当てられており、TeXはそれを使って、数式、段落、箱などさまざまな構成要素を組版する際に、現在のモードを保存・復元します。TeXの各モードに割り当てられた整数は次のとおりです：

|          |                    |          |
| -------- | ------------------ | -------- |
| **モード**  | **意味**             | **モード値** |
| 外部垂直     | 段落の間（ページを組み立てる）    | 1        |
| 内部垂直     | 直ちにある `\vbox{...}` | -1       |
| 水平       | 段落を組版／構築するとき       | 102      |
| 制限付き水平   | 直ちにある `\hbox{...}` | -102     |
| ディスプレイ数式 | 組版 *表示* 方程式／数式     | 203      |
| 行中（数式）   | 組版 *インライン* 方程式／数式  | -203     |

内側垂直モードと外側垂直モードのような、各モードの補集合に負の値を使っていることに注意してください。 `maincontrol()`でコマンドを処理するとき、TeXは現在のモードの絶対値――つまり負号を無視した値――を使います。したがって、たとえばTeXがどちらかの水平モードにあり、カテゴリコード11の文字を処理する必要がある場合、 $$102 + 11 = 113$$ を使って、水平モード（段落の構築または `\hbox`).

#### 次のトークンの取得

この `maincontrol()` 関数は `getxtoken()` 関数を呼び出して次の入力トークンを取得します。その後、 `getxtoken()` 最下層の入力関数 `getnext()`を呼び出します。 `getnext()` が作業を終え、主要な *グローバル変数*, `getxtoken()` の値を設定した後、直前に読み込んだ項目がマクロまたは展開可能なプリミティブを表すかどうかをテストします。

についての注記 `getnext()` や `getxtoken()`:

* **`getnext()`**：これはTeXの中核入力関数です。物理ファイルから入力された文字を読み取り処理するか、トークン列からトークンを読み取ります。なお `getnext()` は実際にはトークン値を計算しませんが、多くの重要な *グローバル* 変数（たとえばコマンドコードや `curcs`）を設定し、それらは後の処理で使われます。
* **`getxtoken()`**：『拡張トークンを取得』は `getnext()` を使って次の入力項目を読み取ります。そして、その読み込んだ項目のコマンドコードを調べ、その項目が展開可能なコマンドかどうかを確認します。もしそうであれば、それは展開されるか、またはマクロが呼び出されます。展開不可能な項目については、 `getxtoken()` がトークン値を計算し、その詳細は次の処理段階――展開不可能なプリミティブが実行され、文字が組版される「ビッグ・スイッチ」――へ渡されます。

要するに、 `getxtoken()` を通じて `maincontrol()`に進む前に、すべての展開可能な項目が「ふるい落とされる」のです。これによりTeXの「ビッグ・スイッチ」は展開不可能なプリミティブコマンドだけを処理することになります。

繰り返しになりますが、上の図は単純化であることを強調しておきます。TeXの他の処理領域でもトークンは展開されるからです。たとえば：

* TeXが数値を探している（走査している）ときは、整数を求める探索の中で展開を引き起こします（ `getxtoken()`) ;
* というプリミティブコマンドを呼び出して `\romannumeral` ）。この事実の繊細な使い方については記事「 [を使った展開 `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) 」を参照してください；
* この `\edef` （「展開定義」）マクロ定義コマンドは完全展開を強制します；
* TeXは `\halign` または `\valign` のプリアンブルを処理するとき、ある時点でトークンを展開します（どちらのコマンドも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)


---

# 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/22-how-does-expandafter-work-the-meaning-of-expansion.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.
