> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# Pandoraの \hbox：LuaTeXを使ってTeXボックスのふたを開ける

## はじめに

ボックスとグルーは、TeXの組版モデルと機能の基盤を成す2つの重要な概念です。前回の投稿の導入的な内容を踏まえて、 [ボックスとグルー：LuaTeXを使った、簡潔だが視覚的な入門](/latex/ja/xiang-xi-ji-shi/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md)、この図版豊富な記事ではボックスとグルーをさらに詳しく見ていきます。また、新しいLuaTeXベースの [Overleafプロジェクト](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) も紹介します。これにより、TeXボックスの深い内部構造を探求でき、その挙動を本当に理解するのに役立つ知見が得られます。Overleafプロジェクトの作成はPatrick Gundlachの作業によって大いに促進されたため、 [彼に感謝します](#credits-thanks-patrick).

## なぜLuaTeXを選ぶのか？

まず、LuaTeXとLuaLaTeXの違いを改めて確認しておく価値があります。

* LuaTeXは、TeXベースの組版エンジンの実行ファイル名です。
* LuaLaTeXは、LuaTeXエンジンとLaTeXマクロパッケージを組み合わせて使うことを指します。

この区別は非常に重要です。というのも、この記事ではLaTeXマクロパッケージが提供するコマンドの機能を使うだけでなく、LuaTeXエンジン自体に組み込まれた機能を活用しているからです。

TeXエンジンとLaTeXマクロパッケージの違いに不安がある読者は、以前に公開した記事の一つを読むとよいかもしれません。 [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/ja/xiang-xi-ji-shi/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md)。そこではそれらの違いをかなり詳しく説明しています。同じ記事では、「TeX」をプログラミング言語として捉えること、そしてTeXベースの組版エンジン（たとえばpdfTeX、XeTeX、LuaTeX）が機能面だけでなく、サポートするTeX言語の「方言」にも違いがあることについても論じています。これがLuaTeXを選ぶ理由につながります。TeXベースのプログラミング言語をサポートするだけでなく、LuaTeXにはLuaスクリプト言語も埋め込まれており、シンプルでありながら非常に強力な従来型のプログラミング言語を利用できます。LuaとLuaTeXの組み込み機能を通じて、LuaTeXの組版処理を他のどのTeXエンジンにもない方法で調べ、制御できます。これにはTeXボックスの内部構造を調査する能力も含まれます。したがって、LuaTeXはこの記事と付属のOverleafプロジェクトにとって理想的な（唯一の）選択です。

### pdfTeX/XeTeX 対 LuaTeX：図で見る

以下の *概略図* は、pdfTeX/XeTeXとLuaTeXの設計上の重要な比較を示すことを意図しています。もちろんpdfTeXもXeTeXも、組版の挙動に影響を与えるTeXコードを書くことをユーザーに許しています。しかし、それらのTeXエンジンに含まれるより深い内部構造や、組版過程で構築される低レベルのデータは、ユーザーコマンドやマクロからはほとんどアクセスできません。その意味で、それらはLuaTeXと比べると *比較的* 閉じたシステムです。

#### pdfTeX/XeTeX

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

#### LuaTeX

LuaTeXは、 `\directlua{...}` という新しいプリミティブコマンドを導入します。これを通じて、Lua言語へ完全にアクセスできるだけでなく、CやC++などの言語を使ってプラグインを書くことでLuaTeXの機能を拡張することもできます。Windowsでは、このようなプラグインは *ダイナミックリンクライブラリ* （.DLL）と呼ばれ、Linuxでは *共有オブジェクトライブラリ* （.so）として知られています。しかしLuaTeXの真の力は、LuaTeXの内部へアクセスできる膨大な組み込みLua関数群に由来しており、TeXベースの組版を極めて高度に制御しプログラムできます。このような関数群はAPI（Application Programming Interface）と呼ばれ、LuaTeXのAPIを通じてLuaプログラムがTeXベースの組版エンジンやデータ構造と通信します。

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

LuaTeXの `\directlua{...}` コマンドを使えば、たとえば他のTeXエンジンでは見えない低レベルのTeX内部データ構造にアクセスできます。さらにLuaスクリプトを使って、あらゆる種類の計算や文字列操作などを行い、その結果をTeXに渡すこともできます。可能性はほとんど無限です。ただしこの記事はLuaTeXの詳細な解説やチュートリアルを目的としたものではありません。とはいえ、この驚くほど強力なTeXエンジンの信じがたいほどの多用途性を示す例を挙げたくなるところではあります。

## ボックスとグルー：簡単なおさらい

記事 [ボックスとグルー：LuaTeXを使った、簡潔だが視覚的な入門](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) で導入したように、ボックスとグルーはTeXの組版機能を支える2つの重要な概念です。次の図は、TeXの横組ボックスと縦組ボックスの挙動について、ごく簡単な覚え書きとして示したものです。注：横組ボックスには、アラビア語やヘブライ語のような右から左へ組む言語で組まれたテキストも当然含められるため、ボックスの成長方向は下の図で示した横組ボックスとは逆になることがあります。

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

### ボックス構築のためのTeXプリミティブ

今日では、ほとんどの人がLaTeXマクロパッケージを使ってTeX文書を作成しています。これは、TeXの低レベル言語の多く、いわゆる *プリミティブ*—TeXエンジンに組み込まれた基本コマンド—からユーザーを隔離するコマンドを提供するよう設計されています（TeXプリミティブについては記事 [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/ja/xiang-xi-ji-shi/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) を参照）。LaTeXマクロ集には、ボックスの作成や保存のためのさまざまなマクロがありますが、すべてのマクロコードを取り除くと、低レベルのボックス構築プリミティブはたった4つしかありません。

横組リストを作成するには：

* \hbox{...}

縦組リストを作成して積み重ねるには：

* \vbox{...}
* \vtop{...}
* \vcenter{...}

これらすべてのボックスコマンドの使い方をここで説明するつもりはありません。ウェブ上やTeX/LaTeXの書籍には例やチュートリアルがたくさんあるからです。ただし、TeXのデータ構造の中でボックスがどのように表現され、保存されているかは見ていきます。

### グルー：柔軟な間隔

グルーは、実質的にはTeXが項目を水平方向または垂直方向に配置するために使う間隔の一種です。TeXユーザーとしては、固定サイズのグルーを挿入するようTeXに指示することもできますし、必要に応じて伸びたり縮んだりする柔軟なグルーを使うこともできます。横方向の間隔のためのグルーを作るTeXのコマンドの一つは `\hskip` と呼ばれ、次の形式をとります。

`**\hskip** <自然幅> **plus** <伸び量> **minus** <縮み量>`

`**plus**` や `**minus**` はTeXのキーワードですが、すべてのグルーで使う必要はありません。もし `**plus**` または `**minus**` が省略されていれば、対応する `<伸び量>` または `<縮み量>` は0とみなされます。たとえば、 `\hskip 3pt` は、伸びや縮みを含まない固定幅のグルーを挿入します。

ひとまず、 `<伸び量>` や `<縮み量>` を *指示* のようなものだと考えてください。正確にどれだけ伸縮するかはTeXが計算します。

これらの考えを助けるために、グルーをバネとして表した図を示します。 `<自然幅>` は、張力（伸び）も圧縮（縮み）もないときのバネの長さです。 `<伸び量>` や `<縮み量>` は、バネの自然長に対する相対値として示されています。

![{{{alt}}}](/files/88b03ac7b06aa448b86af6a22819108579e7d95b)

#### \hboxの例

次のようなものを作りたいとしましょう。 `\hbox{...}` A、B、C、Dの文字だけを含み、幅が100pt（100 TeXポイント）のボックスです。さらに、これら4文字の総幅は100ptよりかなり小さいと考えてよく、ボックス内の残りの空間を埋める何らかの方法がTeXに必要だと分かります。そのためにグルーを使います。ただし、ボックスを埋めるのに必要なグルーの正確な量は分からないので、柔軟なグルーをいくつか加え、その空間量の計算はTeXに任せるのが賢明です。次のコード片では、行末文字に由来する単語間スペースを抑制するために「%」を使っている点に注意してください。

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

結果として得られるボックスは次のようになります（見やすいように拡大しています）：

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

この `\hbox` には破線のボックス（赤）が重ねられており、文字の幅（TeXから見たもの）を示しています。組版上、文字は小さなボックスと見なされ、この `\hbox`を埋めるのに必要なグルー量は、各文字の幅を考慮して（計算されて）決まります。

結果として、TeXはAとBの間のグルー（4ptに設定）を伸ばしも縮めもしませんでした。またBとCの間にはグルーがありません（0ptに設定）。しかし、CとDの間のグルーと、Dとボックスの終わりの間のグルーは、どちらもかなり大きく伸びました。というのも、それらのグルーが最も柔軟な伸び成分を持っていたためで、実質的に、それらのグルーがボックスを埋めるのに必要な伸長をすべて引き受けたからです。

## LuaTeXに戻る

ここまででボックスとグルーを見てきて、LuaTeXではpdfTeXやXeTeXでは見えない内部のTeX構造にアクセスできることが分かりました。これをより明確に示す例に進む時が来ましたが、その前に、TeXがボックスをメモリにどのように保存するのかを簡単に知っておく必要があります。まずはアナロジーから始めましょう。

### TeXがボックスをメモリに保存する方法：アナロジー

何らかの理由で、物理的な箱を記述するデータモデルを作る必要があるとしましょう。そのような記述のために、どんなデータを選ぶでしょうか。1つの方法は、情報を2つに分けることです。箱そのものに関するデータと、箱の中身の一覧を与えるデータです。すると、単純なモデルは次のようになるでしょう。

1. 物理的な箱に関するデータ（「メタデータ」）：

* width
* 高さ
* 奥行き
* 重さ
* 色
* 種類（木製、プラスチック、段ボール）

3. 箱の中身に関するデータ：含まれる品目を記述する何らかの一覧。おそらく順不同で列挙されます。

そしてこれは、TeXがボックスを保存する方法と非常によく似ています。

### TeXがボックスをメモリに保存する方法：hlistとvlist

内部的には、TeXは *hlist* （横組リスト）と *vlist* （縦組リスト）と呼ばれる「コンテナ」を作成し、それぞれhboxとvboxを表します。これらのhlist/vlistオブジェクトは、ボックスに関する「メタデータ」の集合を提供し、さらにボックスを実際に構成するオブジェクトの一覧へのアクセスも提供します。その一覧は *ノードリスト*と呼ばれます。物理的な箱とは異なり、物を任意の順序で入れられるのに対して、TeXでは箱の内容の順序が非常に重要です。それらは組版される項目だからです。プログラミングやコンピュータサイエンスの経験があれば、TeXの箱の中のオブジェクトが、いわゆる [双方向連結リスト](https://en.wikipedia.org/wiki/Doubly_linked_list)を使って保存され、その作成順が保持されていると聞いても驚かないでしょう。連結リストについてこれ以上詳しくは述べません。ウェブにはチュートリアルや例、解説があふれているからです。

ノードとノードリストの概念はTeXの動作の基本的な要素ですが、この記事ではごく簡単に概観するだけにします。ノードは本質的には一種の「ミニコンテナ」であり、（LuaTeX 1.04時点では）約50種類のノードがあります。これはLuaTeXが組版に使う内部データ型や構成要素を反映しています。たとえば、グリフ（「文字」から生じるもの）、グルー、水平/垂直ルール、ペナルティ、whatsit、カーンなどを表すノードがあります。組版された材料は最終的に巨大なノードリストの一部となり、LuaTeXはその内部データ構造に直接アクセスできます。LuaTeXではノードリストを追加、編集、修正、作成することもできるので、たとえばTeXコードを一切使わずにLuaコード内で直接ボックスを作ることもできます。ただし、それについてはまた別の機会に。

### \directlua{...}の動作例

次の例では、 `\hbox` を作成し、それをボックスレジスタ0に保存します。その後、従来のTeXコードを使ってそのボックスの幅を表示し、さらに `\directlua{}`を介した別の方法でも同じ情報を取得します。ここでは小さなLuaスクリプトを実行して、TeXの内部ボックス保存領域にアクセスし、そのボックスの幅を取得しています。もちろん、2つの値は同一で、2412092sp（sp=scaled point：65536sp = 1 TeX point）です。結局、この非常に単純な例では、TeXコードとLuaコードのどちらも同じ内部データ構造を調べてボックスの幅を取得していますが、LuaTeXが開くのは、この直接アクセス経路を通じて、他のエンジンでは得られない豊富な情報と制御の世界です。

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

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent TeXコードを使うと、ボックス0の幅は \number\wd0\relax \space sp です\par
\noindent Luaも使って、Lua\TeXの関数の一つを呼び出し、同じ
情報を得ることもできます。\vskip10mm
\noindent Luaコードからは、ボックス0の幅は
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} となり、もちろんTeXコードから得られた値と同一です。
\end{document}
```

## すべてをまとめる：Overleafプロジェクト

内部的には、TeXがボックスを「hlist/vlist」と呼ばれる「コンテナ」として表現し、ボックスに関する「メタデータ」と、ボックスを構成する要素の一覧へのアクセスを提供することに触れました。LuaTeXを使えば、TeXボックスの「メタデータ」と、その中に含まれる項目の一覧、すなわちグリフ、グルー、ペナルティ、他のボックスなどにアクセスできます。Luaスクリプトを使うことで、TeXのメモリ上にあるボックスを調べ、そのボックスに何が含まれているかを詳細に描画することができます。TeXボックスとその内容を適切に表現するには *ノードグラフ* を使います。そこで、Patrick Gundlachが書いた優れたLuaスクリプトを活用してそれを行う [Overleafプロジェクト](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) を用意しました（クレジットを参照）。ボックスを調べてノードグラフを生成するために必要な詳細な処理についてはここでは説明しません。ただし、TeXボックスを処理するプログラム/スクリプトは *再帰的な* 再帰的でなければならない

![{{{alt}}}](/files/65504067c828758206519bad392419c2cfdeee72)

### のは注目に値します。というのも、ボックスは入れ子にできるからです。つまり、hboxの中にvbox、その中にhbox……というように、すべてのボックス型を非常に深い入れ子構造まで組み合わせられます。

このプロジェクトは何を提供するのか？ `\dobox{box command}`という1つのコマンドだけを実装しています。たとえば：

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

この `\dobox{...}` コマンドは、いくつかの作業を行います。

1. 文書内に、ボックスのTeXコードをそのまま組版します。
2. TeXボックスのSVGグラフィックを生成します。これは（このブログ記事で行ったように）Webページに埋め込めます。
3. ノードリストのSVGグラフィックも生成します。これも（このブログ記事で行ったように）Webページに埋め込めます。
4. ノードリストのPDFグラフィックを出力し、それをプロジェクトが生成するメインPDF文書に取り込みます。

LuaTeXが複雑なTeXボックス（たとえば現在構築中のページや、組版された数式）を表現するために保存しなければならないデータ量が非常に多いため、ノードグラフはすぐに非常に大きくなることがあります。大きなノードリストでは、取り込まれたPDFグラフィックが文書のページ境界で切り取られることがあります。大きなノードグラフを見たい場合は、プロジェクトのZIPファイルをダウンロードし、目的のPDFグラフィックを抽出してください。プロジェクトのZIPファイルをダウンロードする際は、ドロップダウンの選択肢から「Input and Output Files」を選ぶようにしてください。

![{{{alt}}}](/files/65ddad886241d336a561008f7ca83b282f9f2723)

### Overleafプロジェクトのグラフィック：簡単な説明

例をいくつか示す前に、Overleafプロジェクトが生成するグラフィックについて少し観察しておく価値があります。ここでは、記事の前半で述べた同じ `\hbox` 例を使います。これをプロジェクトの `\dobox{...}` コマンド：

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

こちらが `\hbox` TeXによって生成されたものです。分かりやすいようにボックスは拡大されていますが、境界線はOverleafプロジェクトで生成されるグラフィックに含まれます。

![{{{alt}}}](/files/4ee3cc4fbf82728360632e7181d4152599e78c79)

こちらは *注釈付きの* 上のボックスを表すノードリストのSVG図です。注釈はボックスの「メタデータ」と、そこに含まれるオブジェクトの一覧を強調するために追加したもので、Overleafプロジェクトで生成されるグラフィックにはこれらの注釈は含まれません。

[![{{{alt}}}](/files/55efbbaa66c073bb5e46b4b4fb2bd5a916cc53ee)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

「メタデータ」部分を見ると、見慣れないパラメータがいくつかあることに気づくかもしれません。

* `glue_set`
* `glue_sign`
* `glue_order`

これらのパラメータは、TeXがこのボックス内でグルーをどれだけ伸ばしたり縮めたりする必要があるかを計算するために使う設定であり、LuaTeXでは簡単に取得できる一方、他のTeXエンジンではできないデータの一例にすぎません。ボックス要素に含まれるグルーノードは *保持し* 、ボックスを作るために私たちが入力した元のグルー値をそのまま保持します。これは極めて重要です。なぜならTeXには `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` というコマンドがあり、ボックスの内容を「アンボックス」して入力ストリームに戻し、再び組版処理に参加させるからです。TeXが最終的にボックスをPDFまたはDVIファイルへ出力（ship out）するときになって初めて `glue_set`, `glue_sign` や `glue_order` がボックス内のどのグルーにも適用され、ボックス内の要素を配置するのに必要な実際の伸縮量を計算し、その後、適切なPDFデータまたはDVIオペコードを生成します。

「メタデータ」に並ぶ別のパラメータは `shift`です。これは、TeXコマンドを適用した結果として生じるボックスのずれ量です。

* `\raise`, `\lower` （適用先が `\hbox`);
* `\moveleft`, `\moveright` （適用先が `\vbox`).

この例では、 `shift` は0ptです。なぜなら、 `\hbox` を自然な位置からずらしていないからです。

この [Overleafプロジェクト](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) また、PDF形式のノードグラフ図も出力します。ここに、 [PDFファイル版](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) の上記ノードグラフをダウンロードするリンクがあります。

### Overleafプロジェクトはどのようにしてそれらのグラフィックを作るのか？

Overleafプロジェクトは、Overleafのサーバーにインストールされたソフトウェアツールやユーティリティを実行できる機能を活用しています。詳しくは [このブログ記事](/latex/ja/xiang-xi-ji-shi/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) とサンプルプロジェクトを参照してください。TeXボックスを表すSVGグラフィックを作成するには、ボックスのTeXコードを小さなファイルに書き出し、それをpdfTeXで組版してDVIファイルを生成します。なお、pdfTeXプログラムはLuaTeXによって、いくつかのLuaスクリプトを介して実行されます。そのDVIファイルは、 `dvisvgm` ユーティリティ `dvisvgm` をコマンドラインオプション `-n` 付きで実行し、組版されたテキストが線/曲線へ変換されるようにして、SVGファイルの正しい描画がTeXフォントのインストール有無に依存しないようにします。

ノードグラフを作成するには、 `hiviznodelist.lua` というLuaスクリプトを使います。これはPatrick Gundlachの作業に基づいています。そのスクリプトは、いわゆる `.gv` （Graphviz）ファイルを書き出します。これは `dot` 言語で記述されたノードグラフを含むテキストファイルです。 `.gv` ファイルは `dot` というユーティリティプログラムで処理され、PDFとSVGの両方のファイル形式でノード図を出力します。

### プロジェクト例

ここに、Overleafプロジェクトで生成したSVGグラフィックを使った追加例をいくつか示します。テキストをたくさん含むボックス（たとえば\vbox内）や複雑な数式は、非常に巨大なノードグラフを生成します。Overleafプロジェクトを試す際は、注目したい機能を示すのに不必要に複雑なボックスを使わない方がよいでしょう。

#### \vbox to 25pt{A}

この例は、テキストを直接 `\vbox`に入れるとどうなるかを示しています。注：このような単純なボックスでも、ノード構造はかなり複雑です。この複雑さの理由は、テキストを直接 `\vbox` に置くとTeXが改行処理を行うからです。 `\vbox` の幅が345ptであることが分かります。これは `\hsize` の値です。つまり、このボックスが作成された時点の値です。また、文字「A」は `hlist` の中に含まれており、その幅も345ポイントであること、そして大きなペナルティ（10000）とともに `\parfillskip` や `\rightskip` のグルーがボックス内容の終わりにあることにも注目してください。そのペナルティと2つのグルー項目は、TeXの改行処理によって挿入されます。文字「A」を含む段落行の `glue_set` 値（`hlist`）を見ると、非常に大きい（322.500000）ことが分かるでしょう。なぜでしょうか。段落行の幅は345ptですが、含まれているのは `\parindent` と文字「A」だけだからです。残りの空間は `\parfillskip` グルーで埋める必要があり、そのグルーは行の残りを埋めるためにかなりの距離まで伸びなければならないのです。

![{{{alt}}}](/files/37f3024fdd9b099055c62ecf868c864121771e23)

[![{{{alt}}}](/files/bfa5d45b57b58d9992b6f29618223bd3c035cc73)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[PDFファイルをダウンロード](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

この例と前の例を比較すると非常に示唆的です。ここではノードグラフがかなり小さいだけでなく、 `\vbox` の幅はたった7.50002ptで、文字「A」と同じ幅です。理由は、「A」が `\hbox` で囲まれており、それが `\vbox` に改行処理を起こさせないからです。これは `\vbox`.

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

[![{{{alt}}}](/files/6a18a6d101100a2a623220a0288960b5404dac7c)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[PDFファイルをダウンロード](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### 簡単な数式：\hbox{$$\displaystyle \int f(x) dx$$}、複雑なボックス！

この例は、非常に単純な組版数式であっても詳細なボックス構造を生み出すことを示しています。数式の組版は *極めて* TeXの内部に複雑なデータ構造を生成するのです！

![{{{alt}}}](/files/34dc57bead891e212aea7513dcd6b9ce7100df99)

[![{{{alt}}}](/files/7b0aafae20259d60157bc011a3c858d59dde54ad)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[PDFファイルをダウンロード](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## クレジット：Patrickに感謝！

感謝します、 [Patrick Gundlach](https://twitter.com/patrickgundlach) に。彼は、Overleafが彼のLuaスクリプトの修正版を使用・配布する許可を与えてくれました。 `viznodelist.lua`は、TeXボックスを処理して、 `dot` 言語のファイルを出力し、それを処理してノードグラフを描画できます。Overleafプロジェクトには `hiviznodelist.lua`というLuaスクリプトが含まれています。これはPatrickの元のコードを改名し修正したもので、 [GitHub](http://gist.github.com/556247)で入手できます。Patrickは、 [speedata Publisher](https://speedata.github.io/publisher/index.html) というオープンソースのLuaTeXベース組版システムを作成しており、これを無料でダウンロードして使用できます。商用サポートのオプションも利用可能です。


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
