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

# Jak TeX enginy sází tabulky

## Jak TeXové enginy sázejí tabulky

## Úvod: Co tato série pokrývá?

Vytváření esteticky působivých tabulek může být časově náročný úkol — ať už používáte vizuální sazební nástroj, LaTeX nebo značkovací jazyk, jako je HTML či markdown. Zvláště pro uživatele LaTeXu patří sazba tabulek na přední místa mnoha lidí v seznamu „bolavých míst“, což snad dokládá i to, že „tables“ je jedno z nej [častěji označovaných témat na tex.stackexchange](https://tex.stackexchange.com/tags).

Kromě odpovědí a příkladů na tex.stackexchange odhalí i zběžný průzkum podpory pro sazbu tabulek v LaTeXu řadu zdrojů informací týkajících se tabulek:

* stránky nápovědy Overleafu [stránky nápovědy](https://www.overleaf.com/learn/latex/tables) a další weby, jako například [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, Comprehensive TeX Network, uvádí více než [70 balíčků TeX/LaTeX](https://ctan.org/topic/table) souvisejících s vytvářením tabulek
* celou [knihu o sazbě tabulek pomocí LaTeXu](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* vynikající [online generátor tabulek v LaTeXu](https://www.tablesgenerator.com/latex_tables)

Jednoduché vyhledávání na Googlu pro [LaTeX tables](https://www.google.com/search?q=latex+tables) vrátí obrovské množství výsledků a uvádí mnoho webů nabízejících pomoc, rady, příklady a vysvětlení.

### TeX, nikoli LaTeX

Vzhledem k množství literatury dostupné o sazbě tabulek pomocí LaTeXu je vůbec ještě co psát — další příklady tabulek a výčet/demonstrace příkazů balíčků? Existuje způsob, jak k tématu sazby tabulek přistoupit tak, aby vyzdvihl nebo zdůraznil základní principy a koncepty sazby tabulek? Existuje, ale vyžaduje to sloupnout cibuli LaTeXu…

Rozhodli jsme se vytvořit sérii článků, která se snaží poskytnout čtenářům základní informace a vysvětlení podkladových *mechanik* sazby tabulek založené na TeXu. Místo soustředění se na sazbu tabulek pomocí konkrétních maker/balíčků LaTeXu prozkoumáme *základní chování* TeXových enginů: prozkoumáme nízkoúrovňové sazečské mechanismy, které poskytují základy, na nichž jsou postaveny makropříkazy LaTeXu. Konečným cílem je vytáhnout na světlo a vysvětlit základní metody a algoritmy sazby tabulek založené na TeXu — snad to pomůže čtenářům/uživatelům lépe pochopit, proč se tabulky chovají tak, jak se chovají. Nevyhnutelným důsledkem tohoto přístupu, tedy odstraňování ochranných vrstev makroizolace LaTeXu, je odhalení nehezkých nízkoúrovňových detailů, před nimiž jsou uživatelé obvykle (a s potěšením) ukrytí pod vrstvami makrokódu LaTeXu.

Příprava, napsání a ilustrace těchto článků zabraly spoustu času, takže je naším přáním, aby byly užitečným příspěvkem k literatuře a poskytly materiál, který čtenáře poučí a pomůže jim lépe porozumět této složité oblasti sazby v TeXu. Měli bychom zdůraznit, že tato série článků bude *ne* zabíhat i do diskuse o *estetice* návrhu tabulek — to je téma plné subjektivních preferencí a jehož argumenty je třeba vést jinde…

### Zkoumání mechaniky tabulek v TeXu: Jak to lze udělat?

Abychom mohli zkoumat a poté psát o nižší úrovni mechanismů a procesů probíhajících uvnitř TeXových enginů, jako je sazba tabulek, sestavil Overleaf (zkompiloval) „ladicí“ verze Knuthova TeXového enginu pomocí procesu Web2W od Martina Ruckerta, [procesu Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Tradičně se TeX sestavuje pomocí procesu zvaného Web2C, používaného v rámci TeX Live, který generuje C kód převodem původního Pascalového zdrojového kódu TeXu do jeho ekvivalentu v C. Tento proces generuje C kód, který nebyl nikdy určen k tomu, aby jej četli lidé, ale pouze překladače C. Mechanicky generovaný C kód je *mimořádně* obtížně čitelný nebo upravitelný pro účely experimentování.

Naproti tomu Web2W produkuje zdrojový kód C (dostupný [zde](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) který je *řádově* čitelnější než kód vytvořený Web2C. Zdrojový kód C z Web2W je proto mnohem vhodnější k úpravám pro účely učení/experimentování.

Web2W produkuje verzi TeXu („CTeX“), která je *mimořádně* blízká Knuthovu původnímu programu: „CTeX“ neobsahuje mnoho změn a vylepšení zavedených procesem Web2C — například SyncTeX, zpracování z příkazové řádky a vyhledávání souborů pomocí Kpathsea. Přestože se těchto užitečných vylepšení vzdáváte, výsledný C kód (z Web2W) je relativně snadno prozkoumatelný pomocí publikovaného TeXového zdrojového kódu od Knutha, i když je TeX napsán v Pascalu.

* **Poznámka k názvům:** Přísně vzato, název „TeX“ se musí vztahovat pouze na původní software napsaný a publikovaný Donaldem Knuthem. Jakékoli úpravy jeho softwaru musí pro výsledný TeXový sazební software používat jiný název. Zde jsme použili proces Web2W k sestavení enginu, který je ve skutečnosti stále Knuthovým původním softwarem. Nicméně pro vyloučení pochybností budeme termínem „CTeX“ označovat konkrétní verzi sestavenou pomocí Web2W, ale budeme také používat „TeX“ jako označení buď Knuthova původního enginu, nebo obecného pojmu pro sazební jazyk založený na principech Knuthova TeXu. Doufáme, že čtenáři prominou občasné odchylky od přísné aplikace/používání zcela správné terminologie: doufáme, že význam/záměr je z kontextu zřejmý.

Ladicí verze CTeXu byla spuštěna pomocí [Eclipse IDE](https://www.eclipse.org/downloads/packages/)a umožnila sledovat zpracování C kódu v reálném čase, který implementuje nízkoúrovňové primitivní (vestavěné) příkazy TeXu a algoritmy navržené Knuthem pro podporu sazby tabulek.

Následující krátké (cca 90sekundové) video ukazuje běh enginu CTeX uvnitř [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

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

Kromě CTeXu jsme také zkompilovali e-TeX, abychom získali přístup k několika dalším primitivům, která v Knuthově původním softwaru nejsou. Ačkoli jsou CTeX a e-TeX už dnes staré TeXové enginy, stále jsou vhodné jako základ pro zkoumání mechaniky sazby tabulek, protože tyto podkladové principy stále platí pro všechny TeXové sazební enginy.

### Proč používat starší TeXový engine k prozkoumávání tabulek?

Zaprvé, tištěná kniha, [TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), která uvádí a vysvětluje TeXový zdrojový kód, je i po více než 30 letech od vydání (1986) stále nesmírně užitečným průvodcem mlhavými vodami vnitřního fungování TeXu. Samozřejmě si můžete dokumentaci zdrojového kódu TeXu vysázet sami, například viz projekt Overleaf [Vysázejte dokumentaci zdrojového kódu pro TeX, e-TeX nebo pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Od vydání knihy TeX: The Program v roce 1986 se vyvinuly nové TeXové enginy, včetně pdfTeXu, XeTeXu a LuaTeXu, které všechny přinášejí funkce a příkazy, jež nejsou v knize TeX: The Program zdokumentovány, jednoduše proto, že v Knuthově původním softwaru neexistovaly.

Pro mnoho klíčových procesů, jako je sazba tabulek v TeXu, je kód dokumentovaný v knize TeX: The Program stále relevantní jako základ pro studium — i když je zdrojový kód TeXu napsán v Pascalu. Navíc se Knuthův TeX dá poměrně snadno a rychle zkompilovat — zejména díky nesmírně užitečnému [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) procesu vyvinutému Martinem Ruckertem. Snadnost/rychlost kompilace mnohem usnadňuje upravovat TeX jednoduchými způsoby — například při vytváření grafiky SVG použité později v této sérii článků.

### Pochopení rozdílu mezi TeXem a LaTeXem

Mnoho čtenářů už bude vědět, že LaTeX ve skutečnosti není *spustitelný* sazební program, ale rozsáhlá sbírka příkazů (*makra*) které jsou nakonec napsány v nízkoúrovňovém sazečském/programovacím jazyce zvaném TeX. Váš kód LaTeXu vytvoří vysázený výstup teprve poté, co je zpracován spustitelným programem zvaným *TeXový engine*—software, který stojí mezi vaším kódem LaTeXu (dokumentem) a vysázeným PDF. Dnes si uživatelé mohou pro sazbu svého kódu LaTeXu vybírat z různých TeXových enginů, včetně pdfTeXu, XeTeXu a variant LuaTeXu.

Ti, kteří jsou v ekosystému TeX/LaTeX noví, bývají, a oprávněně, zmatení množstvím krypticky znějících názvů používaných pro nástroje, na které narazí: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX a LuaLaTeX. Pokud se cítíte stejně, pomoc je po ruce v článku Overleafu [Co se skrývá v názvu: Průvodce mnoha podobami TeXu](/latex/cs/clanky-do-hloubky/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) který vysvětluje původ a význam všech těchto pojmů.

#### Dialekty a primitiva TeXu

Každý TeXový engine má sadu vestavěných příkazů nazývaných *primitivy* které jako celek tvoří „dialekt“ daného enginu v sazečském jazyce TeX a odrážejí schopnosti zabudované do každého enginu. Zde termín „primitivum“ používaný pro vestavěné příkazy TeXových enginů ne *ne* znamená, že jsou tyto příkazy základní nebo jednoduché, ale že jsou fundamentální a nedělitelné: nejsou sestaveny z jiných příkazů (na rozdíl od maker). Všechny TeXové enginy sdílejí velkou společnou sadu primitiv, ale některé obsahují i primitiva specifická pro daný engine — což vede k pojmu „dialekt“ TeXu.

Bez ohledu na to, který TeXový engine se použije k sazbě vašeho dokumentu v LaTeXu, jeho úkolem je zpracovat („vykonat“) soubor příkazů LaTeXu (tj. maker), z nichž je váš dokument napsán a sestaven. Ve skutečnosti TeXový engine „převádí“ váš kód LaTeXu (makra) *zpět na* jejich jednotlivé primitivní příkazy TeXového enginu, které může engine vykonat, aby provedl vlastní sazbu. Nemusíte *musíte* k používání příkazů LaTeXu pro sazbu dokumentů pomocí TeXových enginů — *můžete* se rozhodnout sestavit své dokumenty zcela pomocí TeXových primitiv, tj. přímo ve spodně úrovňovém *programovacím jazyce TeX* vestavěném v TeXových enginech. Podle dnešních měřítek je však jazyk TeX poměrně archaický a obecně je považován za obtížný jazyk pro programování — k dosažení sazebního cíle může navíc vyžadovat velké množství vestavěných primitiv, což z něj dělá náchylný k chybám a potenciálně repetitivní programátorský úkol.

Abyste nemuseli psát přímo v jazyce TeX nebo neustále přepisovat stejnou sérii příkazů, umožňují TeXové enginy vytvářet „zkratky“ nazývané *makra*. Vytvářením maker definujete vlastní příkazy, které zabalí potenciálně dlouhé a složité sekvence primitiv jazyka TeX (nebo jiných maker) do jediného „vyššího“ příkazu. Programátoři TeXu mohou psát velmi sofistikovaná makra, která v jediném příkazu zapouzdřují značnou funkcionalitu — například příkazy poskytované LaTeXem. Používáním makropaket, jako je LaTeX (nebo [ConTeXt](https://wiki.contextgarden.net/Main_Page)), jsou autoři dokumentů (většinou) ušetřeni mnoha úmorných detailů, takže se mohou soustředit na psaní a sazbu místo neustálého zápasení se složitostí a nuancemi jazyka TeX.

## Na začátku...

Spolu s návrhem algoritmů pro sazbu matematiky a sofistikovaného dělení řádků čelil Knuth výzvě naprogramovat svůj software TeX tak, aby sázel tabulky. Zjevně musí být jakýkoli algoritmus či algoritmy pro konstrukci tabulek dostatečně málo omezující, protože jinak by frustrovaly uživatele, kteří potřebují svobodu vytvářet téměř nekonečnou škálu rozvržení tabulek. Kromě toho mohou buňky tabulek obsahovat širokou škálu obsahu včetně matematiky, grafiky a úseků textu rozdělených do pěkně vysázených řádků — vlastně cokoli, co je TeX schopen sázet. Poskytnout tuto flexibilitu vyžaduje, aby algoritmy pro stavbu tabulek v TeXu pracovaly ruku v ruce s dalšími částmi sazebního mechanismu TeXu.

TeXové enginy však za flexibilitu poskytovanou svými možnostmi konstrukce tabulek vybírají daň: četné jemnosti a nuance v nízkoúrovňovém chování vestavěných (primitivních) příkazů pro sazbu tabulek, kterých je 9:

* **`\halign`**, **`\valign`**: základní příkazy pro stavbu tabulek
* **`\tabskip`**: pružná mezera vložená mezi sloupce \halign nebo řádky \valign
* **`\cr`**: povinný ukončovací znak „carriage return“ pro všechny řádky v tabulce
* **`\noalign`**: vkládá materiál mezi řádky \halign nebo sloupce \valign
* **`\everycr`**: příkazy (tokenový registr) ke čtení po detekci \cr
* **`\span`**: příkaz se dvěma funkcemi: \span vytváří buňky přesahující přes sloupce nebo řádky, nebo rozšiřuje příkazy v předloze tabulky (tomu se budeme věnovat podrobně)
* **`\omit`**: přeskočí šablony pro konkrétní buňku
* **`\crcr`**: používá se v makrech, aby se předešlo chybám, pokud uživatelé zapomenou na požadovaný \cr

S těmito příkazy se setkáme na naší cestě stavbou tabulek.

### Vzdálené ozvěny výzev

Pohřbeno v [zdrojovém kódu TeXu](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) je poněkud zastrašující úvod do tématu implementace nízkoúrovňových příkazů \halign a \valign určených pro sazbu tabulek:

> „Je to vlastně takový zázrak pokaždé, když \halign a \valign fungují, protože zasahují do tolika řídicích struktur TeXu. Proto tato stránka pravděpodobně není to nejlepší místo, kde by začátečník měl začínat číst tento program; je lepší nejprve zvládnout všechno ostatní.“

Knuth dále říká

> „Všimněte si, že jak je \halign zpracováván, bez obav předáváme řízení zbytku TeXu. V kritických okamžicích je vyvolána zarovnávací rutina, aby zasáhla a provedla nějakou drobnou akci, ale většinu času tyto rutiny jen číhají v pozadí. Je to něco jako posthypnotický návrh.“

Z těchto poznámek se zdá rozumné usoudit, že i pro Knutha byla implementace sazby tabulek v TeXu „něčím jako výzvou“ — zajistit uživateli kontrolu a flexibilitu a zároveň, aby automatizované algoritmy stavby tabulek v TeXu byly dobře sladěny s jeho základními sazečskými procesy.

Autor ochotně dosvědčuje složitost kódu a algoritmů stojících za možnostmi sazby tabulek v TeXu, ale také obdiv k obrovskému množství funkcionality obsaženému v relativně malém množství, byť hutného, Pascalu (nebo C) kódu.


---

# 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/14-how-do-tex-engines-typeset-tables.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
