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

# Скринька Пандори: використання LuaTeX, щоб підняти кришку TeX-боксів

## Вступ

Блоки та клей — це два ключові поняття, які лежать в основі моделі верстки TeX і її можливостей. Спираючись на вступний матеріал у попередньому дописі, [Блоки та клей: короткий, але наочний вступ із використанням LuaTeX](/latex/uk/dokladni-statti/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), ця рясно ілюстрована стаття докладніше розглядає блоки та клей. Ми також представляємо новий проєкт Overleaf на базі 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 означає використання макропакета LaTeX із рушієм LuaTeX.

Ця відмінність надзвичайно важлива, тому що в цій статті ми використовуємо вбудовані можливості самого рушія LuaTeX, а не просто функції/можливості команд, які надає макропакет LaTeX.

Читачам, які не впевнені в різниці між рушієм TeX і макропакетом LaTeX, може стати в пригоді одна з наших раніше опублікованих статей, [Що в імені: посібник із численних різновидів TeX](/latex/uk/dokladni-statti/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/d1af952f255f40b229d04123ed68cdeed80e6a27)

#### LuaTeX

LuaTeX вводить нову примітивну команду під назвою `\directlua{...}` за допомогою якої ви можете писати код, що не лише надає повний доступ до мови Lua, а й дає змогу розширювати можливості LuaTeX, створюючи плагіни мовами на кшталт C і C++. У Windows такі плагіни називаються *Бібліотеки динамічного зв’язування* (.DLL); у Linux вони відомі як *Спільні об’єктні бібліотеки* (.so). Однак справжня потужність LuaTeX походить від величезного набору вбудованих функцій Lua, які надають доступ до внутрішніх механізмів LuaTeX — забезпечуючи надзвичайно складне керування та програмування TeX-верстки. Набір таких функцій називається API (інтерфейсом прикладного програмування), і саме через API LuaTeX ви програмами Lua взаємодієте з його TeX-рушієм верстки та структурами даних.

![{{{alt}}}](/files/532f19c932dd9301ea50df67081f29e5fae1febd)

За допомогою `\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. Наведена нижче схема подається як дуже коротка шпаргалка щодо поведінки горизонтальних і вертикальних типів блоків TeX. Зауважте: горизонтальні блоки, звісно, можуть містити текст, набраний мовами справа наліво, такими як арабська або іврит, а це означає, що напрямок розростання блока може бути протилежним до показаного для горизонтального блока на схемі нижче.

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

### Примітиви TeX для побудови блоків

Сьогодні більшість людей готують документи TeX за допомогою макропакета LaTeX, який створений для надання команд, що ізолюють користувачів від значної частини низькорівневої мови TeX — так званих *примітивів*— базових команд, вбудованих у рушії TeX (див. статтю [Що в імені: посібник із численних різновидів TeX](/latex/uk/dokladni-statti/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) для обговорення примітивів TeX). Колекція макросів LaTeX надає різноманітні макроси для створення та збереження блоків, але якщо відкинути весь макрокод, то виявиться, що існує лише 4 низькорівневі примітивні команди побудови блоків:

Для створення горизонтальних списків:

* \hbox{...}

Для створення та складання вертикальних списків:

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

Ми не будемо пояснювати, як користуватися всіма цими командами для блоків, оскільки в інтернеті чи в книжках із TeX/LaTeX є чимало прикладів і навчальних матеріалів, — натомість ми поглянемо, як блоки представлені й зберігаються всередині структур даних TeX.

### Клей: гнучкі проміжки

Клей, по суті, є формою проміжків, яку TeX використовує для розміщення/позиціонування елементів горизонтально або вертикально. Як користувач TeX, ми можемо вказати TeX вставити клей фіксованого розміру або використати гнучкий клей — із такою гнучкістю, яка нам потрібна, щоб він міг або розтягуватися, або стискатися залежно від наших вимог. Одна з команд TeX для створення клею для горизонтальних проміжків називається `\hskip` яка має форму

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

`**plus**` та `**minus**` — це ключові слова TeX, але вам не потрібно використовувати їх для кожного клею. Якщо `**plus**` або `**minus**` відсутні, тоді відповідний `<amount to stretch>` або `<amount to shrink>` вважається рівним нулю. Наприклад, `\hskip 3pt` вставляє клей фіксованої ширини без складових розтягування чи стискання.

Поки що думайте про `<amount to stretch>` та `<amount to shrink>` як про наші *рекомендації* для TeX, оскільки точну величину розтягування або стискання обчислить TeX.

Щоб допомогти зрозуміти ці ідеї, ось діаграма, яка зображає клей як пружину.  `<natural width>`  — це довжина пружини, коли немає натягу (розтягування) або стиснення (стискання).  `<amount to stretch>` та `<amount to shrink>`  показані відносно природної довжини пружини.

![{{{alt}}}](/files/312de3442a3a4b044b3cdce3bff89cf33ffefc1f)

#### Приклад \hbox

Припустімо, ми хочемо створити `\hbox{...}` що міститиме лише літери A, B, C і D, і нам потрібен цей блок завширшки 100pt (100 пунктів TeX). Крім того, можна безпечно припустити, що сумарна ширина цих чотирьох символів значно менша за 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/cd35491625fd178b2ba4ae38df819f0f15776a2f)

Цей `\hbox` накладено пунктирні рамки (червоні), щоб позначити ширину символів (так, як їх бачить TeX). Для цілей верстки символи вважаються маленькими блоками, а кількість клею, потрібна для заповнення цього `\hbox`визначається (обчислюється) з урахуванням ширини кожного символу.

Виявляється, що TeX не розтягував і не стискав клей між A та B (встановлено 4pt), і між B та C немає клею (встановлено 0pt). Однак клей між C та D і клей між D та кінцем блока обидва значно розтягнулися, тому що ці клеї мають найгнучкішу складову розтягування — фактично, саме вони поглинули все розтягування, необхідне для заповнення блока.

## Повертаючись до LuaTeX

Поки що ми дослідили блоки та клей і побачили, що LuaTeX надає доступ до внутрішніх структур TeX, прихованих від огляду в pdfTeX і XeTeX. Настав час для прикладу, щоб зробити це більш явним, але спочатку нам потрібно коротко ознайомитися з тим, як TeX зберігає блоки в пам’яті — почнемо з аналогії.

### Як TeX зберігає блоки в пам’яті: аналогія

Припустімо, з якихось причин вам потрібно було створити модель даних, що описує фізичну коробку. Які дані ви могли б обрати для такого опису? Один із підходів — розділити інформацію на дві частини: дані про саму фізичну коробку та дані, що містять перелік вмісту коробки. Отже, наша проста модель могла б виглядати так:

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 також дає змогу додавати, редагувати, змінювати або створювати списки вузлів, так що, наприклад, ви можете створювати блоки безпосередньо всередині коду Lua, взагалі не використовуючи жодного коду TeX. Однак про це — іншим разом.

### Простий приклад роботи \directlua{...}

У наведеному нижче прикладі створюється `\hbox` і зберігається в регістрі блока 0. Потім ми повідомляємо ширину блока, використовуючи традиційний код TeX, і отримуємо ту саму інформацію другим способом через `\directlua{}`Тут ми запускаємо невеликий сценарій Lua, який звертається до внутрішньої області зберігання блоків TeX, щоб отримати ширину блока — звісно, обидва значення ідентичні: 2412092sp (sp = scaled point: 65536sp = 1 пункт TeX). Зрештою, у цьому надзвичайно простому прикладі код TeX і код Lua звертаються до тих самих внутрішніх структур даних, щоб отримати ширину блока, але саме завдяки прямому доступу LuaTeX відчиняє двері до безлічі відомостей і засобів керування, яких немає в інших рушіях.

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

```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 та його вмісту досягається за допомогою *графи вузлів* і ми підготували [проєкт Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) проєкт Overleaf *рекурсивної* який робить це, використовуючи чудовий сценарій Lua, написаний Patrick Gundlach (див. подяки). Ми не будемо описувати докладні процеси, потрібні для аналізу блоків і створення графів вузлів, — окрім зауваження, що будь-яка програма/сценарій, який обробляє блоки TeX, має бути

![{{{alt}}}](/files/9863c3dbe11c0db719159be576e6cf33687f0533)

### Що надає проєкт?

Він реалізує лише 1 команду під назвою `\dobox{box command}`, наприклад:

```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. вона створює SVG-графіку блока TeX — ви можете вбудувати її у вебсторінку (як ми зробили в цьому дописі);
3. вона створює SVG-графіку списку вузлів — яку також можна вбудувати у вебсторінки (як ми зробили в цьому дописі);
4. вона виводить PDF-графіку списку вузлів, яка потім імпортується до головного PDF-документа, створюваного проєктом.

Графи вузлів можуть дуже швидко ставати надзвичайно великими через величезний обсяг даних, які LuaTeX має зберігати, щоб представляти складні блоки TeX — такі як сторінка, що наразі конструюється, або набрана математика. Для більших списків вузлів імпортована PDF-графіка може бути обрізана межею сторінки вашого документа — якщо ви хочете переглянути великий граф вузлів, можете завантажити ZIP-файл проєкту і витягти потрібну PDF-графіку. Коли завантажуєте ZIP-файл проєкту, обов’язково виберіть «Input and Output Files» у спадному списку:

![{{{alt}}}](/files/5b9e5f1a94b539627888ed046901bcbcdb3051b3)

### Графіка з проєкту 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/044f843e9e649919eaf4c3030e15e6e658c61407)

Ось *підписана* SVG-діаграма списку вузлів, що представляє наведений вище блок — підписи додано, щоб виділити «метадані» блока та список об’єктів, які він містить: цих підписів немає у графіці, створеній проєктом Overleaf.

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

Якщо подивитися на розділ «метадані», можна помітити кілька незнайомих параметрів:

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

Ці параметри — це налаштування, які TeX використовує для обчислення того, наскільки клей має розтягнутися або стиснутися всередині цього блока, і це лише один приклад даних, які можна легко отримати через LuaTeX, але не через інші рушії TeX. Зверніть увагу, що вузли клею, що містяться в компонентах блока *зберігають* початкові значення клею, які ми ввели під час створення блока. Це є суттєвим, оскільки TeX надає команди `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` які «розблоковують» вміст блока і повертають його назад у потік введення, щоб він знову брав участь у процесі верстки. Лише коли TeX нарешті виводить (ship out) блок у PDF- або DVI-файл, до будь-яких клеїв, що містяться в блоці, застосовуються `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/uk/dokladni-statti/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) для детальнішої інформації та прикладу проєкту. Щоб створити SVG-графіку, що представляє блок TeX, код TeX цього блока записується у невеликий файл, який потім набирається за допомогою pdfTeX для створення DVI-файлу — зауважте, що програму pdfTeX запускає LuaTeX через кілька рядків сценарію Lua. Цей DVI-файл на льоту перетворюється на SVG за допомогою `dvisvgm` утиліти — яка постачається з дистрибутивом TeX Live, встановленим на серверах Overleaf. `dvisvgm` виконується з параметром командного рядка `-n` щоб гарантувати, що будь-який набраний текст перетворюється на лінії/криві, так що коректне відображення SVG-файлу не залежить від того, чи встановлені шрифти TeX.

Для створення графів вузлів ми використовуємо сценарій Lua під назвою `hiviznodelist.lua` який базується на роботі Patrick Gundlach. Цей сценарій записує так званий `.gv` (Graphviz)-файл, який є текстовим файлом, що містить граф вузлів, описаний мовою `dot` мовою.  `.gv` файл обробляється утилітою під назвою `dot` яка виводить діаграму вузлів у форматах PDF і SVG.

### Приклади проєкту

Ось ще кілька додаткових прикладів із SVG-графікою, створеною за допомогою проєкту Overleaf. Блоки, що містять багато тексту (наприклад, у \vbox), або складну математику, створюватимуть величезні графи вузлів — якщо ви досліджуєте проєкт Overleaf, доцільно не використовувати надмірно складні блоки, щоб демонструвати потрібні вам можливості.

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

Цей приклад демонструє ефект розміщення тексту безпосередньо в `\vbox`: зауважте, що структура вузлів досить складна, навіть для такого простого блока. Причина цієї складності в тому, що текст, розміщений безпосередньо в `\vbox` спричиняє те, що TeX виконує перенесення рядків. Ви можете побачити, що `\vbox` має ширину 345pt: значення `\hsize` у момент, коли цей блок був створений. Також зауважте, що символ “A” міститься в `hlist` який також має ширину 345 пунктів, і зверніть увагу на великий штраф (10000) разом із `\parfillskip` та `\rightskip` клеями наприкінці вмісту блока. Цей штраф і два елементи клею вставляються внаслідок дій TeX із перенесення рядків. Якщо поглянути на `glue_set` значення для рядка абзацу (`hlist`) що містить літеру “A”, ви побачите, що воно надзвичайно велике (322.500000): чому так? Тому що рядок абзацу має ширину 345pt, але містить лише `\parindent` і літеру “A”: решту простору потрібно заповнити `\parfillskip` клеєм, який має розтягнутися на значну відстань, щоб заповнити решту простору в рядку.

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

[![{{{alt}}}](/files/9ed85aa0f606d0020e47c2148828feedc4fe4ebf)](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` запуску TeX для виконання перенесення рядків — важлива характеристика блоків, створених за допомогою `\vbox`.

![{{{alt}}}](/files/6baeabb9853ffbf65a9dfbcb28d23efee5428ad7)

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

[Завантажити PDF-файл](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Проста математика: \hbox{$$\displaystyle \int f(x) dx$$}, складний блок!

Цей приклад демонструє, що навіть дуже проста набрана математика створює детальну структуру блока: набір математики породжує *надзвичайно* складні структури даних у TeX!

![{{{alt}}}](/files/09e9c445a57efe33aa4813374f44f6f3dda13a40)

[![{{{alt}}}](/files/23ec44d9fac607acd356943a44c2b4deca6a2224)](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 містить сценарій Lua під назвою `hiviznodelist.lua`— перейменовану та змінену версію оригінального коду Patrick, яка доступна на [GitHub](http://gist.github.com/556247). Patrick створив відкриту систему верстки на базі LuaTeX під назвою [speedata Publisher](https://speedata.github.io/publisher/index.html) яку ви можете завантажити й використовувати безкоштовно — також доступні варіанти комерційної підтримки.


---

# 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/uk/dokladni-statti/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.
