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

# Pandořina \hbox: Použití LuaTeXu k nahlédnutí do TeXových boxů

## Úvod

Boxy a lepidlo jsou dva klíčové pojmy, které tvoří základ sazebního modelu a možností TeXu. Navazujíc na úvodní materiál v předchozím příspěvku, [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), se tento bohatě ilustrovaný článek zabývá boxy a lepidlem podrobněji. Také představujeme nový projekt založený na LuaTeXu [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) který vám umožní prozkoumat hlubokou vnitřní strukturu boxů TeXu — a poskytne poznatky, které vám pomohou skutečně porozumět jejich chování. Vytvoření projektu Overleaf bylo výrazně usnadněno prací Patricka Gundlacha, proto mu vyjadřujeme [naše poděkování](#credits-thanks-patrick).

## Proč zvolit LuaTeX?

Za prvé stojí za to znovu připomenout rozdíl mezi LuaTeXem a LuaLaTeXem:

* LuaTeX je název spustitelného sazebního enginu založeného na TeXu;
* LuaLaTeX označuje použití makropaketu LaTeX s enginem LuaTeX.

Toto rozlišení je nesmírně důležité, protože v tomto článku využíváme vestavěné možnosti samotného enginu LuaTeX, nikoli jen funkce/potenciál příkazů poskytovaných makropaketem LaTeX.

Čtenáři, kteří si nejsou jisti rozdílem mezi TeXovým enginem a makropaketem LaTeX, si mohou přečíst jeden z našich dříve zveřejněných článků, [Co je v názvu: Průvodce mnoha variantami TeXu](/latex/cs/clanky-do-hloubky/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), který tyto rozdíly vysvětluje poněkud podrobněji. Tentýž článek také probírá „TeX“ jako programovací jazyk a to, že sazební enginy založené na TeXu (např. pdfTeX, XeTeX a LuaTeX) se neliší jen svými funkcemi a možnostmi, ale také mají odlišnosti v „chuti“ jazyka TeX, kterou podporují. Tím se dostáváme k naší volbě LuaTeXu. Kromě podpory programovacího jazyka založeného na TeXu má LuaTeX také vestavěný skriptovací jazyk Lua — poskytující přístup k jednoduchému, ale velmi výkonnému běžnému programovacímu jazyku. Prostřednictvím Lua a vestavěné funkcionality LuaTeXu můžete zkoumat a řídit sazební činnosti LuaTeXu způsoby, které žádný jiný TeXový engine nenabízí — a to včetně možnosti nahlížet do vnitřních struktur boxů TeXu; proto je LuaTeX ideální (a jedinou) volbou pro tento článek a doprovodný projekt Overleaf.

### pdfTeX/XeTeX vs LuaTeX: v obrázcích

Následující *schémata* mají zdůraznit důležité srovnání mezi návrhem pdfTeXu/XeTeXu a LuaTeXu. PdfTeX i XeTeX samozřejmě umožňují uživatelům psát TeXový kód, který může ovlivnit sazební chování; nicméně hlubší vnitřní struktury obsažené v těchto TeXových enginech a nízkoúrovňová data vytvářená během sazby jsou pro uživatelské příkazy a makra z velké části nepřístupné. V tomto smyslu jsou *poměrně* ve srovnání s LuaTeXem uzavřené systémy.

#### pdfTeX/XeTeX

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

#### LuaTeX

LuaTeX zavádí nový primitivní příkaz nazvaný `\directlua{...}` prostřednictvím něhož můžete psát kód, který nejen poskytuje plný přístup k jazyku Lua, ale také vám umožňuje rozšiřovat možnosti LuaTeXu psaním zásuvných modulů pomocí jazyků jako C a C++. Ve Windows se takové zásuvné moduly nazývají *Dynamic Link Libraries* (.DLL); v Linuxu jsou známé jako *Shared Object Libraries* (.so). Skutečná síla LuaTeXu však vyplývá z obrovské sady vestavěných funkcí Lua, které poskytují přístup k interním částem LuaTeXu — umožňujících mimořádně sofistikované řízení a programování sazby založené na TeXu. Soubor takových funkcí se nazývá API (Application Programming Interface) a právě prostřednictvím API LuaTeXu používáte programy v jazyce Lua ke komunikaci s jeho sazebním enginem a datovými strukturami založenými na TeXu.

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

S příkazem LuaTeXu `\directlua{...}` můžete například přistupovat k nízkoúrovňovým vnitřním datovým strukturám TeXu, které jsou skryté před zrakem v jiných TeXových enginech. Kromě toho můžete pomocí skriptů Lua provádět všemožné programovací výpočty, manipulaci s řetězci atd. a vracet výsledky zpět do TeXu: možnosti jsou téměř neomezené. Tento článek však nemá být podrobným výkladem ani tutoriálem o LuaTeXu — ačkoli je lákavé uvádět příklady, které by zprostředkovaly neuvěřitelnou všestrannost tohoto ohromně výkonného TeXového enginu.

## Boxy a lepidlo: Krátké připomenutí

Jak bylo uvedeno v článku [Boxy a lepidlo: Krátký, ale názorný úvod s využitím LuaTeXu](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) jsou boxy a lepidlo dva klíčové pojmy, které stojí za sazebními možnostmi TeXu. Následující diagram slouží jako velmi krátká pomůcka k zapamatování chování horizontálních a vertikálních typů boxů TeXu. Poznámka: horizontální boxy mohou samozřejmě obsahovat text sázený zprava doleva, například v arabštině nebo hebrejštině, což znamená, že směr růstu boxu může být opačný než ten zobrazený pro horizontální box v diagramu níže.

![{{{alt}}}](/files/9a63eef3c1060061e3d4c02540f61e21ef4b0f63)

### TeXové primitivy pro konstrukci boxů

Dnes většina lidí připravuje své TeXové dokumenty pomocí makropaketu LaTeX, který je navržen tak, aby poskytoval příkazy chránící uživatele před velkou částí nízkoúrovňového jazyka TeXu — jeho takzvanými *primitivy*—základní příkazy zabudované do TeXových enginů (viz článek [Co je v názvu: Průvodce mnoha variantami TeXu](/latex/cs/clanky-do-hloubky/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) pro diskusi o TeXových primitivech). Sada maker LaTeXu poskytuje různé makra pro vytváření a ukládání boxů, ale pokud odstraníte veškerý makrokód, zjistíte, že existují jen 4 nízkoúrovňové primitivní příkazy pro konstrukci boxů:

Pro vytváření horizontálních seznamů:

* \hbox{...}

Pro vytváření a skládaní vertikálních seznamů:

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

Nebudeme vysvětlovat, jak všechny tyto příkazy boxů používat, protože na webu i v knihách o TeXu/LaTeXu je spousta příkladů a tutoriálů — podíváme se však na to, jak jsou boxy reprezentovány a ukládány uvnitř datových struktur TeXu.

### Lepidlo: pružné mezery

Lepidlo je ve skutečnosti forma mezery, kterou TeX používá k rozmístění/umístění prvků horizontálně nebo vertikálně. Jako uživatelé TeXu můžeme TeXu přikázat, aby vložil lepidlo pevné velikosti, nebo můžeme použít lepidlo flexibilní — takové, které má právě tolik pružnosti, kolik potřebujeme, ať už k roztažení nebo smrštění podle našich požadavků. Jeden z TeXových příkazů pro vytváření lepidla pro horizontální mezeru se nazývá `\hskip` který má tvar

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

`**plus**` a `**minus**` jsou klíčová slova TeXu, ale nemusíte je používat u každého lepidla. Pokud `**plus**` nebo `**minus**` chybějí, pak odpovídající `<množství k roztažení>` nebo `<množství ke smrštění>` se předpokládá jako nulové. Například, `\hskip 3pt` vloží lepidlo s pevnou šířkou bez složky pro roztažení nebo smrštění.

Prozatím považujme `<množství k roztažení>` a `<množství ke smrštění>` za naše *doporučení* TeXu, protože přesné množství roztažení nebo smrštění vypočítá TeX.

Pro lepší pochopení těchto myšlenek je zde diagram, který znázorňuje lepidlo jako pružinu.  `<přirozená šířka>` je délka pružiny, když nepůsobí žádné napětí (natahování) ani stlačení (smršťování).  `<množství k roztažení>` a `<množství ke smrštění>` jsou zobrazeny vzhledem k přirozené délce pružiny.

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

#### Příklad \hboxu

Předpokládejme, že chceme vytvořit `\hbox{...}` obsahující pouze písmena A, B, C a D a potřebujeme, aby tento box byl široký 100 pt (100 bodů TeXu). Navíc lze bezpečně předpokládat, že celková šířka těchto čtyř znaků je mnohem menší než 100 pt, což znamená, že TeX potřebuje nějaký způsob, jak vyplnit zbývající prostor uvnitř boxu: k tomu použijeme lepidlo. Protože však neznáme přesné množství lepidla potřebné k vyplnění boxu, je vhodné přidat několik pružných lepidel a nechat TeX, aby vypočítal množství prostoru, které mají tato lepidla zabírat. V následující ukázce kódu si všimněte použití „%“ k potlačení mezer mezi slovy vznikajících z koncových znaků řádku.

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

Výsledný box vypadá takto (pro přehlednost zvětšeno):

![{{{alt}}}](/files/1638885cbf16d37b144ce771028a23129558d67a)

Tento `\hbox` je překryt přerušovanými rámečky (červeně), které označují šířku znaků (tak, jak je vidí TeX). Pro účely sazby jsou znaky považovány za malé boxy a množství lepidla potřebné k vyplnění tohoto `\hbox`se určuje (vypočítává) s ohledem na šířky jednotlivých znaků.

Ukazuje se, že TeX neroztáhl ani nesmrštil lepidlo mezi A a B (nastavené na 4 pt) a mezi B a C není žádné lepidlo (nastavené na 0 pt). Leč lepidlo mezi C a D a lepidlo mezi D a koncem boxu se obě značně roztáhla, protože tato lepidla mají nejpružnější složku roztažení — ve skutečnosti tato lepidla absorbovala veškeré roztažení potřebné k vyplnění boxu.

## Zpět k LuaTeXu

Dosud jsme zkoumali boxy a lepidlo a viděli jsme, že LuaTeX umožňuje přístup k vnitřním strukturám TeXu skrytým před pohledem v pdfTeXu a XeTeXu. Je čas na příklad, který to učiní zřetelnějším, ale nejprve se musíme stručně seznámit s tím, jak TeX ukládá boxy do paměti — začneme analogií.

### Jak TeX ukládá boxy do paměti: analogie

Předpokládejme, že z nějakého důvodu potřebujete vytvořit datový model popisující fyzický box. Jaká data byste zvolili pro takový popis? Jedním z možných přístupů je rozdělit informace na dvě části: data o samotném fyzickém boxu a data, která poskytují seznam obsahu boxu. Náš jednoduchý model by tedy mohl vypadat takto:

1. Data o fyzickém boxu („metadata“):

* width
* výška
* hloubka
* hmotnost
* barva
* typ (dřevěný, plastový, kartonový)

3. Data o obsahu boxu: nějaká forma seznamu, který popisuje položky, jež obsahuje — pravděpodobně uvedené bez zvláštního pořadí.

A existuje velmi blízká analogie s tím, jak TeX ukládá boxy.

### Jak TeX ukládá boxy do paměti: hlisty a vlisty

Uvnitř TeX vytváří „kontejnery“ nazývané *hlisty* (horizontální seznamy) a *vlisty* (vertikální seznamy), které představují hboxy a vboxy. Tyto objekty hlist/vlist poskytují soubor „metadat“ o boxu a zároveň přístup k seznamu objektů, které box skutečně obsahuje — tento seznam se nazývá *seznam uzlů*. Na rozdíl od fyzického boxu, do kterého můžete předměty umístit v libovolném pořadí, je pro TeX pořadí obsahu boxu nesmírně důležité — jsou to položky určené k sazbě. Pokud máte nějaké zkušenosti s programováním nebo informatikou, nepřekvapí vás, že objekty uvnitř boxu TeXu jsou ukládány a jejich pořadí vytvoření je zachováváno pomocí takzvaného [dvojitě propojeného seznamu](https://en.wikipedia.org/wiki/Doubly_linked_list). Propojené seznamy už nebudeme dále rozebírat, protože na webu je spousta tutoriálů, příkladů a vysvětlení.

Pojem uzlů a seznamů uzlů je základním aspektem fungování TeXu, ale pro účely tohoto článku podáme jen stručný přehled. Uzly jsou v podstatě jakési „mini-kontejnery“ a (od LuaTeXu 1.04) existuje asi 50 různých typů uzlů: odrážejí vnitřní datové typy a komponenty, které LuaTeX používá pro sazbu. Například existují uzly reprezentující glyfy (vznikající z „znaků“), lepidlo, horizontální/vertikální pravidla, penalizace, „whatsity“, kerny a tak dále. Veškerý vysázený materiál se nakonec stane součástí obrovského seznamu uzlů a LuaTeX vám poskytuje přímý přístup k těmto vnitřním datovým strukturám. LuaTeX vám také umožňuje seznamy uzlů přidávat, upravovat, měnit nebo vytvářet, takže například můžete boxy vytvářet přímo v kódu Lua, aniž byste museli použít jakýkoli TeXový kód. O tom však zase někdy jindy.

### Jednoduchý příklad \directlua{...} v akci

Následující příklad vytvoří `\hbox` a uloží jej do registru boxů 0. Poté vypíšeme šířku boxu pomocí tradičního TeXového kódu a získáme stejné informace druhou metodou přes `\directlua{}`. Zde spustíme malý skript Lua, který přistupuje k vnitřní oblasti ukládání boxů TeXu, aby získal šířku boxu — samozřejmě obě hodnoty jsou totožné: 2412092 sp (sp = scaled point: 65536 sp = 1 bod TeXu). V tomto zcela jednoduchém příkladu tedy TeXový i Lua kód zkoumají tytéž vnitřní datové struktury, aby získaly šířku boxu, ale právě přímým přístupem otevírá LuaTeX dveře k množství informací a řízení, které jiné enginy nenabízejí.

![{{{alt}}}](/files/024397a8bcae50b80c572a70cb00516dec37ccd5)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Pomocí kódu \TeX{} má box 0 šířku \number\wd0\relax \space sp\par
\noindent Můžeme také použít Lua a zavolat jednu z funkcí Lua\TeXu, abychom získali stejné
informace.\vskip10mm
\noindent Z Lua kódu má box 0 šířku
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} což je samozřejmě totožné s hodnotou získanou z kódu \TeX{}.
\end{document}
```

## Všechno dohromady: projekt Overleaf

Poznamenali jsme, že TeX interně reprezentuje boxy jako „kontejnery“ zvané hlisty/vlisty, které ukládají „metadata“ o boxu a poskytují přístup k seznamu komponent, z nichž je box sestaven. Pomocí LuaTeXu můžete přistupovat k „metadatům“ boxu a k seznamu položek obsažených v boxu TeXu: glyfům, lepidlu, penalizacím, jiným boxům a tak dále. Pomocí skriptů Lua je možné prohlédnout si box ležící v paměti TeXu a nakreslit podrobné znázornění toho, co tento box obsahuje. Vhodné znázornění boxu TeXu a jeho obsahu se dosahuje pomocí *grafů uzlů* a připravili jsme [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) který to dělá s využitím vynikajícího skriptu Lua napsaného Patrickem Gundlachem (viz poděkování). Nebudeme popisovat podrobné procesy potřebné k prohlížení boxů a vytváření grafů uzlů — jen poznamenáme, že jakýkoli program/skript zpracovávající boxy TeXu musí být *rekurzivního* rekurzivní, protože boxy mohou být vnořené: tj. můžete mít hboxy uvnitř vboxů, uvnitř hboxů… kombinující všechny typy boxů do velmi hluboké úrovně vnoření.

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

### Co projekt poskytuje?

Implementuje jen 1 příkaz nazvaný `\dobox{box command}`, například:

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

Ta `\dobox{...}` příkaz provádí několik úloh:

1. ve vašem dokumentu vysází doslovný TeXový kód vašeho boxu;
2. vytvoří SVG grafiku boxu TeXu — tu můžete vložit do webové stránky (tak, jak jsme to udělali v tomto blogovém příspěvku);
3. vytvoří SVG grafiku seznamu uzlů — tu můžete také vložit do webových stránek (tak, jak jsme to udělali v tomto blogovém příspěvku);
4. vygeneruje PDF grafiku seznamu uzlů, která je poté importována do hlavního PDF dokumentu vytvořeného projektem.

Grafy uzlů se mohou velmi rychle stát nesmírně velkými kvůli obrovskému množství dat, které musí LuaTeX ukládat, aby mohl reprezentovat složité boxy TeXu — například právě vytvářenou stránku nebo vysázenou matematiku. U větších seznamů uzlů může být importovaná PDF grafika oříznuta hranicí stránky vašeho dokumentu — pokud chcete zobrazit velký graf uzlů, můžete si stáhnout ZIP soubor projektu a rozbalit požadovanou PDF grafiku. Při stahování ZIP souboru projektu se ujistěte, že v rozbalovací nabídce zvolíte „Input and Output Files“:

![{{{alt}}}](/files/0f6b4b5117a44d69f94556e84553e910517c695e)

### Grafika z projektu Overleaf: stručný popis

Než ukážeme několik příkladů, stojí za to uvést několik postřehů ke grafice vytvořené projektem Overleaf — použijeme tentýž `\hbox` příklad zmíněný dříve v článku. Zde je zabalený v projektu `\dobox{...}` příkazu:

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

Zde je `\hbox` vytvořený TeXem — pro přehlednost byl box zvětšen, ale rámeček je součástí grafiky vytvářené projektem Overleaf.

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

Zde je *anotovaný* SVG diagram seznamu uzlů představující výše uvedený box — anotace byly přidány, aby zvýraznily „metadata“ boxu a seznam objektů, které obsahuje: tyto anotace nejsou přítomny v grafice vytvořené projektem Overleaf.

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

Pokud se podíváte na část „metadata“, můžete si všimnout některých neznámých parametrů:

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

Tyto parametry jsou nastavení, která TeX používá k výpočtu, o kolik se má lepidlo v tomto boxu natáhnout nebo smrštit, a jsou jen jedním z příkladů dat, která můžete snadno získat přes LuaTeX, ale ne pomocí jiných TeXových enginů. Všimněte si, že uzly lepidla obsažené v komponentách boxu *zachovávají* původní hodnoty lepidla, které jsme zadali při vytváření boxu. To je zásadní, protože TeX poskytuje příkazy `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` které „odboxují“ obsah boxu a vrátí jej zpět do vstupního proudu, aby se znovu mohl účastnit sazebních operací. Teprve když TeX nakonec box vypíše (odešle) do souboru PDF nebo DVI, `glue_set`, `glue_sign` a `glue_order` se na všechna lepidla obsažená v boxu aplikují — aby se vypočítalo skutečné množství roztažení nebo smrštění potřebné k umístění komponent v boxu a poté se vygenerovala odpovídající data PDF nebo opkódy DVI.

Dalším parametrem uvedeným v „metadatech“ je `posun`: to je hodnota posunutí boxu vyplývající z použití TeXových příkazů:

* `\raise`, `\lower` (aplikované na `\hbox`);
* `\moveleft`, `\moveright` (aplikované na `\vbox`).

V našem příkladu, `posun` je 0 pt, protože jsme neposunuli `\hbox` z jeho přirozené pozice.

Ta [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) také vypisuje diagramy grafů uzlů ve formátu PDF: zde je odkaz ke stažení [verze souboru PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) výše uvedeného grafu uzlů.

### Jak projekt Overleaf vytváří tuto grafiku?

Projekt Overleaf využívá možnost spouštět softwarové nástroje a utility nainstalované na serverech Overleafu — viz [tento blogový příspěvek](/latex/cs/clanky-do-hloubky/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) pro více podrobností a ukázkový projekt. Aby vznikla SVG grafika představující box TeXu, TeXový kód boxu je zapsán do malého souboru, který je poté vysázen pomocí pdfTeXu za účelem vytvoření souboru DVI — všimněte si, že program pdfTeX je spuštěn LuaTeXem pomocí několika řádků skriptu Lua. Tento soubor DVI je za běhu převáděn na SVG pomocí `nástroje dvisvgm` nástroje — který je součástí distribuce TeX Live nainstalované na serverech Overleafu. `nástroje dvisvgm` je spuštěn s volbou příkazové řádky `-n` aby byl jakýkoli vysázený text převeden na čáry/křivky, takže správné vykreslení souboru SVG nezávisí na tom, zda jsou nainstalována písma TeXu.

K vytvoření grafů uzlů používáme skript Lua nazvaný `hiviznodelist.lua` který je založen na práci Patricka Gundlacha. Tento skript zapisuje takzvaný `.gv` (Graphviz) soubor, což je textový soubor obsahující graf uzlů popsaný v jazyce `dot` jazyk.  `.gv` soubor je zpracován utilitním programem nazvaným `dot` který vytváří diagram uzlů ve formátech souborů PDF i SVG.

### Příklady projektu

Zde jsou další příklady se SVG grafikou vytvořenou pomocí projektu Overleaf. Boxy obsahující hodně textu (např. ve \vboxu) nebo složitou matematiku vytvoří obrovské grafy uzlů — pokud budete projekt Overleaf zkoumat, je vhodné nepoužívat zbytečně složité boxy k demonstraci funkcí, které vás zajímají.

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

Tento příklad ukazuje účinek vložení textu přímo do `\vbox`: všimněte si, že struktura uzlů je poměrně složitá, a to i pro takto jednoduchý box. Důvodem této složitosti je, že text umístěný přímo do `\vbox` nutí TeX provést zalamování řádků. Můžete vidět, že `\vbox` má šířku 345 pt: hodnotu `\hsize` v době, kdy byl tento box vytvořen. Všimněte si také, že znak „A“ je obsažen v `hlistu` který je také široký 345 bodů, a všimněte si velké penalizace (10000) spolu s `\parfillskip` a `\rightskip` lepidly na konci obsahu boxu. Tuto penalizaci a tyto dva položky lepidla vkládá TeX při zalamování řádků. Pokud se podíváte na `glue_set` hodnotu pro řádek odstavce (`hlistu`) obsahující písmeno „A“, uvidíte, že je nesmírně velká (322.500000): proč tomu tak je? Je to proto, že řádek odstavce je široký 345 pt, ale obsahuje pouze `\parindent` a písmeno „A“: zbývající prostor musí být vyplněn `\parfillskip` lepidlem, které se musí značně roztáhnout, aby vyplnilo zbývající prostor na řádku.

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

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

[Stáhnout soubor PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

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

Je velmi poučné porovnat tento příklad s předchozím. Zde není graf uzlů jen výrazně menší, ale šířka `\vbox` činí jen 7.50002 pt: stejnou jako šířka znaku „A“. Důvodem je, že „A“ bylo zabaleno do `\hbox` což brání `\vbox` spuštění zalamování řádků TeXem — důležitá vlastnost boxů vytvořených pomocí `\vbox`.

![{{{alt}}}](/files/9b9a328fa191cca89416c590bf61e2640aa3ea02)

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

[Stáhnout soubor PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Jednoduchá matematika: \hbox{$$\displaystyle \int f(x) dx$$}, složitý box!

Tento příklad ukazuje, že i velmi jednoduchá vysázená matematika vytváří podrobnou strukturu boxu: sazba matematiky vytváří *mimořádně* složité datové struktury uvnitř TeXu!

![{{{alt}}}](/files/66854908673c28791f6e9a673be831908b88d1a8)

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

[Stáhnout soubor PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Poděkování: díky, Patricku!

Naše poděkování patří [Patricku Gundlachovi](https://twitter.com/patrickgundlach) který poskytl Overleafu svolení používat a šířit upravenou verzi svého skriptu Lua, `viznodelist.lua`, který zpracovává boxy TeXu a vytváří soubor (v `dot` jazyce), který lze zpracovat a nakreslit graf uzlů. Projekt Overleaf obsahuje skript Lua nazvaný `hiviznodelist.lua`—přejmenovanou a upravenou verzi Patrickova původního kódu, která je k dispozici na [GitHubu](http://gist.github.com/556247). Patrick vytvořil open-source sazební systém založený na LuaTeXu nazvaný [speedata Publisher](https://speedata.github.io/publisher/index.html) který si můžete stáhnout a používat zdarma — k dispozici jsou také možnosti komerční podpory.


---

# 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/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.
