> 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/21-how-does-expandafter-work-tex-uses-temporary-token-lists.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)

## 展開と内部トークンリスト

ここまでで、トークン、トークンリスト、そして TeX の展開という概念の背後にある基本原理を見てきました。この節では TeX のプリミティブである `\jobname` を用いて、展開処理の重要な側面、すなわち TeX が用いる *一時的なトークンリスト*—これは *基本的な* の一面です。 `\expandafter` がどのように働くかについては、この連載の後半で見ていきます。

`\jobname` は、展開可能な TeX のプリミティブで、その展開によって、メイン入力の名前を表す一連の文字トークンが生成されます `.tex` ファイルです。たとえば、次のようなテキストが `.tex` という名前のファイルの一部だとしましょう `mycode.tex`:

```
    私のファイル名は \jobname .tex %\jobname の後の空白に注意
```

これは次のように組版されます

```
    私のファイル名は mycode.tex です
```

私たちが `\jobname` コマンドを使うと、生成される組版済み文字は、物理的な `.tex` ファイルから読み取られるわけではありません。では、それらはどこから来るのでしょうか。TeX はそれらのトークンをどこに保存し、どこから読み取るのでしょうか。ユーザーには見えないところで（つまり TeX 自体の奥深くで）、 `\jobname` は、ファイル名を表す一連の文字トークンから構成された一時的なトークンリストを作成します。いったん `\jobname` がそのトークンリストを作成すると、TeX は一時的に現在の入力元（ここでは、私たちの `.tex` ファイル）から、その一時的なトークンリストにあるトークン（文字トークン）を読み取るように“視線を移します”。TeX が次の入力トークンを必要とすると、その内部リストから次のトークンを読み取り、リストの末尾に達するまでそれを続けます。そこで TeX は以前の入力元からトークンの読み取りを再開します。ここではそれは、私たちの `.tex` 入力ファイルから読み取ったテキストです。

次の図に示すように、TeX は `.tex` を処理したあとに停止した、ちょうどその位置から入力ファイルの読み取りを再開します `\jobname`—つまり空白文字を読み取った後で、「.」文字を読み取る前です。ピリオド (.) は、実際には TeX の入力バッファから読み取られるのを待っています。入力バッファは、 `.tex` ファイルから読み取ったテキストの1行を保持するよう設計された TeX の小さなメモリ領域です。TeX はあなたの `.tex` ファイルを一度に1行ずつ読み取り処理し、ファイル全体をメモリに読み込むことはありません。

次の図を読むときは、下から上へとたどって処理の流れを追ってください。

![TeX はどのように \jobname を展開するか](/files/823e133c244c635a68d450768da580e8208ad6ab)

展開についての議論に戻ると、 `\jobname` の展開の結果、 `\jobname` コマンド（トークン）が *取り除かれ* 入力から消え、 *置き換えられました* 。展開によって生じたトークン、すなわち `.tex` ファイルから読み込んだときに最初に生成された。

展開可能なコマンド（たとえば `\jobname`）だけが、その効果を得るために“ひそかに”トークンリストを作成して使用する TeX のプリミティブではありません。たとえば、コマンド `\uppercase` と `\lowercase` はどちらも、引数の大文字小文字を変換するために内部トークンリストを作成します。大文字小文字の変換が終わると、TeX はそれらのコマンドによって生成されたトークンリストから文字トークンの読み取りに切り替えます。トークンリストは、物理的なディスクファイルへデータを書き出す場合を除けば、TeX における唯一の「トークンデータ保存」機構です。

### トークンの供給元：TeX は見事なジャグラー

TeX が通常の文書を処理するときには、 *多くの* トークンの供給元を管理しなければなりません。すなわち、数多くの物理ディスクファイルから来る入力と、処理中に作成される無数の内部トークンリストです。この節では、TeX がそれらの入力元をどのように“巧みに扱う”のかを、ごく簡単に見ていきます。

私たちの `.tex` ファイルに記録していることを確認してください:

```
    \def\myfile{私のファイル名は \jobname .tex です}
```

後で、私たちの `.tex` ファイル内でマクロ `\myfile`：一時的に、TeX はあなたのテキスト（`.tex`）ファイル中のテキストからトークンを生成・読み取りする状態から、 `\myfile` メモリに保存された定義（トークンリスト）を読み取る状態へ切り替わります。TeX が `\myfile` マクロを実行するとき（そのトークンを処理するとき）、TeX は `\jobname` コマンドを表すトークンを検出します。その展開は、TeX がトークンを読み取る必要のある、さらに別の一時的なトークンリストを生成します。この単純な場面でも TeX は3つの入力元を管理しなければなりません。

1. その `.tex` を含むテキストファイル `\myfile` マクロ；
2. を定義として格納するトークンリスト `\myfile` マクロ；
3. によって作成されたトークンリスト `\jobname` コマンドが `\myfile` マクロ内にある。

TeX が文書を処理する際には、物理ファイルとトークンリストという入力元の間を絶えず切り替えています。では TeX はこれをどう把握しているのでしょうか。答えは、内部的に TeX エンジンがいわゆる [入力スタック](https://en.wikipedia.org/wiki/Stack_\(abstract_data_type\)) を保持しており、これが一種の“記憶”として働いて、TeX が入力元を切り替える際に、それまで何をしていたか（どこから読み取っていたか）を思い出せるようにしています。

細部にはあまり立ち入らずに言うと、TeX エンジン内部のコードは、 `curinput` （current input）というグローバル変数を使っており、これによって TeX は、現在物理ファイルから読んでいるのかトークンリストから読んでいるのかなどを判断します。 `curinput` また、TeX に対して、次のトークンを取得すべき位置（現在のトークンリストまたはそのテキストバッファ内）も指し示します。TeX がトークンリストから読んでいる場合、 `curinput` は、どの種類のトークンリストを処理しているのか—たとえば、マクロとして格納されたトークン列なのか、あるいはそれらのトークンが別の供給元から生じたものなのか—も記録します。

必要に応じて、 `curinput` 変数の指す先は新しい入力元に変更され、TeX の現在の“入力状態”（供給元と位置）は入力スタックに保存されます。こうして TeX は後でその正確な位置（ `.tex` ファイル内の位置、あるいはトークンリスト内の次のトークン）へ戻れるようになります。新しい入力元が尽きると（たとえばトークンリストにもうトークンがない、またはファイルの末尾に達する）、それはスタックから取り出され、 `curinput` が更新されて、TeX が前の供給元からトークンを再び取得するようになります。

## さらに深く掘り下げる（任意の読み物）

以下の節では、細部を楽しみたい読者向けに、追加の背景情報を提供します。

### 実際のトークンリスト

次の図は、TeX の内部データやデータ構造にアクセスできる Overleaf 独自ビルドの Knuth の TeX を使って生成したものです。このトークンリストの図は、上で示した簡略版を土台にしており、さらに `\jobname` は、通常のカテゴリコード 11 ではなくカテゴリコード 12 を持っています。この図では「node」は、TeX が使うメモリ記憶単位に付けられた名称にすぎません。

![TeX のトークンリストの内部](/files/2618484a8bd24e3ca29ea3511f963d00746d1f01)

### TeX はどのように \jobname を読み取り処理するか

また、補足として、TeX が `\jobname` 私たちの入力の中で `.tex` ファイル内でそれを検出する際の TeX の“思考過程”の概要です。この図では、TeX がエスケープ文字（`\` カテゴリコード 0 の文字）を検出し、文字列 `jobname`を処理してトークンを生成し、 `\jobname` コマンドの意味を調べる様子を示しています。そこで TeX は、そのコマンドコードが 100 より大きいことを見つけ、それが展開可能なコマンドであること

![TeX はどのように \jobname を走査して処理するか](/files/41b905eaf1bd0c20c48e4d9f62aea828952e6e36)

[第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/21-how-does-expandafter-work-tex-uses-temporary-token-lists.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.
