> 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/14-how-do-tex-engines-typeset-tables.md).

# Як рушії TeX верстають таблиці

## Як рушії TeX верстають таблиці

## Вступ: що охоплює ця серія?

Створення естетично привабливих таблиць може бути трудомістким завданням — чи використовуєте ви інструмент візуального компонування, LaTeX або мову розмітки на кшталт HTML чи Markdown. Для користувачів LaTeX зокрема верстка таблиць посідає високе місце в багатьох списках «болючих точок», про що, можливо, свідчить те, що «tables» є однією з найбільш [позначених тем на tex.stackexchange](https://tex.stackexchange.com/tags).

Окрім відповідей і прикладів на tex.stackexchange, навіть побіжний огляд доступної підтримки щодо верстки таблиць у LaTeX виявляє низку інформаційних ресурсів, пов’язаних із таблицями:

* Сторінки довідки [Overleaf](https://www.overleaf.com/learn/latex/tables) та інших сайтів, таких як [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, Comprehensive TeX Network, перелічує понад [70 пакетів TeX/LaTeX](https://ctan.org/topic/table) пов’язаних зі створенням таблиць
* цілу [книгу про верстку таблиць за допомогою LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* чудовий [онлайн-генератор таблиць LaTeX](https://www.tablesgenerator.com/latex_tables)

Простий пошук у Google за [LaTeX tables](https://www.google.com/search?q=latex+tables) видає величезну кількість результатів, перелічуючи багато сайтів із допомогою, порадами, прикладами та поясненнями.

### TeX, а не LaTeX

З огляду на багатство літератури, доступної про верстку таблиць за допомогою LaTeX, чи є ще про що писати — ще більше прикладів таблиць та переліків/демонстрацій команд пакетів? Чи є спосіб підійти до теми верстки таблиць так, щоб виокремити або зосередити увагу на фундаментальних принципах і концепціях верстки таблиць? Є, але для цього треба зняти шари цибулі LaTeX…

Ми вирішили підготувати серію статей, що має на меті дати читачам довідкову інформацію та пояснення основної *механіки* верстки таблиць на основі TeX. Замість того, щоб зосереджуватися на верстці таблиць за допомогою конкретних макросів/пакетів LaTeX, ми дослідимо *поведінку, що лежить в основі* рушіїв TeX: досліджуючи низькорівневу механіку верстки, яка забезпечує основу, на якій побудовані макрокоманди LaTeX. Кінцева мета — виокремити й пояснити основні методи та алгоритми верстки таблиць на основі TeX — сподіваємося, це допоможе читачам/користувачам краще зрозуміти, чому таблиці поводяться саме так, як поводяться. Неминучим наслідком такого підходу, коли знімаються захисні шари макроізоляції LaTeX, є зіткнення з неохайними низькорівневими деталями, від яких користувачів зазвичай (і з радістю) оберігають шари коду макросів LaTeX.

На дослідження, написання й ілюстрування цих статей пішло багато часу, тому ми сподіваємося, що вони стануть вартісним доповненням до літератури, надаючи матеріал, який інформуватиме читачів і допоможе їм краще зрозуміти цю складну сферу верстки TeX. Маємо наголосити, що ця серія статей *не* зачіпатиме *естетику* дизайну таблиць — це тема, сповнена суб’єктивних уподобань, і її аргументи мають обговорюватися деінде…

### Дослідження механіки таблиць TeX: як це можна зробити?

Щоб дослідити, а потім написати про нижчорівневі механізми й процеси, що відбуваються всередині рушіїв TeX, як-от верстку таблиць, Overleaf зібрав (скомпілював) «налагоджувальні» версії рушія TeX Кнута, використовуючи процес Мартіна Рюккерта [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Традиційно збирання TeX передбачає процес під назвою Web2C, який використовується в TeX Live і генерує C-код шляхом перетворення оригінального Pascal-вихідного коду TeX на його еквівалент мовою C. Цей процес генерує C-код, який ніколи не призначався для читання людьми, лише C-компіляторами. Механічно згенерований C-код є *надзвичайно* важким для читання чи модифікації з метою експериментів.

На відміну від цього, Web2W генерує C-вихідний код (доступний [тут](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) який є *на порядки* читабельнішим, ніж код, створений Web2C. Відтак C-вихідний код Web2W значно зручніший для модифікації в навчальних/експериментальних цілях.

Web2W створює версію TeX («CTeX»), яка є *надзвичайно* близькою до оригінальної програми Кнута: «CTeX» не містить багатьох змін і вдосконалень, запроваджених процесом Web2C, — таких як SyncTeX, обробка командного рядка та пошук файлів через Kpathsea. Хоча ви й відмовляєтеся від цих цінних удосконалень, отриманий C-код (Web2W) відносно легко орієнтуватися, використовуючи опублікований Кнутом вихідний код TeX, навіть попри те, що TeX було написано мовою Pascal.

* **Примітка щодо назв:** Строго кажучи, назва «TeX» має стосуватися лише оригінального програмного забезпечення, написаного й опублікованого Дональдом Кнутом. Будь-які модифікації його програмного забезпечення мають використовувати іншу назву для отриманого програмного забезпечення для верстки на основі TeX. Тут ми використали процес Web2W, щоб зібрати рушій, який, по суті, і досі є оригінальним програмним забезпеченням Кнута. Однак, щоб уникнути непорозумінь, ми будемо використовувати термін «CTeX» для позначення конкретної версії, зібраної за допомогою Web2W, але також будемо вживати «TeX» або для позначення оригінального рушія Кнута, або як загальний термін для мови верстки, заснованої на принципах TeX Кнута. Сподіваємося, читачі вибачать нам будь-які поодинокі відступи від суворого застосування/вживання цілком коректної термінології: сподіваємося, що зміст/намір буде передано контекстом.

Налагоджувальну версію CTeX запускали за допомогою [середовища Eclipse IDE](https://www.eclipse.org/downloads/packages/), що зробило можливим спостерігати за обробкою в реальному часі C-коду, який реалізує низькорівневі примітивні (вбудовані) команди TeX і алгоритми, розроблені Кнутом для підтримки верстки таблиць.

Наступне коротке (прибл. 90 секунд) відео демонструє роботу рушія CTeX всередині [середовища Eclipse IDE](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

Окрім CTeX, ми також скомпілювали e-TeX, щоб отримати доступ до кількох додаткових примітивів, відсутніх в оригінальному програмному забезпеченні Кнута. Хоча CTeX і e-TeX нині є вже старими рушіями на основі TeX, вони все ще придатні як основа для дослідження механіки верстки таблиць, оскільки ті базові принципи й досі застосовуються до всіх рушіїв верстки на основі TeX.

### Чому для дослідження таблиць використовувати старіший рушій TeX?

По-перше, друкована книга, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), яка перелічує й пояснює вихідний код TeX, і досі є надзвичайно зручним путівником у туманні води внутрішньої роботи TeX, попри те, що була опублікована понад 30 років тому (1986). Звісно, ви можете самі виконати верстку документації вихідного коду TeX, наприклад, див. проєкт Overleaf [Відверстайте документацію вихідного коду для TeX, e-TeX або pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Із часу публікації TeX:The Program у 1986 році з’явилися нові рушії TeX, зокрема pdfTeX, XeTeX і LuaTeX, які запровадили функції та команди, не описані в TeX:The Program просто тому, що їх не було в оригінальному програмному забезпеченні Кнута.

Для багатьох основних процесів, таких як верстка таблиць у TeX, код, описаний у TeX:The Program, і досі є релевантним як основа для вивчення — навіть попри те, що вихідний код TeX написано мовою Pascal. Окрім того, TeX Кнута порівняно легко й швидко компілюється — особливо завдяки надзвичайно корисному [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) процесу, розробленому Мартіном Рюккертом. Простота/швидкість компіляції робить значно зручнішим внесення простих змін до TeX — наприклад, створення SVG-графіки, яку буде використано пізніше в цій серії статей.

### Розуміння різниці між TeX і LaTeX

Багато читачів уже знають, що LaTeX насправді не є *виконуваною* програмою для верстки, а великим набором команд (*макросів*), які зрештою написані нижчорівневою мовою верстки/програмування під назвою TeX. Ваш код LaTeX дає верстаний результат лише після того, як його опрацює виконувана програма, що називається *рушій TeX*— програмне забезпечення, що стоїть між вашим кодом LaTeX (документом) і верстаним PDF. Сьогодні користувачі можуть обирати між різними рушіями TeX для верстки свого коду LaTeX, зокрема pdfTeX, XeTeX і різними варіантами LuaTeX.

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

#### Діалекти та примітиви TeX

Кожен рушій TeX має набір вбудованих команд, які називаються *примітивів* які, у сукупності, утворюють «діалект» мови верстки TeX, відображаючи можливості, вбудовані в кожен рушій. Тут термін «примітив», яким описують вбудовані команди рушіїв TeX, не *не* означає, що ці команди є базовими чи спрощеними, а те, що вони фундаментальні й неподільні: не побудовані з інших команд (на відміну від макросів). Усі рушії TeX мають велику спільну базову множину примітивів, але деякі містять примітиви, специфічні саме для цього рушія, — звідси й поняття «діалекту» TeX.

Незалежно від того, який рушій TeX використовується для верстки вашого документа LaTeX, його завдання — опрацювати («виконати») набір команд LaTeX (тобто макросів), використаних для написання й побудови вашого документа. Фактично рушій TeX «перетворює» ваш код LaTeX (макроси) *назад у* їхні складові примітивні команди рушія TeX, які рушій може виконати для здійснення власне верстки. Вам не *маєте* потрібно використовувати команди LaTeX для верстки документів у рушіях TeX — ви *можете* обрати створювати свої документи повністю за допомогою примітивів TeX, тобто безпосередньо в низькорівневій *мові програмування TeX* вбудованій у рушії TeX. Однак за сучасними мірками мова TeX доволі архаїчна й загалом вважається складною для програмування — для досягнення вашої мети верстки може також знадобитися велика кількість вбудованих примітивів, що робить таке програмування схильним до помилок і потенційно повторюваним.

Щоб уникнути необхідності писати безпосередньо мовою TeX або постійно повторно вводити одну й ту саму послідовність команд, рушії TeX дозволяють створювати «скорочення», які називаються *макросів*. Створюючи макроси, ви визначаєте власні команди, які пакують потенційно довгі й складні послідовності примітивів мови TeX (або інших макросів) в одну «вищорівневу» команду. Програмісти TeX можуть писати дуже складні макроси, що інкапсулюють чималий обсяг функціональності в одній команді — наприклад, команди, які надає LaTeX. Використовуючи пакети макросів, такі як LaTeX (або [ConTeXt](https://wiki.contextgarden.net/Main_Page)), автори документів (здебільшого) ізольовані від багатьох виснажливих деталей, що дозволяє їм зосередитися на написанні та верстці, а не постійно боротися зі складнощами й нюансами мови TeX.

## На початку...

Поряд із розробленням алгоритмів для верстки математичних формул і витонченого перенесення рядків, Кнут зіткнувся із завданням запрограмувати своє програмне забезпечення TeX для верстки таблиць. Очевидно, будь-який алгоритм(и) побудови таблиць не має бути надто обмежувальним, адже це розчарувало б користувачів, яким потрібна свобода створювати майже безмежний спектр макетів таблиць. Крім того, комірки таблиць можуть містити широкий діапазон вмісту, зокрема математику, графіку та фрагменти тексту, розбиті на гарно зверстані рядки — фактично все, що здатний верстати TeX. Надання такої гнучкості вимагає, щоб алгоритми побудови таблиць TeX працювали пліч-о-пліч з іншими частинами механізму верстки TeX.

Однак рушії TeX беруть свою плату за гнучкість, яку надають їхні можливості побудови таблиць: численні тонкощі й нюанси в низькорівневій поведінці вбудованих (примітивних) команд верстки таблиць, яких є 9:

* **`\halign`**, **`\valign`**: основні команди побудови таблиць
* **`\tabskip`**: клей, що розміщується між стовпцями \halign або рядками \valign
* **`\cr`**: обов’язковий термінатор «повернення каретки» для всіх рядків у таблиці
* **`\noalign`**: вставляє матеріал між рядками \halign або стовпцями \valign
* **`\everycr`**: команди (реєстр токенів), які потрібно зчитати після виявлення \cr
* **`\span`**: команда з подвійною функцією: \span створює комірки, що охоплюють стовпці або рядки, або розгортає команди в преамбулі таблиці (ми розглянемо це детально)
* **`\omit`**: пропускає шаблони для певної комірки
* **`\crcr`**: використовується в макросах, щоб уникнути помилок, якщо користувачі забудуть обов’язковий \cr

Ми зустрінемо ці команди під час нашої подорожі крізь побудову таблиць.

### Відлуння давніх викликів

Прихований у [вихідному коді TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) знаходиться дещо лячний вступ до теми реалізації низькорівневих команд \halign і \valign, призначених для верстки таблиць:

> «Це щось на кшталт дива, коли \halign і \valign працюють, бо вони перетинають так багато керувальних структур TeX. Тому ця сторінка, мабуть, не найкраще місце для початківця, щоб починати читати цю програму; спочатку краще опанувати все інше.»

Кнут далі каже

> «Зауважте, що коли \halign обробляється, ми безстрашно передаємо керування решті TeX. У критичні моменти до роботи залучається процедура вирівнювання, щоб виконати якусь невеличку дію, але більшу частину часу ці процедури просто ховаються на тлі. Це щось на кшталт постгіпнотичного навіювання.»

Із цих коментарів, здається, можна зробити висновок, що навіть для Кнута реалізація верстки таблиць у TeX була «чимось на кшталт виклику» — забезпечити користувачеві контроль і гнучкість, водночас гарантувавши, що автоматизовані алгоритми побудови таблиць TeX добре узгоджуються з основними процесами верстки TeX.

Автор охоче підтверджує складність коду й алгоритмів, що стоять за можливостями верстки таблиць у TeX, але також і захоплення величезним обсягом можливостей, уміщених у відносно невеликому обсязі, хай і щільного, коду Pascal (або C).


---

# 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/14-how-do-tex-engines-typeset-tables.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.
