> 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/14-how-do-tex-engines-typeset-tables.md).

# TeXエンジンは表をどのように組版するか

## TeXエンジンはどのように表を組版するのか

## はじめに: この連載は何を扱うのか?

見た目に美しい表を作るのは、ビジュアルなレイアウトツールを使う場合でも、LaTeXを使う場合でも、HTMLやMarkdownのようなマークアップ言語を使う場合でも、時間のかかる作業になり得ます。とりわけLaTeXユーザーにとって、表の組版は多くの人の「悩みの種」の上位に挙がります。おそらく tex.stackexchange で「tables」が最も [タグ付け数の多いトピックの一つであることが、その証拠でしょう](https://tex.stackexchange.com/tags).

tex.stackexchange の回答や例に加えて、LaTeXによる表組版のサポートについて少し調べるだけでも、表に関する情報リソースがいくつも見つかります:

* Overleafの [ヘルプページ](https://www.overleaf.com/learn/latex/tables) や、次のような他のサイト [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN（Comprehensive TeX Network）では、 [70以上のTeX/LaTeXパッケージ](https://ctan.org/topic/table) が表の作成に関連するものとして挙げられています
* LaTeXを使った表組版に関する一冊まるごとの [本](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* 優れた [オンラインLaTeX表ジェネレーター](https://www.tablesgenerator.com/latex_tables)

で [LaTeX tables](https://www.google.com/search?q=latex+tables) をGoogle検索すると、助け、助言、例、解説を提供する多くのサイトが並ぶ膨大な数の結果が返ってきます。

### TeX、LaTeXではなく

LaTeXを使った表組版については豊富な文献があるのだから、なお書くべきことなどあるのだろうか――さらに表の例や、パッケージコマンドの列挙・デモンストレーションを増やすだけではないのか? 表組版というテーマに対して、その根本原理や概念を引き出したり、そこに焦点を当てたりするようなアプローチはあるのだろうか? ありますが、そのためにはLaTeXという玉ねぎの皮をむいていく必要があります…

私たちは、読者に背景情報と、根底にある *仕組み* についての説明を提供することを目指した記事シリーズを作ることにしました。TeXベースの表組版の。特定のLaTeXマクロ/パッケージを使った表の組版に焦点を当てるのではなく、 *根底にある振る舞い* を探っていきます。すなわち、LaTeXのマクロコマンドが構築される基盤を提供する、TeXエンジンの低レベルな組版機構を探究するのです。最終的な目的は、TeXベースの表組版の中核となる方法とアルゴリズムを引き出して説明し、表がなぜそのように振る舞うのかを読者/ユーザーがよりよく理解できるようにすることです。LaTeXのマクロという保護層を一枚ずつ剥がしていくこのアプローチには、避けられない結果として、通常はLaTeXマクロコードの層によって覆い隠されている厄介な低レベルの詳細にさらされることがあります。

これらの記事の調査、執筆、図版作成にはかなりの時間がかかったため、読者に情報を与え、この複雑なTeX組版の領域をよりよく理解する助けとなる、有益な文献として加わることを願っています。この連載が *実際の* 踏み込んで *美学* ――表デザインの美学――について論じることもある、と強調しておきます。そこは主観的な好みが満ちたテーマであり、その議論は別の場所で行われるべきものです…

### TeXの表の仕組みを探る: どうやってそれを行うのか?

TeXエンジン内部で起きている低レベルの仕組みや処理、たとえば表の組版などを探り、それについて書くために、OverleafではMartin Ruckertの [Web2Wプロセス](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

を使ってKnuthのTeXエンジンの（コンパイルされた）「デバッグ」版を作成しました。従来、TeXのビルドにはWeb2Cと呼ばれるプロセスが使われ、TeX Live内で、TeXの元のPascalソースコードをC相当のコードへ変換してCコードを生成します。このプロセスで生成されるCコードは、人間が読むことを意図したものではなく、Cコンパイラだけを対象にしています。機械的に生成されたCコードは *非常に* 読みにくく、実験のために修正するのも困難です。

対照的に、Web2WはCソースコードを生成し（ [こちら](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c))、これは *桁違いに* Web2Cで生成されたコードよりも読みやすいものです。したがって、Web2WのCソースコードは、学習や実験のために修正しやすくなっています。

Web2WはTeXのバージョン（「CTeX」）を生成しますが、それは *極めて* Knuthの元のプログラムに近いものです。「CTeX」には、SyncTeX、コマンドライン処理、Kpathseaによるファイル検索など、Web2Cプロセスによって導入された多くの変更や拡張は含まれていません。それらの貴重な拡張機能は失われますが、結果として得られる（Web2Wの）Cコードは、TeXがPascalで書かれていたにもかかわらず、Knuthが公開したTeXソースコードを使って比較的容易にたどることができます。

* **名称についての注記:** 厳密に言えば、「TeX」という名前は、Donald Knuthによって書かれ公開された元のソフトウェアのみを指さなければなりません。彼のソフトウェアに加えられた変更は、その結果として生じるTeXベースの組版ソフトウェアに別の名前を使う必要があります。ここでは、Web2Wプロセスを使って、実質的にはなおKnuthの元のソフトウェアであるエンジンを構築しました。しかし、誤解を避けるため、私たちはWeb2Wを使って構築した特定の版を意味する場合に「CTeX」という用語を使いますし、またKnuthの元のエンジン、あるいはKnuthのTeXの原理に基づく組版言語の一般的な用語として「TeX」も使います。厳密に正しい用語法の厳密な適用/使用に時折ゆるみがあることは、読者にご容赦いただければと思います。意味や意図は文脈によって伝わることを願っています。

CTeXのデバッグ版は [Eclipse IDE](https://www.eclipse.org/downloads/packages/)を使って実行され、Knuthが表組版を支えるために設計した、低レベルのプリミティブ（組み込み）TeXコマンドとアルゴリズムを実装するCコードの処理をリアルタイムで観察することができました。

次の短い動画（約90秒）は、CTeXエンジンが [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

CTeXに加えて、私たちはKnuthの元のソフトウェアにはないいくつかの追加プリミティブにアクセスするために e-TeX もコンパイルしました。CTeXと e-TeX は、今となっては古いTeXベースのエンジンですが、表組版の仕組みを探る基盤としてはなお適しています。なぜなら、それらの根底にある原理は、すべてのTeXベースの組版エンジンに今でも当てはまるからです。

### なぜ古いTeXエンジンで表を探るのか?

まず、印刷された書籍 [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)は、TeXのソースコードを一覧し解説している本ですが、30年以上前（1986年）に出版されたにもかかわらず、TeXの内部動作という暗い水域を案内してくれる、今なお非常に便利な手引きです。もちろん、TeXのソースコード文書は自分で組版することもできます。たとえばOverleafのプロジェクト [TeX、e-TeX、またはpdfTeXのソースコード文書を組版する](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv)を参照してください。1986年に TeX:The Program が出版されて以来、pdfTeX、XeTeX、LuaTeX など新しいTeXエンジンが発展し、TeX:The Program には記載されていない機能やコマンドが導入されてきました。単純に言えば、それらはKnuthの元のソフトウェアには存在しなかったからです。

TeXの表組版のような多くの中核的な処理においては、TeX:The Program に記載されたコードは、TeXのソースコードがPascalで書かれているにもかかわらず、研究の基礎として今なお有用です。さらに、KnuthのTeXは比較的簡単かつ高速にコンパイルできます。とりわけ非常に便利な [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) プロセスを Martin Ruckert が開発したおかげです。コンパイルが容易で速いので、TeXを簡単な方法で修正することがずっと便利になります。たとえば、この連載の後半で使うSVGグラフィックスの作成などです。

### TeXとLaTeXの違いを理解する

多くの読者はすでに、LaTeXが実際には *実行可能な* 組版プログラムではなく、*マクロ*と呼ばれるコマンド群の大きな集合であり、それらは最終的にはTeXと呼ばれる低レベルの組版/プログラミング言語で書かれている、ということを知っているでしょう。LaTeXコードは、 *TeXエンジン*と呼ばれる実行可能プログラムで処理されて初めて、組版された出力を生成します。つまり、そのソフトウェアは、あなたのLaTeXコード（文書）と組版済みPDFの間に位置しています。今日では、ユーザーは pdfTeX、XeTeX、LuaTeX の各種派生版を含む、さまざまなTeXエンジンを選んでLaTeXコードを組版できます。

TeX/LaTeXのエコシステムに新しく入った人は、しばしば――もっともなことですが――、遭遇する道具に使われている謎めいた名前の数々、すなわち TeX、LaTeX、pdfTeX、pdfLaTeX、XeTeX、XeLaTeX、LuaTeX、LuaLaTeX に戸惑います。もしあなたも同じなら、Overleafの記事 [名前に何があるのか: TeXの多様な流儀へのガイド](/latex/ja/xiang-xi-ji-shi/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) が、そうした用語の由来と意味を説明してくれます。

#### 方言とTeXプリミティブ

すべてのTeXエンジンには、 *プリミティブ* と呼ばれる組み込みコマンドの集合があり、それらが集まって、そのエンジンに組み込まれた機能を反映するTeX組版言語のそのエンジン版「方言」を構成しています。ここで、TeXエンジンの組み込みコマンドを説明するために使われる「primitive（プリミティブ）」という用語は、 *実際の* それらのコマンドが基本的あるいは単純だという意味ではなく、他のコマンドから構成されていない、すなわち根本的かつ不可分であることを意味します（マクロとは異なります）。すべてのTeXエンジンは大きな共通のプリミティブ集合を共有していますが、エンジン固有のプリミティブを含むものもあり、そのためTeXの「方言」という概念が生じます。

LaTeX文書の組版にどのTeXエンジンを使うにせよ、その役割は、その文書を記述・構成するために使われるLaTeXコマンド（すなわちマクロ）の集まりを処理（「実行」）することです。実際には、TeXエンジンはあなたのLaTeXコード（マクロ）を *再び* その構成要素であるTeXエンジンのプリミティブコマンドへと「変換」し、エンジンが実際の組版を行うためにそれらを実行できるようにします。TeXエンジンで文書を組版するのにLaTeXコマンドを使う必要はありません――あなたは *必要があるなら* LaTeXコマンドを使う必要はありません—あなたは *できる* あなたの文書を完全にTeXプリミティブだけで、つまり低レベルの *TeXプログラミング言語* で直接構成することも選べます。しかし、今日の基準ではTeX言語はかなり難解で、一般にプログラミングしにくいものと考えられています。しかも、組版目的を達成するために大量の組み込みプリミティブが必要になることもあり、エラーが起こりやすく、繰り返し作業の多いプログラミング課題になりがちです。

TeX言語で直接書いたり、同じコマンド列を何度も打ち直したりするのを避けるために、TeXエンジンは *マクロ*と呼ばれる「ショートカット」を作成できるようにしてくれます。マクロを作ることで、TeX言語のプリミティブ（または他のマクロ）の長く複雑になり得る並びを、一つの「より高レベルな」コマンドにまとめた独自のコマンドを定義できます。TeXプログラマーは、LaTeXが提供するコマンドのように、一つのコマンドの中に多くの機能をカプセル化する非常に洗練されたマクロを書くことができます。LaTeX（あるいは [ConTeXt](https://wiki.contextgarden.net/Main_Page)）のようなマクロパッケージを使うことで、文書作成者は多くの面倒な詳細から（ほぼ）切り離され、TeX言語の複雑さやニュアンスと常に格闘するのではなく、執筆と組版に集中できるようになります。

## はじめに…

数式の組版や高度な改行アルゴリズムを設計するのと並んで、KnuthはTeXソフトウェアに表を組版させるという課題に直面しました。明らかに、表構築アルゴリズムは過度に制約的であってはなりません。そうでなければ、ほぼ無限に近いレイアウトの表を作れる自由を必要とするユーザーを苛立たせてしまうからです。さらに、表のセルには、数式、図、きれいに組版された行に分割された文章など、TeXが組版できるものなら何でも含めることができます。この柔軟性を実現するには、TeXの表構築アルゴリズムがTeXの他の組版機構と密接に連携して動作する必要があります。

しかし、TeXエンジンは表構築機能によって提供される柔軟性の代償として、低レベル動作における数多くの微妙な点や нюансы を伴います。組み込み（プリミティブ）の表組版コマンドは9個あります:

* **`\halign`**, **`\valign`**：表構築の中核コマンド
* **`\tabskip`**：\halign の列または \valign の行の間に置かれるグルー
* **`\cr`**：表のすべての行に必要な「キャリッジリターン」終端
* **`\noalign`**：\halign の行または \valign の列の間に सामग्री を挿入する
* **`\everycr`**：\cr を検出した後に読むコマンド（トークンレジスタ）
* **`\span`**：二重の役割を持つコマンド。\span は列または行にまたがるセルを作成するか、表のプレアンブル内のコマンドを展開する（これについては詳しく見ます）
* **`\omit`**：特定のセルのテンプレートを省略する
* **`\crcr`**：ユーザーが必要な \cr を忘れた場合のエラーを避けるためにマクロ内で使われる

表構築の旅で、これらのコマンドに出会うことになるでしょう。

### 課題の遠い反響

埋め込まれている [TeXのソースコード](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) には、表を組版するために設計された低レベルコマンド \halign と \valign を実装する話題への、やや気後れするような導入があります:

> 「\halign と \valign が動くたびに、何だか奇跡のようなものだ。というのも、それらはTeXの多くの制御構造を横切ってしまうからだ。したがって、ここはおそらく初心者がこのプログラムを読み始めるのに最適な場所ではない。まず他のすべてを習得したほうがよい。」

Knuthは続けてこう述べています

> 「\halign が処理されている間、私たちは臆することなく制御をTeXの残りの部分に委ねることに注意してほしい。重要な局面では、整列ルーチンが呼び出されて何らかの小さな動作を行うが、ほとんどの時間、これらのルーチンはただ背後で潜んでいるだけだ。まるで催眠後暗示のようなものだ。」

これらのコメントからは、Knuthにとってさえ、TeXの表組版を実装することは「なかなかの挑戦」だったと結論づけるのが妥当でしょう――ユーザーに制御と柔軟性を与えつつ、同時にTeXの自動表構築アルゴリズムがTeXの中核組版処理と適切に協調するようにする必要があったのです。

著者は、TeXの表組版機能の背後にあるコードとアルゴリズムの複雑さを率直に認めるとともに、密度は高いものの比較的少ないPascal（あるいはC）コードの中に含まれる、膨大な機能の量そのものにも感嘆しています。


---

# 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/14-how-do-tex-engines-typeset-tables.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.
