> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Jak LaTeX sází záhlaví a zápatí?

## Jak LaTeX vysází záhlaví a zápatí?

### Úvod

Pokud hledáte návod na změnu záhlaví a zápatí, prosím [navštivte naši stránku nápovědy](/latex/cs/formatovani/02-headers-and-footers.md) protože tento článek se zaměřuje na vysvětlení nízkoúrovňových mechanismů, které enginy TeXu a LaTeX používají k tvorbě záhlaví a zápatí.

* **Poznámka (aktualizace)**: Tento článek zkoumá základní mechanismus značek LaTeXu používaný před červnem 2022, kdy byla představena nová a všestrannější implementace zpracování značek v LaTeXu. Viz [Přehled nového mechanismu značek v LaTeXu](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) pro více podrobností. Z důvodů zpětné kompatibility LaTeX nadále podporuje svůj starší mechanismus značek. Obsah článku pojednávající o chování enginů TeXu není těmito změnami v LaTeXu ovlivněn.
* **Poznámka**: výrazy „LaTeX“, „TeX“ a „TeX engine“ se v tomto pojednání používají průběžně, takže je užitečné rozumět jejich významu — viz článek 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) pro další informace.

Pro poskytnutí užitečného pozadí/kontekstu začneme přehledem některých relevantních nízkoúrovňových oblastí sazby založené na TeXu — včetně dočasného (interního) ukládání obsahu, zalamování stránek a konstrukce. Výklad jsme zúžili/zjednodušili tím, že budeme uvažovat vysázenou stránku, která obsahuje „tělo“ textu plus nějaká záhlaví a zápatí. Prvky stránky, jako jsou obrázky (plovoucí objekty) a poznámky pod čarou, zde neřešíme, protože zahrnují složitý mechanismus TeXu nazývaný *vložení*, který je zcela mimo rozsah tohoto článku.

Začneme základním pojmem *uzlů*: základní stavební kameny, které enginy TeXu používají k dočasnému (vnitřnímu) ukládání obsahu.

### Několik poznámek k ukládání obsahu: uzly TeXu

Jak základní engine TeXu zpracovává váš kód LaTeXu, aby vytvořil vysázený materiál — například odstavce, tabulky a matematiku —, potřebuje tento obsah dočasně uložit v paměti toho engine TeXu, který je právě použit ke zpracování vašeho kódu LaTeXu. K ukládání vysázeného obsahu používají enginy TeXu posloupnost takzvaných *uzlů*, které si můžete představit jako různě velké „kousky“ paměti počítače (zařízení), propojené do seznamu (viz tento [článek na Wikipedii o propojených datových strukturách](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Schematické zobrazení toho, jak enginy TeXu ukládají obsah pomocí propojených uzlů](/files/e1593755411236cb671c75996b7a943a24822791)

K reprezentaci základních prvků sazby založené na TeXu — například znaků, lepidla, polí, trestů, kernů a [*značek*](#why-were-here-understanding-mark-nodes) (abychom jmenovali jen některé) — enginy TeXu používají různé *typům* typy uzlů. Některé uzly, například ty pro pole, potřebují uchovávat více dat než jednodušší typy uzlů, jako jsou uzly znaků; proto jsou některé uzly větší než jiné — vyžadují více bajtů, aby bylo možné je uložit v paměti. Při čtení o TeXu můžete narazit na pojmy jako *uzly znaků*, *uzly lepidla*, [*uzly značek*](#why-were-here-understanding-mark-nodes) a tak dále: nyní víte, že jsou to jen názvy dané kouskům paměti přiděleným k ukládání dat představujících prvek sazby TeXu.

#### Proč tu jsme: porozumění uzlům značek

Z mnoha typů uzlů je ten, o němž potřebujeme mluvit, nazýván *uzel značky* který je vytvářen příkazem `\mark` příkazu:

```latex
\mark{stuff to store}
```

Ta `\mark` příkaz přímo nevytváří žádný vysázený obsah: jeho argument `*co uložit*` je uložen do paměti pro pozdější použití a *uzel značky* je vytvořen, aby obsahoval paměťové umístění *co uložit*. Jak uvidíme, `\mark` příkaz byl vytvořen *speciálně* aby pomáhal s tvorbou záhlaví a zápatí.

Uzly značek vytvořené příkazy `\mark` jsou „vložené“ do obsahu stránky a připravené k použití v závěrečných fázích sestavování stránky, kdy je engine TeXu připraven přidat záhlaví a zápatí k vysázené stránce (tělu). Obvykle `*co uložit*` budou obsahovat materiál jako čísla stránek a názvy/čísla kapitol nebo sekcí — stavební kameny záhlaví a zápatí.

#### ε-TeX přidává příkaz \marks

[Verze 2 ε-TeXu](https://texdoc.org/serve/e-TeX/0), rozšíření původního TeXu od Knutha, byla vydána v roce 1998 a poskytuje nové možnosti spolu s vylepšeními stávajících funkcí. Dnes byla většina vylepšení ε-TeXu začleněna do hlavních enginů TeXu: pdfTeX, LuaTeX a XeTeX — viz [**`-etex`** přepínač příkazového řádku enginů TeXu](/latex/cs/dalsi-temata/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) který umožňuje použití rozšíření ε-TeXu.

Původní software TeXu od Knutha poskytuje příkaz \mark, který vytváří pouze 1 „třídu“ neboli „typ“ uzlu značky. Váš dokument může obsahovat mnoho příkazů \mark, ale všechny vytvářejí uzly značek stejného „typu“ nebo „třídy“ — neexistuje žádný vestavěný mechanismus, jak je seskupovat nebo klasifikovat. Toto omezení bylo odstraněno vylepšením ε-TeXu: příkazem \marks, který podporují pdfTeX, LuaTeX a XeTeX:

```latex
\marks n {stuff to store}
```

kde `n` je celé číslo (`0` <= `n` < `32768`) které určuje *třídu*.

Poznámky:

* zápis `\marks 0` (tj., `n`=`0`) je synonymní s použitím původního TeXu `\mark` příkaz
* ε-TeX také zavedl proměnné značek ([viz dále](#pre-output-checks-looking-for-mark-nodes)) pro každou třídu (`n`) značky: `\firstmarks n`, `\topmarks n` a `\botmarks n`. Vybrané třídy proměnných značek lze použít k poskytování dat značek pro konkrétní sázecí úlohy.
* LuaTeX zvýšil maximální hodnotu `n` na `65535`, čímž umožnil $$2^{16}$$ třídy značek

### Důvody používání značek v TeXu

Abychom porozuměli *proč* (a jak) enginy TeXu používají `\mark` (nebo `\marks`) příkaz k tvorbě záhlaví a zápatí, musíme ocenit některé „zvláštnosti“ mechanismů enginů TeXu pro sestavování stránek — hledání zalomení stránky a odesílání hotových stránek do souboru PDF. Ve skutečnosti jsou tyto procesy sestavování stránek složité, ale základní principy/koncepce lze zjednodušit tak, aby poskytly dostatečné vysvětlení pozadí, které nám pomůže porozumět značkám.

Když engine TeXu dokončí sazbu jednotlivých prvků obsahu, jako jsou odstavce, tabulky nebo matematika, zavolá interní rutinu (funkci nazvanou `build_page(...)`), která se snaží přidat tyto nově vysázené položky na stránku, která je právě v paměti sestavována. Když je nový materiál přidán na budovanou stránku, TeX také kontroluje, zda tento nově přidaný obsah nezpůsobil, že je aktuální stránka „dostatečně plná“. Je-li stránka plná, TeX může vytvořit *zalomení stránky*— a odeslat obsah této stránky k závěrečnému zpracování („zabalení“) a následnému výstupu do souboru PDF.

Jedním z klíčových rysů závěrečné fáze balení stránky (kompozice) je něco, co se nazývá *výstupní rutina* což je ve skutečnosti uživatelem definovaná posloupnost příkazů používaná k zabalení stránky obsahu, aby byla připravena k odeslání do souboru PDF. Jednou z činností „zabalení“ je přidání záhlaví a zápatí, ale existuje mnoho způsobů, jak výstupní rutiny používat — například viz [tento článek v TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Výstupní rutiny jsou v TeXu poměrně složitá oblast, takže zde nebudeme zacházet do podrobností: pro naše účely si jen pamatujte, že závěrečná fáze sestavování stránky zahrnuje použití nějaké uživatelsky definované posloupnosti příkazů (souhrnně nazývané *výstupní rutina*).

Ale pojďme zvážit, co se může stát, když TeX dokončí sazbu dlouhého odstavce textu a rozbije jej do posloupnosti jednotlivých vysázených řádků. TeX bude chtít přidávat tento nově vysázený odstavec — řádek po řádku — na stránku, která je právě sestavována, ale možná se na aktuální stránku vejde jen *některých* z těchto řádků. Poznamenejme, že „stránkou“ máme na mysli hlavní textovou oblast (tělo stránky), která *ne* může zahrnovat i další prvky stránky, jako jsou záhlaví a zápatí, které jsou přidány později (výstupní rutinou).

Poté, co bylo na aktuální stránku přidáno několik řádků odstavce, může se stát „dostatečně plnou“ a nastane čas, aby TeX vytvořil zalomení stránky. Máme však nějaký „zbylý“ materiál, protože na aktuální stránku se dostalo jen *part* odstavce: „přebytečný obsah odstavce“ je uložen na později a připraven pro vytvoření *další* stránky. Následující grafika tuto myšlenku ilustruje: část odstavce je na *aktuální* stránce a část je zadržena pro *další* stránce.

![Schematické znázornění odstavce překračujícího zalomení stránky](/files/bf3c49d0f0fbf229a4c42eb442e334312e13bc98)

Tento příklad odstavce ukazuje, že engine TeXu často zpracovává (sází) části obsahu, které *v celém rozsahu*, se nevejdou na aktuální stránku — protože tento obsah přesahuje bod, ve kterém je nutné zalomení stránky. Pamatujte, že enginy TeXu zjišťují zalomení řádků tak, že nejprve načtou a pak vysází *celé odstavce* a na rozdíl od některých aplikací nepoužívají při sazbě odstavců přístup řádek po řádku. Jinými slovy, TeX sází *celý* odstavec bez ohledu na to, zda se vejde na aktuální stránku (to se určí až později). Mimochodem, princip „nejprve vysázet v plném rozsahu a pak přidat na aktuální stránku“ platí i pro jiné typy obsahu TeXu, včetně tabulek, které jsou z .tex souboru plně načteny a vysázeny v celém rozsahu před jakýmkoli pokusem o jejich přidání na aktuální stránku.

V našem příkladu odstavce byl kompletní text tohoto odstavce, *včetně všech příkazů v tomto textu*, plně zpracován — což znamená, že sazba TeXu dosáhla určitého místa ve vašem `.tex` souboru. „Aktuální vnitřní stav“ enginu TeXu, jako je hodnota proměnných nebo uložených nastavení parametrů, bude odrážet materiál, včetně všech příkazů, zpracovaných až do aktuálního místa — konce odstavce.

Ačkoli byl kompletní odstavec vysázen, některé jeho části se nemohou na aktuální stránku vejít, což vede k tomu, že „přebytečný obsah odstavce“ je uložen pro *další* stránku. V rámci kódu LaTeXu (text plus příkazy), který vytvořil „přebytečný obsah odstavce“, engine TeXu *mohl* zavolat libovolný počet příkazů a maker, které změnily hodnoty a proměnné uložené interně enginem TeXu — tj. provedly změny TeXova „aktuálního stavu“.

Následující diagram ilustruje mimořádně důležitou „zvláštnost“ TeXu, která ovlivňuje několik aspektů sazby založené na TeXu. Při pohledu na pravou stranu diagramu vidíte znázornění uzlů tvořících veškerý obsah aktuálně uložený v paměti: světle šedá oblast obsahuje uzly tvořící *aktuální* stránku a tmavě šedá oblast je vysázený obsah určený pro *další* stránku. Tento scénář odpovídá našemu příkladu odstavce: tmavě šedá oblast představuje „přebytečný obsah odstavce“: řádky textu zadržené, protože se nevejdou na aktuální stránku.

![Schematické znázornění umístění uzlu, kde TeX najde zalomení stránky, zároveň ukazující obsah zadržený pro další stránku](/files/b02e31d0ea09db5bcd22ded6e88a3dc6822981b4)

Pamatujte, že jakmile má TeX „dostatečně plnou“ stránku (tělo), předá tento obsah něčemu, co se nazývá *výstupní rutina* což je uživatelem definovaná posloupnost příkazů. Mimo jiné výstupní rutina přidává do těla stránky záhlaví a zápatí a dokončuje stránku, aby byla připravena k odeslání do souboru PDF.

Náš obrázek výše představuje situaci, kdy se TeX rozhodl provést zalomení stránky na určitém uzlu, například na `\baselineskip` lepidle mezi vysázenými řádky, a je připraven začít balit aktuální stránku pomocí výstupní rutiny — posloupnosti vestavěných příkazů a uživatelem definovaných maker. *Avšak*, kromě obsahu tvořícího aktuální stránku (uloženého v paměti) TeX již zpracoval a uložil (v paměti) *dodatečný materiál*, ze svého `.tex` souboru. Tento dodatečný materiál se rozšiřuje *za zalomení stránky* a *mohl* mohly být zahrnuty příkazy, které změnily důležité hodnoty nebo proměnné související se stránkou a ovlivnily TeXův „aktuální vnitřní stav“ — který zahrnuje hodnoty vnitřních parametrů nebo dat uložených makry.

Když TeX začne balit aktuální stránku, jeho „aktuální vnitřní stav“ je *ne* určen vším vysázeným až do místa zalomení stránky, protože TeX již *přešel za tento bod* v souboru a zpracoval další materiál. Pokud vezmete v úvahu místo v souboru odpovídající tomu, kde k zalomení stránky dochází, a místo, kam se TeX ve vašem `.tex` souboru skutečně dostal, mohou být dva odpovídající vnitřní stavy TeXu, včetně uložených dat a hodnot proměnných, velmi odlišné. Aktuální stav sazby TeXu je obvykle napřed oproti místu, kde dojde k zalomení stránky; tj. sazební činnosti TeXu *nejsou synchronizovány* s procesem výstupu vysázených stránek prostřednictvím výstupní rutiny.

#### Hypotetický příklad: jak získat nesprávná záhlaví

Následující diagram ilustruje hypotetické příkazy `\myheader` a `\myfooter` používané k uložení požadovaného textu záhlaví a zápatí; například pomocí základních definic jako

```latex
\newtoks\headertoks% nová proměnná seznamu tokenů pro text záhlaví
\newtoks\footertoks% nová proměnná seznamu tokenů pro text zápatí
% Použijte \global, aby byla uložená data záhlaví nebo zápatí
% přístupná všude, včetně příkazů ve
% výstupní rutině
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

v nichž `\headertoks` a `\footertoks` jsou seznamy tokenů používané k ukládání textu záhlaví a zápatí.

Náš hypotetický příklad navíc obsahuje i výstupní rutinu, která získává text záhlaví a zápatí z aktuálních hodnot `\myheader` a `\myfooter`. Jak je znázorněno v diagramu, v obsahu určeném pro aktuální stránku, `\myheader` a `\myfooter` nastaví příslušné (správné) hodnoty. Bylo by však možné, aby `\myheader` a/nebo `\myfooter` byl zavolán v odstavci, který přetíná zalomení stránky. Protože TeX musí zpracovat celý odstavec, `\myheader` a `\myfooter` byl by znovu zavolán, aby resetoval text záhlaví/zápatí uložený ve „vnitřním stavu TeXu“, čímž by vznikly hodnoty, které nejsou správné pro aktuální stránku. Když výstupní rutina vytvoří záhlaví a zápatí, budou obsahovat text určený pro další stránku.

![Grafika zobrazující nesprávná záhlaví a zápatí vzniklá, pokud výstupní rutina používá k získání textu záhlaví a zápatí pouze makra TeXu](/files/a454bae7232658f9c70a874181e15d082eaf4257)

#### Asynchronní chování TeXu: příkaz \mark na pomoc

Sazební (konstrukční) činnosti TeXu jsou *nesynchronizované* s konečným procesem výstupu vysázené stránky prostřednictvím příkazů obsažených ve výstupní rutině. Když nastane čas vyvést stránku, skutečný vnitřní stav TeXu je napřed před jakýmkoli stavem, který mohl mít v místě zalomení stránky — kde vysázel poslední kus obsahu na právě vyváděné stránce.

V [TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, tvůrce TeXu, popisuje tuto situaci jako

> ... výstupní rutina TeXu zaostává za jeho činnostmi při sestavování stránek

Kvůli tomuto nesynchronizovanému vztahu jsou zapotřebí „speciální prostředky“ v podobě *mechanismu značek*, uplatňovaných prostřednictvím `\mark` (nebo `\marks n`) příkazu, aby záhlaví a zápatí obsahovala materiál relevantní pro skutečnou vyváděnou stránku. Příkaz `\mark` vkládá uzly značek do obsahu stránky a ukládá paměťové umístění obsahu, které lze použít pro záhlaví a zápatí hostitelské stránky.

Autor známé a uznávané knihy [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) popisuje `\mark` mechanismus jako

> ... hlavní mechanismus, jehož prostřednictvím může výstupní rutina získat informace o obsahu právě oddělené stránky, zejména o její horní a dolní části.

Ta `\mark` příkaz je mechanismus navržený k obejití asynchronní povahy algoritmu zalamování stránek a výstupní rutiny TeXu.

![Schematické znázornění dat značek (uzlů) vložených do obsahu těla stránky](/files/23a4bab1db56ce6be8bc5e8c05cef51fe0e63d20)

### Předvýstupní kontroly: hledání uzlů značek

Poté, co engine TeXu určí umístění zalomení stránky, zavolá interní rutinu (nazývanou `fire_up()`) která provádí mnoho předzpracování předtím, než výstupní rutina dokončí sestavení stránky a zapíše hotovou stránku do souboru PDF. Důležitou součástí těchto předzpracovacích kroků je nastavit hodnotu tří *globálních proměnných značek*: `\botmark`, `\topmark` a `\firstmark` které se používají k poskytování dat pro vytváření záhlaví a zápatí. Samozřejmě stránka může obsahovat více uzlů značek, ale ty jsou filtrovány tak, aby vznikly tři proměnné značek, které fungují takto:

* **`\botmark`** je značka v platnosti při aktuálním zalomení stránky; tj. poslední značka zaznamenaná na *aktuální* page
* **`\topmark`** je hodnota `\botmark` z balíčku *předchozí* page
* **`\firstmark`** je první značka na *aktuální* stránce — první značka mezi `\topmark` a `\botmark`

Následující schéma ukazuje základní principy předzpracování vysázeného obsahu stránky za účelem určení hodnot tří globálních proměnných značek `\botmark`, `\topmark` a `\firstmark`:

![Schematické znázornění základních principů používaných k určení hodnot tří globálních proměnných značek \botmark, \topmark a \firstmark](/files/ccd09d95ff83ed2ff01a653cc5f0f93bbe3b4bd5)

Následující část využívá některá z výše uvedených vysvětlení k nastínění toho, jak LaTeX sází záhlaví a zápatí.

### Třídy LaTeXu: styly stránek a záhlaví/zápatí

Když napíšete `\documentclass{*class*}` kde `*class*` může být `article`, `book`, `report` nebo `letter`, LaTeX načte soubor s názvem `*class*.cls`; například, `book.cls`, `article.cls` a tak dále. Tyto `.cls` soubory obsahují kód LaTeXu pro implementaci variant různých příkazů a funkcí specifických pro danou třídu, které se očekávají, že budou přítomny ve všech dokumentových třídách a poskytovány jimi — chování společné všem dokumentovým třídám. Příklady mohou zahrnovat marginy rozvržení stránky specifické pro třídu spolu s verzemi příkazů specifickými pro třídu, jako například `\section`, `\subsection` a tak dále.

Dalším důležitým prvkem `.cls` souborů je implementace standardních stylů stránek specifická pro danou třídu, která definuje záhlaví a zápatí dokumentů vytvořených pomocí konkrétní třídy a stylu stránky. Například:

* **`book.cls`** a **`article.cls`** každý obsahuje implementace stylů stránek `headings` a `myheadings`
* **`letter.cls`** obsahuje definice stylů stránek `headings`, `empty`, `plain` a jeden nazvaný `firstpage`
* **`report.cls`** obsahuje definice stylů stránek `headings` a `myheadings`

Implementace stylů stránek často závisí na `twoside` volbě `\documentclass`— zda je dokument jednostranný nebo oboustranný — aby záhlaví a zápatí byla definována vhodně pro levostranné (sudé) a pravostranné (liché) stránky.

Dokumentové třídy se mohou spoléhat na výchozí definice `plain` nebo `empty` stylů stránek poskytovaných jinde v LaTeXu — mimo `.cls` používaný soubor.

#### Více o stylech stránek

Když změníte styl stránky pomocí `\pagestyle{*somestyle*}` nebo `\thispagestyle{*somestyle*}` LaTeX očekává, že najde interní příkaz s názvem `ps@*somestyle*`— obvykle poskytovaný třídou dokumentu `.cls` soubor nebo možná balíček jako `fancyhdr`. Mimochodem, „interním příkazem“ myslíme příkaz, který je součástí zdrojového kódu LaTeXu a jehož název obsahuje `@` symbol, který obvykle brání běžnému používání (kvůli jeho [kategoriální kód](/latex/cs/dalsi-temata/43-table-of-tex-category-codes.md)).

Definice `\ps@*somestyle*` odpovídá za implementaci funkcí/chování daného stylu stránky, což zahrnuje poskytnutí definic:

* příkazů používaných během závěrečných fází skládání stránky (k přidání záhlaví a zápatí, viz [později v článku](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* příkazů pro vkládání dat značek souvisejících se sekcemi pro použití při generování záhlaví a zápatí dokumentu, která obsahují názvy sekcí, čísla a podobně. Například `headings` styl stránky (v rámci `book.cls`) definuje následující příkazy vytvářející značky:
  * `\chaptermark`
  * `\sectionmark`

Budeme [dále zkoumat příkazy generující značky](#mark-commands-and-mark-data), například `\chaptermark`, ale jen pro názornost: když napíšete `\chapter{název kapitoly}` webových stránkách `\chaptermark` je také proveden příkaz pro vložení dat značek souvisejících s kapitolou pro následnou tvorbu záhlaví stránek.

#### Anatomie příkazů záhlaví a zápatí založených na stylu stránky

Tato část zkoumá některé základní příkazy/procesy LaTeXu používané k vytváření záhlaví a zápatí — s využitím vysvětlení nebo konceptů představených dříve v tomto článku.

**LaTeXův „model“ záhlaví a zápatí**

Obsah (výchozích) záhlaví a zápatí LaTeXu je založen na dvouúrovňové hierarchii sekcí dokumentu: sekce „vyšší úrovně“ obsahuje více sekcí „nižší úrovně“. U tříd book a article to znamená:

* `**book**` **třídu**: sekce „vyšší úrovně“ se vytvářejí pomocí `\chapter` příkazů a sekce „nižší úrovně“ pomocí `\section`, což odpovídá kapitolám obsahujícím mnoho sekcí.
* `**article**` **třídu** (za předpokladu oboustranných dokumentů): sekce „vyšší úrovně“ se vytvářejí pomocí `\section` příkazů a ty „nižší úrovně“ pomocí `\subsection`, což odpovídá více podsekcím objevujícím se v rámci téže sekce.

LaTeX uplatňuje svůj „model“ záhlaví a zápatí prostřednictvím svých příkazů pro členění, které „vkládají“ uzly značek (pomocí `\mark` příkazu) k ukládání dat relevantních pro vytvářenou sekci dokumentu. Například pokaždé, když napíšete `\section{*název sekce*}` bude vytvořen uzel značky obsahující data, která odrážejí `*název sekce*` a číslo sekce.

LaTeX používá systém značek, které obsahují data ve formátu `{left}{right}`, která jsou nakonec generována pomocí `\mark` příkazy

```latex
\mark{{left}{right}}
```

zabalených do vrstev maker navržených tak, aby uživatele chránily před nízkoúrovňovými detaily — těm se věnují následující části tohoto článku.

#### Prozkoumání třídy book

Když je `book.cls` soubor načten, jednou z jeho posledních akcí je provést `\pagestyle{headings}` který nastaví výchozí styl stránky na `headings`, takže se na tento styl stránky podíváme podrobněji.

Jak [bylo uvedeno výše](#more-on-page-styles), vlastnosti/funkce `headings` stylu stránky, jak je implementován třídou `book` třídy, budou definovány (interním) příkazem `\ps@headings` obsaženým v souboru `book.cls`. Přesná definice `\ps@headings` závisí na tom, zda je dokument jednostranný nebo oboustranný (výchozí pro třídu `book` ).

**„Příkazy značek“ a „data značek“**

U oboustranných dokumentů vytvořených třídou `book` třídy je definice `\ps@headings` vytváří (definuje) dva „příkazy značek“: `\chaptermark` a `\sectionmark` které vytvářejí „data značek“ ve formátu `{left}{right}`, pro použití v záhlaví a zápatí. Tyto příkazy značek odrážejí model záhlaví a zápatí v LaTeXu — založený na hierarchii sekcí dokumentu:

* příkaz sekce „vyšší úrovně“ (zde, `\chapter`) se používá k poskytování „dat značek“ pro záhlaví levostranných (sudě číslovaných) stránek. Když začnete novou kapitolu napsáním `\chapter{*název kapitoly*}`, `\chaptermark` je zavolán k vytvoření „dat značek“, která odrážejí tuto novou kapitolu — obsahující její `*název kapitoly*` a číslo.
* příkaz sekce „nižší úrovně“ (zde, `\section`) se používá k poskytování „značkových dat“ pro pravostranné (liché) stránky. Když napíšete `\section{*název oddílu*}` webových stránkách `\sectionmark` bude vyvolán příkaz k vytvoření „značkových dat“, která odrážejí novou sekci — obsahující její `*název oddílu*` a číslo. Jakákoli značková data poskytnutá předchozím `\chapter` není ovlivněna žádnými následnými \section příkazy.

**\markboth a \markright**

příkazy značek specifické pro sekce v LaTeXu, jako jsou `\chaptermark` a `\sectionmark`, využívají dva další příkazy nazvané `\markboth` a `\markright` které poskytují skutečná značková data pro záhlaví a zápatí. `\markboth` a/nebo `\markright` může obsahovat příkazy pro stylování textu záhlaví nebo zápatí, například jeho převod na verzálky.

U dokumentů vytvořených pomocí `book` výchozího nastavení třídy (oboustranné, `headings` styl stránky), fungují příkazy generující značky následovně:

* `\chaptermark` generuje značková data pomocí `\markboth`
* `\sectionmark` generuje značková data `\markright`

`\markboth` a `\markright` jsou makra, která nakonec používají primitivní (vestavěný, nízkoúrovňový) `\mark` příkaz k samotnému vkládání značek generovaných uvnitř příkazů členění dokumentu.

`\markboth` má podobu

* **`\markboth{left}{right}`**: vloží značku (uzel) pomocí `\mark{{left}{right}}` což vede k uzlu značky obsahujícímu dvojici hodnot v složených závorkách `{left}{right}`.

`\markright` má podobu

* **`\markright{newright}`**: vloží značku (uzel) pomocí `\mark{{currentleft}{newright}}`; tj. změní aktuální hodnotu `pravý` na `newright` ale aktuální hodnota `levý` (tj., `currentleft`) zůstává nezměněna, což vede k uzlu značky obsahujícímu dvojici hodnot v složených závorkách `{currentleft}{newright}`.

Chování `\markboth` a `\markright` podporují dvouúrovňovou hierarchii sekcí, například dokument obsahující více sekcí v každé kapitole.

Jako příklady pro (oboustrannou) `book` třídu dokumentu (používající styl stránky záhlaví):

* `\chaptermark` používá `\markboth` k nastavení:
  * a `{left}` pole, které vysází CHAPTER. verzálkami.
  * pole {right}, které je prázdné (`{}`)
* `\sectionmark` používá `\markright` k nastavení `{right}` značkové pole k vysázení, také verzálkami.

Abychom pochopili proč `\sectionmark` používá `\markright` můžeme si všimnout, že každý nový `\section` příkaz by měl:

* vložit novou značku obsahující data pro tuto `\section` (například její název a číslo).
* ale *ne* ovlivnit hodnoty značkových dat pro aktuální `\chapter` ve které je tento konkrétní `\section` příkaz uveden

Z těchto důvodů `\section` příkaz volá `\sectionmark` který používá `\markright` k vytvoření `\section`-související značky: aktualizuje `{right}` pole značkových dat, ale neovlivní aktuální `{left}` hodnotu pole značkových dat, která byla nastavena aktuálním `\chapter`.

Poznámka: zdrojový kód LaTeXu obsahuje upozornění:

> Příkazy pro značkování fungují přiměřeně dobře pro pravé značky „číslované v rámci“ levých značek — např. levá značka je změněna příkazem \chapter a pravá značka je změněna příkazem \section. Pokud se však na stejné stránce vyskytnou 2 příkazy \markboth, vede to k poněkud anomálním výsledkům.

**Příkazy pro výstupní rutinu**

Ta `\ps@headings` příkaz implementuje definice následujících příkazů

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

které výstupní rutina používá k přidávání záhlaví a zápatí během závěrečné fáze sazby stránky. Například `book.cls` nastaví `\@oddfoot` a `\@evenfoot` na hodnotu `\@empty`, což je definováno jako `\def\@empty{}`, čímž `\ps@headings` vytváří prázdná zápatí na levých i pravých stránkách:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

Záhlaví jsou definována takto:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

kde

* `\leftmark` vybírá `{left}` hodnotu z `{left}{right}` dvojice značek
* `\rightmark` vybírá `{right}` hodnotu z `{left}{right}` dvojice značek
* \thepage vypisuje aktuální číslo stránky

V podstatě tyto implementace `\@evenhead` a `\@oddhead` vedou k následujícím výsledkům:

* `\@evenhead`: číslo stránky se objeví vlevo v záhlaví a obsah `\leftmark`, s typografií upravenou příkazem fontu `\slshape`, se vysází vpravo v záhlaví — mezilehlé bílé místo je zajištěno velmi pružným `\hfil` lepidla.
* `\@oddhead`: obsah `\rightmark`, s typografií upravenou příkazem fontu `\slshape`, se objeví vlevo v záhlaví a aktuální číslo stránky se vysází vpravo v záhlaví — opět je mezilehlé bílé místo zajištěno `\hfil` lepidla.

Zůstává však klíčová otázka: *které* `{left}{right}` dvojice značek používá `\leftmark` a `\rightmark`: jinými slovy, odkud získávají své hodnoty značkových dat?

Jak [bylo uvedeno výše](#filtering) ale [vysvětleno níže](#explainfiltering), během závěrečných fází sazby stránky jsou všechny značky obsažené na stránkách dokumentu „filtrovány“ a použity k nastavení hodnot tří globálních proměnných značek: `\botmark`, `\topmark` a `\firstmark`. Kvůli [struktuře značek LaTeXu](#latexs-model-of-headers-and-footers), bude každá z těchto 3 proměnných značek nakonec obsahovat hodnotu `{left}{right}` pro nějakou dvojici hodnot `{left}` a `{right}` a právě ty poskytují skutečnou `{left}{right}` dvojici značek (polí) pro `\leftmark` a `\rightmark`:

* `\leftmark` vybírá `levý` hodnotu z `{left}{right}` dvojice značek (polí) poskytnuté `\botmark`
* `\rightmark` vybírá `pravý` hodnotu z `{left}{right}` dvojice značek poskytnutá `\firstmark`

Poznámka `\markboth` a `\markright` může obsahovat příkazy pro stylování textu záhlaví a zápatí — například převod na verzálky.

### Příklady používající nízkoúrovňové příkazy LaTeXu

Následující příklady ukazují provádění změn ve stylech stránek nebo v záhlaví a zápatí předefinováním některých nízkoúrovňových (interních) příkazů LaTeXu diskutovaných v tomto článku (těch, které obsahují symbol @). Neprosazujeme tuto metodu pro změnu záhlaví a zápatí, ale je k dispozici těm, kteří ji potřebují (např. autorům balíčků). Preferovaným řešením pro změnu záhlaví a zápatí je použití [`fancyhdr` accents](https://ctan.org/pkg/fancyhdr?lang=en), o němž se pojednává v [článku nápovědy Overleafu](/latex/cs/formatovani/02-headers-and-footers.md).

#### Definice minimálního stylu stránky

Následující příklad definuje nový, mimořádně minimalistický styl stránky s názvem `demostyle` který používá statický text k definování záhlaví a zápatí a nespoléhá na příkazy členění dokumentu (`\chapter`, `\section` atd.) k nastavení obsahu záhlaví a zápatí.

Příklad začíná změnou kódu kategorie znaku `@` na 11, aby jej bylo možné používat v názvech maker. Příkaz `\ps@demostyle` implementuje náš minimální styl stránky předefinováním příkazů používaných (ve výstupní rutině) k vytvoření záhlaví a zápatí: `\@oddhead`, `\@oddfoot`, `\@evenhead` a `\@evenfoot`. Všimněte si `twoside` volby v našem `\documentclass` deklaraci — která používá `article` třídu.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Footer liché stránky\hfil}%
\renewcommand\@evenfoot{\hfil Footer sudé stránky\hfil}%
\renewcommand\@evenhead{\thepage\hfil Záhlaví sudé stránky}%;
\renewcommand\@oddhead{Záhlaví liché stránky\hfil\thepage}}
\catcode`@=12
\title{Ukázka stylu stránky}
\author{Overleaf}
\date{srpen 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Úvod}
\newpage
\section{Více materiálu}
\end{document}
```

[Otevřete tento příklad v Overleafu](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Změna záhlaví pro třídu book

Následující příklad mění záhlaví pro třídu book předefinováním `\@oddhead` a `\@evenhead` tak, aby záhlaví levých i pravých stránek obsahovalo aktuální číslo stránky a název kapitoly. Všimněte si, jak druhý `\chapter` příkaz používá volitelný krátký název kapitoly `[Krátký název]` který nyní poskytuje text záhlaví místo dlouhého názvu.

`\section` příkazy nemají na obsah záhlaví žádný vliv, protože naše předefinice záhlaví používají pouze `\leftmark` který získává údaje o aktuální kapitole. Pro přístup k údajům o aktuální sekci bychom museli použít `\rightmark` v definici `\@oddhead` a/nebo `\evenhead`.

```latex
\documentclass{book}
% Pozn.: kód kategorie znaku '@' je dočasně změněn na 11
% aby jej bylo možné používat v názvech příkazů
\catcode `@=11
% Nechť \@oddfoot a \evenfoot jsou ekvivalentní \@empty
% aby byly prázdné (neobsahovaly nic)
\let\@oddfoot\empty\let\evenfoot\empty
% Předefinujte \@oddhead a \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Použijte vhodně malou velikost stránky
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Vzpomínky uživatele \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Toto je úvodní část, která používá římské číslice.
\mainmatter
\chapter{Kde mám začít?}
Kapitola 1: Krátká kapitola.
\newpage
\section{Na začátku...}
Sekce.
\chapter[Krátký název]{Kapitola s velmi dlouhým názvem, kvůli kterému se nehodí do záhlaví}
\newpage
\section{Další sekce}
S malým množstvím obsahu.
\newpage
\section{Cože, další sekce?}
Taky s malým množstvím obsahu.
\end{document}
```

[Otevřete tento příklad v Overleafu](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Použití rozšířených příkazů značek ε-TeXu

Ta `book` třída používá následující definice `\@evenhead` a `\@oddhead` pro vytváření záhlaví:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

kde jsou příkazy `\leftmark` a `\rightmark` definovány jako

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

S použitím rozšířených příkazů ε-TeXu a ekvivalence mezi třídou značek 0 v ε-TeXu a původními příkazy TeXu můžeme:

* přepsat `\leftmark` k nahrazení `\botmark` s ε-TeXovým `\botmarks0` ekvivalentem, a
* přepsat `\rightmark` k nahrazení `\firstmark` s ε-TeXovým `\firstmarks0` ekvivalentem

Tyto předefinice vytvářejí

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Všimněte si použití `\relax` k ukončení hledání dalších číslic v TeXu — můžete také nahradit `\relax` mezerou, která bude fungovat jako ukončovač.

Následující příklad produkuje výstup, který je shodný s původními definicemi `\leftmark` a `\rightmark`.

```latex
\documentclass{book}
% Předefinujte \leftmark a \rightmark tak, aby používaly
% \botmarks0 a \firstmarks0, v uvedeném pořadí
% Pozn.: kód kategorie znaku '@' je dočasně změněn na 11
% aby jej bylo možné používat v názvech příkazů
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Použijte vhodně malou velikost stránky
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Vzpomínky uživatele \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Toto je úvodní část, která používá římské číslice.
\mainmatter
\chapter{Kde mám začít?}
Kapitola 1: Krátká kapitola.
\newpage
\section{Na začátku...}
Sekce.
\newpage
Další sekce.
\end{document}
```

[Otevřete tento příklad v Overleafu](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Poznámky k ε-TeXu**

Jak [jsme výše poznamenali](#etex), ε-TeX zavádí `\marks` příkazu:

```latex
\marks n {stuff to store}
```

který rozšiřuje původní `\mark` funkci Knuthova TeXového enginu a je dostupný ve všech třech hlavních TeXových enginách: pdfTeX, LuaTeX a XeTeX.

Implementace ε-TeXu také zavádí nové globální proměnné značek `\firstmarks n`, `\botmarks n` a `\topmarks n`: jednu pro každou třídu `n`. Tyto proměnné značek založené na třídách jsou určovány [pomocí mechanismů uvedených výše](#pre-output-checks-looking-for-mark-nodes), a všechny mohou být použity při tvorbě záhlaví a zápatí.

Můžete použít kteroukoli z $$2^{15}$$ = 32768 tříd značek v rozsahu od 0 do 32767 v rámci předefinic `\leftmark` nebo `\rightmark`. To předpokládá, že jste pro zvolenou třídu značek poskytli (vložili) vhodná značková data, `n`, prostřednictvím `\marks n{{left}{right}}`.

Všimněte si, že LuaTeX poskytuje $$2^{16}$$ = 65536 tříd značek, s `n` v rozmezí od 0 do 65535.

**Příklad použití třídy značek 10**

Tento příklad ukazuje použití třídy značek 10 (vybrané náhodně) k vytvoření záhlaví dokumentu. Ukázkový dokument vysází 6 stránek, které obsahují posloupnost značek uvedenou v [pracovaném příkladu na konci tohoto článku](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Studium tohoto příkladu ukáže, proč TeXový engine vybral určitou značku, $$\alpha$$, $$\beta$$, $$\gamma$$ a $$\delta$$, pro použití v každém ze záhlaví.

Začneme definicí pomocného makra, `\domark`, které používá `\marks 10` k vložení značkových dat, která následují po LaTeXové `{left}{right}` konvenci:

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

Značky třídy 10 jsou zpřístupněny mechanismu záhlaví a zápatí LaTeXu předefinováním `\leftmark` a `\rightmark`—s malým doplněním informací:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (prostřednictvím \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (prostřednictvím \texttt{\string\firstmarks10})}
```

Po vložení několika značek (třídy 10) TeXový engine (zde pdfTeX) ochotně vytvoří globální proměnné značek pro třídu 10 —`\botmarks10`, `\topmarks10` a `\firstsmarks10` které `\leftmark` a `\rightmark` se používají k vytvoření záhlaví.

```latex
\documentclass{book}
% Krátký příkaz pro použití značek třídy 10
% a sledující LaTeXovu strukturu značek {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Předefinujte \leftmark a \rightmark tak, aby používaly
% \botmarks10 a \firstmarks10, v uvedeném pořadí
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (prostřednictvím \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (prostřednictvím \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Ukázka vylepšených značek \(\varepsilon\)-TeXu}
\author{Overleaf}
\date{srpen 2022}
\begin{document}

Stránka 1: Nebyly přidány žádné značky, takže všechny proměnné značek zůstávají ve svém inicializovaném stavu: prázdné (NULL).

\newpage
Stránka 2: Značka $\alpha$ přidána na tuto stránku pomocí

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Stránka 3: Na tuto stránku nebyly přidány žádné nové značky.

\newpage
Stránka 4: Na tuto stránku byla přidána značka $\beta$ následovaná značkou $\gamma$ pomocí

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Stránka 5: Na tuto stránku byla přidána značka $\delta$ pomocí

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Stránka 6: Na tuto stránku nebyly přidány žádné značky.
\end{document}
```

[Otevřete tento příklad v Overleafu](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

Následující grafika ukazuje záhlaví vytvořená tímto příkladem:

![Grafika zobrazující výstup z kódu LaTeXu používajícího rozšířené příkazy značek ε-TeXu](/files/bfeb52e97b72c56ad1b92c1b681515ba39ff0f1b)

* **Poznámka**: Záhlaví na stránce 1 je vytvořeno v době, kdy jsou všechny tři proměnné značek pro třídu 10 —`\botmarks10`, `\topmarks10` a `\firstsmarks10`—prázdné. Konečným výsledkem je, že `\rightmark` (pro stránku 1) vloží pouze poslední fragment záhlaví: `(prostřednictvím \texttt{\string\firstmarks10})`, jak je ukázáno na obrázku výše.

## Pracovaný příklad ukazující, jak TeXové enginy určují hodnoty \botmark, \topmark a \firstmark

![Db.gif](/files/4622490578cc58ae23a170bf4248fe13c6123455)![Db.gif](/files/4622490578cc58ae23a170bf4248fe13c6123455) Připadá vhodné zopakovat Knuthovo použití dvojitých značek nebezpečí (obrázek s laskavým svolením [této webové stránky](http://www.truetex.com/db.htm)) protože materiál je poněkud nízkoúrovňový a „dívá se pod kapotu“ — ačkoli doufáme, že může být zajímavý pro odvážné čtenáře, kteří chtějí pochopit ještě několik detailů.

Následující rozbor je úzce založen na posledním příkladu na straně 258 z [TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Zde jsme tento příklad upravili a znovu vysázeli pro ty, kteří nemají přístup k The TeXbook:

![Upravená a znovu vysázená verze příkladu ze strany 258 z The TeXbook](/files/9a4209b496692ce52aad437c6ab21944e7394352)

Tabulka uvedená v této grafice je reprodukována z tabulky poskytnuté Knuthem, ale stejně jako originál neobsahuje vysvětlení, jak byla odvozena. Zde to napravíme a poskytneme další podrobnosti ukazující, jak byly tyto hodnoty `\botmark`, `\topmark` a `\firstmark` určeny — získání těchto podrobností vyžadovalo prozkoumání zdrojového kódu TeXového enginu!

Proces nastavování hodnot pro `\botmark`, `\topmark` a `\firstmark` lze shrnout do 3 krátkých úryvků pseudokódu, jak ukazuje následující diagram a následná vysvětlení:

1. Předobsahová kontrola
2. Smyčka obsahu
3. Poobsahová kontrola

Poznámka:

* Testy v kroku 1 „Předobsahová kontrola“ a kroku 3 „Poobsahová kontrola“ se provádějí jednou na každou stránku.
* Krok 2 „Smyčka obsahu“ zahrnuje, že TeX prochází obsah stránky a hledá uzly značek, které používá k nastavení hodnot proměnných značek, jak je ukázáno.

![Obrázek zobrazující pseudokódové verze kódu používaného k nastavení hodnot tří globálních proměnných značek používaných TeXovými enginy](/files/0c739096d328b645d21f9aa5c564f6c772211ded)

Pokaždé, když TeX najde vhodný zlom stránky, odešle obsah této stránky k závěrečnému zpracování a provede tyto (tři) kroky zpracování značek pro každou stránku ve vašem dokumentu. Kroky zpracování označené 1, 2 a 3 jsou uvedeny v závěrečném diagramu v této části.

Všimněte si, že:

* před zpracováním první stránky jsou všechny tři globální proměnné značek `\botmark`, `\topmark` a `\firstmark` inicializovány jako prázdné (NULL).
* konečné hodnoty `\botmark`, `\topmark` a `\firstmark` určené na konci *předchozí* stránky se stanou (vstupními) hodnotami pro zpracování *aktuální* stránky — té právě zpracovávané.

Následující úryvky kódu jsou ***pseudokód*** odvozeny (shrnuty) ze skutečného zdrojového kódu TeXového enginu. Cílem je poskytnout stručné shrnutí kódu, které pomůže demonstrovat klíčové principy.

**Krok 1: Předobsahová kontrola** Než TeX projde skutečný obsah aktuální stránky, zkontroluje, zda je aktuální `\botmark` hodnota — tj. vyplývající z *předchozí* stránky — prázdná (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

V tomto testu, pokud `\botmark` (z *předchozí* stránky) je *ne* prázdná:

* `\topmark` pro *aktuální* stránku je nastavena na *předchozí* stránky `\botmark` hodnota
* `\firstmark`, pro *aktuální* stránku (právě zpracovávanou) se nastaví na prázdnou (NULL): začněte tuto stránku s předpokladem, že neexistují žádné `\mark` uzly.

Všimněte si, že tento test se provádí *jednou* pro každou zpracovávanou stránku.

**Krok 2: Smyčka obsahu** Dále TeX prochází obsah stránky; součástí této smyčky je hledání `\mark` uzlů:

```latex
if(type(node)==mark_node)
{
   if(\\firstmark==NULL)
   {
      \\firstmark=node(text);
   }
   \\botmark= node(text);
}
```

Tento test se aplikuje na každý uzel značky nacházející se uvnitř (obsažený na) aktuální stránky. Předchozí test (Krok 1 výše) mohl nastavit `\firstmark` na prázdnou hodnotu, takže úplně první značka nalezená na aktuální stránce se stane hodnotou `\firstmark` a `\botmark`. Jakýkoli *následný* `\mark` uzel zjištěný během vykonávání této smyčky nezmění hodnotu `\firstmark`, protože už není prázdná (NULL), ale `\botmark` se aktualizuje — protože to je účel `\botmark`: uložit naposledy viděný `\mark` uzel pro tuto stránku.

**Krok 3: Kontrola po obsahu** Jakmile projde obsahem stránky TeX použije následující, závěrečný test, který se také provádí jednou na každou stránku:

```latex
if((\\topmark != NULL)&&(\\firstmark==NULL))
{
	\\firstmark= \\topmark;
}
```

* Pokud `\topmark` není prázdná (NULL), víme z Kroku 1, že `\botmark` pro předchozí stránku nebyla prázdná (NULL).
* Pokud `\firstmark` je stále prázdná, pak jsme neviděli žádné `\mark` uzly, protože test v Kroku 2 nebyl spuštěn; následkem toho, `\firstmark` se nastaví na hodnotu `\topmark` která je zároveň hodnotou `\botmark` z předchozí stránky.

Po postupném použití těchto tří kroků na všech 6 stránkách našeho příkladu jsou hodnoty `\botmark`, `\topmark` a `\firstmark` odvozeny pomocí přechodů zobrazených v následujícím diagramu, kde:

* světle modré zaoblené obdélníky představují konečné hodnoty proměnných značek pro každou stránku
* světle šedé zaoblené čtverce představují průběžné hodnoty vznikající během zpracování
* šipky s popisky představují změny hodnot proměnných značek podle kroků 1, 2 nebo 3 v diagramu výše — nebo že hodnota nebyla změněna žádným z kroků; označeno „beze změny“.

Následující diagram ukazuje, jak tři fragmenty pseudokódu generují konečné hodnoty `\botmark`, `\topmark` a `\firstmark` uvedené v tabulce na straně 258 knihy The TeXbook.

![Diagram přechodů doprovázející příklad ze strany 258 knihy The TeXbook, zobrazující vnitřní přechody při přiřazování hodnot globálním proměnným značek](/files/2f60d40ab6b8c43441c002655350ca9fbe27ba69)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
