> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# TeXové tabulky: Jak TeX vypočítává šířky sloupců přes více sloupců

## Cílem tohoto článku

V tomto článku zkoumáme, jak $$\mathrm\TeX$$ počítá šířky sloupců tabulky, když tabulky obsahují položky (např. nadpisy tabulek), které zasahují přes více sloupců (např. pomocí $$\mathrm\TeX$$ primitivy `\omit` a `\span`). S využitím základní [„referenční“ tabulky](#reference-table) jako výchozího bodu vytváříme řadu příkladů — odvozených z této referenční tabulky — úpravou různých položek tak, aby vznikly sloupce přes více buněk. Zkoumáním dopadu těchto úprav můžeme začít chápat základní algoritmus, který $$\mathrm\TeX$$ používá k výpočtu šířky sloupců přes více buněk.

### Pomocí $$\mathrm\TeX$$ ne $$\mathrm\LaTeX$$

K prozkoumání a vysvětlení *jak* $$\mathrm\TeX$$ určuje šířky sloupců přes více buněk, je nutné obejít se bez všech těch úžasných $$\mathrm\LaTeX$$ balíčků pro sazbu tabulek a vrátit se k základním, nízkoúrovňovým (primitivním) příkazům pro vytváření tabulek: konkrétně `\halign{...}`, `\span` a `\omit`. [Stávající $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ balíčky pro sazbu tabulek](https://ctan.org/topic/table) jsou samozřejmě nezbytnými nástroji pro zvýšení produktivity a nabízejí množství mimořádně užitečných funkcí, které uživatelům umožňují rychle vytvářet širokou škálu tabulek pomocí $$\mathrm\LaTeX$$. Tyto balíčky poskytují nezbytné „makro lešení“ vystavěné kolem $$\mathrm\TeX$$nízkoúrovňového chování a jejich vývojáři poskytují velmi vítané abstrakce a vrstvy izolace, které se starají o základní složitosti. Mnohé z těchto balíčků jsou skutečně neuvěřitelné výkony složitého $$\mathrm\TeX$$ programování: všichni bychom měli být vděční, že existují, aby nás chránily před nutností používat syrové $$\mathrm\TeX$$!

Skutečný algoritmus, který $$\mathrm\TeX$$ používá k výpočtu šířky sloupců přes více buněk, je vysvětlen na straně 245 [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) a s dalšími podrobnostmi v oddíle 801 (strana 336) tištěné knihy obsahující $$\mathrm\TeX$$zdrojový kód [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Avšak pro mnoho lidí (včetně mě) jsou Knuthova vysvětlení občas poněkud stručná a výstižná a někdy je obtížné je podrobně sledovat: ilustrované příklady jsou vždy velmi užitečné.

### Ano, tabulky jsou složité

V oddíle 768 (strana 322) knihy [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), Knuth uvádí zajímavou poznámku:

> „Je to tak trochu zázrak, kdykoli `\halign` a `\valign` fungují, protože zasahují do tolika řídicích struktur $$\mathrm\TeX$$.“

Kromě toho svazek IV čtyřsvazkové knižní série [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) věnuje ne méně než 180 stran (s. 199–379) vytváření tabulek v $$\mathrm\TeX$$ prostřednictvím `\halign` a `\valign`.

Je tedy bezpečné poznamenat, že $$\mathrm\TeX$$ tabulky jsou skutečně „poměrně záludné“.

### Sloupce přes více buněk: \omit, \span a \multispan

Jak bylo uvedeno, pro zkoumání $$\mathrm\TeX$$výpočtů šířek sloupců musíme používat „syrové“ $$\mathrm\TeX$$; to znamená kombinaci primitivních příkazů a jednoho $$\text{Plain }\mathrm\TeX$$ makra nazvaného `\multispan`. Ačkoli tyto příkazy nebudeme používat k přímé ilustraci našich ukázkových tabulek (tj. k plnému vysvětlení veškerého $$\mathrm\TeX$$ kódu), stojí za to připojit krátkou poznámku, která je vysvětlí:

* `\halign`: Jeden ze dvou $$\mathrm\TeX$$ primitivních příkazů pro vytváření tabulek. Tím druhým je `\valign` , ale ten se nepoužívá tak často a v tomto článku se jím nebudeme zabývat.
* `\omit`: $$\mathrm\TeX$$ primitiv (příkaz), který instruuje $$\mathrm\TeX$$ aby ignoroval předlohu položky tabulky.
* `\span`: $$\mathrm\TeX$$ primitivní příkaz používaný ke spojení dvou sousedních položek tabulky.
* `\multispan{n}`: Prosté $$\mathrm\TeX$$ makro pro přesah `n` sloupců.

V podstatě při přesahu sloupců $$\mathrm\TeX$$ ignoruje příslušný počet předloh tabulky a sloučí požadovaný počet položek tabulky do jediné položky. `\multispan{n}` funguje tak, že se rozvine do sekvence `\omit` a `\span` tokenů potřebných k přesahu `n` sloupců. Například `\multispan{3}` se rozvine na `\omit\span\omit\span\omit`.

## Úvod do naší „referenční“ tabulky

Zde je naše referenční tabulka, následovaná anotovanou verzí, která vysvětluje prvky použité při její konstrukci:

![{{{alt}}}](/files/722a8a593bbe3f884322900f329c7d740280ad90)

Úpravami naší referenční tabulky budeme pozorovat, co se stane s šířkou tabulky a šířkou jednotlivých sloupců, jak přidáváme položky, které zasahují přes různé sloupce. Tato referenční tabulka byla vytvořena v syrovém $$\mathrm\TeX$$ s použitím `\halign{...}` primitivu spolu s řadou vlastních maker potřebných k sazbě tabulek — o těchto makrech nebudeme diskutovat, protože nejsou nezbytná pro pochopení příkladů a vysvětlení.

Zde je anotovaná verze naší referenční tabulky, která vysvětluje její vlastnosti:

![{{{alt}}}](/files/688cd1b976e6f560ef8e5cd531cc9a0061dbe04b)

Naše první sada ukázkových tabulek i počáteční referenční tabulka mají všechny nastaveno `\tabskip=0pt` tak, aby $$\mathrm\TeX$$ nepřidával mezi naše sloupce žádnou mezeru: ve skutečnosti se všechny dotýkají. Důvodem je zjednodušit úvodní diskusi a následné výpočty — později v článku znovu zavedeme nenulové `\tabskip` lepidlo, abychom prozkoumali jeho vliv na výpočet šířek sloupců přes více buněk.

Jak je uvedeno v poznámkách, přidali jsme na začátek všech nespojujících položek tabulky malý odstup (5 pt) s výjimkou prvního řádku. Těch 5 pt bílého prostoru je součástí celkové šířky všech nespojujících položek (s výjimkou prvního řádku) a bylo přidáno jen proto, aby tabulka vypadala o něco méně přeplněně.

### Krátká poznámka k šířkám tabulek

Ta `\halign{...}` příkaz má tři podoby:

* `\halign{...}`: nastaví tabulku na libovolnou šířku $$\mathrm\TeX$$ vypočítá na základě velikosti položek (a `\tabskip` lepidla);
* `\halign to *width* {...}`: instruuje $$\mathrm\TeX$$ aby vysázelo tabulku na určenou `*width*`;
* `\halign spread *amount*{...}`: upraví vypočtenou šířku o `*amount*`.

Když $$\mathrm\TeX$$ sází tabulku s použitím `\halign{...}` musí načíst celou tabulku do paměti, aby provedl různé výpočty potřebné k jejímu vysázení. Následně, pokud jste neurčili šířku pomocí `\halign to *width* {...}` , nemůžete znát konečnou šířku, dokud $$\mathrm\TeX$$ nedokončí její zpracování (sazbu). Jeden způsob, jak získat šířku tabulky vytvořené pomocí `\halign{...}` je nejprve vysázet tabulku uvnitř `\vbox{...}` (např. `\setbox0=\vbox{\halign{...}}`) a poté například použít `\the\wd0` k získání šířky.

### Žádné automatické zalamování řádků v položkách tabulky

Je důležité poznamenat, že když $$\mathrm\TeX$$ sází tabulku vytvořenou pomocí `\halign{...}` jakýkoli text v položkách tabulky není automaticky podroben zalamování řádků: položky tabulky se sázejí v *omezeném horizontálním režimu*—stejně jako `\hbox`. Aby bylo možné zalamování řádků, musí být text položky tabulky uzavřen uvnitř `\vbox{...}` spolu s použitím vhodné hodnoty pro `\hsize` uvnitř tohoto `\vbox{...}`. Upozorňujeme však, že text v `\noalign{...}` příkazu ( $$\mathrm\TeX$$ primitivu) použitém v `\halign{...}` podléhá $$\mathrm\TeX$$zalamování řádků v `\noalign{...}` umožňuje $$\mathrm\TeX$$ aby „unikl“ z `\halign{...}` a umístit materiál mezi řádky tabulky — obvykle za účelem vytvoření vodorovných čar mezi řádky tabulky.

### Nepovoleno: \halign{...} uvnitř \hbox{...}

Nemůžete *přímo* sázet `\halign{...}` \halign `\hbox{...}`uvnitř `\hbox{\halign{...}}` vyvolá poměrně matoucí chybu:

```latex
! Chybí } vložená.
<vložený text>
                }
<má být přečteno znovu>
                   \halign
l.1 \hbox{\halign
```

#### Vysvětlení této chyby

Kvůli obalujícímu `\hbox{...}` $$\mathrm\TeX$$ je v *omezeném horizontálním režimu*; poté detekuje `\halign{...}` což je *vertikální režim* příkaz. Například pokud použijete `\halign{...}` uvnitř odstavce, $$\mathrm\TeX$$ ukončí odstavec, zpracuje `\halign{...}` a pak pokračuje se zbytkem odstavce.

Když se použije uvnitř `\hbox{...}`, `\halign{...}` spustí $$\mathrm\TeX$$ aby se pokusil uniknout zpět do vertikálního režimu tím, že se pokusí vynutit uzavření aktuální skupiny: $$\mathrm\TeX$$ hlásí „`! Chybí }`“ a vydá chybu, protože se domnívá, že jste udělali chybu při používání seskupování. Ačkoli pravá závorka (`}`) nemusí ve vašem $$\mathrm\TeX$$ kódu chybět, chybové hlášení je příznakem toho, že `\hbox{...}` „překáží“ a $$\mathrm\TeX$$ dělá svůj „nejlepší odhad“ správného postupu pro vyřešení problému.

## Příklady tabulek se sloupci přes více buněk

Následující řada grafů tabulek nabízí škálu příkladů demonstrujících účinek přesahu sloupců tabulky: ukazují, že dlouhé položky tabulky mohou mít neočekávané důsledky na šířku určitých sloupců — a tedy i na šířku celé tabulky. Otázka, kterou se chystáme řešit, zní: co dělá $$\mathrm\TeX$$ když určitá položka tabulky přesahuje několik sloupců, ale je „příliš široká, než aby se vešla“. Jak bylo uvedeno výše, $$\mathrm\TeX$$ skutečně uplatňuje na tento problém výpočtu šířek sloupců konkrétní algoritmus: následující příklady jsou navrženy tak, aby pomohly vytvořit „pocit“ pro fungování tohoto algoritmu.

### Ukázková tabulka 1

V tomto příkladu používáme `\multispan{2}` k přesahu sloupců 1 a 2 s položkou, jejíž text je **Nadpis tabulky**:

![{{{alt}}}](/files/085ed4dbfc4a67d55a7110d70199650cdfd37a52)

#### Pozorování

* Šířka této tabulky je stejná jako u [referenční tabulky](#reference-table): $$327.71722\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 1 a 2, je $$81.04953\text{pt}$$ což je méně než celková šířka položek ve sloupcích, přes které zasahuje: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Ukázková tabulka 2

Stejně jako v [Ukázková tabulka 1](#example-table-1), tento příklad také používá `\multispan{2}` k přesahu sloupců 1 a 2, ale zde používáme delší položku, jejíž text je **Poněkud delší nadpis tabulky**.

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

#### Pozorování

Pokud tento příklad porovnáte s naším [referenční tabulky](#reference-table) můžeme vidět následující:

* Šířka této tabulky se zvýšila z $$327.71722\text{pt}$$ na $$374.37032\text{pt}$$: celkem o $$46.6531\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 1 a 2 ($$156.28664\text{pt}$$) je větší než celková šířka položek ve sloupcích, přes které zasahuje: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Tento rozdíl je $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ což je stejná částka, o kterou se zvýšila šířka tabulky.
* $$\mathrm\TeX$$ upravilo šířku sloupce 2, aby poskytlo dodatečný potřebný prostor. Později uvidíme, jak $$\mathrm\TeX$$ vypočítá částku, o kterou se musí sloupec 2 zvětšit.
* Sloupec 1 není ovlivněn: jeho šířka nebyla položkou, která zasahuje přes sloupce 1 a 2, nijak dotčena.

### Ukázková tabulka 3

V tomto příkladu používáme `\multispan{3}` k přesahu sloupců 1 až 3 s položkou, jejíž text je stejný jako [Ukázková tabulka 2](#example-table-2): **Poněkud delší nadpis tabulky**.

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

#### Pozorování

* Šířka této tabulky je stejná jako u [referenční tabulky](#reference-table): $$327.71722\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 1 až 3 ($$156.28664\text{pt}$$) je menší než celková šířka položek ve třech sloupcích, přes které zasahuje: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Šířky žádného ze sloupců nebyly položkou přesahující přes sloupce 1 až 3 ovlivněny.

Začínáte vidět, že se objevuje nějaký vzorec?

### Ukázková tabulka 4

Stejně jako u [Ukázková tabulka 3](#example-table-3), zde používáme `\multispan{3}` k přesahu sloupců 1 až 3, ale tentokrát s položkou, jejíž text je podstatně delší: **Podstatně delší nadpis tabulky, který se táhne daleko**.

![{{{alt}}}](/files/57566956d6d21cd0f36b426a7190c7856613b54b)

#### Pozorování

* Ve srovnání s [referenční tabulky](#reference-table), se šířka této tabulky zvýšila z $$327.71722\text{pt}$$ na $$465.95685\text{pt}$$: nárůst o $$138.23963\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 1 až 3, je $$306.91216\text{pt}$$.
* Celková šířka položek ve třech přesahovaných sloupcích je $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Rozdíl v šířce mezi dlouhou přesahující položkou a položkami ve sloupcích 1 až 3 je $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. Stejná částka (na 4 desetinná místa!), o kterou se zvýšila šířka tabulky.
* Šířka se zvětšila pouze u sloupce 3: ani sloupec 1, ani sloupec 2 nejsou ovlivněny.

#### Objevuje se vzorec

Když se podíváme na [Ukázková tabulka 2](#example-table-2) a [Ukázková tabulka 4](#example-table-4) vidíme, že v obou případech je to **poslední sloupec v rozsahu** jehož šířka byla zvětšena, aby vytvořila místo pro dlouhou položku, která přesahovala přes sloupce:

* V [Ukázková tabulka 2](#example-table-2): Dlouhá položka zasahovala přes sloupce 1 a 2. Sloupec 2 se stal „protaženým“.
* V [Ukázková tabulka 4](#example-table-4): Dlouhá položka zasahovala přes sloupce 1 až 3. Sloupec 3 se stal „protaženým“.

#### Šířka sloupce 3: Objevuje se algoritmus?

Následující výpočty dávají jasnější představu o tom, co $$\mathrm\TeX$$ dělá. Zde je to, co víme:

* Šířka dlouhé položky zasahující přes sloupce 1 až 3 je $$306.91216\text{pt}$$.
* Celková šířka položek ve sloupcích 1 a 2 je $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Jaký je rozdíl mezi těmito hodnotami? Je to $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ a to je šířka použitá pro sloupec 3: vyplývá přímo z algoritmu používaného $$\mathrm\TeX$$.

### Ukázková tabulka 5

Než se dostaneme ke složitějšímu příkladu, zde je ještě jeden „jednoduchý“ příklad. Tato tabulka obsahuje stejnou dlouhou položku jako [Ukázková tabulka 4](#example-table-4): **Podstatně delší nadpis tabulky, který se táhne daleko**; tentokrát však používáme `\multispan{6}` což této položce umožňuje zasáhnout přes celou tabulku. Jak vidíte, výsledná tabulka má stále stejnou šířku jako naše [referenční tabulky](#reference-table) ($$327.71722\text{pt}$$) což znamená, že žádné sloupce nebyly touto velmi dlouhou položkou ovlivněny. Je zřejmé, že je to proto, že šířka položky ($$306.91216\text{pt}$$) je menší než celková šířka všech položek, přes které zasahuje: $$327.71722\text{pt}$$; tj. šířka tabulky.

![{{{alt}}}](/files/7d6258dbe74b9782980a4c2d65db8ba8cc01a961)

### Ukázková tabulka 6: Poněkud složitější

Zde se podíváme na sérii tří ukázkových tabulek (6(a)–6(c)), abychom ukázali účinek dvou různých položek, které obě zasahují do sloupce 5. [Ukázková tabulka 6(a)](#example-table-6a) a [Ukázková tabulka 6(b)](#example-table-6b) každá ukazuje tabulku obsahující jedinou položku, která zasahuje přes několik sloupců až do sloupce 5. [Ukázková tabulka 6(c)](#example-table-6c) spojí obě přesahující položky do jedné tabulky a klade otázku: která položka vlastně určuje šířku sloupce 5, a proč? Odpověď nás dovádí k podstatě algoritmu používaného $$\mathrm\TeX$$.

#### Ukázková tabulka 6(a)

![{{{alt}}}](/files/723529c3e8d391968d67ff02fd8da227ed74bd03)

**Pozorování**

* Ve srovnání s [referenční tabulky](#reference-table), se šířka této tabulky zvýšila z $$327.71722\text{pt}$$ na $$371.11153\text{pt}$$: nárůst o $$43.39431\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 3 až 5, je $$215.06683\text{pt}$$.
* Celková šířka položek ve sloupcích 3 až 5 je $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* Rozdíl v šířce mezi položkami přesahujícími ve sloupcích 3 až 5 a šířkou přesahující položky je $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: přesná částka (na 4 desetinná místa!), o kterou se šířka tabulky zvýšila.

#### Ukázková tabulka 6(b)

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

**Pozorování**

* Ve srovnání s [referenční tabulky](#reference-table), se šířka této tabulky zvýšila z $$327.71722\text{pt}$$ na $$353.3233\text{pt}$$: nárůst o $$25.60608\text{pt}$$.
* Šířka položky, která zasahuje přes sloupce 1 až 5, je $$306.91216\text{pt}$$.
* Celková šířka položek ve sloupcích 1 až 5 je $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* Rozdíl v šířce mezi položkami přesahujícími ve sloupcích 1 až 5 a šířkou přesahující položky je $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** toto je *menší* než hodnota vypočtená pro [Příklad 6(a)](#example-table-6a), která byla $$43.3943\text{pt}$$.

#### Ukázková tabulka 6(c)

Zde spojíme položky z ukázkových tabulek [6(a)](#example-table-6a) a [6(b)](#example-table-6b) do jedné tabulky: co se stane?

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

**Pozorování**

* Ve srovnání s [referenční tabulky](#reference-table), se šířka této tabulky zvýšila z $$327.71722\text{pt}$$ na $$371.11153\text{pt}$$: nárůst o $$43.39431\text{pt}$$. Všimneme si, že je to přesně totéž jako [Ukázková tabulka 6(a)](#example-table-6a).

#### Co $$\mathrm\TeX$$ dělá

Abychom pochopili výsledky $$\mathrm\TeX$$algoritmu a rozhodovacích procesů si všimneme, že tato položka

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

přesahuje za položky, které jsou přesahovány $$25.60608\text{pt}$$; tato položka však

![{{{alt}}}](/files/4e4fa725ae9ec5c88b713cc3fef1c2f4476d0a73)

přesahuje ještě dále za položky, přes které zasahuje: o $$43.3943\text{pt}$$. Proto tato položka „vyhraje závod“ a šířka sloupce 5 se zvětší o **maximum** z těchto dvou hodnot ($$43.3943\text{pt}$$). Šířka sloupce 5 se nyní stane $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ aby se přizpůsobila položce, která zasahuje přes sloupce 3 až 5. Náš popis přesné „posloupnosti událostí“ je poněkud zjednodušený, ale výsledek je takový, jak jsme popsali.

## Návrat k určité složitosti

Abychom minimalizovali složitost našich dosavadních diskusí, použili jsme poměrně jednoduché příklady k demonstraci principů $$\mathrm\TeX$$algoritmu; konkrétně jsme nastavili `\tabskip=0pt`. V praxi budou mít tabulky z „reálného světa“ pravděpodobně mnoho položek přesahujících přes různé sloupce a samozřejmě budou mít nenulové hodnoty pro `\tabskip` lepidlo — nyní se k tomuto tématu vrátíme.

### lepidlo \tabskip a šířky sloupců přes více buněk

Návrh tabulek často vyžaduje přidání mezery mezi sloupce a samozřejmě $$\mathrm\TeX$$ má tuto možnost prostřednictvím primitivního příkazu nazvaného `\tabskip`. Tento příkaz lze použít k vložení pevného nebo pružného lepidla (mezery):

* před tabulku (tj. vlevo od sloupce 1);
* mezi jeden nebo více sloupců;
* za tabulku (tj. napravo od posledního sloupce).

Zde je pro připomenutí příklad:

![{{{alt}}}](/files/2fafeaec887fe2a729efa4d70da48c322a65863e)

### Jak \tabskip lepidlo ovlivňuje šířky sloupců přes více buněk?

Přítomnost nenulového `\tabskip` lepidla mezi sloupci poskytuje dodatečný prostor, který mohou položky přesahující přes více buněk „pohltit“, než $$\mathrm\TeX$$ začne uvažovat o zvětšení šířky posledního sloupce v přesahu.

V našem dalším příkladu použijeme dvě tabulky k porovnání výsledků přesahu dvou sloupců. Jediný rozdíl mezi tabulkami je použití `\tabskip` lepidla.

* První příklad používá naši původní „referenční“ tabulku, která má, připomeňte si, nastaveno `\tabskip=0pt`.
* Druhý příklad používá upravenou verzi naší [referenční tabulky](#reference-table) (anotovanou výše), která má `\tabskip=10pt` před tabulkou i za ní, ale důležitější je, že má nastaveno `\tabskip=20pt` mezi sloupci.

Uvnitř *upravené* referenční tabulky nemají dva přesahované sloupce žádný vliv na šířky sloupců (ani šířku tabulky), ale mají vliv na šířku sloupce 2 (a šířku tabulky) v *původní* [referenční tabulky](#reference-table).

### Původní referenční tabulka: \tabskip=0pt

Zde ukazujeme naši původní [referenční tabulky](#reference-table) spolu s druhou tabulkou (odvozenou z naší původní [referenční tabulky](#reference-table)) která má položku „**Vyzkoušej delší nadpis tabulky**“ zasahující přes sloupce 1 a 2. Zcela zjevně je ovlivněn sloupec 2 (druhé tabulky v diagramu), a tím i celá tabulka, přesahujícími sloupci.

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

### Upravená referenční tabulka: \tabskip=20pt

Zde ukazujeme naši upravenou referenční tabulku spolu s druhou tabulkou (odvozenou z naší upravené referenční tabulky), která má také položku „**Vyzkoušej delší nadpis tabulky**“ zasahující přes sloupce 1 a 2. Zcela zjevně v druhé tabulce v diagramu není ovlivněna ani šířka sloupce 2, ani tabulky přesahujícími sloupci. V tomto případě přítomnost `\tabskip` lepidla (`20pt`) mezi sloupci pomohla „pohltit“ prostor potřebný pro text v položce přesahující sloupce 1 a 2:

![{{{alt}}}](/files/4fa25f3b7ffbd41e9fec868a2b67f20bc88c134c)

## Podstata $$\mathrm\TeX$$algoritmu

Doufejme, že rozsah výše uvedených příkladů pomohl rozvinout „pocit“ pro to, co $$\mathrm\TeX$$ dělá, aby vyhověl položkám přesahujícím více sloupců, a jak $$\mathrm\TeX$$ v případě potřeby upraví šířku **posledního** sloupce v každém rozsahu přesahovaných sloupců. Kromě šířky položek v jednotlivých sloupcích, přes které se přesahuje, je přítomnost nenulového `\tabskip` lepidla důležitým faktorem, který $$\mathrm\TeX$$ bere v úvahu při rozhodování, zda je třeba upravit nějaké šířky sloupců. Klíčový bod k zapamatování je, že $$\mathrm\TeX$$cílem je vypočítat vhodnou šířku pro **poslední sloupec** v každém rozsahu rozpětí sloupců.

### Konečný příklad tabulky: poslední sloupce v rozpětí

V tomto závěrečném příkladu opět použijeme naši upravenou referenční tabulku (s `\tabskip` hodnotami lepidla probíranými výše) k odvození další tabulky, která obsahuje různé sloupce rozpínané pravidly — použili jsme pravidla, aby bylo rozpětí snáze vidět.

Obě tabulky byly pečlivě zarovnány, aby ukázaly, že v horní tabulce nebyly žádné sloupce před sloupcem 5 ovlivněny rozpětými sloupci. Tmavší zelená oblast vlevo od diagramu ukazuje, že sloupce 1 až 4 v obou tabulkách se stále dokonale zarovnávají. Vpravo je světleji zeleně stínovaná oblast ukazující, že byly ovlivněny pouze sloupce 5 a 6.

V horní tabulce jsou rozpětí následující:

* sloupce 1 až 5: překryto $$400\text{pt}$$ pravidlem;
* sloupce 3 až 5: překryto $$200\text{pt}$$ pravidlem;
* sloupce 4 až 6: překryto $$250\text{pt}$$ pravidlem.

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

Ještě jednou je vysvětlení takové, že v sérii sloupců s rozpětím se upravuje pouze šířka posledního sloupce (je-li třeba): mezilehlé sloupce nejsou ovlivněny a zde to znamená sloupce 1 až 4 — i když, samozřejmě, šířka sloupců 1 až 4 (a mezilehlého `\tabskip` lepidla) se bere v úvahu při výpočtu upravených šířek sloupců 5 a 6.

### Přehled $$\mathrm\TeX$$algoritmu

Zakončíme *zjednodušeným* přehledem „$$\mathrm\TeX$$myšlenkových postupů“ při výpočtu šířek sloupců v položkách s rozpětím. Popis $$\mathrm\TeX$$algoritmů není vždy přímočarý, takže použijeme trochu „zjednodušující umělecké licence“, abychom poskytli přehled toho, co se děje. Čtenáři, kteří mají zájem o všechny ty nehezké detaily, nechť nahlédnou do oddílu 801 (strana 336) tištěné knihy obsahující $$\mathrm\TeX$$zdrojový kód [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Reálné tabulky se často vytvářejí s mnoha použitími `\span` primitiva (např. uvnitř $$\mathrm\LaTeX$$ balíčků) k sestavení více instancí rozpětých sloupců uvnitř tabulky. Aby se to zvládlo, datové struktury (hluboko uvnitř $$\mathrm\TeX$$) udržují informace (tzv. *uzly rozpětí*) které řeknou $$\mathrm\TeX$$ o vazbách (rozpětích) mezi položkami/sloupci tabulky. Je zřejmé, že $$\mathrm\TeX$$ musí své algoritmy aplikovat systematicky a bude muset zpracovat celou tabulku, aby provedl své konečné výpočty — určit všechny šířky sloupců, celkovou šířku tabulky a, je-li třeba, množství, o které se musí flexibilní lepidla použitá v tabulce natáhnout nebo smrštit. Není vlastně překvapivé, že $$\mathrm\TeX$$ nemůže říci konečnou šířku tabulky, dokud zcela nezpracuje `\halign{...}` příkaz — má opravdu hodně práce!

Výchozím bodem pro výpočty šířky sloupců je sloupec 1, protože samozřejmě nic nemůže rozpínat zleva od (a *přes/na*) sloupce 1. $$\mathrm\TeX$$ začíná určením šířky sloupce 1 tak, že zjišťuje, která položka má maximální *přirozenou šířku*. Nazvěme tuto maximální šířku $$w\_1$$a pokud existují položky, které se rozpínají od sloupce 1 ke sloupci 2, nazvěme šířku této položky $$w\_{12}$$ (šířka od 1 do 2). Kromě toho označíme `\tabskip` lepidlo mezi sloupci 1 a 2 jako $$t\_{1}$$—poznamenejme, že uvažujeme pouze *přirozenou šířku* této `\tabskip` lepidla a prozatím ignorujeme jakékoli složky roztažení nebo smrštění, které by mohlo mít. Také nechť je maximální přirozená šířka všech nerozpínajících se položek ve sloupci 2 $$w\_2$$.

Klíčové je poznamenat, že $$\mathrm\TeX$$ se snaží vypočítat šířku sloupce 2 tak, že zvažuje pouze ty položky, u nichž rozpětí *začíná* ve sloupci 1 a *končí* ve sloupci 2. Klíčovým hlediskem pro $$\mathrm\TeX$$ je test $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—může existovat více položek rozpínajících se přes sloupce 1 a 2: některé mohou být úzké (malé $$w\_{12}$$), jiné velmi široké (velké $$w\_{12}$$) takže $$\mathrm\TeX$$ hledá tu, která má největší účinek (odtud $$\max(\text{...})$$). Zde je hodnota $$w\_{12} -(w\_1+ t\_1)$$ množství, o které položka rozpínající se přes sloupce 1 a 2 „přetéká“ ze sloupce 1 do sloupce 2: všimněte si, že $$\mathrm\TeX$$ používá šířku sloupce 1 **a** webových stránkách `\tabskip` lepidla ($$t\_{1}$$) mezi sloupci 1 a 2. Jakmile $$\mathrm\TeX$$ určí, zda nějaká rozpětí ze sloupce 1 do 2 skutečně ovlivňují šířku sloupce 2, nastaví šířku sloupce 2 na maximální hodnotu, kterou určil (použitím popsaného testu). $$\mathrm\TeX$$ pokračuje v procházení všech ostatních sloupců a provádí podobné testy.

A nakonec, jen pro úplnost, zde uvádíme podstatu $$\mathrm\TeX$$algoritmu pro výpočet šířek sloupců (převzato z dokumentace zdrojového kódu Knutha k $$\mathrm\TeX$$):

Nechť $$w\_{ij}$$ je maximum přirozených šířek všech položek, které se rozpínají přes sloupce $$i$$ až $$j$$, včetně. Konečné šířky sloupců jsou definovány vzorcem

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

kde $$t\_k$$ je přirozená šířka tabskip lepidla mezi sloupci $$k$$ a $$k+1$$.

## Kolofon: Použití Overleafu k tvorbě tabulek jako grafiky SVG

Všechny $$\mathrm\TeX$$ tabulky uvedené v tomto článku jsou soubory Scalable Vector Graphics (SVG) vytvořené na platformě Overleaf. Poznámky (šipky a zelené rámečky) byly přidány otevřením grafiky SVG v Inkscape — všimněte si však, že text poznámek byl vysázen v $$\mathrm\TeX$$ jako dodatečný text doprovázející tabulku: v Inkscape byly přidány pouze šipky a zelená pozadí. Pokud vás zajímá, jak toho bylo dosaženo, čtěte dál.

Servery Overleafu používají $$\mathrm\TeX \text{ Live}$$ distribuci, která kromě $$\mathrm\TeX$$-založených sazebních enginů poskytuje bohatou zásobu velmi užitečných $$\mathrm\TeX$$-souvisejících softwarových nástrojů a utilit. Mezi nimi je jeden nazvaný [`dvisvgm`](https://dvisvgm.de) , který, jak jeho název napovídá, převádí $$\mathrm\TeX$$’s tradiční DVI (**D**e**V**ice **I**ndependent) výstupní formát do SVG. Mezi jeho mnoha [volbami příkazového řádku](https://dvisvgm.de/Manpage/) `dvisvgm` nabízí volbu (`-n` nebo `--no-fonts`), která mu nařídí převést veškerý text na *cesty* , což znamená, že text v grafice SVG je kreslen pomocí čar a křivek namísto skutečných písem a glyfů. To může zvýšit velikost výsledné grafiky SVG, ale zajišťuje to, že grafiky SVG jsou velmi přenosné a téměř jistě budou dobře fungovat na jakémkoli zařízení.

### Takže... jak se to udělalo?

V [předchozím článku](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) jsem popsal, jak lze použít $$\text{Lua}\mathrm\TeX$$ k spuštění různých softwarových nástrojů a utilit nainstalovaných na serverech Overleafu — je to nesmírně snadná a pohodlná technika. Tato technika byla použita k vygenerování SVG grafik vysázených $$\mathrm\TeX$$ tabulek takto. Z hlavního $$\mathrm\TeX$$ souboru dokumentu byl kód pro vysázení každé tabulky (vytvořené pomocí `\halign`) zapsán do `.tex` souboru. Toho bylo dosaženo uzavřením kódu tabulky mezi dvojici příkazů, které jsem nazval `\beginscoop` a `\endscoop`. Pravděpodobně existuje mnoho dalších způsobů, jak dosáhnout požadovaných výsledků, ale zde jsou definice maker, které jsem použil:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

Používáte je takto:

```latex
\beginscoop
\halign{...}
\endscoop
```

Všimněte si, že `\endscoop` token slouží pouze k ohraničení parametru `\scoop` makra: $$\mathrm\TeX$$ efektivně zahazuje `\endscoop` token, takže ho ve skutečnosti nemusíme definovat (např. pomocí `\def\endscoop{...}`).

Ta $$\mathrm\TeX$$ kód obsažený v `\halign{...}` se uloží do `toks` registru zvaného `\fulltoks`. Na jeden ošemetný bod, na který jsem narazil (s $$\text{Lua}\mathrm\TeX$$) spočíval v potřebě zabránit `#` znakům uvnitř the `\halign{...}` preambule v tom, aby se při zápisu do `##` souboru. Abych tomu předešel, musel jsem dočasně nastavit `.tex` znaky na 12 před uložením `\catcode`pro `#` znaky na 12 před uložením $$\mathrm\TeX$$ kódu (tokenů) v `\fulltoks` tokenovém registru.

Dalším krokem je zapsat tokeny obsažené v `\fulltoks` do $$\mathrm\TeX$$ souboru — protože jsem používal $$\text{Lua}\mathrm\TeX$$ to se ukázalo být *mimořádně* snadné díky $$\text{Lua}\mathrm\TeX$$’s úžasného Lua API. Stručně řečeno, napsal jsem makro nazvané `\writefile{...}` , které jako svůj parametr bere název tokenového registru, jehož tokeny chcete zapsat do souboru (např. `\writefile{fulltoks}`). V rámci `\writefile{...}` makra jsem použil Lua API k získání textové reprezentace `\fulltoks` tokenového registru:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Zde je snímek obrazovky ukazující trochu více z `\writefile{...}` příkazu:

[![{{{alt}}}](/files/a02e55991cc33a945d7d3b138f2a9a42b5e28fc2)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Jazyk Lua a Lua API poskytované $$\text{Lua}\mathrm\TeX$$ mohou často zjednodušit $$\mathrm\TeX$$ programátorské úlohy a právě kvůli těmto užitečným a mocným funkcím používám $$\text{Lua}\mathrm\TeX$$ od roku 2009 — a zůstávám velkým fanouškem tohoto skutečně úžasného $$\mathrm\TeX$$ enginu. Dobře, tato $$\text{Lua}\mathrm\TeX$$ reklamní vsuvka nyní končí.

Poté, co jsme tak snadno získali $$\mathrm\TeX$$ kód uložený v `\fulltoks` , je zapsán do souboru spolu s nějakým dalším kódem, aby z něj vznikl správně vytvořený $$\mathrm\LaTeX$$ soubor. Další kroky jsou:

1. Zpracujte `.tex` soubor obsahující naši tabulku pomocí $$\text{pdf}\mathrm\LaTeX$$ (v režimu DVI), aby vysázel tabulku a vygeneroval `.dvi` soubor pro `dvisvgm` ke zpracování. Ano, můžete použít $$\text{Lua}\mathrm\TeX$$ ke spuštění $$\text{pdf}\mathrm\LaTeX$$—opět jsem použil metodu diskutovanou v [předchozím článku](/latex/cs/clanky-do-hloubky/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. A nakonec spusťte `dvisvgm` ke zpracování `.dvi` souboru, aby se vygenerovala grafika SVG vysázené $$\mathrm\TeX$$ tabulky.
3. Chcete-li získat samotné grafiky SVG, můžete si z Overleafu stáhnout ZIP soubor — ujistěte se, že jste zvolili **Vstupní a výstupní soubory** možnost.


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
