> 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/54-what-is-a-tex-token-list.md).

# TeXトークンリストとは何ですか

## では、"TeX token list" とは一体何でしょうか？

ある [前の記事](/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md)—これもこの [低レベルなTeXの技術解説シリーズの一部です](/latex/ja/xiang-xi-ji-shi/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md)—TeXがあなたの `.tex` ファイルを走査して新しいトークンを生成する過程を見ました。TeXトークンの本質と、TeXがそれをどのように作るかを検討しました（参照 [「TeX トークン」とは何か？](/latex/ja/xiang-xi-ji-shi/53-what-is-a-tex-token.md)).

この続編では、〜を見ていきます *トークンリスト*です。トークンリストとは何か、そしてTeXエンジンはそれをどう作成し、どう使うのか。トークンリストの理解は少し難しいかもしれません。というのも、それらはTeXの内部の深いところに保存されており、そうした詳細は通常ユーザーの目からは隠されているからです――もっとも、LuaTeXで高度なプログラミングを行う場合は、今日では必ずしもそうとは限りません。ただ、いまのところは、トークンリストを「TeXが整数値の列を保存するための仕組み」と考え始めればよいでしょう。各整数は、TeXが入力ファイルから読み取った文字やコマンドに由来するトークンです。

トークンリストはTeXの内部動作で重要な役割を果たし、しばしば次のような少し意外な形で使われます。たとえば、〜のようなコマンドの内部動作です。 `\uppercase` や `\lowercase`です。トークンリストの特に重要な用途の一つは、マクロの保存と実行です。この話題は、このシリーズの次回の記事で詳しく見ていきます。

### TeXはファイルとトークンリストから入力を受け取ります

TeXエンジンには3つの入力元があります。ご存じかもしれないものが2つあります。

* ディスクに保存された物理的なテキストファイル;
* ユーザーが端末（コマンドライン）に入力するテキスト;

しかし、入力を読み取る／取得する第3の方法もあります。トークンリストです！

トークンリストは、実際にはTeXが動作の一部として使う内部データ保存機構です。TeXのトークンリストは、以前に作成されたトークンの「保管庫」として機能するので、それらを別の入力元として再利用できるのは理にかなっています。次の入力を特定のトークンリストから取る必要が生じたとき（あるいはTeXにそう指示したとき）、TeXは一時的に物理ファイルからの入力読み取りを止め（つまり、 *新しいトークン*）の生成を止め、入力の取得元を *既存のトークン*：トークンリストが格納されているメモリ上の場所へ切り替えます。明らかに、トークンリストでは走査とトークン生成の過程はすでに終わっているので、TeXはリスト内の各トークンを見て、それぞれをどう処理するかを決めるだけです。

例として手短に言うと、低レベルの（TeXのプリミティブである） `\toks` コマンドを使うと、TeXが後で再利用できるようにメモリに保存するトークンのリストを作成できます。

```latex
\toks100={Hello}
```

それらのトークンを取り出すには（つまり、TeXに次の入力元として扱わせるには）、次のようなコマンドを出します。

```latex
\the\toks100
```

これにより、TeXは入力ファイルから新しいトークンを作るのをやめ、次の入力をそれらのトークン（によって作られたもの）が `\toks`）保存されている場所から取るようになります。いわゆる *トークンレジスタ* です。これはTeXに知られている内部メモリ上の位置にすぎません（ここではレジスタ100です）。

さらに、トークンリストは多くのTeXコマンドによって、その場で内部的に生成されることがあります。たとえば次のコマンドです。 `\jobname` TeXが処理しているメインファイル名の各文字ごとに1つ、文字トークンの列を生成します。別の例は `\string` コマンドです。たとえば

```latex
\string\mymacro
```

は、名前の各文字ごとに文字トークンの列を生成します。 `\mymacro`—先頭の `\` 文字も含めてです。この記事の最後で、いくつかの「トークン生成コマンド」を詳しく見ていきます。

## トークンリスト：比喩で説明する

プログラミングの経験やコンピュータ科学の知識がないと、「トークンリスト」はやや曖昧で、少し混乱しやすい概念かもしれません。しかし、TeX/LaTeXマクロを自在に書けるようになりたいなら、TeXトークン、トークンリスト、カテゴリコード（`\catcode`）といった話題をよく理解しておくことは、非常に役立ちます。

この節では、比喩を使ってTeXトークンリストの核心的な考え方／原理、つまりTeXがトークンをメモリにどう保存するかを説明・図解します。トークンリストは *基本的な* TeXの要素であり、もう少し詳しく理解する価値があります。

### トークンリスト：比喩（思考実験）

TeXトークンリストを理解するための基礎として、「思考実験」を行います。何百もの缶のような大量の容器を使えると想像してください。思考実験の容器を表すのに「箱」という言葉は使えません。もちろん「box」にはTeXで非常に特定の意味があり、ここでの議論とはまったく関係ないからです。そこで、容器を「Tin」と呼ぶことにします。各Tinは次のようなものです。

* 外側に固有の識別番号が印字されている;
* 内部的に2つの区画に分かれている。

その2つの区画は次のように設計されています。

* 左側の区画には、Tinに入れたい物を入れる;
* 右側の区画には、別のTinを識別する番号を1つ書ける紙を入れるようになっている。

![テスト](/files/958725f5715f3c226711f1e62f98291a58ad9c02)

たとえば5個のアイテムがあり、その集合をそれらのTinに保存したいとします。しかし残念ながら、各Tinには保存したい種類のアイテムを1つしか入れられません。

簡単のため、5つの色付きの円を保存したいとしましょう。

![{{{alt}}}](/files/d8acb8adcd3229797e32c7109402f2cde4503712)

さらに、その保存システム（Tin）からそれらのアイテムを取り出しに戻るとき、それらのアイテムは *必要があります* 特定の順序で取り出され／見つかる必要があります。つまり、保存された順番です。その順序は保持されなければなりません。どうすればそれを実現できるでしょうか？

各Tinが次のような性質を持つことを利用できます。

* 外側に固有の識別番号が付いている;
* 2つの区画があり、そのうち1つだけをアイテムの格納に使い、もう1つには別のTinの番号を書いた紙が入っている。

すべてのTinは空だと仮定しましょう。ただし、特定のTinを開けて空かどうか確認するのは自由です。空でなければ、空のTinが見つかるまで次を試します。

やり方は次のとおりです。最初のアイテム（濃い緑の円）をTinの1つ（たとえばTin 124）に入れ、その最初のTinの番号を記録します。最初のTinの番号が何であるかは重要ではありません。重要なのは、どこかに書き留めて後で使えるように保存しておくことです。

![{{{alt}}}](/files/210360b654eee14d552d7ba471ee6da91b33144c)

2つ目のTinを見つけます。どのTin番号でもかまいません（たとえばTin 432）。その番号を記録します。その2つ目のTin（432）の番号を紙に書き、そのメモを *最初のTinの中に* （Tin 124）入れます。2つ目のアイテム（薄い緑の円）を2つ目のTinに入れます。すると、現在は次のような状況になります。

* Tinには保存されていない書き付けがあり、最初のTinは124番だと示している（そこに最初のアイテムが入っている）;
* Tin 124の中には、次のアイテムはTin 432にあると書いた別のメモが入っている。

要するに、私たちは *連結しました* 最初の2つのTinを結びつけたのです。どこから始めるか（Tin 124）が分かっており、Tin 124のメモが次のアイテムを含むTin（Tin 432）を教えてくれます。

![{{{alt}}}](/files/76810e5f791fcc003cde3faf66a2dca8b794d2ac)

次に3つ目のTinを見つけ、その番号（たとえばTin 543）を紙に書いて、それを *2つ目の* Tin（432番）に入れます。そして3つ目のアイテム（赤い円）を3つ目のTinに入れます。

これで3つのTinが順に連結されました。開始点のTin 124（濃い緑の円）→ Tin 432（薄い緑の円）→ Tin 543（赤い円）→…

![{{{alt}}}](/files/43f4b376d40a048ef1814915088c065141319c75)

残りの2つのアイテム（薄い青と濃い青の円）についても、Tin 213（薄い青の円）とTin 102（濃い青の円）を使ってこの手順を繰り返します。

![{{{alt}}}](/files/f9f8cfb6cd4b8fe402b4a0010e3a756f2b412149)

これで5つすべてのTinが（それぞれのTinの数値識別子を使って）連結され、各Tinを順に訪れてアイテムを取り出し、次のアイテムが入っているTinを示すメモを見るだけで、保存したすべてのアイテムを正しい順序で取り出せるようになります。

### リストの最後のアイテム（Tin 102）はどうでしょうか？

なぜこの1つだけを気にする必要があるのでしょうか。これまで、各アイテムをTinに保存し、次のアイテムが入っているTinを示すメモを添えてきました。では、リストの最後のアイテムについてそのメモには何を書けばよいのでしょうか。次のTinが存在しないのです。

最後のアイテム（Tin）にたどり着いたとき、このTin（最後のアイテムを含む）がリストの最終要素であることが明確でなければなりません。別のTinを探す必要はありません。存在しないからです。そのための方法の1つは、最後のTin（102）の中に「特別な」Tin番号を入れておくことです。実在するTinの番号ではない一意の番号を選べば、好きな番号を使えます。たとえば「Tin -1」「Tin 0」などです。「Tin -1」や「Tin 0」などを見たらすぐに探索を止めるべきだと分かればよいので、重要なのはそこです。これが最後の1つであり、もう取り出すアイテムはないのですから、これ以上Tinを探す必要はありません。

### 「アイテム」と「Tin」からトークンとTeXへ

ここで、比喩からTeXの実態に近い説明へ移る必要があります。まず、想像上のTinに色の違う円を保存する代わりに、それらのTinをTeXトークン、つまり単なる整数を保存するものだと考えればよいでしょう。これが、比喩をソフトウェア（TeX）の領域へ移すうえでの、より簡単な部分です。しかし、「区画」を持つ物理的な番号付きTinに相当するソフトウェア上のものは何でしょうか？

あまりプログラミングの概念に踏み込みたくはありませんが、私たちの「Tin」は、便利な保存単位として「ひとまとめ」にされたコンピュータメモリの数バイトだと考えられます。比喩で各Tinに付けた数値識別子は、その小さなメモリの塊がコンピュータメモリのどこにあるかを示す位置だと見なせます。TeXの内部では、そうした小さな保存単位は「memory words」と呼ばれます。これはTeXが作られた時代（1970年代）を反映した用語です。これらの「memory words」はTeXで使われる基本構成要素ですが、ここでこれ以上詳しく掘り下げる必要はありません。さらに詳しく知りたい人は、次の記事を参照してください。 [著者の個人ブログ](http://www.readytext.co.uk/?p=3537).

コンピュータプログラミングの用語では、ここまで話してきたものは [*連結リスト*](https://en.wikipedia.org/wiki/Linked_list)：TeXトークンリストは、TeXの保存用コンテナと呼ばれるものから作られた連結リストです。 *メモリワード* 各メモリワードには次のものを保存できます。

* a *値*：トークンの値（整数）;
* a *リンク*：リスト内の次のトークンを含む次のメモリワードのメモリ上の位置。

## TeXはどこでトークンリストを使うのでしょうか？

いたるところです！これは、TeX/LaTeXのマクロ定義（たとえばLaTeXコマンド）が、トークンリストの（少し特殊化した）形で保存されているからです。特殊化されているというのは、「標準的な」トークンリストには見られないトークン（マクロのパラメータ照合などに関係するもの）が含まれているという意味です。ここは心配しなくて大丈夫です。これらの詳細は次回の記事で扱います。

### マクロの例

マクロは3つの部分から成ると考えられます。

```
\def\<macro name><parameter text>{<replacement text>}
```

なお、 `\def` を使ってもよかった `\edef`, `\gdef` または `\xdef`.

**LaTeXユーザーへの注記**：ここでは、むき出しの低レベルなTeXコマンド（ *プリミティブ*と呼ばれる）を使ってマクロを定義しています。LaTeXユーザーには、LaTeXの `\newcommand` （これ自体もマクロです）を使ってマクロを作るほうがなじみ深いでしょう。

TeXにマクロを作成（定義）させると、その `<macro name>` と *トークンリスト* を表すトークンを作成します。これは、組み合わされた `<parameter text>` や `<replacement text>`を表すトークンです。TeXは、すべてを注意深く保存し、 `<macro name>` を表すトークンが、その定義を表すトークンリスト（`<parameter text>` や `<replacement text>`).

たとえば、次を定義した場合、 `\mymacro` 次のように:

```latex
\def\mymacro abc #1 defz{I typed "#1"!}
```

その構成要素は次のとおりです。

* `<macro name>` = `mymacro`
* `<parameter text>` = `abc #1 defz`
* `<replacement text>` = `「#1」と入力しました！`

たとえば、次のように呼び出せます。 `\mymacro` 次のように:

```latex
\mymacro abc THIS TEXT defz
```

その結果、 `「THIS TEXT」と入力しました！` が組版されます。— `abc` や `defz` すでに *実際の* が組版されます。 `abc` や `defz` は、〜に使われる文字トークンの並びです。 *区切る* マクロのパラメータを `#1` そして、マクロ呼び出しがTeXで正常に処理されると吸収され、破棄されます。

あなたが `\mymacro`を定義したとき、保存された中に含まれるトークンのパターンが、TeXが次のことを判断するための「テンプレート」として機能します。

* 入力のどのトークンが区切りトークンか;
* 入力のどのトークンが実際にマクロのパラメータを構成しているか（ここでは、あなたが〜に使っているもの） `#1` あなたの呼び出しでの `\mymacro`).

あなたは〜を呼び出す必要があります `\mymacro` に置き換え `<parameter text>` 定義時に使ったものと同一の区切りを含む形で呼び出さなければなりません。これは、カテゴリコードが同一の文字区切りを使うことも含みます。〜の中の区切りが `<parameter text>` 呼び出しに使われた `\mymacro` 定義時に使ったもの（メモリに保存された「テンプレート」）と異なる場合、TeXはかなり混乱することがあります。TeXが〜を処理しようとすると `\mymacro` 、メモリに保存した「テンプレート」と一致させられなくなるのです。

TeXがあなたがマクロを呼び出していると見ると、入力テキストを走査して新しいトークンを作成し、トークンごとに、それらをトークンリストと照合しようとします。 `<parameter text>` これはマクロ定義の一部として保存されたテンプレートです。入力テキストで使われた区切りが「テンプレート」に保存されたものと一致しないトークン列を生むと、通常TeXはエラーを出します。

TeXは非常に厳密です。文字トークンは文字コードとカテゴリコードの組み合わせだということを思い出してください。ある文字のカテゴリコードを変えると、その文字から得られるトークン値も変わります。

たとえば、〜のカテゴリコードを変更したとしましょう。 `z` をたとえば12にし、通常は11ですが、次のようにマクロを呼び出してみます。

```latex
\catcode`z=12
\mymacro abc THIS TEXT defz more text here...
```

今回はうまくいきません。なぜなら、〜のカテゴリコードが `z` 変更されているからです。次のようなエラーが表示されます。

```latex
途中で暴走した引数?
THIS TEXT defz
! \mymacro が完了する前に段落が終わりました。
<to be read again>
\par
l.22
```

TeXが〜を読み取り走査するとき、 `z` を `defz` それを〜の終わりを構成するものだと認識できません。 `\mymacro`のノードリストでは、 `<parameter text>` 入力ファイルで使われた〜。あの誤った〜が現れるまでは `z` TeXは最初の3文字を正しく一致させていました `def` しかしその `z` （カテゴリコード12の）文字がTeXの走査をつまずかせます。〜だと仮定すると `z` 〜がカテゴリコード11だったときに私たちが *定義した* `\mymacro`：その場合、256×11 + 122 = 2938というトークン値が〜の一部として保存されます。 `\mymacro`の定義（つまり「テンプレート」の一部として保存）されていることになります。しかし、カテゴリコード12では、 `z` は、256×12 + 122 = 3194のトークン値を作成します。入力から読み取ったトークン値（ `z`の値3194）が〜と一致しないため、 `z`保存された `<parameter text>` トークンリストのテンプレート（値2938）内のトークンと一致しないと、TeXは入力の走査を続けます。TeXはマクロの後に続くテキスト（*more text here* …）を走査して追加のトークンを探し、入力内で見つけたトークンと保存されたテンプレートを一致させようとします。おそらく正しいトークンパターンは見つからず、TeXが入力を「行き過ぎて」誤って余分なテキストを読み取り追加トークンを作るため、エラーが発生します。その余分なトークンはこの時点で読み取られるべきではなく、ほぼ確実にエラーを引き起こすでしょう。

この点については、次回の記事でさらに詳しく見ていきます。

## トークンリストのその他の用途

トークンリストを作成／保存するその他のコマンドには次のものがあります。

```latex
\toks<n>={...}
\everypar={...}
\everymath={...}
\everydisplay={...}
\everyhbox={...}
\everyvbox={...}
\output={...}
\everyjob={...}
\everycr={...}
\errhelp={...}
```

これらのコマンドはそれぞれ、波括弧「{...}」内の文字やコマンドからトークンリストを作成し、そのトークン列は特定の状況で再利用されることを意図しています。たとえば、 `\everypar={...}` 新しい段落を始める直前にTeXが入力へ差し込むトークンの集合（トークンリスト）を作成して保存します。

## トークンリストの隠れた用途：例

この最後の節では、トークンリストが思いがけない形で使われている実用例をいくつか見ていきます。

### 例1：\uppercase{...} と \lowercase{....} — 一時的なトークンリスト

トークンリストを生成する明示的なコマンドに加えて、TeXが特別な処理を行うために、隠れた一時的な内部トークンリストを生成する場合があります。TeXが入力の文字やコマンドを読み取り／処理すると、それらはトークンに変わることを思い出してください。トークンはTeXエンジンが扱う基本的な構成要素です。

よい例は次のコマンドです。 `\uppercase{...}` または `\lowercase{...}` というのも、初めて見るとその動作はかなり分かりにくいからです。TeXのさらに奥深く、ユーザーには見えないところで何をしているのかが分かれば、その動作はずっと理解しやすくなります。

たとえば、abcde という単純な文字列を大文字にしたいとしましょう。つまり ABCDE に変換したいわけです。TeXの `\uppercase` コマンド：

```latex
\uppercase{abcde}
```

を使えば、TeXは次を出力します。 `ABCDE`。では、この単純な文字列を後で使うために保存したいとしましょう。つまり、すぐには出力したくないので、TeXの唯一の *内部* データ保存機構――外部（ファイル）機構ではありません――を使います。トークンリストです。これは、マクロを作るか、明示的なトークンリストコマンドを使うことで実現できます。

```latex
\toks100={abcde}
\def\mychars{abcde}
```

その後、ある時点で、その文字列を再利用したいが、今度は大文字にしたいと思うかもしれません。そこで次を試します。

```latex
\uppercase{\the\toks100}
```

や

```latex
\uppercase{\mychars}
```

しかし残念ながら、どちらも動きません。なぜでしょうか？

### 秘密のトークンリスト！

〜というコマンドがどのように `\uppercase{...}` `\lowercase{...}` 実際に動作するのかを理解するには、TeXの内部動作をのぞく必要があったため、以下の説明はその調査に基づいています。

TeXが次のいずれかを検出すると、 `\uppercase{<material>}` または `\lowercase{<material>}` あなたの入力中にあると、TeXが最初に行うのは、その `<material>` の後に続く「{」と「}」で囲まれた部分から、一時的な内部トークンリストを作成することです。 `\uppercase{...}` または `\lowercase{...}` コマンドです。その一時的なトークンリストはTeX内部のものです。

重要な点であり、〜がどのように `\uppercase{<material>}` や `\lowercase{<material>}` 実際に動作するかというと、その中に含まれているコマンドやマクロはどれも `<material>` 〜されません *展開されて*：TeXが行うのは、「{」と「}」の間に置かれた文字やコマンドからトークンを生成することだけです。 `{...}`。〜の動作中は `\uppercase{<material>}` または `\lowercase{<material>}` 波括弧の中身は何も実行されません。ただトークンに変換されるだけです。

〜の後で `<material>` の中では `{...}` 一時的なトークンリストに変換されると、TeXはそのリストの各トークンを再度見て、それが *文字* トークンか *コマンド* トークンかを（トークンの数値を使って）判定します。TeXが文字トークンを検出すると、その文字の大小文字を調整するようそのトークンを変更します（ `\uppercase` または `\lowercase` が処理されているかによって）。TeXはコマンドトークンを単純に無視し、それらが何を表し何を含むのか（たとえば文字を含むマクロ）を「中をのぞく」ことはしません。単に飛ばされるだけです。大小文字変換の操作で実際に処理／影響を受けるのは文字トークンだけです。

たとえば、TeXコマンドとして次のようなものを実行すると、 `\uppercase{abcde}` TeXは〜からトークンリストを作成します。 `abcde` 文字トークンだけを含むものです。それらはすべて調整され、A、B、C、D、Eを表す修正済みトークンの列になります。その修正済みトークンはTeXの入力処理系に戻され、その結果 `ABCDE` が組版されます。しかし、文字列を *マクロの中に*保存していた場合――たとえば `\def\mychars{abcde}`―そして次のように大文字にしようとすると、

```latex
\uppercase{\mychars}
```

すると失敗し、abcde が組版されます。期待するような ABCDE にはなりません。さらに、文字列を次のようなトークンリストに保存しようとしても、 `\toks0={abcde}` そして `\uppercase{\the\toks0}` としても、やはり `\uppercase` 失敗します。なぜなら、そのトークンリストは `\uppercase`.

たとえばマクロの場合、 `\mychars`の場合、TeXが〜を検出すると `\uppercase` 入力中にあるものとして、TeXは〜の意味を調べて `\uppercase` それを実行し、〜から一時的なトークンリストを作成します。 `{\mychars}`。明らかに、その一時的なトークンリストには1つのトークンしか含まれておらず、それは文字トークンではなく、私たちのマクロコマンド `\mychars`を表すものです。したがって、〜を実行する目的では `\uppercase`、そのトークンは無視されます――`\mychars` は文字トークンを表していないからです。しかし、前述のとおり、一度 `\uppercase` が処理を終えると、その一時的なトークンリスト（〜の作用によって作成されたもの）は `\uppercase`）はTeXの完全な入力処理（走査）機構へ戻されます。TeXがそのトークンリストを再読込みすると、私たちの `\mychars` マクロを表すトークンを検出し、TeXはそれを実行（展開）して abcde を組版するための文字列を生成します。マクロの中に「包まれて」いたため、そして \uppercase の作用から見えないため、まだ小文字のままです。 `\uppercase`.

TeXが〜のために作成された一時的なトークンリストを再確認し、 `\uppercase{...}` または `\lowercase{...}`そして文字トークンを処理すると、入力元をその一時的なトークンリストに切り替えます。つまり、文字を組版し（処理済みの文字トークン）、コマンドやマクロを実行します。

### これはどう修正すればよいのでしょうか？

なぜなら `\uppercase{...}` または `\lowercase{...}` は文字トークンにしか作用しないので、マクロの中に含まれる文字を「強制的に取り出す」方法が必要です `\mychars` （または〜の中に含まれる `\toks` レジスタ）を `\uppercase{...}` または `\lowercase{...}` が作用する前に。ここで言う「取り出す」とは、実際にはTeXの *の展開*:

* TeX/LaTeXコマンドを *列* のトークン列に置き換える *そのコマンドが* (*たとえばマクロなどが*) *構成されているものから* または
* コマンドが生成するよう設計されたトークン列を生み出すことです。 *生成する*。トークンを生成するコマンドの一例は `\jobname`で、処理中のメインTeXファイル名を表す文字トークンの列を生成します。

#### 低レベルの魔法：scantoks(..., ...)

ここではTeXの内部動作の少し暗い部分まで本当に掘り下げています。細部が好きでなければ、この節は読み飛ばしてかまいません…

TeXが〜を検出すると、 `\uppercase` または `\lowercase` 入力ストリーム内で、次の内部関数を実行します。 `scantoks(..., ...)` その役割は、開始の「{」と終了の「}」の間の項目を使ってトークンリストを生成することです。前述のとおり、そのトークンリストは後で調べられ、必要に応じて文字の大小文字を変えるために文字トークンが検出（そして調整）されます。ここで注意してほしいのは、私たちが指しているのは `scantoks(..., ...)` TeXエンジンのソースコードに組み込まれた内部関数としての scantoks であり、ここでは制御綴の名前を指しているわけではありません。

その作業の一環として、 `scantoks(..., ...)` は、構築中のトークンリストを展開するかしないかを指示できますが、〜と `\uppercase` （`\lowercase`）ではトークンを展開しません。ただ作成してトークンリストに入れるだけです。

最初に行うことの一つは、 `scantoks(..., ...)` 開始の「{」（または `\catcode` 1のカテゴリコードを持つ任意の文字）を確認することです。というのも、ユーザーが構文エラーを起こして開始の「{」（またはカテゴリコード1の任意の文字）を忘れていないことを確かめなければならないからです。カテゴリコード1の文字は、トークン化される項目リストの開始を区切るために必要です。

そして、ここがコツです。開始の「{」を探す作業が `scantoks(..., ...)` TeXの展開処理を実行させるので、次の例は動作します。

```latex
\let\ob={
\uppercase\ob abcde}
\def\obb{\ob}
\uppercase\obb xyz}
```

例として `\obb`、これはマクロであり、〜として認識されます。 *展開可能なコマンド* であり、TeXによって（ `scantoks(..., ...)` 関数を介して）開始の波括弧（カテゴリコード1の任意の文字）を探す過程で、きちんと展開されます。つまり、私たちは「`\expandafter` トリック」を使って、マクロの中に閉じ込められた文字を「取り出す」――つまり展開する――という目的を達成できるのです。なお、 `\expandafter` も *展開可能なコマンド*も展開可能なコマンドに分類されるので、TeXはここでそれを実行し、開始の「{」（またはカテゴリコード1の任意の文字）を探す一環としてそれを働かせます。

では、次のように定義すると：

```latex
\toks0={abcde}
\def\mychars{abcde}
```

そして、次のようにすると：

```latex
\uppercase\expandafter{\mychars}
\uppercase\expandafter{\the\toks0}
```

どちらの場合も ABCDE が組版されるはずです。なぜなら `\expandafter` が「取り出し」（展開）を引き起こし、 `\mychars` や `\the\toks0`―どちらも結果として `\uppercase` 文字トークンの列を読み取ることになり、それらを処理して大文字／小文字を変更できるからです。

### 例2：\string ― さらに一時的なトークンリスト

内部的には、TeXは分類する `\string` それをいわゆる「convert」コマンドの一つとして扱います。つまり「テキストへ変換」操作を行うものです。 `\string` このコマンドは、トークンを人間が読めるテキスト版に変換するよう設計されています。つまり、そのトークンが元々作られた、人間が読める文字列を組版します。

例えば `\string\hello` は、一時的なトークンリストを作成し、その中には文字 \\, h, e, l, l, o が含まれます。――そう、先頭の「\」まで含まれます。そのトークンリストが作成されると、TeX によって再度読み込まれ、コマンド「`\hello`」が組版されます――ええ、正しいフォントを選べば「\」も含めて…

TeX が通常はスキャナに働きかけてコマンドトークンを作らせるために使われるエスケープ文字を、どうして/なぜここでは組版できるのか、不思議に思うかもしれません。なぜここではそうならないのでしょうか。答えはカテゴリコードにあります。通常、「\」文字の catcode は 0（エスケープ文字）ですが、 `\string` 内部トークンリストを生成するときには、少し異なることをします。文字トークンリストを作る際、空白文字には catcode 10 を割り当て、それ以外のすべての文字にはカテゴリコード 12 を割り当てます。――文字トークンは 256 × catcode + ASCII 値で計算されることを思い出してください。したがって、TeX が、その一時的なトークンリストを再読み込み（入力）するとき、 `\string` から生成された `\hello`、TeX は *エスケープ文字としては見ません* 「\」のトークンは catcode 0 ではなく 12 で計算されているからです。TeX は「\」をただの通常文字として扱い、組版します。

厳密には、TeX は入力中でエスケープ文字を検出したとき、それ自体のトークンを実際には生成しないことも付け加えておくべきでしょう。カテゴリコード 0 の文字を認識すると、その文字は制御綴トークンの生成を「引き起こす」ためだけに使われます。いったん TeX にその生成を行わせれば、エスケープ文字の役目は終わり、それ以上は考慮されません。

### 技術的注記

というコマンドがあり `\showtokens{...}` （e-TeX エンジンによって導入された）は、トークンリストを（ログファイルに）表示できます。e-TeX マニュアルより：

> コマンド `\showtokens{<token list>}` トークンリストを表示し、次では表示できない量も表示できます。 `\show` または `\showthe`、例えば：
>
> ```latex
> \showtokens\expandafter{\jobname}
> ```

## まとめとして

TeX ソースコードの 291 節（の [TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)122 ページを参照）で、Knuth はトークンリストを次のように説明しています：

> 「トークンリストは、mem 内の 1 ワードノードからなる単方向連結リストであり、各ワードにはトークンとリンクが含まれている。マクロ定義、出力ルーチン定義、マーク、 `\write` テキスト、およびその他いくつかのものは、TeX によってトークンリストの形で記憶され、通常はその「token\_ref\_count」フィールドに参照カウントを持つノードが前置される。」

初めて読むと分かりにくかったかもしれませんが、うまくいけば、今では少し分かりやすくなっているはずです。


---

# 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/54-what-is-a-tex-token-list.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.
