> 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/dalsi-temata/20-how-tex-macros-actually-work-part-2.md).

# Jak makra TeXu ve skutečnosti fungují: Část 2

[Část 1](/latex/cs/dalsi-temata/19-how-tex-macros-actually-work-part-1.md) [Část 2](/latex/cs/dalsi-temata/20-how-tex-macros-actually-work-part-2.md) [Část 3](/latex/cs/dalsi-temata/21-how-tex-macros-actually-work-part-3.md) [Část 4](/latex/cs/dalsi-temata/22-how-tex-macros-actually-work-part-4.md) [Část 5](/latex/cs/dalsi-temata/23-how-tex-macros-actually-work-part-5.md) [Část 6](/latex/cs/dalsi-temata/24-how-tex-macros-actually-work-part-6.md)

## Úvod: Příběh v obrázcích

Jak bylo uvedeno v části 1, TeX musí „přečíst“ každý znak ve vašem `.tex` souboru a tento proces čtení se přesněji označuje jako *skenování*. Tradičně se vstupní zpracování TeXu (skenování) přirovnává k tomu, že TeX má „oči“, kterými sleduje vstup, takže tuto osvědčenou analogii použijeme i v obrázcích níže.

### Obrázek 1: Oči jsou připravené

Předpokládejme, že TeX získal nějaký vstup ze `.tex` souboru a právě se chystá zpracovat náš řetězec znaků `Hello World \jobname` obsažený v odstavci textu. Postupně zkontroluje každý znak a prozkoumá jeho kód kategorie.

![TeXovy oči připravené ke skenování řádku textu](/files/baaafa62bb4b1bc6971dc3b53d3c6060936c5314)

### Obrázek 2: Zpracování kódů kategorie

V následujícím obrázku vidíme v obrysech (další podrobnosti níže), jak TeX reaguje na několik různých kódů kategorie. Celkem existuje 16 kódů kategorie, ale pro jednoduchost znázorňujeme použití jen tří: 11, 10 a 0. Ostatní kódy znaků se stávají důležitými během sázecích procesů TeXu, jako je sestavování tabulek, sazba matematiky a rozpoznávání parametrů maker.

![TeX reagující na několik různých kódů kategorie](/files/51835cbecc4e27107a27ed59af7f16b487612122)

#### Poznámky k obrázku 2

Zde uvažujeme TeX, jak čte (skenuje) znaky, které tvoří část odstavce textu. TeX zkoumá každý znak, kontroluje jeho kód kategorie a podle kódu kategorie a TeXova „režimu“ (stavu založeného na tom, co právě dělá) provádí příslušnou akci.

* **(zelené oči)** TeX uvidí, že každý z těchto znaků má kód kategorie 11 („písmeno“) a předá tyto znaky k sazbě jako součást odstavce, který vytváří. TeX však nepředává (nepoužívá) samotný kód znaku, ale místo toho používá dvojici čísel (kód znaku, kód kategorie) k výpočtu složené celočíselné hodnoty zvané *znakový token* (viz níže). Jakmile je tento znakový token vytvořen, vstupuje do vnitřních sázecích procesů/algoritmů TeXu.
* **(modré oči)** TeX uvidí znak mezery (ASCII 32) s kódem kategorie 10 („oddělovače“) — všimněte si, že jak bylo uvedeno, je docela možné, aby kód kategorie mezery (ASCII 32) nebo jakéhokoli znaku byl před načtením TeXem změněn na jinou hodnotu.

Způsob, jakým TeX skutečně zpracovává znaky s kódem kategorie 10 („oddělovače“), se liší podle toho, kdy/kde je TeX vidí — podle aktuálního „režimu“ TeXu. Například někdy je TeX jednoduše přeskočí. Zde TeX pozná, že při zpracování odstavce textu detekoval znak s kódem kategorie 10 (což je shodou okolností mezera, ASCII 32), a tak jej nakonec převede na tzv. mezislovní lepidlo: jakýsi pružný prostor, který se může roztahovat nebo smršťovat.

* **(červené oči)** Zde TeX zaznamenal znak, který má velmi důležitý kód kategorie: 0 (escape znak).

Escape znak—*jakýkoli* znak s kódem kategorie 0—říká TeXu, aby přepnul do speciálního režimu čtení a pečlivě skenoval (četl) následující znaky, protože ty identifikují název *příkaz*, nikoli text určený k sazbě. V literatuře o TeXu uvidíte, že termín „command“ je také označován jako *řídicí sekvence*. Po spatření escape znaku TeX zkontroluje kód kategorie znaku, který následuje *bezprostředně za ním*; je to proto, že TeX rozpoznává dva typy příkazu:

* vícepísmenné příkazy zvané *řídicích slov*: znak bezprostředně následující za escape znakem má kód kategorie 11. Všechny následující znaky, které mají kód kategorie 11, jsou považovány za součást názvu příkazu. TeX přestane hledat znaky, které tvoří část názvu příkazu, když detekuje jakýkoli znak, který *ne* nemá kód kategorie 11 — například znak mezery s kódem kategorie 10.
* jednopísmenné příkazy zvané *řídicí symboly*: znak bezprostředně následující za escape znakem *ne* má kód kategorie 11.

Escape znak si můžete představit jako podnět, který TeX „vyvede“ z jeho obvyklého chování při skenování a přiměje jej zvolit jiný přístup k několika dalším znakům — to je naznačeno červeným tečkovaným rámečkem ukazujícím, že TeX bude **Začít skenovat pro příkaz**.

### Obrázek 3: Zpracování kódu kategorie 11 („písmena“)

V části 1 této série jsme poznamenali, že každý znak, který TeX čte ze svého vstupu, je popsán dvěma celými čísly:

* kód znaku: celé číslo definující číselnou reprezentaci znaku;
* kód kategorie: hodnota od 0 do 15, kterou TeX přiřazuje každému znaku, jenž se může objevit ve vstupu.

TeX používá tyto dvě informace v další fázi svého zpracování: při vytváření znakových tokenů.

Obrázek 3 rozvíjí Obrázek 2 a ukazuje, co TeX dělá s těmito vstupními znaky s kódem kategorie 11 (písmeno): vytváří *znakové tokeny*— celočíselné hodnoty, které TeX vypočítává pomocí kombinace kódu kategorie a kódu znaku daného znaku.

**Poznámka**: V tomto příkladu se zabýváme pouze znaky s kódem kategorie 11, ale měli byste vědět, že TeX vytváří tokenové hodnoty i pro vstupní znaky s jinými kódy kategorie — s výjimkou kódu kategorie 0, který se nikdy nepřemění na token: escape znak jednoduše funguje jako „přepínač“ pro spuštění zvláštního zpracování.

![TeX zpracovávající znaky s kódem kategorie 11](/files/9abcc74a6b81f6cbf4073b3a3563802d5c832180)

Obrázek 5 níže ukáže, co TeX dělá, když uvidí znak s kódem kategorie 0 (escape znak).

#### Poznámky k obrázku 3: Zpracování kódu kategorie 11 („písmeno“)

Zde se zaměříme na **green** aktivitu: co se stane, když TeX uvidí znaky, které mají kód kategorie 11 („písmeno“). Poté, co TeX přečte znak a určí jeho kód kategorie (zde je to 11), co TeX udělá dál, je *zkombinovat* tuto dvojici čísel do jediného celého čísla zvaného znakový token: tyto tokeny (celá čísla) jsou předávány do další fáze vnitřních sázecích algoritmů/zpracování TeXu. Jak bylo uvedeno, TeX bude vytvářet znakové tokeny i pro znaky s jinými kódy kategorie (tj. ne 11), zde používáme kód kategorie 11 jen jako příklad.

Každý znakový token (celé číslo) trvale svazuje vstupní znak s kódem kategorie přiřazeným tomuto znaku **v době, kdy jej TeX skenoval (četl)**: tato skutečnost je zásadně důležitá pro pochopení chování maker TeXu/LaTeXu. Samozřejmě při dalším zpracování bude TeX někdy potřebovat znakový token rozdělit, aby zjistil, která dvojice (kód znaku, kód kategorie) byla použita k vytvoření daného tokenu. Jakmile je však znak načten vstupním (skenovacím) procesem TeXu, hodnota znakového tokenu vypočítaná TeXem způsobí, že je tento znak *trvale* spojen s kódem kategorie, který mu byl přiřazen *v době načtení*.

**Výpočet znakových tokenů**

Enginy TeXu používají jednoduchý vzorec k výpočtu znakového tokenu, $$T$$, ze znaku s kódem kategorie $$C$$ a kódem znaku $$A$$:

$$T = \text{constant} \times C + A$$

8bitové enginy, jako je pdfTeX, používají:

$$T = 256\times C + A$$

Enginy podporující Unicode, jako XeTeX nebo LuaTeX, musí použít jiný vzorec, protože v Unicode mohou být kódy znaků mnohem větší než maximum 255 ve starším světě 8bitového kódování ASCII. XeTeX například používá:

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

Opět stojí za zmínku, že znaky s kódem kategorie 0 se nepřevádějí na znakové tokeny: kód kategorie 0 má v TeXově vstupním filtrování velmi zvláštní místo a slouží čistě jako „přepínač“, který spouští TeX do zvláštního režimu skenování několika dalších znaků. Obrázek 5 se tomu věnuje.

### Obrázek 4: Zpracování kódu kategorie 10 („oddělovač“)

Zacházení TeXu se znaky s kódem kategorie 10 („oddělovač“) závisí na tom, na čem TeX právě pracuje, když ve vstupu detekuje znak s kódem kategorie 10. V našem příkladu TeX provádí běžné zpracování odstavce a znak mezery s kódem kategorie 10 bude převeden na mezislovní lepidlo.

![TeX zpracovávající znaky s kódem kategorie 10](/files/158570b3268cf74e632029fbfa4a37bb872aa380)

Zacházení TeXu s mezerami může působit dosti svévolně, ale dobrý přehled lze nalézt v kapitolách 1 a 2 knihy [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) od Victora Eijkhouta — můžete si [stáhnout bezplatnou PDF kopii](https://bitbucket.org/VictorEijkhout/tex-by-topic) prostřednictvím jeho webu.

Například když TeX uvidí znak s kódem kategorie 10, jsou chvíle, kdy TeX:

* přeskočí (ignoruje) všechny z nich — např. když je TeX ve svislém režimu;
* převede více oddělovačů na jediný oddělovač — přeskočí nadbytečné mezery, například při zpracování odstavce;
* pohltí je — např. pohltí jednu mezeru za názvem příkazu;

Všimněte si také, že někdy TeX také *generuje* mezery — převodem znaků konce řádku na mezeru. Chování/zacházení se znaky mezery (jakýkoli znak s kódem kategorie 10) je jednou z TeXových „zvláštností“: chvíli trvá, než si na tento aspekt TeXu zvyknete a budete se v něm cítit pohodlně.

### Obrázek 5a: Zpracování kódu kategorie 0 („escape znak“)

V tomto obrázku TeX zpracoval všechny znaky až do `\` znaku, který má kód kategorie 0: „escape znak“ — použijeme další sérii obrázků, abychom ukázali, jak TeX zpracovává escape znak a identifikuje název příkazu.

![TeX zpracovávající znaky s kódem kategorie 0](/files/01e18ea248720e75ff5a216282d37abc8809a7ea)

### Obrázek 5b: Hledání názvu příkazu

V tomto obrázku se podíváme do části s červeně tečkovaným rámečkem (**Začít skenovat pro příkaz**) a uvidíme, co TeX dělá poté, co uviděl escape znak.

![TeX hledající název příkazu](/files/b72fe7486671b5811bc3f27a7306eefe91b57dea)

**Poznámky k obrázku 5b**

* Jakmile je escape znak rozpoznán, splnil svůj úkol: působil jako přepínač a nepodílí se na dalším zpracování — konkrétně se **ne** převádí na znakový token.
* Pro pohodlí zopakujeme některé dříve zmíněné podrobnosti. Po spatření escape znaku TeX zkontroluje kód kategorie znaku, který následuje *bezprostředně za ním*; je to proto, že TeX rozpoznává dva typy příkazu:
* * vícepísmenné příkazy zvané *řídicích slov*: znak bezprostředně následující za escape znakem má kód kategorie 11. Všechny následující znaky, které mají kód kategorie 11, jsou považovány za tvořící název příkazu (*řídicí slovo*). TeX přestane hledat znaky, které tvoří část názvu příkazu, když detekuje jakýkoli znak, který *ne* nemá kód kategorie 11 — například znak mezery s kódem kategorie 10.
  * jednopísmenné příkazy zvané *řídicí symboly*: znak bezprostředně následující za escape znakem *ne* má kód kategorie 11.
* V našem příkladu je prvním znakem po `\` je `j` (kód kategorie 11), což TeXu říká, aby hledal příkaz, který je (potenciálně) vícepísmennou sekvencí znaků s kódem kategorie 11.
* TeX dál kontroluje další znaky s kódem kategorie 11. Jakmile detekuje znak s jiným kódem kategorie, například mezeru s kódem kategorie 10, TeX ví, že dosáhl konce názvu příkazu. Jen pro zdůraznění: zde to byl znak mezery (kód kategorie 10), který „ukončil“ název příkazu, ale mohl to být jakýkoli znak, který **ne** má kód kategorie 11.

## Část 3

V části 3 budeme pokračovat od Obrázku 5b a dokončíme tuto část příběhu — jak TeX identifikuje příkaz — a přesuneme se k tomu, co dělá dál. Také se podíváme hlouběji na některé vnitřní aspekty zpracování TeXu — některé části lze při prvním čtení přeskočit, pokud vás opravdu baví detaily.

[Část 1](/latex/cs/dalsi-temata/19-how-tex-macros-actually-work-part-1.md) [Část 2](/latex/cs/dalsi-temata/20-how-tex-macros-actually-work-part-2.md) [Část 3](/latex/cs/dalsi-temata/21-how-tex-macros-actually-work-part-3.md) [Část 4](/latex/cs/dalsi-temata/22-how-tex-macros-actually-work-part-4.md) [Část 5](/latex/cs/dalsi-temata/23-how-tex-macros-actually-work-part-5.md) [Část 6](/latex/cs/dalsi-temata/24-how-tex-macros-actually-work-part-6.md)


---

# 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/dalsi-temata/20-how-tex-macros-actually-work-part-2.md?ask=<question>&goal=<endgoal>
```

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

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

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