> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/cs/clanky-do-hloubky/15-how-do-tex-engines-typeset-tables-2.md).

# Jak TeX enginy sází tabulky 2

## Jak TeXové enginy sázejí tabulky 2

## TeXové enginy označují tabulky jako zarovnání

Uvnitř [dokumentace zdrojového kódu TeXu](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth nerozebírá schopnost TeXu „sázet tabulky“, ale místo toho popisuje algoritmy TeXu pro konstrukci takzvaných *zarovnání*. Sazba tabulek v TeXu je ve skutečnosti automatizovaný proces zarovnávání rámečků: uspořádávání rámečků (buněk tabulky, řádků a sloupců) tak, aby vznikla líbivá obdélníková mřížka nebo pole — i když samozřejmě, protože jde o TeX, existují *mnoha* v tomto procesu určité nuance.

Pojem „zarovnání“ se odráží i v názvech dvou příkazů pro sazbu tabulek zabudovaných ve všech TeXových enginích:

* `\halign` (horizontální zarovnání) a
* `\valign` (vertikální zarovnání).

Oba příkazy budeme probírat v celé této sérii článků, a začneme formálnějším přehledem formátu/struktury `\halign` a `\valign` příkazů, abychom položili základy pro pozdější podrobné články v této sérii.

### TeXové tabulky jsou rámečky a mezery

Jednotlivé buňky tabulky obvykle obsahují různý obsah, například řádky textu, matematické výrazy nebo grafiku, což vytváří sadu buněk tabulky, které mají různé šířky, výšky nebo hloubky vysázeného materiálu. TeX musí nějak pracovat s těmito buňkami s různými rozměry obsahu, aby sestavil výslednou tabulku, v níž má každý řádek určitou výšku a každý sloupec určitou šířku. TeX musí z kolekce buněk tabulky proměnné velikosti odvodit vhodné hodnoty výšek jednotlivých řádků a šířek jednotlivých sloupců.

TeX však nemůže znát skutečnou velikost obsahu každé buňky, dokud není tento obsah vysázen; TeX proto prochází celou tabulku, vysazuje každou buňku a získává tak údaje o velikosti potřebné k dokončení rozvržení tabulky. Z těchto údajů o velikosti může TeX určit správnou výšku každého řádku a šířku každého sloupce. TeX se může setkat také s prázdnými buňkami nebo buňkami, které uživatel chce rozpínat přes více sloupců nebo více řádků, a to vše musí TeX ve svých výpočtech pečlivě zohlednit. Teprve po „odfiltrování“ této nesourodé sbírky údajů o velikosti buněk (rámečků) je TeX schopen určit konečné hodnoty šířek sloupců v `\halign`, nebo výšek řádků pro `\valign` a používá tyto hodnoty v závěrečných fázích svých algoritmů rozvržení tabulek.

V praxi a „pod kapotou“ se sazba tabulek v TeXu skládá z několika kroků. Ve zkratce TeX nejprve vysází „pracovní“ nebo „neúplnou“ verzi tabulky, zatímco zachycuje a zpracovává údaje o velikosti buněk — a údaje o případných `\span` příkazech použitých v tabulce. V závěrečných krocích TeX znovu zpracuje tuto „neúplnou“ verzi tabulky, aby dokončil `\halign` šířky sloupců nebo `\valign` výšky řádků a dosáhl hotového rozvržení — a to vše prozkoumáme v této sérii článků.

## \halign a \valign: dva způsoby konstrukce tabulek

Všechny TeXové enginy poskytují dva *vestavěnou* příkazy (primitiva) určené pro sazbu tabulek (zarovnání): `\halign` a `\valign`, které sdílejí mnoho základních vlastností, ale v některých zásadních ohledech se liší. Hlavní rozdíl mezi `\halign` a `\valign` spočívá v tom, jak konstruují své tabulky: po řádcích nebo po sloupcích:

* `\halign`: sází tabulky po řádcích a vytváří jednotlivé řádky, které jsou skládány svisle, aby vytvořily sloupce tabulky
* `\valign`: sází tabulky po sloupcích a vytváří jednotlivé sloupce, které jsou skládány vodorovně, aby vytvořily řádky tabulky

### \halign

Následující diagram znázorňuje konstrukci tabulky vytvořené pomocí `\halign`. Tabulka je sázená po řádcích a jednotlivé řádky jsou skládány svisle. Některé důsledky jsou:

* sloupce tabulky vznikají svislým skládáním řádků tabulky
* zlomy stránek mohou nastat mezi řádky tabulky
* mezi řádky lze vkládat netabulkový materiál (pomocí `\nolign`, na což se podíváme později)

![](/files/7bec6bb9980f8712c19420de82a1b36e6c906a60)

### \valign

Následující diagram znázorňuje konstrukci tabulky vytvořené pomocí `\valign`. Tabulka je sázená po sloupcích a jednotlivé sloupce jsou skládány vodorovně (vedle sebe). Některé důsledky jsou:

* řádky tabulky vznikají vodorovným skládáním sloupců tabulky
* zalomení řádku mohou nastat mezi sloupci tabulky
* mezi sloupce lze vkládat netabulkový materiál (pomocí `\noalign`, na což se podíváme později)

![](/files/1a3c2176cb0b94b02bc18a6b1105b6869210314b)

### Příklady

Následující příklad má zdůraznit řádkový *vs.*. sloupcový přístup \halign a \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Těsně přiléhající okraje rámečků
\setlength{\fboxsep}{0pt}

Zde je tabulka \verb|\valign|:
\begingroup
% \hsize ovládá \valign
% šířky sloupců. Také nastavíme
% \parindent na menší hodnotu
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Preambule: později podrobně probrána!
A&B&C\cr % První SLOUPEC této tabulky \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Poznámka: z důvodů vysvětlených později
% \halign musí být vložen do \vbox
Zde je tabulka \verb|\halign|: \fbox{%
\vbox{\halign{
#&#&#\cr % Preambule: později podrobně probrána!
A&B&C\cr % První ŘÁDEK této tabulky \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup: ![](/files/43b70ca24859002592e225e71b9005b86de974d6)

Následující grafika ukazuje okomentovanou verzi tabulek vytvořených výše uvedeným kódem. Později v této sérii článků se budeme zabývat tématy jako:

* co jsou tabulkové preambule?
* proč nastavujeme `\hsize` a `\parindent` pro `\valign` tabulky?

Pro nynější účely si jen všimněte řádkového vs. sloupcového přístupu `\halign` *vs.*. `\valign` ke konstrukci tabulek:

![](/files/fadc85779dd3a2eb168b55ade8236aca9abac534)

## Obecná forma \halign a \valign

Nejprve si projdeme základní vlastnosti a obecný formát `\halign` a `\valign` ale zatím se neponoříme do žádných podrobností. [Jak bylo uvedeno](#intro), přijímáme poněkud formálnější přehled formy/struktury `\halign` a `\valign` příkazů, abychom položili základy pro následující články této série.

Nejobecnější forma `\halign` a `\valign` příkazů lze zapsat následovně:

`\halign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambuli`⁠$$\rangle$$ $$\langle$$⁠`tělo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambuli`⁠$$\rangle$$ $$\langle$$⁠`tělo`⁠$$\rangle$$ }

Jak vidíte, oba `\halign` a `\valign` se skládají ze tří hlavních částí:

* [$$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`preambuli`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`tělo`⁠$$\rangle$$](#body)

## Ta $$\langle$$⁠volitelná specifikace⁠$$\rangle$$

Výchozí velikost/rozsah tabulky, její takzvaná „přirozená velikost“, je určena jejím obsahem — pro upřesnění, velikostí/rozsahem máme na mysli

* webových stránkách *šířku* tabulky vytvořené pomocí `\halign`, nebo
* webových stránkách *výšku* tabulky vytvořené pomocí `\valign`

Jeden $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ lze použít k „přepsání“ přirozené velikosti tabulky a má jednu ze dvou forem:

* **`na`** $$\langle$$**⁠`dimenze`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`dimenze`⁠**$$\rangle$$

kde

* $$\langle$$**⁠`dimenze`⁠**$$\rangle$$ je délka zadaná v jednotkách, kterým TeX rozumí, například pt, mm nebo cm — délku lze také zadat jako příkaz, který se rozvine na hodnotu uvedenou ve vhodných jednotkách;
* **`na`** a **`spread`** jsou texová klíčová slova určující typ „přepsání“ přirozené velikosti:
  * **`na`**: nastaví velikost tabulky na zadanou $$\langle$$⁠`dimenze`⁠$$\rangle$$ hodnota
  * **`spread`**: přičte zadanou $$\langle$$⁠`dimenze`⁠$$\rangle$$ hodnotu k přirozené velikosti tabulky

Účinek $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ závisí na typu sazované tabulky: upraví `\halign` přirozenou *šířku*, nebo `\valign` přirozenou *výšku*.

Zde je několik příkladů:

* `\halign **to 100pt**{...}`: nastaví `\halign` šířku tabulky na `100pt`
* `\valign **to 50pt**{...}`: nastaví `\valign` výšku tabulky na `30pt`
* `\halign **spread 30pt**{...}`: přičte 30pt k `\halign` přirozené šířce tabulky. Naopak zápis **spread -30pt** by zmenšil šířku tabulky o 30pt.
* `\valign **spread 20pt**{...}`: přičte 20pt k `\valign` přirozené výšce tabulky. Naopak zápis **spread -20pt** by zmenšil výšku tabulky o 20pt.

Následující kód znovu používá výše uvedené příklady tabulek, ale aplikuje $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ na `\valign` a `\halign` tabulku:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Těsně přiléhající okraje rámečků
\setlength{\fboxsep}{0pt}

Zde je tabulka \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

Zde je tabulka \verb|\halign|:
\fbox{
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytváří níže zobrazený výstup:

![](/files/d2ecbeb56daa8f3c6624ad22085ce8dd17339e2e)

—všimněte si však, jak je obsah obou tabulek „namačkán k sobě“. Důvodem je absence pružných mezer (lepidla), které by TeX mohl použít k roztažení obsahu, aby vyplnil dodatečný prostor poskytnutý **`na`** $$\langle$$**⁠`dimenze`⁠**$$\rangle$$. Zde přeskočíme dopředu a zmíníme `\tabskip` příkaz.

#### Úvodní seznámení s příkazem \tabskip

Estetika rozvržení tabulky může vyžadovat úpravu mezer mezi jejími řádky nebo sloupci, takže nepřekvapivě TeXové enginy poskytují příkaz nazvaný `\tabskip` který vám to umožňuje. `\tabskip` se používá k nastavení (a měnění) množství pružného prostoru („lepidla“), který TeX vkládá mezi sloupce `\halign` nebo mezi řádky `\valign`. Pozdější články prozkoumají `\tabskip` mnohem podrobněji.

Jako úvodní příklad následující kód používá nastavení pro `\tabskip` které způsobí, že TeX vloží mezi řádky `\valign` tabulky nějaký (velmi) pružný prostor. Tento pružný prostor umožňuje řádkům tabulky roztáhnout se a vyplnit dodatečný prostor vytvořený $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ pro **`na 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
Zde je tabulka \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}

Zde je tatáž tabulka \verb|\valign|, ale s \optspec{} „\texttt{to 50pt}“. Všimněte si, jak jsou řádky „namačkané“, protože mezi nimi není žádné dostupné „roztažitelné lepidlo“:

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

Použijeme tabulku \verb|\valign| s \optspec{} „\texttt{to 50pt}“, ale poskytneme „pružné mezery“ pomocí příkazu \verb|\tabskip|. Zde \verb|\tabskip| poskytuje dostatek „lepidla“, aby umožnil řádkům \verb|\valign| „se roztáhnout“ a vyplnit veškerý dostupný dodatečný prostor. Zde je „roztáhnutá“ tabulka \verb|\valign|:

\tabskip=0pt plus1fil % This sets \tabskip to a very flexible glue
\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}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/f4b1aacd20b1a985b3e75da8cc3d8f6ee440198e)

## Úvod do tabulky $$\langle$$⁠preambule⁠$$\rangle$$ a $$\langle$$⁠tělo⁠$$\rangle$$

Tato část poskytuje úvod do tabulky $$\langle$$⁠`preambuli`⁠$$\rangle$$, a *stručně* se krátce dotýká tabulky $$\langle$$⁠`tělo`⁠$$\rangle$$ která je následně [prozkoumána podrobněji](#bodydetails).

Pozdější články v této sérii prozkoumají $$\langle$$⁠`preambuli`⁠$$\rangle$$ a $$\langle$$⁠`tělo`⁠$$\rangle$$ podrobněji, zejména TeXovo použití a zpracování tabulky $$\langle$$⁠`preambuli`⁠$$\rangle$$.

Jak bylo uvedeno výše, nejobecnější formát `\halign` nebo `\valign` tabulek lze zapsat takto:

`\halign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambuli`⁠$$\rangle$$ $$\langle$$⁠`tělo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambuli`⁠$$\rangle$$ $$\langle$$⁠`tělo`⁠$$\rangle$$ }

### Ta $$\langle$$⁠preambule⁠$$\rangle$$

Ta $$\langle$$⁠`preambuli`⁠$$\rangle$$ část obsahuje jedinou $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ který je *ukončený* pomocí `\cr` příkazu; v důsledku toho lze $$\langle$$⁠`preambuli`⁠$$\rangle$$ přepsat jako:

$$\langle$$⁠`preambuli`⁠$$\rangle$$=$$\langle$$⁠`preambulový řádek`⁠$$\rangle$$**`\cr`**

### Ta $$\langle$$⁠tělo⁠$$\rangle$$

Podobně $$\langle$$⁠tělo⁠$$\rangle$$ část lze dále rozdělit na jeden nebo více jednotlivých „řádků“, ale zde jsou pro každý řádek dvě možnosti:

* řádek skládající se ze sady buněk, které tvoří `\halign` řádek nebo `\valign` sloupec; nebo
* a `\noalign` příkaz, který „vkládá“ materiál mezi `\halign`řádky nebo `\valign`sloupce.

Pro nynější účely budeme ignorovat `\noalign` příkaz (viz [později v článku](#noalign)) $$\langle$$⁠tělo⁠$$\rangle$$ jsou data pro sadu buněk a *ukončený* pomocí `\cr` příkaz.

Ignorujeme `\noalign`, $$\langle$$⁠`tělo`⁠$$\rangle$$ část, která představuje uživatelův obsah, obsahuje posloupnost řádků, z nichž každý budeme nazývat $$\langle$$⁠`řádkem těla`⁠$$\rangle$$ který je *ukončený* svým doprovodným `\cr` příkaz.

Ta $$\langle$$⁠`tělo`⁠$$\rangle$$ přepsat jako:

$$\langle$$⁠řádkem těla$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠řádkem těla$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Když to dáme dohromady, můžeme obecný formát `\halign` a `\valign` takto:

`\halign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠řádkem těla$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`volitelné specifikace`⁠$$\rangle$$ { $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠řádkem těla$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Z důvodů, které budou vysvětleny v pozdějších článcích, $$\langle$$⁠`preambuli`⁠$$\rangle$$, právě jeden $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$, má odlišný formát od všech řádků v tabulce $$\langle$$⁠`tělo`⁠$$\rangle$$. Také budeme [se vracet k `\noalign` příkaz](#noalign) který lze také použít v tabulce $$\langle$$⁠`tělo`⁠$$\rangle$$.

### Ta $$\langle$$⁠preambulový řádek⁠$$\rangle$$

Ta $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ hraje *zásadní* roli při sazbě tabulek, protože poskytuje jakýsi „plán“ používaný k sazbě obsahu —`\halign` řádky nebo `\valign` sloupce — obsažené v tabulce $$\langle$$⁠`tělo`⁠$$\rangle$$. Balíček $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ může také obsahovat buněčné „šablony“ používané k sestavení řádků `\halign` nebo sloupců `\valign`— téma, které bude podrobně prozkoumáno.

Účelem $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ je dvojí:

* určuje *maximum* počet buněk na řádek `\halign` nebo na sloupec `\valign`.
* ukládá *šablony buněk* které lze použít k automatizaci formátování nebo vkládání obsahu do buněk obsažených v tabulce $$\langle$$⁠`tělo`⁠$$\rangle$$. Šablony buněk jsou volitelné a mohou být „prázdné“, nebo můžete zahrnout znaky či příkazy, které TeX automaticky vloží před a/nebo za skutečný obsah konkrétních buněk ve vaší tabulce. Ušetří vás to únavného ručního psaní/vkládání těchto znaků nebo příkazů do každé buňky, na kterou je chcete použít.

**Poznámka**:  `\halign` řádek nebo `\valign` sloupec může obsahovat méně buněk, než je maximum určené $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ ale nemůže obsahovat více než toto maximum, jinak TeX vyvolá chybu. Pro nynější účely vynecháváme podrobnosti o *cyklických* preambulích.

Při pokračování v našich schématech struktury je $$\langle$$⁠`preambulový řádek`⁠$$\rangle$$ pro

* obrázkový `\halign` tabulka s maximálně $$\mathrm{K}$$ buněk na *řádku*, nebo
* a `\valign` tabulka s maximálně $$\mathrm{K}$$ buněk na *sloupec*

lze zapsat takto:

$$\langle$$⁠šablona$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠šablona$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠šablona$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠šablona$${}*\mathrm{K}$$⁠$$\rangle$$

kde `&` je *znak zarovnávacího tabulátoru* který označuje konec jedné buňky a začátek další. Tradičně se jako zarovnávací tabulátor používá znak ampersandu (`&`) se používá jako zarovnávací tabulátor, ale jakýkoli znak s [kategoriální kód](/latex/cs/dalsi-temata/43-table-of-tex-category-codes.md) 4 by mohl být použit místo něj.

Jen pro připomenutí,  $$\langle$$⁠`preambuli`⁠$$\rangle$$ lze zapsat $$\langle$$⁠`preambuli`⁠$$\rangle$$=$$\langle$$⁠`preambulový řádek`⁠$$\rangle$$**`\cr`**, nebo ekvivalentně

$$\langle$$⁠`preambuli`⁠$$\rangle$$=$$\langle$$⁠šablona$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠šablona$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠šablona$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠šablona$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Struktura každé buňky $$\langle$$⁠šablona⁠$$\rangle$$

Každá buňka $$\langle$$⁠šablona$${}\_i$$⁠$$\rangle$$ lze zapsat takto:

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

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ je sada znaků nebo příkazů (tokenů), které TeX automaticky vloží *dříve, než* uživatelem zadaný obsah buňky $$i$$;
* $$\texttt{#}$$ je zástupný symbol ukazující, kde se má v buňce objevit uživatelem zadaný obsah $$i$$. Opět platí, že `#` znak je jen *tradice*, jakýkoli znak s [kategoriální kód](/latex/cs/dalsi-temata/43-table-of-tex-category-codes.md) 6 by mohl být použit místo něj. Všimněte si, že kód kategorie 6 se používá pro parametry maker;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ je sada znaků nebo příkazů (tokenů), které TeX automaticky vloží *za* uživatelem zadaný obsah buňky $$i$$.

Všimněte si, že všechny $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ a $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ jste *volitelná*: nemusíte používat žádné znaky ani příkazy před obsahem buňky ani za ním.

**Dokončení** $$\langle$$**⁠preambule⁠**$$\rangle$$

Nakonec, s použitím výše uvedené notace, $$\langle$$⁠`preambuli`⁠$$\rangle$$ pro

* obrázkový `\halign` tabulka s maximálně $$\mathrm{K}$$ buněk na *řádku*, nebo
* a `\valign` tabulka s maximálně $$\mathrm{K}$$ buněk na *sloupec*

lze zapsat takto:

$$\langle$$⁠`preambuli`⁠$$\rangle$$=$$\langle$$⁠`preambulový řádek`⁠$$\rangle$$`**\cr**`

nebo

$$\langle$$⁠`preambuli`⁠$$\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**`

**Ta** $$\langle$$**⁠preambule⁠**$$\rangle$$ **a počítání řádků a sloupců**

Jeden **`\halign`** tabulka s $$\langle$$⁠`preambuli`⁠$$\rangle$$ udávající $$\mathrm{K}$$ buňky a $$\langle$$⁠`tělo`⁠$$\rangle$$ obsahující $$\mathrm{N}$$ $$\langle$$⁠`řádky těla`⁠$$\rangle$$ vytvoří tabulku s $$\mathrm{K}$$ *sloupci* a $$\mathrm{N}$$ *řádky*, jak ukazuje následující diagram:

![](/files/f99aa15a01967d630bed4c64531c9365f56d33b5)

Zkopírovaný **`\valign`** tabulka s $$\langle$$⁠`preambuli`⁠$$\rangle$$ udávající $$\mathrm{K}$$ buňky a $$\langle$$⁠`tělo`⁠$$\rangle$$ obsahující $$\mathrm{N}$$ $$\langle$$⁠`řádky těla`⁠$$\rangle$$ vytvoří tabulku s $$\mathrm{K}$$ *řádky* a $$\mathrm{N}$$ *sloupci*, jak ukazuje následující diagram:

![](/files/822cae7882e89770eda57ccec4bf2a2924205f70)

### Dost teorie, trochu příkladů!

Jak později uvidíme podrobněji, když TeX zpracovává obsah tabulky — buňky tabulky obsažené v [$$\langle$$⁠`tělo`⁠$$\rangle$$](#body)— kontroluje přítomnost šablon buněk, které byly definovány v $$\langle$$⁠`preambuli`⁠$$\rangle$$, protože TeX hledá jakékoli tokeny šablony, které se mají vložit před a/nebo za uživatelův obsah. Následující minimální příklady ukazují použití šablon buněk $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ v `\halign` a `\valign` tabulky.

#### Tabulka \halign používající šablony buněk

Následující příklad ukazuje `\halign` tabulku, která používá šablonu buňky k automatickému vložení uvozovek kolem obsahu první buňky v každém řádku: tedy šablonu, která ovlivňuje každou buňku v prvním sloupci:

```latex
\documentclass{article}
\usepackage{parskip} % Set \parindent to 0pt
% Zvolte vhodně malou velikost stránky
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Space out the \halign columns
\begin{document}
\pagestyle{empty}

Zde je tabulka \verb|\halign| \textit{bez} šablon buněk:

\halign{
% Nic před ani za každým '#' v <preambuli>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Zde je tatáž tabulka \verb|\halign|, ale s automaticky přidanými uvozovkami k první buňce v každém řádku; tedy ovlivňuje každou buňku v prvním sloupci:

\halign{
% Uvozovací šablony v preambuli:
``#''&#&#\cr % Uvozovky před a za prvním #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/aa878279a2e1babb56f26a5ebb4cf64c487ae914)

Následující grafika je okomentovanou verzí `\halign` tabulky vytvořené výše uvedeným příkladem; zde porovnáváme „formální“ strukturu tříbuněčné $$\langle$$⁠`preambuli`⁠$$\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**`

s faktickou $$\langle$$⁠`preambuli`⁠$$\rangle$$ pro ` ``#''&#&#**\cr** `, přičemž zvýrazňujeme přítomnost nebo nepřítomnost šablon buněk:

![](/files/6c88ee99da917f32dc0c3c6f9acb2d5455364a67)

#### Tabulka \valign používající šablony buněk

Následující příklad ukazuje `\valign` tabulku, která používá šablonu pro každou buňku k automatickému vložení číslic obklopujících uživatelův obsah.

```latex
\documentclass{article}
\usepackage{parskip} % Set \parindent to 0pt
% Zvolte vhodně malou velikost stránky
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Space out the \valign rows
\begin{document}
\pagestyle{empty}

Zde je tabulka \verb|\valign| \textit{bez} šablon buněk:

\begingroup
\hsize=25pt
\valign{
% Nic před ani za každým '#' v
% <preambuli>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Zde je tatáž tabulka \verb|\valign|, ale s použitím šablon buněk k automatickému vkládání číslic do každé buňky:

\begingroup
\hsize=25pt
\valign{
% Číslice vložené před a za každým '#' v
% <preambuli>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/9b53d358d5914c92fb39bcd53ebb8581b40e717e)

Následující grafika je okomentovanou verzí `\valign` tabulky vytvořené výše uvedeným příkladem; zde porovnáváme „formální“ strukturu tříbuněčné $$\langle$$⁠`preambuli`⁠$$\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**`

s faktickou $$\langle$$⁠`preambuli`⁠$$\rangle$$ pro `1#2&3#4&5#6**\cr**`, přičemž zvýrazňuje použití šablon buněk $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/0e2e1b412241869fc71c7e1d5ae88ca3a2247ad7)

Všimněte si, jak se šablona pro buňku $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) používá na $$i$$tou buňku v každém `\valign` sloupci, takže všechny buňky $$i$$téhož *řádku* jsou ovlivněny.

#### Stylování textu pomocí šablon buněk

Další příklad používá následující $$\langle$$⁠`preambuli`⁠$$\rangle$$ (šablony buněk) k úpravě stylu textu obsaženého v každém řádku nebo sloupci:

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

Pokud toto porovnáme $$\langle$$⁠`preambuli`⁠$$\rangle$$ s naší „formální“ strukturou tříbuněčné $$\langle$$⁠`preambuli`⁠$$\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**`

vidíme, že:

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

Všimněte si, jak tyto šablony buněk, jako například `\\textbf{#}` připomínají makra s jediným parametrem (obsahem buňky).

```latex
Tabulka \\verb|\\valign| s textem stylovaným pomocí šablon buněk:

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

Tabulka \\verb|\\halign| s textem stylovaným pomocí šablon buněk:

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

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/3e602c99c4acda7eba3fc25dc21c3dacec321034)

## Více podrobností o tabulce $$\langle$$⁠tělo⁠$$\rangle$$

V části [Úvod do tabulky $$\langle$$⁠`preambuli`⁠$$\rangle$$ a $$\langle$$⁠`tělo`⁠$$\rangle$$](#preamble) jsme viděli, jak, pokud dočasně ignorujeme `\noalign`, $$\langle$$⁠`tělo`⁠$$\rangle$$ z `\halign` nebo `\valign` tabulka se skládá z více řádků, z nichž každý je označen $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$, kde:

* každý $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ je ukončen `\cr` příkaz
* každý $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ z `\halign` je řádek tabulky
* každý $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ z `\valign` je sloupec tabulky

Posloupnost řádků, $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$, kde $$j=1\ldots\mathrm{N}$$, vytváří $$\mathrm{N}$$ řádky `\halign` nebo $$\mathrm{N}$$ sloupce `\valign`. Jak shrnuje následující diagram, obecná $$\langle$$⁠`preambuli`⁠$$\rangle$$ jako například

$$\langle$$⁠`preambuli`⁠$$\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**`

určuje šablony buněk pro maximálně $$\mathrm{K}$$ buněk v každém z $$\mathrm{N}$$ $$\langle$$⁠`řádkem těla`⁠$$\rangle$$ položek v $$\langle$$⁠`tělo`⁠$$\rangle$$:

![](/files/360849b06ad8aa94cd6803dbe2d5026934246583)

### Struktura každého $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$

Každý řádek $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ tabulky $$\langle$$⁠tělo⁠$$\rangle$$ obsahuje obsah až pro $$\mathrm{K}$$ buněk — jak určuje tabulka $$\langle$$⁠preambule⁠$$\rangle$$— a má obecný tvar:

$$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$=$$\langle$$Buňka$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$Buňka$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$Buňka$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$Buňka$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

kde:

* $$\langle$$Buňka$${}\_i$$⁠$$\rangle$$ představuje uživatelský obsah pro $$i$$n-tou buňku v nějaké $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$
* webových stránkách **`&`** znak se nazývá *zarovnávací tabulátor* (stejně jako se používá v $$\langle$$⁠preambule⁠$$\rangle$$) který signalizuje konec jedné buňky a začátek další. Opět platí, že použití **`&`** je pouze tradice (konvence), protože jakýkoli znak s [kategoriální kód](/latex/cs/dalsi-temata/43-table-of-tex-category-codes.md) 4 by mohl být použit místo něj.

Ačkoli každý $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ může obsahovat maximálně $$\mathrm{K}$$ buněk (určených $$\langle$$⁠preambule⁠$$\rangle$$) mohou obsahovat *méně* než $$\mathrm{K}$$ buněk a kterákoli $$\langle$$Buňka$${}\_i$$⁠$$\rangle$$ v $$\langle$$⁠řádkem těla$${}\_j$$⁠$$\rangle$$ může být prázdná.

Následující příklad ukazuje $$\langle$$⁠preambule⁠$$\rangle$$ pro `#&#&#&#&#\\cr` což poskytuje maximum 5 buněk na $$\langle$$řádek těla$$\rangle$$; nicméně sazba tabulek obsahuje řádky s méně než 5 buňkami:

```latex
Tabulka \\verb|\\valign| s 1 až 5 buňkami na \\textit{sloupec}:

\begingroup
% \\hsize řídí šířky sloupců \\valign (velikost sázených řádků).
\\hsize=40pt
\fbox{\valign{
% Použijte preambuli, která umožňuje 5 buněk na sloupec
% Většina sloupců neposkytuje obsah pro 5 buněk
#&#&#&#&#\\cr% 5 buněk na sloupec
\\(\\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

% Poznámka: z důvodů vysvětlených později
% \halign musí být vložen do \vbox
Tabulka \\verb|\\halign| s 1 až 5 buňkami na \\textit{řádek}:

\fbox{
\vbox{\halign{
% Použijte preambuli, která umožňuje 5 buněk na řádek
% Většina řádků neposkytuje obsah pro 5 buněk
#&#&#&#&#\\cr % 5 buněk na řádek
\\(\\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
}}}
```

[Otevřete tento příklad v Overleafu](/latex/cs/clanky-do-hloubky/15-how-do-tex-engines-typeset-tables-2.md)

Tento příklad vytvoří následující výstup:

![](/files/c295babfd6fbc366c77e25637aa0d2795b707f0f)

Následující `\halign` příklad ukazuje proměnlivý počet buněk na řádek a možnost, aby buňky byly prázdné — všimněte si, jak jsou prázdné buňky vytvářeny po sobě jdoucími **`&`** znaky v tabulce:

```latex
Tabulka \\verb|\\halign| s některými prázdnými buňkami—všimněte si, že v tabulce \\(?\\langle\\texttt{body}\\rangle\\): jsou po sobě jdoucí znaky \\texttt{\\&}:

\fbox{
\vbox{\halign{
% Použijte preambuli, která umožňuje 5 buněk na řádek
% Většina řádků neposkytuje obsah pro 5 buněk
#&#&#&#&#\\cr % 5 buněk na řádek
\\(\\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
}}}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/5176c2e05a8b9d2280f66e25d3de790b55ec6b50)

### Na sazbě tabulek není na znacích & a # nic zvláštního

Použití znaků `&` a `#` v sazbě `\halign`- nebo `\valign`-založených tabulek je tradice, která pochází z Knuthových původních makr plain TeXu. Je docela možné používat jiné znaky než `&` a `#` tím, že přiřadíte odpovídající kódy kategorií vámi zvoleným náhradám, jak ukazuje následující příklad:

* nahrazení `&` s `@` přiřazením `@` ke kódu kategorie 4
* nahrazení `#` s `|` přiřazením `|` ke kódu kategorie 6 (který se používá pro parametry maker)

Změny kategorií se udržují lokální pomocí `\begingroup` a `\endgroup`:

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

[Otevřete tento příklad v Overleafu](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)

## Znovuzavedení příkazu \\\noalign

Jádra TeXu poskytují vestavěný (primitivní) `\noalign` příkazu:

`\\noalign{`$$\langle$$⁠`tokeny`⁠$$\rangle$$`}`

kde $$\langle$$⁠`tokeny`⁠$$\rangle$$ jsou znaky a/nebo příkazy TeXu/LaTeXu. Příkaz `\noalign` je určen výhradně k použití v `\halign` nebo `\valign` tabulce: použití mimo ně vyvolá chybu.

Účelem `\noalign` je umožnit „vložení“ textu a příkazů TeXu/LaTeXu *mezi* řádky `\halign` tabulky nebo sloupce `\valign` tabulky. Nejčastější použití `\noalign` je vytváření čar tabulky:

* *vodorovných* čar mezi `\halign` řádky tabulky
* *svislých* čar mezi `\valign` sloupci tabulky

Všimněte si následujícího:

* webových stránkách `\noalign` příkazu je ***není ukončeno\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*příkazem***
* sada příkazů povolených v `\noalign{...}` závisí na tom, zda se používá v $$\langle$$⁠`tělo`⁠$$\rangle$$ z `\halign` nebo `\valign` tabulce (tj. ve vertikálním nebo horizontálním režimu).

Nyní můžeme říci, že tabulka $$\langle$$⁠`tělo`⁠$$\rangle$$ pro `\halign` nebo `\valign` se může skládat z jednotlivých řádků $$\langle$$⁠řádkem těla$${}\_i$$⁠$$\rangle$$`\cr` prokládaných `\noalign` příkazy; jednou z mnoha možností/kombinací může být:

`\\noalign{`$$\langle$$⁠`tokeny`⁠$$\rangle$$`}` $$\langle$$⁠řádkem těla$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠řádkem těla$${}\_2$$⁠$$\rangle$$\cr `\\noalign{`$$\langle$$⁠`více tokenů`⁠$$\rangle$$`}` $$\langle$$⁠řádkem těla$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠řádkem těla$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\\noalign{`$$\langle$$⁠`jiné tokeny`⁠$$\rangle$$`}`

### Příklad použití \\\noalign

Na další případy použití se podíváme později v této sérii článků, ale zde je základní příklad ukazující vytváření čar tabulky pomocí `\noalign`:

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

Použití \\verb|\\noalign| k vložení vodorovných čar mezi řádky tabulky \\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}
}

Použití \\verb|\\noalign| k vložení svislých čar mezi sloupce tabulky \\verb|\\valign|:
\vspace{6pt}

\\begingroup % ponechte změny \\parindent a \\hsize lokální
\\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
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/57804323ec310a0619eb34d8c98c589fb4fcdc27)

## Znovu k \\\tabskip

Podíváme se blíže na `\tabskip` příkaz, navazující na [úvod v předchozí části](#tabskip).

Ta `\tabskip` příkaz nastavuje hodnotu zvláštní formy „rozestupu“ (lepidla) používané *výhradně* při sazbě tabulek: jeho účelem je poskytovat rozestup mezi řádky nebo sloupci tabulky:

* pro `\halign` tabulky: `\tabskip` lepidlo se vkládá před a za tabulku (tj. vlevo a vpravo) a mezi sloupce tabulky
* pro `\valign` tabulky: `\tabskip` lepidlo se vkládá před a za tabulku (tj. nahoře a dole) a mezi řádky tabulky

Hodnota `\tabskip` může být nastavena pomocí LaTeXu `\setlength` příkazu:

`\\setlength{\\tabskip}{`$$\langle$$⁠`hodnota lepidla`⁠$$\rangle$$`}`

kde $$\langle$$⁠`hodnota lepidla`⁠$$\rangle$$ může být:

* pevná délka, například `5pt`, `3mm`, nebo
* konečné pružné lepidlo, například `3pt plus 2pt minus 1pt`, nebo
* nekonečně pružné lepidlo, například `0pt plus1fill`.

Můžete také přímo nastavit `\tabskip` (obejitím `\setlength`) zápisem

`\tabskip`=$$\langle$$⁠`hodnota lepidla`⁠$$\rangle$$

Jakákoli změna hodnoty `\tabskip` lepidla ovlivní rozestupy tabulky pouze tehdy, když je tato změna:

* provedena *dříve, než* webových stránkách `\halign` nebo `\valign` příkaz ke zpracování, nebo
* provedena uvnitř tabulky $$\langle$$⁠`preambuli`⁠$$\rangle$$

Pokusy nastavit `\tabskip` hodnoty uvnitř obsahu tabulky (buňky v tabulce $$\langle$$⁠`tělo`⁠$$\rangle$$) *neznamená* nezmění rozestupy `\halign` sloupců tabulky ani `\valign` řádků tabulky. Důvod tohoto chování `\tabskip` lze vysledovat k roli, kterou hraje $$\langle$$⁠`preambuli`⁠$$\rangle$$ při sazbě tabulek — procesům, které později prozkoumáme poněkud podrobněji.

### Co je vidět, tomu se věří

Abychom pomohli vizualizovat přítomnost různých typů rozestupů/lepidel používaných při sazbě tabulek, zejména

* `\tabskip` glue
* `\baselineskip` glue
* ruční kerning (`\kern`)

Overleaf připravil projekt založený na LuaTeXu k obarvení komponent tabulky. LuaTeX byl zvolen, protože umožňuje nízkoúrovňové opětovné zpracování interních dat/struktur vysázených tabulek, ale zde se těmito detaily nebudeme zabývat.

Zde je několik příkladů ukazujících různé aplikace `\tabskip`. U každého příkladu ukážeme skutečný výstup a barevnou verzi vytvořenou LuaTeXem.

### příklad \tabskip 1

Podívejme se na použití `\tabskip` v `\halign` a `\valign` tabulky. Ukážeme skutečně vysázené tabulky s rámečkem pro vizualizaci jejich velikosti a rozestupů spolu s anotovanými grafikami obsahujícími barevné verze, které jasně ukazují velikost různých lepidel/rozestupů v každé tabulce.

Nejprve, `\halign`:

```latex
% Abychom vizualizovali rozsah tabulky, umístíme kolem ní rámeček
\\setlength{\\fboxsep}{0pt} % Použijte těsně přiléhající rámečky

% Zde nastavujeme \\tabskip „přímo“
\\tabskip5pt % Nastavte počáteční hodnotu \\tabskip mimo tabulku

% Aby bylo možné dát kolem tabulky rámeček, musí být uložena do boxu TeXu.
% \\halign musí být umístěn do \\vbox, protože \\halign musí být
% zpracován ve „vertikálním režimu“: \\hbox nebude fungovat, protože
% ten je zpracováván v „horizontálním režimu“

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

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/b125e8b9a7d0198a57fe3f9a74856790b3fd481b)

Následující grafika je větší, barevná a anotovaná verze tabulky vytvořené v předchozím příkladu:

![](/files/33bf747e2ca377db9dda0b54a3daeb7a27523e2c)

Existují 4 výskyty `\tabskip` příkazu, každý z nich odpovídá určitému umístění rozestupu v tabulce:

1. `\\tabskip5pt` se používá mimo tabulku a nastavuje `\tabskip` hodnotu použitou před (vlevo od) první buňky v každém řádku.
2. `\\tabskip10pt` je nastaven v první šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor mezi $$\langle$$Buňka$${}\_1$$⁠$$\rangle$$ a $$\langle$$Buňka$${}\_2$$⁠$$\rangle$$ každého řádku.
3. `\\tabskip15pt` je nastaven v druhé šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor mezi $$\langle$$Buňka$${}\_2$$⁠$$\rangle$$ a $$\langle$$Buňka$${}\_3$$⁠$$\rangle$$ každého řádku.
4. `\\tabskip20pt` je nastaven ve třetí a poslední šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor přidaný po $$\langle$$Buňka$${}\_3$$⁠$$\rangle$$, poslední buňce každého řádku.

Dále, `\valign`

```latex
\\setlength{\\fboxsep}{0pt} % Použijte těsně přiléhající rámečky
\\tabskip5pt % Nastavte počáteční hodnotu \\tabskip mimo tabulku

% Ponechte změny \\hsize lokální (ve skupině)
\begingroup
% \\hsize určuje šířky sloupců \\valign
\\setlength{\\hsize}{50pt}
% Protože \\valign lze umístit do \\vbox nebo \\hbox, můžeme použít
% \\fbox přímo
\fbox{\valign{
\\tabskip10pt#&
\\tabskip15pt#&
\\tabskip20pt#\\cr
A&B&C\cr
E&E&F\\cr
G&H&I\cr
}}
\endgroup
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

![](/files/26d88247a0d094f719bf4b93f727e3446134b31f)

Opět platí, že následující grafika je větší, barevná a anotovaná verze tabulky vytvořené v předchozím příkladu:

![](/files/6fed754c2b776534f4e165f0a4d1042e70ba0988)

Stejně jako u `\halign` příkladu, existují 4 výskyty `\tabskip` příkazu. Nicméně u `\valign` tabulky je `\tabskip` vkládáno mezi řádky tabulky:

1. `\\tabskip5pt` se používá mimo tabulku a nastavuje `\tabskip` hodnota použitá před (nad) první buňkou v každém sloupci.
2. `\\tabskip10pt` je nastaven v první šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor mezi $$\langle$$Buňka$${}\_1$$⁠$$\rangle$$ a $$\langle$$Buňka$${}\_2$$⁠$$\rangle$$ každého sloupce.
3. `\\tabskip15pt` je nastaven v druhé šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor mezi $$\langle$$Buňka$${}\_2$$⁠$$\rangle$$ a $$\langle$$Buňka$${}\_3$$⁠$$\rangle$$ každého sloupce.
4. `\\tabskip20pt` je nastaven ve třetí a poslední šabloně buňky $$\langle$$⁠`preambuli`⁠$$\rangle$$ což ovlivňuje prostor přidaný po $$\langle$$Buňka$${}\_3$$⁠$$\rangle$$, poslední buňce každého sloupce.

**Shrnutí/závěry**

* V `\halign` tabulky je `\tabskip` je lepidlo umístěno vlevo a vpravo od každé buňky v řádku, čímž se rozestupují sloupce tabulky.
* V `\valign` tabulky je `\tabskip` lepidlo je umístěno nad a pod každou buňkou ve sloupci, čímž se rozestupují řádky tabulky.

### \\\tabskip a \\\noalign

#### Použití \\\halign

Následující `\halign` příklad používá `\tabskip` lepidla a také ukazuje `\noalign` příkaz, který jej používá k umístění odstupných čar nad a pod řádky `\halign` tabulky. Tyto čáry jsou sazeny pomocí `\hrule` (primitivního) příkazu spolu s prostorem vytvořeným `\kern`:

```latex
\\setlength{\\tabskip}{5pt} % Nastavte \\tabskip mimo tabulku

\halign{
#&#&#&#&#\\cr % Preambule
\\noalign{\\hrule\\kern2pt} % Odstupná čára před řádkem 1
1&2&3&4&5\\cr % Řádek 1
\\noalign{\\kern2pt\\hrule\\kern2pt} % Odstupná čára mezi řádky 1/2
6&7&8&9&10\\cr % Řádek 2
\\noalign{\\kern2pt\\hrule\\kern2pt} % Odstupná čára mezi řádky 2/3
11&12&13&14&15\\cr % Řádek 3
16&17&18&19&20\\cr % Řádek 4---žádné čáry mezi řádky 3/4
\\noalign{\\kern2pt\\hrule} % Odstupná čára na konci tabulky
}
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytváří tabulku zobrazenou níže, která byla dále anotována, aby reprodukovala kód (La)TeXu a čísla (1) až (4) pro očíslování `\noalign` příkazů obsahujících čáry a kerny, spolu s jejich odpovídajícím vysázeným výstupem:

![](/files/3e775f10d8f3a302f5c3d703130fd295d5a17597)

Následující grafika ukazuje barevnou verzi tabulky s popisky zobrazujícími různé rozestupy/lepidla v tabulce:

![](/files/f9c336ff3bc4e11c6db2a02c1b51c43c9dfcd53d)

Všimněte si následujícího:

* použití `\noalign` k vložení čar mezi určité řádky a ruční použití `\kern` hodnot k vložení určitého prostoru před/za čarami. Jádra TeXu nevkládají `\baselineskip` lepidlo po vysázené čáře, proto je prostor vložen ručně pomocí `\kern` (lze použít jiné příkazy pro rozestupy);
* `\baselineskip` lepidlo bylo automaticky vloženo mezi řádky 3 a 4.

#### Použití \\\valign

Následující `\valign` příklad používá stejná data jako předchozí `\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
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytváří tabulku zobrazenou níže, která byla dále anotována, aby reprodukovala kód (La)TeXu a čísla (1) až (4) pro očíslování `\noalign` příkazů obsahujících čáry a kerny, spolu s jejich odpovídajícím vysázeným výstupem:

![](/files/b83748bdf0fa4e96538f200a8faaefff21413923)

![](/files/4480cbfd5d336c5e69551387138cac2026a69f64)

### Tabulka \\\valign s řádky textu

Následující příklad

```latex
\\setlength{\\tabskip}{5pt}
\\begingroup % Ponechte změny \\parindent a \\hsize lokální
\setlength{\parindent}{10pt}
\\setlength{\\hsize}{75pt}
\valign{
#&#&#\cr
\\noalign{\\vrule\\kern5pt}
\\TeX{} dokáže sázet velmi složité
tabulky.&Zde je trochu dalšího
textu.&A nakonec ještě jeden dodatečný řádek
v tomto sloupci.\\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
```

[Otevřete tento příklad v Overleafu](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)

Tento příklad vytvoří následující výstup:

## Nastavení šířek řádků a výšek sloupců

## Více o tabulce $$\langle$$⁠preambule⁠$$\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/cs/clanky-do-hloubky/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.
