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

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

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

## Рушії TeX називають таблиці вирівнюваннями

У [документація вихідного коду TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Кнут не обговорює здатність TeX «верстати таблиці», а натомість описує алгоритми TeX для побудови так званих *вирівнювань*. Верстання таблиць у TeX, по суті, є автоматизованим процесом вирівнювання блоків: розміщенням блоків (комірок таблиці, рядків і стовпців) для отримання приємної прямокутної сітки або масиву — хоча, звісно, для TeX у цьому процесі є *багатьма* нюанси.

Термін «вирівнювання» відображено також у назвах двох вбудованих у всі рушії TeX команд для верстання таблиць:

* `\halign` (горизонтальне вирівнювання), і
* `\valign` (вертикальне вирівнювання).

Ми дослідимо обидві команди впродовж цієї серії статей, починаючи з більш формального огляду формату/структури `\halign` та `\valign` команд, щоб закласти основу для наступних докладних статей цієї серії.

### Таблиці TeX — це блоки та інтервали

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

Однак TeX не може знати справжній розмір вмісту кожної комірки, доки цей вміст не буде набрано; отже, TeX проходить через усю таблицю, набираючи кожну комірку, щоб отримати дані про розміри, потрібні для завершення макета таблиці. З цих даних про розміри TeX може визначити правильну висоту кожного рядка та ширину кожного стовпця. TeX також може натрапити на порожні комірки або комірки, які користувач хоче розтягнути на кілька стовпців або кілька рядків, і все це TeX має ретельно врахувати у своїх обчисленнях. Після «фільтрування» цього різнорідного набору даних про розміри комірок (блоків) TeX лише тоді здатний визначити остаточні значення ширин стовпців у `\halign`, або висот рядків для `\valign` і використовує ці значення на завершальних етапах своїх алгоритмів макета таблиці.

На практиці, і «під капотом», верстання таблиць у TeX складається з кількох кроків. В загальних рисах TeX спочатку набирає «чернеткову» або «неповну» версію таблиці, поки збирає й обробляє дані про розміри комірок — а також дані про будь-які `\span` команди, використані в таблиці. На завершальних кроках TeX повторно обробляє цю «неповну» версію таблиці, щоб остаточно визначити `\halign` ширини стовпців або `\valign` висоти рядків і отримати завершений макет — усе це ми дослідимо в цій серії статей.

## \halign і \valign: два способи побудови таблиць

Усі рушії TeX надають дві *вбудовану* команди (примітиви), призначені для верстання таблиць (вирівнювань): `\halign` та `\valign`, які мають багато спільних основних можливостей, але також відрізняються в кількох принципових аспектах. Ключова відмінність між `\halign` та `\valign` полягає в тому, як вони будують свої відповідні таблиці: рядок за рядком або стовпець за стовпцем:

* `\halign`: верстає таблиці покомпонентно по рядках, створюючи окремі рядки, які потім складаються вертикально, утворюючи стовпці таблиці
* `\valign`: верстає таблиці покомпонентно по стовпцях, створюючи окремі стовпці, які потім складаються горизонтально, утворюючи рядки таблиці

### \halign

Наведена нижче діаграма зображує побудову таблиці, створеної `\halign`. Таблиця верстається рядок за рядком, з окремими рядками, складеними вертикально. Деякі наслідки цього такі:

* стовпці таблиці виникають завдяки вертикальному складанню рядків таблиці
* розриви сторінки можуть відбуватися між рядками таблиці
* між рядками можна вставити нетабличний матеріал (за допомогою `\nolign`, про що ми поговоримо пізніше)

![](/files/f0b0559b8e241c9a27b1ebcb794d55679d00640f)

### \valign

Наведена нижче діаграма зображує побудову таблиці, створеної `\valign`. Таблиця верстається покомпонентно по стовпцях, з окремими стовпцями, складеними горизонтально (поруч один з одним). Деякі наслідки цього такі:

* рядки таблиці виникають завдяки горизонтальному складанню стовпців таблиці
* розриви рядка можуть відбуватися між стовпцями таблиці
* між стовпцями можна вставити нетабличний матеріал (за допомогою `\noalign`, про що ми поговоримо пізніше)

![](/files/3d6949cf984bf9fb9e2a957d50a3ca03b6f32a78)

### Приклади

Наведений нижче приклад покликаний підкреслити підхід по рядках *проти*. по стовпцях у \halign і \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Щільно прилеглі межі блоку
\setlength{\fboxsep}{0pt}

Ось таблиця \verb|\valign|:
\begingroup
% \hsize керує \valign
% ширини стовпців. Ми також установлюємо
% \parindent до меншого значення
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Преамбула: буде розглянута пізніше (дуже докладно!)
A&B&C\cr % Перший СТОВПЕЦЬ цієї таблиці \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Примітка: з причин, пояснених пізніше
% \halign потрібно помістити у \vbox
Ось таблиця \verb|\halign|: \fbox{%
\vbox{\halign{
#&#&#\cr % Преамбула: буде розглянута пізніше (дуже докладно!)
A&B&C\cr % Перший РЯДОК цієї таблиці \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат: ![](/files/e538afe027c937281728a63bddc1172475ad439f)

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

* що таке преамбули таблиць?
* чому ми встановлюємо `\hsize` та `\parindent` для `\valign` таблиці?

Для теперішніх цілей просто зауважте підхід по рядках проти по стовпцях у `\halign` *проти*. `\valign` побудові таблиць:

![](/files/b789839de0e6366dbc811d9adb5b4fc40d289803)

## Загальна форма \halign і \valign

Для початку ми розглянемо основні властивості та загальний формат `\halign` та `\valign` але ще не заглиблюватимемося в жодні справді деталі. [Як зазначено](#intro), ми приймаємо дещо формальний огляд форми/структури `\halign` та `\valign` команд, щоб закласти основу для наступних статей цієї серії.

Найзагальніша форма `\halign` та `\valign` команд може бути записана так:

`\halign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`преамбулі`⁠$$\rangle$$ $$\langle$$⁠`тіло`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`преамбулі`⁠$$\rangle$$ $$\langle$$⁠`тіло`⁠$$\rangle$$ }

Як бачите, обидві `\halign` та `\valign` складаються з трьох основних розділів:

* [$$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`преамбулі`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`тіло`⁠$$\rangle$$](#body)

## Функція $$\langle$$⁠необов’язкова специфікація⁠$$\rangle$$

Стандартний розмір/обсяг таблиці, так званий «природний розмір», визначається її вмістом — щоб уточнити, під розміром/обсягом мається на увазі

* сайті *ширина* таблиці, створеної за допомогою `\halign`, або
* сайті *висота* таблиці, створеної за допомогою `\valign`

Додаток $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ можна використати, щоб «перевизначити» природний розмір таблиці, і це має одну з двох форм:

* **`на`** $$\langle$$**⁠`розмірність`⁠**$$\rangle$$
* **`розтяг`** $$\langle$$**⁠`розмірність`⁠**$$\rangle$$

де

* $$\langle$$**⁠`розмірність`⁠**$$\rangle$$ це довжина, задана в одиницях, які розуміє TeX, таких як pt, mm або cm — довжину також можна вказати як команду, що розгортається у значення, задане у відповідних одиницях;
* **`на`** та **`розтяг`** це ключові слова TeX, що визначають тип «перевизначення» природного розміру:
  * **`на`**: встановлює розмір таблиці в задану $$\langle$$⁠`розмірність`⁠$$\rangle$$ значення
  * **`розтяг`**: додає задане $$\langle$$⁠`розмірність`⁠$$\rangle$$ значення до природного розміру таблиці

Ефект від $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ залежить від типу таблиці, що верстається: він змінюватиме `\halign` природну *ширина*, або `\valign` природну *висота*.

Ось кілька прикладів:

* `\halign **до 100pt**{...}`: встановлює `\halign` ширину таблиці в `100pt`
* `\valign **до 50pt**{...}`: встановлює `\valign` висоту таблиці в `30pt`
* `\halign **розтяг 30pt**{...}`: додає 30pt до `\halign` природної ширини таблиці. Натомість запис **spread -30pt** зменшив би ширину таблиці на 30pt.
* `\valign **розтяг 20pt**{...}`: додає 20pt до `\valign` природної висоти таблиці. Натомість запис **spread -20pt** зменшив би висоту таблиці на 20pt.

Наведений нижче код повторно використовує приклади таблиць вище, але застосовує $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ до `\valign` та `\halign` таблиці:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Щільно прилеглі межі блоку
\setlength{\fboxsep}{0pt}

Ось таблиця \verb|\valign|:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Ось таблиця \verb|\halign|:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає результат, показаний нижче:

![](/files/f3d26bad751b035ff8c2b75350b887ffd93d1369)

—але зауважте, як вміст обох таблиць «збивається докупи». Причина в тому, що бракує гнучких інтервалів (клею), які TeX може використати, щоб розтягнути вміст і заповнити додатковий простір, наданий **`на`** $$\langle$$**⁠`розмірність`⁠**$$\rangle$$. Тут ми забіжимо наперед і згадаємо `\tabskip` команду.

#### Початкове знайомство з командою \tabskip

Естетика макета таблиці може вимагати коригування інтервалів між її рядками або стовпцями, тож, не дивно, рушії TeX надають команду під назвою `\tabskip` , яка дозволяє це робити. `\tabskip` використовується для встановлення (і зміни) величини гнучкого простору («клею»), який TeX розміщує між стовпцями `\halign` або рядками `\valign`. Пізніші статті розглянуть `\tabskip` набагато докладніше.

Як вступний приклад, наведений нижче код використовує значення для `\tabskip` що змушує TeX вставляти трохи (дуже) гнучкого простору між рядками `\valign` таблиці. Цей гнучкий простір дозволяє рядкам таблиці розсунутися і заповнити додатковий простір, створений $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ значення **`до 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{необов’язкова специфікація} \rangle\)}
\begin{document}
\pagestyle{empty}
Ось таблиця \verb|\valign|:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Ось та сама таблиця \verb|\valign|, але з \optspec{} ``\texttt{to 50pt}''. Зверніть увагу, як рядки «згромаджені докупи», бо між рядками немає доступного «розтяжного клею»:

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Ми використаємо таблицю \verb|\valign| з \optspec{} ``\texttt{to 50pt}'', але додамо «гнучкий інтервал» за допомогою команди \verb|\tabskip|. Тут \verb|\tabskip| надає достатньо «клею», щоб дозволити рядкам \verb|\valign| «розтягнутися» і заповнити будь-який доступний зайвий простір. Ось «розтягнута» таблиця \verb|\valign|:

\tabskip=0pt plus1fil % Це встановлює \tabskip на дуже гнучкий клей
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/21f3814000b12df836ad148b3281a7787ff7ec25)

## Знайомство з $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$ та $$\langle$$⁠тілом⁠$$\rangle$$

Цей розділ дає вступ до $$\langle$$⁠`преамбулі`⁠$$\rangle$$, і *коротко* торкається $$\langle$$⁠`тіло`⁠$$\rangle$$ яка згодом [розглядається докладніше](#bodydetails).

Пізніші статті цієї серії дослідять $$\langle$$⁠`преамбулі`⁠$$\rangle$$ та $$\langle$$⁠`тіло`⁠$$\rangle$$ докладніше, зокрема використання та обробку TeX таблиці $$\langle$$⁠`преамбулі`⁠$$\rangle$$.

Як зазначено вище, найзагальніший формат `\halign` або `\valign` таблиць можна записати так:

`\halign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`преамбулі`⁠$$\rangle$$ $$\langle$$⁠`тіло`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`преамбулі`⁠$$\rangle$$ $$\langle$$⁠`тіло`⁠$$\rangle$$ }

### Функція $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$

Функція $$\langle$$⁠`преамбулі`⁠$$\rangle$$ розділ містить один $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ який *закінчений* командою `\cr` ; отже, $$\langle$$⁠`преамбулі`⁠$$\rangle$$ можна переписати так:

$$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠`рядок преамбули`⁠$$\rangle$$**`\cr`**

### Функція $$\langle$$⁠тілом⁠$$\rangle$$

Так само, $$\langle$$⁠тілом⁠$$\rangle$$ розділ можна далі розбити на один або кілька складових «рядків», але тут для кожного рядка є два варіанти:

* рядок, що складається з набору комірок, які утворюють `\halign` рядок або `\valign` стовпець; або
* a `\noalign` команду, яка «впроваджує» матеріал між рядками `\halign`рядками або `\valign`стовпцями.

Для наших теперішніх цілей ми проігноруємо `\noalign` команду (див. [далі в статті](#noalign)) і припустимо, що кожен рядок $$\langle$$⁠тілом⁠$$\rangle$$ преамбули *закінчений* є даними для набору комірок і `\cr` команду.

Ігноруючи `\noalign`, а $$\langle$$⁠`тіло`⁠$$\rangle$$ розділ, який представляє вміст користувача, містить послідовність рядків, кожен з яких ми називатимемо $$\langle$$⁠`рядком тіла`⁠$$\rangle$$ що є *закінчений* у супроводі свого `\cr` команду.

Функція $$\langle$$⁠`тіло`⁠$$\rangle$$ можна переписати так:

$$\langle$$рядок тіла$${}\_1$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_2$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$рядок тіла$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Узагальнивши це, ми можемо переписати загальний формат `\halign` та `\valign` так:

`\halign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_1$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_2$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$рядок тіла$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`необов’язкова специфікація`⁠$$\rangle$$ { $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_1$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_2$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$рядок тіла$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

З причин, які будуть розглянуті в пізніших статтях, $$\langle$$⁠`преамбулі`⁠$$\rangle$$, лише один $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$, має інший формат, ніж усі рядки в таблиці $$\langle$$⁠`тіло`⁠$$\rangle$$. Ми також [повернемося до `\noalign` команду](#noalign) яка також може використовуватися всередині таблиці $$\langle$$⁠`тіло`⁠$$\rangle$$.

### Функція $$\langle$$⁠рядок преамбули⁠$$\rangle$$

Функція $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ відіграє *життєво важливу* роль у верстанні таблиць, бо він надає своєрідний «шаблон», що використовується для набору вмісту —`\halign` рядків або `\valign` стовпців — що містяться в таблиці $$\langle$$⁠`тіло`⁠$$\rangle$$. $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ також може містити шаблони комірок, які використовуються для побудови рядків `\halign` або стовпців `\valign`—тему, яку буде розглянуто докладно.

Мета $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ подвійна:

* вона визначає *максимум* кількість комірок у рядку `\halign` або в стовпці `\valign`.
* вона зберігає *шаблони комірок* які можна використовувати для автоматизації форматування або включення вмісту в комірки, що містяться в таблиці $$\langle$$⁠`тіло`⁠$$\rangle$$. Шаблони комірок є необов’язковими і можуть бути «порожніми», або ви можете включати символи чи команди, які TeX автоматично вставлятиме перед та/або після фактичного вмісту окремих комірок у вашій таблиці. Це позбавляє вас нудної потреби вручну вписувати/включати ці символи чи команди в кожну комірку, де ви хочете їх застосувати.

**Примітка**: у `\halign` рядок або `\valign` стовпець може міститися менше комірок, ніж максимальне значення, задане $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ , але не може містити більше за цей максимум, інакше TeX видасть помилку. Для наших теперішніх цілей ми опускаємо деталі *циклічних* преамбул.

Продовжуючи наші діаграми структури, таблицю $$\langle$$⁠`рядок преамбули`⁠$$\rangle$$ для

* один `\halign` з максимумом $$\mathrm{K}$$ комірок на *рядка*, або
* a `\valign` з максимумом $$\mathrm{K}$$ комірок на *стовпець*

можна записати так:

$$\langle$$⁠шаблон$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠шаблон$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠шаблон$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠шаблон$${}*\mathrm{K}$$⁠$$\rangle$$

де `&` це *символу табуляції вирівнювання* який позначає кінець однієї комірки і початок наступної. Традиційно як символ табуляції вирівнювання використовується амперсанд (`&`) але замість нього можна використати будь-який символ із [код категорії](/latex/uk/inshi-temi/43-table-of-tex-category-codes.md) 4.

Тільки нагадаємо, що $$\langle$$⁠`преамбулі`⁠$$\rangle$$ можна записати $$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠`рядок преамбули`⁠$$\rangle$$**`\cr`**, або еквівалентно

$$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠шаблон$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠шаблон$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠шаблон$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠шаблон$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Структура кожної комірки $$\langle$$⁠шаблон⁠$$\rangle$$

Кожна комірка $$\langle$$⁠шаблон$${}\_i$$⁠$$\rangle$$ можна записати так:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ де:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ є набором символів або команд (токенів), які TeX вставлятиме автоматично *до того, як* вміст для комірки, наданий користувачем $$i$$;
* $$\texttt{#}$$ є заповнювачем, що показує, де вміст, наданий користувачем, має з’явитися в комірці $$i$$. Знову ж таки, `#` символ — це лише *традиція*, замість нього можна використати будь-який символ з [код категорії](/latex/uk/inshi-temi/43-table-of-tex-category-codes.md) 6. Зверніть увагу, що код категорії 6 використовується для параметрів макросів;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ є набором символів або команд (токенів), які TeX вставлятиме автоматично *після* вміст для комірки, наданий користувачем $$i$$.

Зверніть увагу, що всі $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ та $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ є *необов'язковим*: вам не потрібно використовувати жодні символи чи команди до або після вмісту комірки.

**Завершення** $$\langle$$**⁠преамбулою таблиці⁠**$$\rangle$$

Нарешті, використовуючи наведену вище нотацію, $$\langle$$⁠`преамбулі`⁠$$\rangle$$ для

* один `\halign` з максимумом $$\mathrm{K}$$ комірок на *рядка*, або
* a `\valign` з максимумом $$\mathrm{K}$$ комірок на *стовпець*

можна записати так:

$$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠`рядок преамбули`⁠$$\rangle$$`**\cr**`

або

$$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Функція** $$\langle$$**⁠преамбулою таблиці⁠**$$\rangle$$ **і підрахунок рядків та стовпців**

Додаток **`\halign`** таблиця з $$\langle$$⁠`преамбулі`⁠$$\rangle$$ із зазначенням $$\mathrm{K}$$ комірок і $$\langle$$⁠`тіло`⁠$$\rangle$$ що містить $$\mathrm{N}$$ $$\langle$$⁠`рядки тіла`⁠$$\rangle$$ дасть таблицю з $$\mathrm{K}$$ *стовпцями* та $$\mathrm{N}$$ *рядками*, як показано на наведеній нижче діаграмі:

![](/files/c6d73e7482811412225db75155c540ee2f168844)

Скопійований **`\valign`** таблиця з $$\langle$$⁠`преамбулі`⁠$$\rangle$$ із зазначенням $$\mathrm{K}$$ комірок і $$\langle$$⁠`тіло`⁠$$\rangle$$ що містить $$\mathrm{N}$$ $$\langle$$⁠`рядки тіла`⁠$$\rangle$$ дасть таблицю з $$\mathrm{K}$$ *рядками* та $$\mathrm{N}$$ *стовпцями*, як показано на наведеній нижче діаграмі:

![](/files/86122268979116ff7545b653b72c1d0973897498)

### Досить теорії, трохи прикладів!

Як ми згодом побачимо докладніше, коли TeX обробляє вміст таблиці — комірки таблиці, що містяться в [$$\langle$$⁠`тіло`⁠$$\rangle$$](#body)— він перевіряє наявність шаблонів комірок, які були визначені в $$\langle$$⁠`преамбулі`⁠$$\rangle$$, бо TeX шукає будь-які токени шаблону, які слід вставити перед та/або після вмісту користувача. Наведені нижче мінімальні приклади демонструють використання шаблонів комірок $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ у `\halign` та `\valign` таблиці.

#### Таблиця \halign із використанням шаблонів комірок

Наведений нижче приклад демонструє `\halign` таблицю, що використовує шаблон комірки для автоматичної вставки подвійних лапок навколо вмісту першої комірки в кожному рядку: тобто шаблон, який впливає на кожну комірку в першому стовпці:

```latex
\documentclass{article}
\usepackage{parskip} % Встановити \parindent у 0pt
% Виберіть зручний малий розмір сторінки
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Розставити стовпці \halign
\begin{document}
\pagestyle{empty}

Ось таблиця \verb|\halign| \textit{без} шаблонів комірок:

\halign{
% Нічого до або після кожного '#' у <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Ось та сама таблиця \verb|\halign|, але з подвійними лапками, автоматично доданими до першої комірки в кожному рядку; тобто це впливає на кожну комірку в першому стовпці:

\halign{
% Шаблони лапок у преамбулі:
``#''&#&#\cr % Подвійні лапки до і після першого #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/25b5f507bc3398a886ddf485ac56ab0ff49bd5e9)

Наведена нижче графіка є анотованою версією `\halign` таблиці, отриманої в наведеному вище прикладі; тут ми порівнюємо «формальну» структуру таблиці з трьома комірками $$\langle$$⁠`преамбулі`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

з фактичною $$\langle$$⁠`преамбулі`⁠$$\rangle$$ значення ` ``#''&#&#**\cr** `, підкреслюючи наявність або відсутність шаблонів комірок:

![](/files/0c4cc251c93061f7b93b51cd3df4065dd8278596)

#### Таблиця \valign із використанням шаблонів комірок

Наведений нижче приклад демонструє `\valign` таблицю, яка використовує шаблон для кожної комірки, щоб автоматично вставляти цифри навколо вмісту користувача.

```latex
\documentclass{article}
\usepackage{parskip} % Встановити \parindent у 0pt
% Виберіть зручний малий розмір сторінки
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Розставити рядки \valign
\begin{document}
\pagestyle{empty}

Ось таблиця \verb|\valign| \textit{без} шаблонів комірок:

\begingroup
\hsize=25pt
\valign{
% Нічого до або після кожного '#' у
% <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Ось та сама таблиця \verb|\valign|, але з використанням шаблонів комірок для автоматичної вставки цифр у кожну комірку:

\begingroup
\hsize=25pt
\valign{
% Цифри вставлені до і після кожного '#' у
% <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/16b184e2fd88aea0adfad7ef9b6e10d22442c9b2)

Наведена нижче графіка є анотованою версією `\valign` таблиці, отриманої в наведеному вище прикладі; тут ми порівнюємо «формальну» структуру таблиці з трьома комірками $$\langle$$⁠`преамбулі`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

з фактичною $$\langle$$⁠`преамбулі`⁠$$\rangle$$ значення `1#2&3#4&5#6**\cr**`, підкреслюючи використання шаблонів комірок $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/e5c805a7c3053801aa831e68954be3a51e6de973)

Зверніть увагу, як шаблон для комірки $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) застосовується до $$i$$го стовпця в кожному `\valign` результатом чого всі комірки $$i$$го *рядка* є зачепленими.

#### Стилізація тексту за допомогою шаблонів комірок

Наступний приклад використовує такі $$\langle$$⁠`преамбулі`⁠$$\rangle$$ (шаблони комірок), щоб стилізувати текст, що міститься в кожному рядку або стовпці:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Якщо ми порівняємо цю $$\langle$$⁠`преамбулі`⁠$$\rangle$$ з нашою «формальною» структурою таблиці з трьома комірками $$\langle$$⁠`преамбулі`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

ми можемо бачити, що:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Зверніть увагу, як ці шаблони комірок, такі як `\textbf{#}` нагадують макроси з одним параметром (вмістом комірки).

```latex
Таблиця \verb|\valign| із текстом, стилізованим за допомогою шаблонів комірок:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Таблиця \verb|\halign| із текстом, стилізованим за допомогою шаблонів комірок:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/e254b03385e60ec014459b49ee5a573c32f84f17)

## Докладніше про таблицю $$\langle$$⁠тілом⁠$$\rangle$$

У розділі [Знайомство з $$\langle$$⁠`преамбулі`⁠$$\rangle$$ та $$\langle$$⁠`тіло`⁠$$\rangle$$](#preamble) ми побачили, як, якщо тимчасово ігнорувати `\noalign`, а $$\langle$$⁠`тіло`⁠$$\rangle$$ у `\halign` або `\valign` таблиця складається з кількох рядків, кожен позначений $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$, де:

* кожен $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ завершується `\cr` команду
* кожен $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ у `\halign` є рядком таблиці
* кожен $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ з `\valign` є стовпцем таблиці

Послідовність рядків, $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$, де $$j=1\ldots\mathrm{N}$$, утворює $$\mathrm{N}$$ рядки `\halign` або $$\mathrm{N}$$ стовпці для `\valign`. Як підсумовано на наведеній нижче схемі, загальний $$\langle$$⁠`преамбулі`⁠$$\rangle$$ такі як

$$\langle$$⁠`преамбулі`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

визначає шаблони комірок максимум для $$\mathrm{K}$$ комірок у кожному з $$\mathrm{N}$$ $$\langle$$⁠`рядком тіла`⁠$$\rangle$$ записів у $$\langle$$⁠`тіло`⁠$$\rangle$$:

![](/files/273451c3344a8c3731b8f245ec9923ef3266a2c8)

### Структура кожного $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$

Кожен рядок $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ таблиці $$\langle$$⁠тілом⁠$$\rangle$$ містить вміст для до $$\mathrm{K}$$ комірок — як визначено таблицею $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$— і має загальний вигляд:

$$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Комірка$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Комірка$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Комірка$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Комірка$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

де:

* $$\langle$$⁠Комірка$${}\_i$$⁠$$\rangle$$ представляє вміст користувача для $$i$$-ї комірки в деякій $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$
* сайті **`&`** символ називається *табулятор вирівнювання* (так само, як використовується в $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$) який сигналізує про кінець однієї комірки і початок наступної. Знову ж таки, використання **`&`** є лише традицією (умовністю), оскільки будь-який символ із [код категорії](/latex/uk/inshi-temi/43-table-of-tex-category-codes.md) 4.

Хоча кожен $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ може містити максимум $$\mathrm{K}$$ комірок (визначено $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$) вони можуть містити *менше* ніж $$\mathrm{K}$$ комірок, і будь-яка $$\langle$$⁠Комірка$${}\_i$$⁠$$\rangle$$ % $$\langle$$рядок тіла$${}\_j$$⁠$$\rangle$$ може бути порожньою.

Наведений нижче приклад демонструє $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$ значення `#&#&#&#&#\cr` що забезпечує максимум 5 комірок на $$\langle$$⁠рядок тіла⁠$$\rangle$$; однак, набрані таблиці містять рядки з менш ніж 5 комірками:

```latex
Таблиця \verb|\valign| з 1 до 5 комірками на \textit{стовпець}:

\begingroup
% \hsize керує шириною стовпців \valign (розміром набраних рядків).
\hsize=40pt
\fbox{\valign{
% Використайте преамбулу, що дозволяє 5 комірок на стовпець
% У більшості стовпців немає вмісту для 5 комірок
#&#&#&#&#\cr% 5 комірок на стовпець
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Примітка: з причин, пояснених пізніше
% \halign потрібно помістити у \vbox
Таблиця \verb|\halign| з 1 до 5 комірками на \textit{рядок}:

\fbox{%
\vbox{\halign{
% Використайте преамбулу, що дозволяє 5 комірок на рядок
% У більшості рядків немає вмісту для 5 комірок
#&#&#&#&#\cr % 5 комірок на рядок
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Відкрити цей приклад в Overleaf](/latex/uk/dokladni-statti/15-how-do-tex-engines-typeset-tables-2.md)

Цей приклад дає такий результат:

![](/files/93ceb891f08a3b6b8f79c689ac72732fa810ac8c)

Наступний `\halign` приклад демонструє змінну кількість комірок у рядку та можливість, щоб комірки були порожніми — зверніть увагу, як порожні комірки утворюються послідовними **`&`** символами у таблиці:

```latex
Таблиця \verb|\halign| з деякими порожніми комірками — зверніть увагу, що в таблиці \(\langle\texttt{body}\rangle\) є послідовні символи \texttt{\&}:

\fbox{%
\vbox{\halign{
% Використайте преамбулу, що дозволяє 5 комірок на рядок
% У більшості рядків немає вмісту для 5 комірок
#&#&#&#&#\cr % 5 комірок на рядок
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/ca9d2c239e6d73d5971953a13477c0986da4fb17)

### У типографському наборі таблиць немає нічого особливого в & і \#

Використання TeX символів `&` та `#` у наборі `\halign`- або `\valign`-основних таблиць є традицією, що походить від оригінальних макросів plain TeX Кнута. Цілком можливо використовувати символи, відмінні від `&` та `#` встановивши відповідні коди категорій для ваших бажаних замінників, як демонструє наступний приклад:

* заміщення `&` з `@` призначивши `@` кодові категорії 4
* заміщення `#` з `|` призначивши `|` кодові категорії 6 (який використовується для параметрів макросів)

Зміни коду категорії залишаються локальними завдяки використанню `\begingroup` та `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Повторне введення команди \noalign

Рушії TeX надають вбудовану (примітивну) `\noalign` команди:

`\noalign{`$$\langle$$⁠`токени`⁠$$\rangle$$`}`

де $$\langle$$⁠`токени`⁠$$\rangle$$ є символами та/або командами TeX/LaTeX. Команда `\noalign` призначена виключно для використання всередині `\halign` або `\valign` таблиці: використання її поза ними спричинить помилку.

Призначення `\noalign` полягає в тому, щоб дозволити «вставлення» тексту та команд TeX/LaTeX *між* рядками `\halign` таблиці або стовпцями `\valign` таблиці. Найпоширеніше використання `\noalign` — створення правил таблиці (ліній):

* *горизонтальні* лінії між `\halign` рядками таблиці
* *вертикальні* лінії між `\valign` стовпцями таблиці

Зверніть увагу на таке:

* сайті `\noalign` команди такий ***не завершується\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*командою***
* набір команд, дозволених у `\noalign{...}` залежить від того, чи використовується вона в $$\langle$$⁠`тіло`⁠$$\rangle$$ у `\halign` або `\valign` таблиці (тобто у вертикальному чи горизонтальному режимі).

Тепер ми можемо сказати, що таблиця $$\langle$$⁠`тіло`⁠$$\rangle$$ значення `\halign` або `\valign` може складатися з окремих рядків $$\langle$$рядок тіла$${}\_i$$⁠$$\rangle$$`\cr` чергуючись із `\noalign` командами; одним із багатьох можливих варіантів/комбінацій може бути:

`\noalign{`$$\langle$$⁠`токени`⁠$$\rangle$$`}` $$\langle$$рядок тіла$${}\_1$$⁠$$\rangle$$\cr $$\langle$$рядок тіла$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`більше токенів`⁠$$\rangle$$`}` $$\langle$$рядок тіла$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$рядок тіла$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`інші токени`⁠$$\rangle$$`}`

### Приклад із \noalign

Ми розглянемо інші випадки використання пізніше в цій серії статей, але ось базовий приклад, що демонструє створення правил таблиці через `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Використання \verb|\noalign| для розміщення горизонтальних ліній між рядками таблиці \verb|\halign|:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Використання \verb|\noalign| для розміщення вертикальних ліній між стовпцями таблиці \verb|\valign|:
\vspace{6pt}

\begingroup % Залишаємо зміни \parindent і \hsize локальними
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/1402bce45314466f39de0a046b925aef96d07013)

## \tabskip переглянуто знову

Ми детальніше розглянемо `\tabskip` команду, спираючись на [вступ у попередньому розділі](#tabskip).

Функція `\tabskip` команда встановлює значення особливої форми «інтервалу» (клею), що використовується *виключно* у наборі таблиць: її призначення — забезпечити проміжки між рядками або стовпцями таблиці:

* для `\halign` таблиці: `\tabskip` клей вставляється перед і після таблиці (тобто ліворуч і праворуч) та між стовпцями таблиці
* для `\valign` таблиці: `\tabskip` клей вставляється перед і після таблиці (тобто над і під нею) та між рядками таблиці

Значення `\tabskip` можна встановити за допомогою LaTeX `\setlength` команди:

`\setlength{\tabskip}{`$$\langle$$⁠`значення клею`⁠$$\rangle$$`}`

де $$\langle$$⁠`значення клею`⁠$$\rangle$$ може бути:

* фіксована довжина, наприклад `5pt`, `3mm`, або
* скінченний гнучкий клей, наприклад `3pt plus 2pt minus 1pt`, або
* нескінченно гнучкий клей, наприклад `0pt plus1fill`.

Ви також можете безпосередньо встановити `\tabskip` (обминаючи `\setlength`) написавши

`\tabskip`=$$\langle$$⁠`значення клею`⁠$$\rangle$$

Однак будь-яка зміна значення `\tabskip` клею вплине на інтервали таблиці лише тоді, коли ця зміна:

* зроблена *до того, як* сайті `\halign` або `\valign` команду для обробки або
* зроблена всередині таблиці $$\langle$$⁠`преамбулі`⁠$$\rangle$$

Спроби встановити `\tabskip` значення всередині вмісту таблиці (комірок у таблиці $$\langle$$⁠`тіло`⁠$$\rangle$$) *не* змінюють інтервали `\halign` стовпців таблиці або `\valign` рядків таблиці. Причину такої поведінки `\tabskip` можна простежити до ролі, яку відіграє $$\langle$$⁠`преамбулі`⁠$$\rangle$$ під час набору таблиць — процесів, які ми пізніше детально розглянемо.

### Бачити — значить вірити

Щоб допомогти візуалізувати наявність різних типів інтервалів/клею, що використовується в наборі таблиць, особливо

* `\tabskip` клей
* `\baselineskip` клей
* ручний кернінг (`\kern`)

Overleaf підготував проєкт на основі LuaTeX для кольорового виділення компонентів таблиці. LuaTeX було обрано, оскільки він дає змогу низькорівнево повторно обробляти внутрішні дані/структури набраних таблиць, але ми не розглядатимемо ці деталі тут.

Ось кілька прикладів, що показують різні застосування `\tabskip`. Для кожного прикладу ми покажемо фактичний результат і версію з кольоровим виділенням, згенеровану LuaTeX.

### Приклад 1 \tabskip

Давайте розглянемо використання `\tabskip` у `\halign` та `\valign` таблиці. Ми покажемо фактичні набрані таблиці, з рамкою для візуалізації їхнього розміру та інтервалів, разом із анотованою графікою, що містить кольорові версії, які чітко показують розмір різних клеїв/інтервалів у кожній таблиці.

По-перше, `\halign`:

```latex
% Щоб візуалізувати межі таблиці, ми помістимо навколо неї рамку
\setlength{\fboxsep}{0pt} % Використайте рамки, що щільно прилягають

% Тут ми задаємо \tabskip «безпосередньо»
\tabskip5pt % Встановіть початкове значення \tabskip поза таблицею

% Щоб помістити рамку навколо таблиці, її потрібно зберегти в TeX-скриньці.
% \halign потрібно розмістити у \vbox, тому що \halign має бути
% оброблений у «вертикальному режимі»: \hbox не підійде, бо
% це обробляється в «горизонтальному режимі»

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/a6d19cb65e72840852620d5700b30fc226dda285)

Наступна графіка — це більша, кольорова та анотована версія таблиці, отриманої в попередньому прикладі:

![](/files/07084573d0a542f89f0f353f081a6fc269541ce5)

Є 4 входження `\tabskip` команди, кожне з яких відповідає певному місцю інтервалу в таблиці:

1. `\tabskip5pt` використовується поза таблицею і встановлює `\tabskip` значення, що застосовується перед (ліворуч від) першою коміркою в кожному рядку.
2. `\tabskip10pt` встановлюється в першому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір між $$\langle$$⁠Комірка$${}\_1$$⁠$$\rangle$$ та $$\langle$$⁠Комірка$${}\_2$$⁠$$\rangle$$ кожного рядка.
3. `\tabskip15pt` встановлюється у другому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір між $$\langle$$⁠Комірка$${}\_2$$⁠$$\rangle$$ та $$\langle$$⁠Комірка$${}\_3$$⁠$$\rangle$$ кожного рядка.
4. `\tabskip20pt` встановлюється у третьому й останньому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір, доданий після $$\langle$$⁠Комірка$${}\_3$$⁠$$\rangle$$, останньої комірки кожного рядка.

Далі, `\valign`

```latex
\setlength{\fboxsep}{0pt} % Використайте рамки, що щільно прилягають
\tabskip5pt % Встановіть початкове значення \tabskip поза таблицею

% Залишайте зміни \hsize локальними (у групі)
\begingroup
% \hsize визначає ширину стовпців \valign
\setlength{\hsize}{50pt}
% Оскільки \valign можна помістити у \vbox або \hbox, ми можемо використати
% \fbox безпосередньо
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

![](/files/5cde33a29b1b2d01a294f529123969975fad8bba)

Знову ж таки, наступна графіка — це більша, кольорова та анотована версія таблиці, отриманої в попередньому прикладі:

![](/files/c5d71acc772a3b61f6c082d595847f5626b86fd9)

Так само, як і у `\halign` прикладі, є 4 входження `\tabskip` команди. Однак у `\valign` таблиці `\tabskip` вставляється між рядками таблиці:

1. `\tabskip5pt` використовується поза таблицею і встановлює `\tabskip` значення, що застосовується перед (над) першою коміркою в кожному стовпці.
2. `\tabskip10pt` встановлюється в першому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір між $$\langle$$⁠Комірка$${}\_1$$⁠$$\rangle$$ та $$\langle$$⁠Комірка$${}\_2$$⁠$$\rangle$$ кожного стовпця.
3. `\tabskip15pt` встановлюється у другому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір між $$\langle$$⁠Комірка$${}\_2$$⁠$$\rangle$$ та $$\langle$$⁠Комірка$${}\_3$$⁠$$\rangle$$ кожного стовпця.
4. `\tabskip20pt` встановлюється у третьому й останньому шаблоні комірки $$\langle$$⁠`преамбулі`⁠$$\rangle$$ що впливає на простір, доданий після $$\langle$$⁠Комірка$${}\_3$$⁠$$\rangle$$, останньої комірки кожного стовпця.

**Підсумки/висновки**

* У `\halign` таблиці `\tabskip` клей розміщується ліворуч і праворуч від кожної комірки в рядку, тим самим розсуваючи стовпці таблиці.
* У `\valign` таблиці `\tabskip` клей розміщується над і під кожною коміркою в стовпці, тим самим розсуваючи рядки таблиці.

### \tabskip і \noalign

#### Використання \halign

Наступний `\halign` приклад використовує `\tabskip` клеї, а також демонструє `\noalign` команду, використовуючи її для розміщення розділених інтервалом ліній над і під рядками `\halign` таблиці. Ці лінії набираються за допомогою `\hrule` (примітивної) команди разом із простором, створеним `\kern`:

```latex
\setlength{\tabskip}{5pt} % Встановіть \tabskip поза таблицею

\halign{
#&#&#&#&#\cr % Преамбула
\noalign{\hrule\kern2pt} % Розділена інтервалом лінія перед рядком 1
1&2&3&4&5\cr % Рядок 1
\noalign{\kern2pt\hrule\kern2pt} % Розділена інтервалом лінія між рядками 1/2
6&7&8&9&10\cr % Рядок 2
\noalign{\kern2pt\hrule\kern2pt} % Розділена інтервалом лінія між рядками 2/3
11&12&13&14&15\cr % Рядок 3
16&17&18&19&20\cr % Рядок 4 --- без ліній між рядками 3/4
\noalign{\kern2pt\hrule} % Розділена інтервалом лінія в кінці таблиці
}
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Цей приклад створює таблицю, показану нижче, яку додатково анотовано, щоб відтворити (La)TeX-код і числа (1) до (4), щоб перелічити `\noalign` команди, що містять лінії та керни, разом із відповідним набраним результатом:

![](/files/0d7c8f9fb3028fbfba99d09a04a02d373e4cb788)

Наведена нижче графіка показує кольорову версію таблиці з підписами, що відображають різні інтервали/клеї в таблиці:

![](/files/9bf4fc8498d3ec966c800de001f6517cb241ae33)

Зверніть увагу на таке:

* використання `\noalign` для вставлення ліній між певними рядками та ручне використання `\kern` значень, щоб додати трохи простору до/після ліній. Рушії TeX не вставляють `\baselineskip` клей після набраної лінії, тому простір вставляється вручну за допомогою `\kern` (можна було б використати інші команди інтервалів);
* `\baselineskip` клей автоматично вставлявся між рядками 3 і 4.

#### Використання \valign

Наступний `\valign` приклад використовує ті самі дані, що й попередній `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад створює таблицю, показану нижче, яку додатково анотовано, щоб відтворити (La)TeX-код і числа (1) до (4), щоб перелічити `\noalign` команди, що містять лінії та керни, разом із відповідним набраним результатом:

![](/files/dc90fbe7f56c74299963eeb70be2e71bb07e88d7)

![](/files/b86fbef9aa9ad65e2497d5d813e2d37f7ad549d8)

### Таблиця \valign з рядками тексту

Наступний приклад

```latex
\setlength{\tabskip}{5pt}
\begingroup % Залишайте зміни \parindent і \hsize локальними
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} може набирати дуже складні
таблиці. & Ось трохи додаткового
тексту. & І, нарешті, додатковий рядок
у цьому стовпці.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Відкрити цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Цей приклад дає такий результат:

## Встановлення ширини рядків і висоти стовпців

## Докладніше про таблицю $$\langle$$⁠преамбулою таблиці⁠$$\rangle$$


---

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