> 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/24-how-tex-calculates-glue-settings-in-an-hbox.md).

# TeXが\hbox内のグルー設定をどのように計算するか

これは、〜を取り上げる連載の第3回であり、最終回の記事です $$\mathrm \TeX$$ ボックスとグルーについて。最初の記事は [ボックスとグルー：LuaTeXを使った、簡潔だが視覚的な入門](/latex/ja/xiang-xi-ji-shi/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) ボックスとグルーの概念を紹介し、続いて [パンドラの\hbox: LuaTeXを使ってTeXボックスのふたを開ける](/latex/ja/xiang-xi-ji-shi/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) で、〜を紹介しました [$$\text{Lua}\mathrm\TeX$$ベースのOverleafプロジェクト](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) のより深い構造を探るための $$\mathrm \TeX$$ ノードグラフを用いてボックスを調べました。今回の最終回では、〜がどのように動作するのか、その仕組みを“深掘り”します $$\mathrm \TeX$$ が、〜においてグルー値をどのように計算するか `\hbox`：これは、 *グルーを設定すること*。本記事ではノードグラフを広く活用します（ [パンドラの\hbox: LuaTeXを使ってTeXボックスのふたを開ける](/latex/ja/xiang-xi-ji-shi/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) この連載で紹介したもの）を用い、それらが提供するデータのいくつかの使い方と読み解き方を示します： `glue_set`, `glue_sign` や `glue_order`.

ここでは、〜のグルー計算の完全な例を示します `\hbox` 多くの詳細を扱います。ただし、ここでは取り上げきれない追加の状況や考慮事項もあるかもしれません。詳しく知りたい読者は、〜の77ページを参照してください $$\text{The } \mathrm \TeX \text{book}$$.

## 課題

次のような〜があるとします `\hbox` このようなものです：

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

このボックスは次のように見えます。分かりやすいように、拡大して枠線付きで示します：

![ボックス](/files/dad2596d327d4d2a387d608b013146b1cc8cbfd7)

問題は、最終的な値はいくつか、〜で $$\mathrm \TeX$$ 以下の要素の間の空間（グルー）のポイント数は？

* A と B の間
* B と C の間
* C と D の間
* D とボックスの終わりの間

つまり、次の値を計算したいのです： $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![グルー](/files/8aa97e049801e34636de3707316876e01d8f8d09)

上のボックスを表すノードグラフです。特に注目したいのは、“metadata”セクションに含まれる3つの値です：

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

![ノードグラフ](/files/b947cf8283e4a12d5f7ac2d0aaa3cad59ff640d4)

特定の値の組があることに注意することが重要です `glue_set`, `glue_sign` や `glue_order` は最上位ボックス内のグルーにのみ影響し、〜内のグルーには影響しません *入れ子の* ボックス：各入れ子ボックス（hlist または vlist オブジェクト）には、これら3つのパラメータそれぞれに独自の値があります。次に、〜の例を示します `\hbox` 外側の〜の中に入れ子になった `\hbox`。この例では、〜の異なる値がはっきり分かります `glue_set`—もちろん、入れ子ボックスでは〜についても異なる値を持つことができます `glue_sign` や `glue_order`.

```latex
\hbox to 75pt{\hfill ABC\hbox to15pt{\hfill D}}
```

![ノードグラフ](/files/bc73be766845496b5cb4bb69dc847056bf71aa38)

## グルーの種類、無限級数、順序：まとめ

$$\mathrm \TeX$$ は、次のようなグルー関連の基本コマンドをいくつか提供します：

* 横方向のグルー： `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* 縦方向のグルー：`\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

および `\mskip` 数式にグルーを挿入するためのものです。

グルーの項目は、3つの値の組で定義されます：

* **自然幅**：伸ばしたり縮めたりしない場合に占める空間の大きさ；
* **伸長成分**：グルーをどれだけ伸ばせるか；
* **収縮成分**：グルーをどれだけ縮められるか。

ここで考えるのは、〜内でのグルーの使用と `\hbox{...}` および、 $$\mathrm \TeX$$ 最終的にグルーがどれだけの空間を占めるかを決めるために使う計算です。いくつかの〜を作成するために使うコマンドは *横向き* グルーは `\hskip`で、書式は次のとおりです：

`**\hskip** *<natural width>* **plus** *<amount to stretch>* **minus** *<amount to shrink>*`

〜については *縦向き* 使うグルー `**\vskip** *<natural width>* **plus** *<amount to stretch>* **minus** *<amount to shrink>*`.

たとえば、典型的な横方向グルーは次のように表されます `\hskip 3pt plus 2pt minus 1pt`。他の物理単位も使えます：

* `\hskip 3mm plus 2mm minus 1mm`
* `\hskip 3in plus 2in minus 1in`
* `\hskip 1in plus 3cm minus 20mm`

## $$\mathrm \TeX$$ グルーと「無限」の単位

グルーの収縮または伸長成分には $$\mathrm \TeX$$ は、別の種類の単位、いわゆる「無限級数」を導入します： $$\text{fil}$$, $$\text{fill}$$ や $$\text{filll}$$。これら3つの「無限のレベル」は、順に並べると、それぞれが前のものより「より無限」であるという関係にあります：

$$\text{fil} < \text{fill} < \text{filll}$$

「infinities」という名称は、これらの単位には少し紛らわしいかもしれません。別の見方をすれば、これは異なるレベルの *優先度*と考えると分かりやすいでしょう。というのも、最終的には、どのグルーが実際に伸縮の過程に参加するかを決める助けになるからです。伸長または収縮成分が「無限」のグルーを使えば、 $$\mathrm \TeX$$ 任意の量だけ伸縮できるグルーを作れます。有限のグルーでは、 $$\mathrm \TeX$$ そのようなグルーが縮められる量は制限されます。「無限」のグルーの例は

`\hskip 3pt plus 2fil minus 1fill`

なお、たとえば次のようには書けません： `\hskip 1fil` なぜなら $$\mathrm \TeX$$ は、次のメッセージのエラーを報告します `不正な測定単位です（ptを挿入しました）`。この時点では、これらの「無限のレベル」は非常に奇妙に聞こえるかもしれませんが、ひとまずはそのまま受け入れてください。すぐに、〜がどのように $$\mathrm \TeX$$ グルー計算を行う際にこれらの無限級数を使うのかが分かります。

### 無限のレベル（「グルー順序」）

内部的には、 $$\mathrm \TeX$$ がグルー計算を行う際、各無限レベルを 0〜3 の「グルー順序」とみなし、0次は bp、pt、mm などの物理単位を持つグルーに対応します。ただし、〜では $$\text{Lua}\mathrm\TeX$$ 少し違いがあります。というのも、実際には他の多くの〜にはない追加の無限種類（順序）を持っているからです $$\mathrm \TeX$$ エンジン： $$\text{fi}$$ （下の説明を参照）。 $$\text{The } \mathrm \TeX\text{book}$$ を読んでも、〜についての記述は見当たりません $$\text{fi}$$ 無限—単に、それがKnuthの元の $$\mathrm \TeX$$ ソフトウェアに実装されていないためです。その結果、〜の間には少しした「ずれ」があります $$\text{Lua}\mathrm\TeX\text{'s}$$ 無限の順序と、〜に関する本で目にするものとの間に $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ は、0〜4 の順序の無限級数を使いますが、他の（一般的な） $$\mathrm \TeX$$ エンジンは 0〜3 です。以下は、各種類のグルー単位に割り当てられるグルー順序を示した表です。

|                           |                |      |     |      |       |
| ------------------------- | -------------- | ---- | --- | ---- | ----- |
|                           | 物理単位（pt、mm、in） | fi   | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0              | 1    | 2   | 3    | 4     |
| 他のエンジン                    | 0              | 該当なし | 1   | 2    | 3     |

### 注記 $$\text{Lua}\mathrm\TeX$$：なぜ追加の無限があるのか？

$$\text{Lua}\mathrm\TeX$$ は、いくつかのプロジェクトやコードライブラリに由来しており、その中には次のものがあります [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ はOmegaのコードの一部を取り込み、それには次のような新しい種類の無限グルーも含まれています $$\text{fi}$$。Omegaマニュアルより：

> 「新しい無限レベル $$\text{fi}$$ が追加されました。これは〜より小さいですが、 $$\text{fil}$$ どんな有限量よりも大きいものです。元々の目的は文字間の伸縮で、アラビア語のような書道系の文字で行われるような黒みの補完、あるいはロシア語のような強調のためでした。既存のマクロパッケージを書き換える必要はありません。したがって、新しいキーワード $$\text{fi}$$があり、さらに2つの新しいプリミティブ `\hfi` や `\vfi`」によって示されます。

## 課題に戻りましょう

Knuthのモデルに従って、2つの量を定義しましょう：

* ボックスの望ましい幅： $$\mathrm{W}\_{\mathrm{D}}$$—どれくらいの大きさにしたいか；
* ボックスの自然幅： $$\mathrm{W}\_{\mathrm{N}}$$—グルーが伸縮される前に、その構成要素が占める全体の空間。

### ボックスの自然幅

ボックスの自然幅とは、そのボックス内のすべての要素、つまり文字、カーン、入れ子ボックス、そしてあらゆるグルーの合計幅です。ボックス内のグルーについては、その自然幅はグルーの伸長や収縮を無視します。つまり、伸縮が行われる前の大きさです。

もう一度、調べているボックスを示します：

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

明らかに、このボックスは 100pt 幅にしたいので、したがって $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ では、その自然幅はどうでしょうか、 $$\mathrm{W}*{\mathrm{N}}$$？自然幅を計算するには、4つの文字（A、B、C、D）の幅に加えて、4つのグルーの自然幅が必要であることは明らかです。

$$\eqalign{\mathrm{W}\_{\mathrm{N}} &= &\text{width(A)} + \text{width(B)} + \text{width(C)} + \text{width(D)} \ & &+ \text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fil\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fill)*\ & &+\text{width}(\verb*\hskip 0pt plus 3fill\*)\ }$$

ここで $$\text{width}$$ は、項目の自然幅を表すための表記にすぎません。4つの文字（A、B、C、D）の自然幅は、ノードグラフから求められます：

![ノードグラフ](/files/31ecf180c69edc462dc04197535a9eb2b8e89dda)

上のノードグラフから分かることは次のとおりです：

$$\eqalign{ \text{width(A)} &= 7.50002\text{pt}\ \text{width(B)} &= 7.08336\text{pt}\ \text{width(C)} &= 7.22223\text{pt}\ \text{width(D)} &= 7.6389\text{pt}\ }$$

あとはグルーの自然幅だけです。これは伸長成分と収縮成分を無視すれば簡単に求められます：

$$\eqalign{ &\text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*) & = 4\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fil\*) &=0\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fill)*&=0\text{pt}\ &\text{width}(\verb*\hskip 0pt plus 3fill\*)&=0\text{pt}\ }$$

したがって：

$$\eqalign{ \mathrm{W}\_{\mathrm{N}} & = \text{widths of characters} + \text{width of all glues}\ &= 7.50002\text{pt}+ 7.08336\text{pt} + 7.22223\text{pt} + 7.6389\text{pt} + 4\text{pt}\space \text{(from }\verb\*\hskip\*\text{)}\ &=33.4445\text{pt}\ }$$

これで重要な情報が2つそろいました：

$$\eqalign{ \mathrm{W}*{\mathrm{D}} & = 100\text{pt}\ \mathrm{W}*{\mathrm{N}} & = 33.4445\text{pt}\ }$$

明らかに、 $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ その差は $$(100-33.4445)\text{pt}=66.5555\text{pt}$$；この余分な空間はグルーを伸ばして埋める必要があります—しかし、どのグルーを、どれだけ伸ばすのでしょうか？

### 最も伸長が大きいのはどれでしょうか？

Knuthの方法論に従うと（〜の77ページ）、 $$\text{The } \mathrm \TeX \text{book}$$）、ただし追加の無限種類（$$\text{fi}$$）を考慮すると、これは〜によって提供されるものです $$\text{Lua}\mathrm \TeX$$、次のステップはボックスの *総* 伸長を次の形で書き出すことです：

$$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}$$

まず、 $$\text{total glue}$$:

$$\text{total glue } = (\verb*4pt plus3pt minus 2pt*) + (\verb*0pt plus 2fil*) + (\verb*0pt plus 2fill*) + (\verb*0pt plus 3fill*)$$

を書き出すと、 $$\text{total stretch}$$ の一般形は次のとおりです:

$$\eqalign{ \text{total stretch} & = 3\text{pt}+ 0\text{fi} + (2\text{fil}) + (2\text{fill} + 3\text{fill}) + 0\text{filll}\ &=3\text{pt}+ 0\text{fi} + 2\text{fil} + 5\text{fill} + 0\text{filll}\ }$$

これを〜と比べると $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$次のことが分かります：

$$\eqalign{ y\_0 &=3\text{pt}\ y\_1 &=0\ y\_2 &=2\ y\_3&=5\ y\_4&=0\ }$$

$$\mathrm\TeX$$ 次に“自問”します：〜を見て $$\text{total stretch}$$、非ゼロの値を持つ最も高い無限レベルはどれでしょうか？ボックスの〜を調べると、 $$\text{total stretch}$$ 「最も無限に近い」非ゼロの伸長成分は $$\text{fill}$$ であり、 $$y\_3=5$$ 単位があります。これは、次の $$\text{fill}$$ 伸長成分を持つグルーが、すべての伸長を担っていることを意味します。〜の下付き3は $$y\_3$$ が `glue_order` 使用されるグルーの〜を示しています—この場合は伸長用です。さて、この〜のノード図の“metadata”セクションを見ると、 `\hbox` さらに2つの“metadata値”の意味が分かるようになります（〜については後で扱います） `glue_set` 次の節で）

![メタデータ](/files/b9d8cb872a35162a4d5aba0ddb3732b127f25f50)

* `glue_sign`：グルーが自然長に設定されているのか、伸ばされているのか、縮められているのかを示します：
* 0=自然幅に設定
* 1=伸長
* 2=収縮

この例では、 `glue_sign` の値は `1`で、参加するグルーは伸ばされることを意味します。

* `glue_order` どの「無限」が関係しているかを示します；〜では $$\text{Lua}\mathrm \TeX$$ 値が3であることは、次のようなグルーが $$\text{fill}$$ 成分を持つものがグルー計算に参加することを示します—今回の場合は伸長します。

単位として〜で定義された伸長成分を持たないグルーはすべて $$\text{fill}$$ は **自然長に設定されます**：つまり、（今回の場合）まったく伸びません。

### どれだけ伸ばすか、縮めるか：glue\_set の計算

ここまでの状況と分かっていることをまとめると：

1. ボックスの望ましい幅： $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. ボックスの自然幅： $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. グルーは伸ばす必要がありますが、次のようなグルーだけが $$\text{fill}$$ 伸長成分
4. 合計で $$(2+3)=5$$ 単位の $$\text{fill}$$ が利用可能です。

次の疑問は、そのグルーは実際にどれだけ伸びるのか、ということです。そこで登場するのが *グルー設定比率*—として参照される `glue_set` ノードグラフ内ではこう表されます。 $$\mathrm \TeX$$ が行うのは、埋める必要のある空間の量を求め、その空間を適切なグルーに、それぞれの伸長成分の大きさに比例して配分することです。実際の `\hbox` を見返すと、どのグルーに〜単位を含む伸長成分があるかが正確に分かります $$\text{fill}$$:

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

この $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ は次のように計算されます：

$$\eqalign{ \text{glue set ratio}\space (\verb*glue\_set*) = & {\text{amount to stretch}}\over{\text{value of highest infinity}}\ =& {\mathrm{W}*{\mathrm{D}}-\mathrm{W}*{\mathrm{N}}}\over{y\_3}\ =& {(100-33.4445)}\over{5}\ =& {66.5555}\over{5}\ =& 13.3111\space (\text{to 4 decimal places})\ }$$

そして最後のステップです。 $$\mathrm\TeX$$ アルゴリズムが適用されます：

1. 伸長成分が目的の〜と一致する各グルー項目について `glue_order` （今回の場合は3）、そのグルーの長さは次のようになります：

$$\text{stretched value} = \text{natural length} + (\verb*glue\_set* \times \text{value of stretch component})$$

3. それ以外のすべてのグルーは自然長に設定されます。つまり、まったく伸びません。

ボックス内のグルーを見ると：

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

それぞれを順に見て、最終値を計算できます：

1. **A と B の間**: `\hskip 4pt plus3pt minus 2pt`。伸長成分は `3pt`で、順序は `0`。必要なのは `glue_order` は `3`：伸長成分は無視され、このグルーは自然幅の `4pt`.
2. **B と C の間**: `\hskip 0pt plus 2fil`。伸長成分は `2fil`で、順序は `2`。必要なのは `glue_order` は `3`：伸長成分は無視され、このグルーは自然幅の `0pt`.
3. **C と D の間**: `\hskip 0pt plus 2fill`。伸長成分は `2fill`で、順序は `3` と一致し、必要な `glue_order` のトークン値は次のようになります。 `3`。このグルーは次の長さまで伸ばされます： $$\eqalign{ \text{stretched value}\space = & \text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ = & 0\text{pt} + 13.3111 \times 2 \ = & 26.6222\text{pt}\ }$$5. **D とボックスの終わりの間**: `\hskip 0pt plus 3fill`。伸長成分は `3fill`で、順序は `3` と一致し、必要な `glue_order` のトークン値は次のようになります。 `3`。このグルーは次の長さまで伸ばされます： $$\eqalign{ \text{stretched value}\space = &\text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ =& 0\text{pt} + 13.3111 \times 3 \ = &39.9333\text{pt}\ }$$

## そして最後に：合計幅の確認

グルーが実際に占める空間を計算する過程は *グルーを設定すること* と呼ばれます。これで、ボックスを望みの幅まで埋められたかどうかを確認できます、 $$(\mathrm{W}\_{\mathrm{D}} = \text{100pt})$$:

$$\eqalign{ \mathrm{W}\_{\mathrm{D}} & = \text{width of all characters} + \text{width of all }\textbf{set}\text{ glue values}\ & = \text{A:7.50002pt} + \text{B:7.08336pt} + \text{C:7.22223pt} + \text{D:7.6389pt}\ & + \text{4pt} + \text{0pt} + \text{26.6222pt} + \text{39.9333pt}\ & = \text{100.00pt} }$$

これで、すべてのグルーの幅が分かりました。この記事の冒頭で提示した問いに答える図を用意できます。こちらが、私たちの〜内の文字間にあるグルー幅です `\hbox`:

![グルー](/files/50d2f4b6940bae300a3364563504d2735b04966f)


---

# 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/24-how-tex-calculates-glue-settings-in-an-hbox.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.
