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

# Jak TeX vypočítává nastavení lepidla v \hbox

Toto je třetí a závěrečný článek ze série, která se zabývá $$\mathrm \TeX$$ boxy a glue. První příspěvek [Boxy a lepidlo: Krátký, ale názorný úvod s využitím LuaTeXu](/latex/cs/clanky-do-hloubky/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md) představil pojmy boxů a glue a po něm následoval [Pandora’s \hbox: Použití LuaTeXu k nadzvednutí víka TeXových boxů](/latex/cs/clanky-do-hloubky/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) který představil [$$\text{Lua}\mathrm\TeX$$-based projekt na Overleafu](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) prozkoumat hlubší struktury $$\mathrm \TeX$$ boxů pomocí grafů uzlů. V této závěrečné části se „ponoříme do hloubky“ do mechanismu toho, jak $$\mathrm \TeX$$ počítá hodnoty glue v `\hbox`: procesu označovaném jako *nastavování glue*. Rozsáhle využíváme grafy uzlů (představené v [Pandora’s \hbox: Použití LuaTeXu k nadzvednutí víka TeXových boxů](/latex/cs/clanky-do-hloubky/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) v této sérii) a ukazujeme, jak používat a interpretovat některá data, která poskytují: `glue_set`, `glue_sign` a `glue_order`.

Uvádíme plně vypracovaný příklad výpočtů glue pro `\hbox` a probíráme mnoho detailů; mohou však existovat další okolnosti a hlediska, na která zde nemáme prostor a zájemce proto odkázáme na stranu 77 $$\text{The } \mathrm \TeX \text{book}$$.

## Výzva

Předpokládejme, že máme `\hbox` takovýto:

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

Takhle tento box vypadá — pro přehlednost je zobrazen zvětšený a s rámečkem:

![box](/files/6d81b4b0a296e2de7c08219be4c0f46da09c74ea)

Otázka zní: jaká je konečná hodnota, v $$\mathrm \TeX$$ pointechech, prostoru (glue) mezi následujícími položkami:

* A a B
* B a C
* C a D
* D a koncem boxu

tj. chceme vypočítat hodnoty $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![lepidlo](/files/dfdfa63f55725c3db56bc4f80056c2f076bf8786)

Zde je graf uzlů představující výše uvedený box. Zvláštní pozornost si zasluhují tři hodnoty obsažené v části „metadata“:

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

![graf uzlů](/files/65f4c363663b186d8dc11911fbf1a1155b2b1def)

Je důležité si uvědomit, že konkrétní sada hodnot pro `glue_set`, `glue_sign` a `glue_order` ovlivňuje pouze glue v horním boxu: neovlivňuje glue uvnitř *vnořených* boxů: každý vnořený box (objekt hlist nebo vlist) má pro tyto tři parametry vlastní hodnoty. Zde je příklad `\hbox` vnořeného uvnitř vnějšího `\hbox`. V tomto příkladu můžete jasně vidět různé hodnoty `glue_set`— samozřejmě i vnořený box může mít různé hodnoty `glue_sign` a `glue_order`.

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

![graf uzlů](/files/07e2aab0db0786350b465e66f2595fdd63bdfce9)

## Typy glue, nekonečna a řády: shrnutí

$$\mathrm \TeX$$ poskytuje řadu primitivních příkazů souvisejících s glue, včetně:

* vodorovné glue: `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* svislé glue:`\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

spolu s `\mskip` pro vkládání glue v matematických výrazech.

Položka glue je definována sadou tří hodnot:

* **přirozená šířka**: kolik prostoru zabírá, když ji nenatáhnete ani nesmrštíte;
* **komponenta natažení**: o kolik se může glue natáhnout;
* **komponenta smrštění**: o kolik se může glue smrštit.

To, čím se budeme zabývat, je použití glue uvnitř `\hbox{...}` a výpočty $$\mathrm \TeX$$ které používá k určení, kolik prostoru bude glue nakonec zabírat. Příkaz, který budeme používat k vytvoření některého *vodorovná* glue je `\hskip`, který má tvar:

`**\hskip** *<přirozená šířka>* **plus** *<množství k natažení>* **minus** *<množství ke smrštění>*`

Pro *svislá* glue, které byste použili `**\vskip** *<přirozená šířka>* **plus** *<množství k natažení>* **minus** *<množství ke smrštění>*`.

Například nějaké typické vodorovné glue by se vyjádřilo jako `\hskip 3pt plus 2pt minus 1pt`. Můžete použít i jiné fyzické jednotky:

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

## $$\mathrm \TeX$$ glue a jednotky „nekonečna“

Pro složku smrštění nebo natažení glue $$\mathrm \TeX$$ zavádí jiný typ jednotky: tzv. „nekonečna“: $$\text{fil}$$, $$\text{fill}$$ a $$\text{filll}$$. Tato tři „stupně nekonečna“ jsou taková, že když jsou uvedena v pořadí, každé další je „více nekonečné“ než předchozí:

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

Možná je „nekonečna“ pro tyto jednotky poněkud matoucí název — může být užitečné myslet na ně také jako na různé úrovně *priority*, protože nakonec pomáhají určit, která glue se ve skutečnosti zapojí do procesu natahování nebo smrštění. Díky glue s „nekonečnou“ složkou natažení nebo smrštění $$\mathrm \TeX$$ můžete vytvářet glue, které se může natáhnout nebo smrštit o libovolnou požadovanou míru. Všimněte si, že u konečných glue $$\mathrm \TeX$$ omezí míru, o kterou se takové glue mohou smrštit. Příkladem „nekonečného“ glue je

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

Všimněte si, že nemůžeme napsat například `\hskip 1fil` protože $$\mathrm \TeX$$ nahlásí chybu se zprávou `Illegal unit of measure (pt inserted)`. V tuto chvíli mohou tato „stupně nekonečna“ znít velmi podivně, ale prozatím to prostě přijměte jako fakt a brzy uvidíme, jak $$\mathrm \TeX$$ používá tato nekonečna při provádění výpočtů glue.

### Stupně nekonečna („pořadí glue“)

Interně, když $$\mathrm \TeX$$ provádí své výpočty glue, považuje každý stupeň nekonečna za „pořadí glue“ v rozsahu 0–3, kde nulté pořadí je pro glue s fyzikálními rozměry, jako jsou bp, pt, mm a tak dále. Nicméně u $$\text{Lua}\mathrm\TeX$$ je tu drobná odchylka, protože ve skutečnosti má navíc jeden typ (pořadí) nekonečna, který v mnoha jiných $$\mathrm \TeX$$ enginech chybí: $$\text{fi}$$ (viz vysvětlení níže). Pokud čtete $$\text{The } \mathrm \TeX\text{book}$$ nenajdete žádnou zmínku o $$\text{fi}$$ nekonečnu — jednoduše proto, že nebylo implementováno v původním Knuthově $$\mathrm \TeX$$ softwaru. Máme tedy drobný „nesoulad“ mezi $$\text{Lua}\mathrm\TeX\text{'s}$$ pořadím nekonečen a těmi, které můžete vidět v knihách o $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ používá nekonečna v rozsahu pořadí 0–4, ale jiné (běžné) $$\mathrm \TeX$$ enginy používají rozsah 0–3. Zde je tabulka ukazující pořadí glue přiřazené každému typu jednotky glue.

|                           |                                 |     |     |      |       |
| ------------------------- | ------------------------------- | --- | --- | ---- | ----- |
|                           | Fyzikální jednotky (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                               | 1   | 2   | 3    | 4     |
| Jiné enginy               | 0                               | N/A | 1   | 2    | 3     |

### Poznámky k $$\text{Lua}\mathrm\TeX$$: Proč mít navíc jedno nekonečno?

$$\text{Lua}\mathrm\TeX$$ je odvozen z řady projektů a kódových knihoven, včetně jedné nazvané [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ zahrnoval určité aspekty kódu Omeg y a to zahrnuje nový typ nekonečného glue nazvaný $$\text{fi}$$. Z manuálu k Omeze:

> „Přidána byla nová úroveň nekonečna $$\text{fi}$$ je menší než $$\text{fil}$$ ale větší než jakákoli konečná veličina. Jeho původním záměrem bylo pro protažení mezi písmeny: buď vyplňování černých míst, jak se to dělá u kaligrafických písem, jako je arabština; nebo pro zdůraznění, jako v ruštině; to vše bez nutnosti přepisovat stávající makropakety. Existuje tedy nové klíčové slovo, $$\text{fi}$$, a dva nové primitivy, `\hfi` a `\vfi`.”

## Zpět k naší výzvě

Podle Knuthova modelu definujme dvě veličiny:

* požadovaná šířka boxu: $$\mathrm{W}\_{\mathrm{D}}$$— jak velký ho chceme mít;
* přirozená šířka boxu: $$\mathrm{W}\_{\mathrm{N}}$$— celkový prostor zabraný jeho složkami předtím, než se nějaká glue natáhne nebo smrští.

### Přirozená šířka boxu

Přirozená šířka boxu je celková šířka všech složek v tom boxu: znaků, kernů, vnořených boxů a veškerého glue. U glue uvnitř boxu se jeho přirozená šířka nebere s natažením ani smrštěním v úvahu: tj. jeho velikost předtím, než dojde k jakémukoli natažení nebo smrštění.

Ještě jednou, zde je box, který zkoumáme:

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

Je zřejmé, že chceme, aby box byl široký 100pt, tedy $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ ale co jeho přirozená šířka, $$\mathrm{W}*{\mathrm{N}}$$? K výpočtu přirozené šířky je zřejmé, že potřebujeme šířky čtyř znaků (A, B, C a D) plus přirozené šířky čtyř glue.

$$\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\*)\ }$$

Kde $$\text{width}$$ je pouze zápis označující přirozenou šířku položky. Přirozené šířky čtyř znaků (A, B, C a D) můžeme získat z našeho grafu uzlů:

![graf uzlů](/files/bf320f5a14d7994ea16893dda5612ba489c75c2e)

Z výše uvedeného grafu uzlů vidíme, že:

$$\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}\ }$$

Nyní potřebujeme už jen přirozené šířky našich glue, které snadno získáme ignorováním složek natažení a smrštění:

$$\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}\ }$$

Proto:

$$\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}\ }$$

Nyní máme dvě klíčové informace:

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

Jasně, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ a rozdíl je $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; tento přebytečný prostor musí být vyplněn natažením glue — ale které a o kolik?

### Kdo má největší natažení?

Podle Knuthovy metodiky (strana 77 $$\text{The } \mathrm \TeX \text{book}$$), ale s ohledem na dodatečný typ nekonečna ($$\text{fi}$$) poskytovaný $$\text{Lua}\mathrm \TeX$$, je dalším krokem zapsat *celkové* natažení boxu ve tvaru:

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

Nejprve, když zapíšeme $$\text{total glue}$$:

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

můžeme pak vidět, že $$\text{total stretch}$$ je:

$$\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}\ }$$

Ve srovnání s $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$můžeme vidět, že:

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

$$\mathrm\TeX$$ pak se „samo ptá“: při pohledu na $$\text{total stretch}$$, jaká je nejvyšší úroveň nekonečna s nenulovou hodnotou? Při prozkoumání našeho boxu $$\text{total stretch}$$ je jasné, že „nejvíce nekonečná“ nenulová složka natažení je $$\text{fill}$$ a máme $$y\_3=5$$ jednotek toho: veškeré natahování zajišťují glue s $$\text{fill}$$ složkou natažení. Dolní index 3 u $$y\_3$$ nám říká `glue_order` toho glue, které se bude používat — v tomto případě pro natahování. Když se nyní podíváme na část „metadata“ v našem diagramu uzlů pro tento `\hbox` můžeme nyní dát smysl dalším dvěma „hodnotám metadata“ ( `glue_set` se budeme věnovat v další části)

![metadata](/files/f3732d88568995b7a6e8c811c0b2b1f5c84e672a)

* `glue_sign`: říká vám, zda je glue nastaveno na přirozenou délku, nataženo nebo smrštěno:
* 0=nastaveno na přirozenou šířku
* 1=natažení
* 2=smrštění

V našem příkladu, `glue_sign` má hodnotu `1`, což znamená, že se účastnící glue mají natáhnout.

* `glue_order` vám říká, které „nekonečno“ je ve hře; pro $$\text{Lua}\mathrm \TeX$$ hodnota 3 vám říká, že se do výpočtů glue zapojí glue s $$\text{fill}$$ složkou — v našem případě se budou natahovat.

Jakékoli glue, které nemá složku natažení definovanou v jednotkách $$\text{fill}$$ bude **nastaveno na svou přirozenou délku**: tj. se vůbec (v našem případě) nebude natahovat.

### Kolik natáhnout nebo smrštit: výpočet glue\_set

Abychom shrnuli, kde jsme a co víme:

1. požadovaná šířka boxu: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. přirozená šířka boxu: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. glue se bude muset natáhnout, ale toto natahování provedou jen glue s $$\text{fill}$$ složkou natažení;
4. máme celkem $$(2+3)=5$$ jednotek $$\text{fill}$$ k dispozici.

Další otázka zní: o kolik se tato glue vlastně natáhnou? Nastupuje *poměr nastavení glue*— označovaný jako `glue_set` v našem grafu uzlů. Co $$\mathrm \TeX$$ dělá, je spočítat, kolik prostoru je třeba vyplnit, a poté toto množství prostoru rozdělit mezi příslušná glue úměrně velikosti jejich složky natažení. Když se podíváte zpět na naše skutečné `\hbox` můžete přesně vidět, které glue mají složky natažení obsahující jednotky $$\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%
}
```

Ta $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ se vypočítává takto:

$$\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})\ }$$

A nyní poslední krok v $$\mathrm\TeX$$ algoritmu se použije:

1. pro každou položku glue, jejíž složka natažení odpovídá požadovanému `glue_order` (v našem případě 3) se délka tohoto glue stane:

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

3. všechna ostatní glue se nastaví na svou přirozenou délku — tj. vůbec se nenatáhnou.

Při pohledu na glue v našem boxu:

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

můžeme je projít a vypočítat jejich konečné hodnoty:

1. **Mezi A a B**: `\hskip 4pt plus3pt minus 2pt`. Složka natažení je `3pt`, což je řád `0`. Požadované `glue_order` je `3`: složka natažení se ignoruje a toto glue převezme svou přirozenou šířku `4pt`.
2. **Mezi B a C**: `\hskip 0pt plus 2fil`. Složka natažení je `2fil`, což je řád `2`. Požadované `glue_order` je `3`: složka natažení se ignoruje a toto glue převezme svou přirozenou šířku `0pt`.
3. **Mezi C a D**: `\hskip 0pt plus 2fill`. Složka natažení je `2fill`, což je řád `3` a odpovídá požadovanému `glue_order` pro `3`. Toto glue se natáhne na: $$\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. **Mezi D a koncem boxu**: `\hskip 0pt plus 3fill`. Složka natažení je `3fill`, což je řád `3` a odpovídá požadovanému `glue_order` pro `3`. Toto glue se natáhne na: $$\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}\ }$$

## A nakonec: kontrola celkové šířky

Proces výpočtu skutečného prostoru zabraného glue se nazývá *nastavování glue* takže nyní můžeme zkontrolovat, zda jsme box vyplnili na požadovanou šířku, $$(\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} }$$

Nyní známe šířky všech glue a můžeme připravit grafiku, která odpoví na otázku položenou na začátku tohoto článku: zde jsou šířky glue mezi znaky v našem `\hbox`:

![lepidlo](/files/a4bbdfec173fac95b5bac6c78fd636912b0e75b4)


---

# 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/cs/clanky-do-hloubky/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.
