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

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

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

## はじめに：本シリーズの目的

この連載記事には野心的な目標があります。それは、次のことを説明することです *どのように* TeXマクロ（LaTeXコマンドなど）が、実際のTeXエンジンソフトウェア内部の最も基本的なレベルで、実際にどのように動作するかです。依存するのではなく *もっぱら* TeXのさまざまな機能、エッジケース、動作を示すために設計された一連のマクロではなく、TeXそのものの内部を見て、 *どのように* や *なぜでしょうか* そのマクロプログラミング手法がなぜそのように機能するのかを見ていきます。

目的を達成するには、かなり低レベルな話題から始める必要があります。最初は、これらが文書の組版という作業からやや遠いものに思えるかもしれません。より深く掘り下げることで、最終的には理解を深めるための基盤を得られ、多くの時間を節約し、もしかするとフラストレーションも軽減できるでしょう。

### TeXプログラミング言語：こんな感覚に覚えはありますか？

TeXプログラミング言語をやや難解だと表現しても、決して不当に厳しいわけではありません。少なくとも、現在使われている大半の主流プログラミング言語の基準では、実際にそうだからです。TeX/LaTeXについてさらに学び始めると、特に自明ではないマクロを書きたい場合には、カテゴリーコード、トークン／トークン化、コマンドやマクロの「展開」といった概念にすぐ出会います。このような概念の集中砲火はかなり異質に感じられ、戸惑いを覚えたり、ときには少しフラストレーションを感じたりするかもしれません。TeX/LaTeXのほとんど解読不能なエラーメッセージが、成功への道筋を常に助けてくれるとは限らないからです。

## では、どこから始めましょうか？ カテゴリーコードからです。

TeXエンジンは、次のように呼ばれるソフトウェアの一種です [コンパイラ](https://en.wikipedia.org/wiki/Compiler)：次の言語で書かれたファイルを入力として受け取るプログラムです *ソース* 言語で書かれたファイルを *コンパイル* （変換）して、次の言語で書かれた出力ファイルにします *ターゲット* 言語です。より具体的には、TeXは *文書コンパイラ*です。TeXエンジン（コンパイラ）の場合、入力ファイルはTeX組版言語で書かれ、ターゲットは次のような別の「言語」で書かれた出力ファイルです [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) またはPDFです。ただし、「言語」という概念については少し大まかに捉えています。

TeXファイルを書くために使用されるソース、つまり入力の「言語」を詳しく見てみましょう。 `.tex` ファイルとは、突き詰めれば（改行文字を含む）1つの長い文字列であり、組版対象のテキストの間に `\`, `}`, `$`, `[` や、一見すると無限に近い組合せで現れうるあらゆる種類の文字が挿入されています。TeX/LaTeXを使わない人が典型的な `.tex` ファイルを見れば、目に見えるファイル構造がほとんど、あるいはまったくない、かなり混乱した文字の寄せ集めだと受け取っても無理はありません。LaTeXマクロパッケージは、.tex入力ファイルにある程度の基本的な構造を「課す」役割を確かに果たしています。しかし、 `\begin{document}` や `\end{document}` その間に何を入れるかは文書作成者次第です。 `.tex` KnuthによるオリジナルのPlain TeXマクロパッケージを使って書かれたファイルを見ると、文書構造がほぼ完全に存在しないことがわかります。

したがって一般に、TeX入力ファイルはかなり構造化されていないように見え、組版される内容と、その内容の組版を指示する命令（コマンド）が入り交じった、一見任意の混合物です。TeXが典型的な `.tex` 入力ファイルを理解し、入力される雑多な文字群を組版エンジンが実行可能な命令と組版対象の内容に振り分けることなど、どうして可能なのでしょうか？

### 雑多な文字群をフィルタリングする：カテゴリーコードの登場

TeXについて何も知らない人間の観察者なら、 `.tex` ファイルを見て、たとえば次のような特定の文字を認識するかもしれません `$` そして、それが通貨を表す記号だと知っていたり、 `&` を見てアンパサンドだと識別したりするでしょう。その観察者は、 *とその* を見る各文字に対して、その文字が人間のコミュニケーションにおいて果たす役割に基づく意味を推測します。さらに、次のような文字を見て `a`, `e`, `または` が母音に分類されることを知り、一方で次のような文字は `b`, `c` または `d` が子音に分類されることを知っています。人間には、目にする各文字に意味を割り当てる一種の組み込み済みルックアップテーブル（記憶の中）があり、その意味は、私たちがコミュニケーションできる言語においてその文字が果たす役割に基づいています。

次のものを処理するには `.tex` ファイルを処理するため、TeXソフトウェアも入力内のすべての文字を見る必要があり、それぞれの文字に *とその* を割り当てる必要があります。しかしTeXは、入力ファイル内にある整数列（文字コード）として格納されたテキストを処理する、ソフトウェアベースの機械にすぎません。機械であるTeXには、注目している文字の意味を判断し、その後それをどう扱うべきかを指示する関連データをプログラムする必要があります。TeXはどのようにしてこれを実現するのでしょうか？

答えは、TeX特有の概念の1つです： *カテゴリーコード* です。0から15までの16種類があります。TeXにとっては、次の中で遭遇すると想定するすべての文字に `.tex` いわゆる *カテゴリコード* が事前に割り当てられています。TeXソフトウェア内部には一種の「ルックアップテーブル」があり、カテゴリーコードを列挙しています *現在* 入力 .tex ファイル内でTeXが遭遇しうる各文字に割り当てられています。TeXのカテゴリーコードは、 *とその* を、TeXが調査（走査）する入力ストリーム内の個々の文字に割り当てるものだと考えてください。

文書を組版するには、TeXエンジンは1文字残らず読み取る（走査する）必要があります。しかし、TeXが直ちに関心を持つのは実際の文字（文字コード）ではありません。文字の *カテゴリコード* の方が、入力を走査する際には重要です。文字の *現在の* カテゴリーコードは、その文字の *現在の意味* を決定します *TeXがそれを読み込む時点で*：そのカテゴリーコードが、TeXが各文字をどのように扱い／処理するかを決定します。「現在のカテゴリーコード」および「現在の意味」と言う理由は後で説明します。カテゴリーコードによって、TeXは入力される雑多な文字群をフィルタリングし、組版対象の文字（内容）と、処理すべき命令を構成する文字とを区別できます。*コマンド* これはTeXが実行する必要があるものです。

次の表は、16種類のカテゴリーコード、それぞれが示す意味、および各カテゴリーに通常割り当てられる文字の例を示しています。

| **カテゴリコード** | **説明**                            | **標準のLaTeX/TeX**              |
| ----------- | --------------------------------- | ----------------------------- |
| 0           | エスケープ文字—TEXにコマンドを探し始めるよう指示する      | `\`                           |
| 1           | グループを開始する                         | {                             |
| 2           | グループを終了する                         | }                             |
| 3           | 数式シフト—数式モードに入る/抜ける切り替え            | $                             |
| 4           | 整列タブ                              | &                             |
| 5           | 行末                                | ASCIIコード13（`\r`)              |
| 6           | マクロ引数                             | #                             |
| 7           | 上付き文字—数式組版用： `$y=x^2$` $$y=x^2$$  | ˆ                             |
| 8           | 下付き文字—数式組版用： `$y=x_2$` $$y=x\_2$$ | \_                            |
| 9           | 無視される文字                           | ASCII 0 `<null>`              |
| 10          | スペーサー                             | ASCIIコード32（スペース）と9（タブ文字）      |
| 11          | 文字                                | A...Z、a...z、（そして数千のUnicode文字） |
| 12          | その他                               | 0...9に加えて、,.;?" など多数          |
| 13          | アクティブ文字                           | ˜のような1文字マクロを作成するための特殊カテゴリコード  |
| 14          | コメント文字—行末まで続くすべてを無視する             | %                             |
| 15          | .tex入力ファイルに現れることが許可されていない無効な文字    | ASCIIコード127（`DEL`)            |

カテゴリーコードの使用は、入力文字ストリームをフィルタリングし、入力内容を理解して次のものを判別するためのTeXの基本的な仕組みです：

* 組版するテキストを構成する文字。
* 数式として組版すべき内容を区切るもの。
* 処理または実行すべきコマンド名となる文字列。
* …その他、多くの組版操作。

最初は、各文字のカテゴリーコード（意味）は固定的な割当てであり、変更不可能で、TeXソフトウェアの内部基盤に恒久的に組み込まれているものだと思うかもしれません。しかし、そうではありません。既に述べたように、TeXはどのカテゴリーコードが *現在* 各文字に割り当てられているかの詳細を格納する内部ルックアップテーブルを保持しています。私たちが意図的に *現在割り当てられている* と言うのは、（まだ読み込まれていない）任意の文字のカテゴリーコードは、次のプリミティブ（組み込み）コマンドを使用して変更できるからです `\catcode`。これにより大きな柔軟性が得られます。望むなら、後から入力から読み取られる任意の文字について、TeXがその意味を扱うまたは解釈する方法を完全に変更でき、高度な組版アプリケーションに向けた非常に大きな可能性を提供します。

主にLaTeXを使って「仕事を片付ける」ことに関心がある場合、目にしたことのあるエラーメッセージを通じて以外では、カテゴリーコードに直接出会ったことがないかもしれません。しかし安心してください。カテゴリーコードはTeXエンジンの動作における中核的な構成要素であり、LaTeX（およびLaTeXパッケージ）が実際に文書を組版する作業を可能にしています。

TeXエンジンが起動すると（「[ブートストラップ](https://en.wikipedia.org/wiki/Bootstrapping)」）、文字からカテゴリーコードへのデフォルトの割当てセットを使用しますが、 `\catcode` コマンドを介して、そのデフォルトはLaTeXの中核コード（マクロ）や読み込んだLaTeXパッケージ、さらには自作のTeXコードやマクロによって変更される場合があります。しかし時代と慣習／使用を通じて、特定のカテゴリーコードに割り当てられる特定の文字は「標準」として受け入れられるようになりました。文書の可搬性を高め、同僚や他のユーザーと簡単に共有したいのであれば、その標準に従うことが望ましいのは確かです。たとえば、 `\` 文字には、TeX/LaTeXコマンドの開始を示すカテゴリーコード0が割り当てられます。次を参照してください [上の表](#tbl-0).

### 入力の読み取り（走査）

TeXが入力ファイルから次の文字を読み取る（走査する）とき、最初に行うことはそのカテゴリーコードを見ることです。そこで、TeXが典型的な入力行を読む際に何が起きるかを詳しく見てみましょう。

次のテキストを含む .tex ファイルがあるとします `Hello World \jobname` これが段落内のどこかにあります。 `.tex` ファイルを次のものを使って内部から見ると [16進エディタ](https://en.wikipedia.org/wiki/Hex_editor)、文字列 `Hello World \jobname` この `.tex` ファイル内のものは、単なる整数列、すなわち *文字コード*であり、以下のスクリーンショットでは次の16進数列として示されています：

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![TeXファイル内の16進文字コード](/files/df7dbda4115f7210e71ac3bed8d8c6d568e65dd3)

16進数（基数16）から10進数（基数10）に変換すると、文字コード列は次のようになります：

![TeXファイル内の10進文字コード](/files/aa44e67655f2b995efe1f1c54d3864d73781272d)

また、TeXにとって各文字には対応するカテゴリーコードがあることもわかっています。したがって、次に基づくと [上の表](#tbl-0) おそらく、次のデフォルトのカテゴリーコード割当ても使用されています：

![TeXのカテゴリーコード](/files/c888ff11b04522a1c3a1b86b5d8bc3e6d8de00a3)

したがってTeXにとって、入力ファイル内の各文字は、 *2 つの* 2つの数値、すなわち文字コードとカテゴリーコードによって表現されます：

![文字コードと対応するTeXカテゴリーコード](/files/6f1aaeb3f47053b17f7a13811375073574e388f5)

この時点では、ファイルに対するTeXの処理のまさに最初の段階、すなわち個々の文字の走査だけを考えています。では、TeXは実際に、これらの文字コードとカテゴリーコードの組をどう扱うのでしょうか？ TeXは個々の文字を走査し、対応するカテゴリーコードを検索した後、この情報を正確にどのように使って、入力文字を「フィルタリング」するのでしょうか？

## 第2部

第2回では、TeXが入力をどのように読むかを詳しく見ます。TeXの「目」になったつもりで、入力を1文字ずつ見ていきます。

[第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/19-how-tex-macros-actually-work-part-1.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.
