> 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/21-how-tex-macros-actually-work-part-3.md).

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

[Čá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)

## Je čas na pauzu!

Než budeme pokračovat k další části tohoto příběhu, potřebujeme si zopakovat: připomenout si, kam směřujeme, a srovnat si myšlenky, aby bylo jisté, že jsou na místě všechny klíčové myšlenky. Jen připomínám, náš řešený příklad je založen na předpokladu, že TeX přečetl řádek textu obsahující `Hello World \jobname` a že TeX jej sazí, aby vytvořil odstavec.

### Konečný cíl

Naším cílem je rozvinout lepší (hlubší) porozumění povaze maker TeXu a tomu, jak fungují. Než se k tomu však dostaneme, musíme nejprve pochopit, jak TeX čte vstupní soubor a zpracovává v něm obsažené znaky. Zde je shrnutí témat, která jsme dosud probrali.

* TeX čte (skenuje) každý znak ve vašem vstupu a ke každému znaku má TeX dvě informace:
* **znakový kód**: celé číslo používané k identifikaci daného znaku, např. při uložení v vstupním souboru .tex;
* **kategoriální kód**: další celé číslo, interní pro TeX, které používá k přiřazení významu každému znaku přečtenému ze vstupu.
* Jakmile je znak načten TeXem, kód kategorie každého znaku se stává *natrvalo* spojen s daným jednotlivým znakem prostřednictvím vytvoření znakového tokenu:
* TeX používá jednoduchý vzorec, aby „zabalil“ kód znaku a jeho odpovídající kód kategorie do celého čísla nazývaného znakový token.
* Můžete změnit význam libovolného znaku, který TeX ještě *dosud nenačetl* přiřazením jiného kódu kategorie libovolnému znaku, jehož chování chcete změnit — tj. upravit způsob, jakým TeX s daným znakem zachází.
* Předefinování (přemapování) kódů kategorií se provádí pomocí TeXovy primitivy `\catcode` příkaz.
* Když TeX uvidí kód kategorie 0, přepne se do zvláštního skenovacího režimu a začne hledat příkaz: buď (potenciálně) vícepísmenné *řídicí slovo* nebo jednopísmenný *řídicí symbol*.

Dosud jsme se zabývali procesem skenování vstupu v TeXu, když identifikuje jednotlivé znaky a používá kód kategorie každého znaku, aby určil, co dělat dál. Některé znaky jsou jen obyčejné položky textu pro sazbu (např. kód kategorie 11), ale viděli jsme také znaky mezery (kód kategorie 10) a únikové znaky (kód kategorie 0). Existují i další kódy kategorií, které jsme kvůli stručnosti neprobírali — například kód kategorie 1 („zahájit skupinu“, např., `{`), kód kategorie 2 („ukončit skupinu“, např., `}`) a další. Každý kód kategorie hraje v TeXově skenování vstupu a následném zpracování vlastní roli v softwarových procesech/algoritmech uvnitř TeXu.

### Tokeny: rychlé zopakování

Pojem „tokenů“ je pro způsob, jakým TeX funguje, zásadní: na „tokeny“ narazíte nebo se o nich bude hovořit v knihách, článcích i online komunitách o TeXu, takže stojí za to toto téma stručně zopakovat — více podrobností najdete v dříve publikovaném článku [Co je „TeX token“?](/latex/cs/clanky-do-hloubky/53-what-is-a-tex-token.md)

Už jsme viděli, že TeX převádí vstupní znaky na tokeny spojením kódu znaku a kódu kategorie do jediného složeného celého čísla. TeX dělá něco podobného i pro příkazy: pomocí názvu příkazu vypočítá celé číslo nazývané *příkazový token* (budeme to zkoumat podrobněji). Jako vodítko si můžete tokeny představit jako způsob, jakým TeX „balí“ položky, které přečetl ze vstupu, a připravuje je k předání do další fáze zpracování v TeXu. To, že jsou všechny položky (znaky nebo příkazy) úhledně zabaleny do jedné číselné reprezentace, usnadňuje jejich další zpracování v řetězci. Například když si TeX chce uložit část vašeho vstupu pro pozdější použití, například definici makra, stačí TeXu uložit vaši definici makra, ať je jakkoli složitá, jako posloupnost celých čísel, kde každé celé číslo je token představující znak nebo příkaz, který tvoří část (je obsažen uvnitř) definice vašeho makra.

## Tak co dál?

V závěrečné části 2. dílu jsme viděli, jak únikový znak (kód kategorie 0) přepne TeX do zvláštního režimu zpracování, v němž hledá název příkazu. V našem příkladu TeX rozpoznal řetězec znaků `jobname` a 2. díl jsme ukončili ve chvíli, kdy se TeX chystal s tímto řetězcem znaků (názvem příkazu) „něco udělat“. V této části se podíváme podrobně na to, co TeX udělá dál.

Jakmile TeX identifikuje, že určitá posloupnost znaků ve vašem vstupním souboru představuje název příkazu (zde `jobname`) může TeX v závislosti na tom, co právě dělá, potřebovat tento příkaz vykonat. Říkáme „může potřebovat“, protože jsou chvíle, kdy se TeX nepokusí příkaz vykonat okamžitě: například když definuje makro (TeX vytváří seznamy tokenů) — témata, o nichž budeme mluvit později. Budeme však pokračovat v našem příkladu, kdy TeX sází odstavec a *bude*, v této situaci potřebuje vykonat `\jobname`.

### Od řetězce znaků k vykonání příkazu: jak?

Nejprve se vraťme ke grafice 5b z 2. dílu, v níž TeX identifikoval, že určitý řetězec znaků ve vstupu tvoří název příkazu: `jobname`. Grafika 5b naznačuje, že TeX má „zkontrolovat interní tabulky...“. Co to *ve skutečnosti znamená*?

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

Další, podrobnější popis toho, jak TeX „kontroluje interní tabulky“, aby přešel od řetězce znaků (např., `jobname`) k přesnému určení, jaký příkaz to je a co znamená, najdete v předchozím článku [Co je „TeX token“?](/latex/cs/clanky-do-hloubky/53-what-is-a-tex-token.md) Zde shrneme klíčové myšlenky a pokusíme se přitom vyhnout zbytečnému opakování.

Začněme analogií. Představte si, že čtete knihu a narazíte na neznámé slovo: co uděláte? Dnes je to téměř jistě „sáhnete po Googlu“, ale předpokládejme, že dáváte přednost starší metodě: sáhnete po slovníku, který uvádí slova a poskytuje jejich význam(y). TeX má podobný mechanismus: interní „slovník“, který uvádí všechny příkazy aktuálně známé TeXu — a „význam“ těchto příkazů. Pod pojmem „význam“ rozumíme, jaký typ příkazu to je: co dělá, plus jakékoli další informace, které TeX může k vykonání toho příkazu potřebovat. Všimněte si také, že pojem „příkaz“ zahrnuje jakákoli makra TeX/LaTeX napsaná uživateli/programátory TeXu a [stovky vestavěných primitivních příkazů](/latex/cs/dalsi-temata/46-tex-primitives-listed-by-tex-engine.md).

Pokračujme v analogii se slovníkem. Když jako lidský čtenář potřebujeme zjistit význam slova, prohledáme slovník pomocí abecedního seznamu slov, který slovník poskytuje — ale TeX samozřejmě takto úplně nefunguje. Vraťme se k našemu původnímu `jobname` příkladu: jak TeX ve svém „slovníku“ najde „význam“ `jobname`— a co tento „význam“ TeXu vlastně poskytuje?

Místo toho, aby poskytoval interní „abecední seznam“ všech příkazů, které TeX zná, dělá něco trochu jiného. TeX převede celou posloupnost znaků — obsaženou v názvu příkazu — na jediné celé číslo, které se použije k identifikaci (zastoupení) daného příkazu. Uvnitř si TeX vede velký „slovník“ všech známých příkazů, do něhož ukládá *celá čísla* vypočítaná z názvů příkazů — všimněte si, že tento slovník neukládá samotné názvy příkazů jako posloupnosti písmen (nazývané *řetězce*). TeX používá tento slovník pro všechny své vestavěné příkazy (primitiva) *a* a použije jej k uložení údajů o jakémkoli makru (příkazu) vytvořeném uživateli: název vašeho makra se převede na celé číslo a toto číslo je „zaregistrováno“ ve slovníku TeXu.

Pokaždé, když TeX rozpozná příkaz použitý ve vašem vstupu a potřebuje o tomto příkazu něco vědět, převede posloupnost znaků v názvu příkazu na „ekvivalentní“ celé číslo a toto číslo použije k vyhledání příkazu ve svém „velkém slovníku“. Programátory mezi vámi možná potěší, že TeX používá formu [hashovací funkce](https://en.wikipedia.org/wiki/Hash_function) k provedení této konverze.

![Diagram hashovací funkce](/files/2139c31519c646a6a29653f85f6f605f36b0b387)

### Grafika 6: Od znaků k významu příkazu

Následující grafika ukazuje cestu, kterou příkaz prochází, když TeX převádí řetězec znaků na ekvivalentní celé číslo, které nazývá **curcs**, a toto celé číslo používá k vyhledání významu příkazu ve „velkém slovníku“ TeXu. Výsledkem tohoto vyhledání jsou dvě informace: dvě celá čísla nazývaná **curcmd** a **curchr**, která může TeX použít k přesnému určení, co příkaz dělá a jak jej následně vykonat.

![TeX převádí řetězec znaků na ekvivalentní celé číslo, aby vyhledal význam příkazu](/files/680e2b9f815c5524ec53b7b29bd3d76b819dde7a)

Interně si TeX vede proměnnou nazvanou **curcs** (**aktu**ální **c**řídicí **s**sekvence) která se používá k ukládání celočíselné hodnoty příkazu, na němž TeX právě pracuje — tj., **curcs** ukládá celé číslo vypočítané z názvu příkazu. To ale není celý příběh, protože je tu ještě jeden detail: pokud TeX právě přečetl/zpracoval znak, nikoli příkaz, nastaví **curcs** na hodnotu 0, aby si pamatoval, že poslední načtená věc byl znak, nikoli příkaz.

### Co příkazy znamenají pro TeX

Když se podíváme na množinu [vestavěných příkazů poskytovaných enginy TeXu](/latex/cs/dalsi-temata/46-tex-primitives-listed-by-tex-engine.md) vidíme, že některé z těchto příkazů spolu úzce souvisejí: vykonávají podobné úlohy; například existují 4 primitivní příkazy, které všechny enginy TeXu používají k definování (vytváření) maker: `\def`, `\gdef`, `\edef`, `\xdef`. Všechny tyto 4 příkazy definují makra, ale samozřejmě každý to dělá trochu jinak. Když se na to podíváme z programátorského hlediska: máme zde 4 příkazy pro definici maker, které v zásadě dělají totéž, ale musíme si mezi nimi vybrat, abychom zohlednili jejich individuální chování.

Aby to zvládl, TeX přiřazuje každému příkazu dvě hodnoty a právě tyto dvě hodnoty TeX chápe jako „význam“ příkazu (jeho roli / to, co dělá) — tyto dvě hodnoty jsou v TeXu interní, hluboko v softwaru, a jsou součástí „vnitřního mechanismu“, který není uživatelům přístupný. Každému příkazu TeXu, ať už jde o vestavěnou primitivu nebo uživatelsky definovaný příkaz, jsou přiřazeny dvě hodnoty, které pro TeX definují/klasifikují jeho chování — co pro TeX znamená. Když TeX pomocí svého „velkého slovníku“ vyhledá příkaz, najde tyto dva zásadní údaje:

* **kód příkazu**: jakousi „obecnou klasifikaci“ udávající, jakého „typu“ je příkaz — například příkaz „definice makra“ (jeden z `\def`, `\gdef`, `\edef`, `\xdef`); příkaz „vytváření boxů“ (jeden z `\hbox`, `\vbox` nebo `\vcenter`) a tak dále pro stovky příkazů, které enginy TeXu podporují. Makrům (uživatelsky definovaným příkazům) je také přiřazen kód příkazu.
* **modifikátor příkazu**: To je doplňková informace, která TeXu poskytuje konkrétní údaje o příkazu. Makrům (uživatelsky definovaným příkazům) je také přiřazen modifikátor příkazu — u maker však modifikátor příkazu hraje trochu jinou roli než u primitiv (u maker modifikátor příkazu určuje, kde je definice makra uložena v paměti).

Společně kód příkazu a modifikátor příkazu jednoznačně identifikují každý příkaz. Zde jsou kódy příkazů a modifikátory příkazů pro příkazy definice maker tak, jak je používá původní Knuthův software TeX — všimněte si, že jiné enginy TeXu mohou používat jiné hodnoty, ale řídí se naprosto stejným principem:

|            |                                                        |                                                                |
| ---------- | ------------------------------------------------------ | -------------------------------------------------------------- |
| **Příkaz** | <p><strong>Příkaz</strong><br><strong>kód</strong></p> | <p><strong>Příkaz</strong><br><strong>modifikátor</strong></p> |
| `\def`     | 97                                                     | 0                                                              |
| `\gdef`    | 97                                                     | 1                                                              |
| `\edef`    | 97                                                     | 2                                                              |
| `\xdef`    | 97                                                     | 3                                                              |

### Shrnutí: jak dát smysl všem těmto proměnným/hodnotám

V této chvíli jsme zahlceni spoustou informací o hodnotách, proměnných, hodnotách příkazů a všemožných detailech — může to rychle začít být matoucí, tak si shrňme, co víme. Když TeX čte něco z vašeho vstupu, je to buď znak, nebo příkaz. Kdykoli TeX něco načte ze vstupu, potřebuje uložit informace o tom, co právě přečetl (skenoval):

* Pro **znaky**: potřebuje zaznamenat kód znaku a kód kategorie. Také potřebuje vytvořit a uložit hodnotu tokenu, kterou TeX vypočítá pomocí těchto hodnot.
* Pro **příkazy**: TeX potřebuje znát číselný ekvivalent, **curcs**, který vypočítal z názvu příkazu. Možná také bude potřebovat uložit „význam“, který získal vyhledáním příkazu ve „slovníku“ TeXu: kód příkazu a modifikátor příkazu. Kromě toho bude TeX také muset vypočítat hodnotu tokenu, která tento příkaz představuje.

Ano, je to matoucí: kolem se vznáší spousta proměnných a představ o tokenech, takže se to pojďme pokusit objasnit.

Uvnitř TeX používá čtyři globální proměnné k ukládání informací o poslední položce, kterou TeX načetl (nebo na ní právě „pracuje“) — nebudeme tyto proměnné rozebírat do podrobností, ale vědomí jejich existence pomáhá poskytnout trochu více pozadí pro pochopení toho, co se ve skutečnosti děje:

* **curcmd**: (current command) celočíselná proměnná. Používá se k ukládání *aktuální příkaz* hodnoty pro právě zpracovávaný příkaz *nebo* ukládá aktuální *kategoriální kód* znaku, který se zpracovává;
* **curchr**: (aktuální znak) celočíselná proměnná, ale to, co ukládá, závisí na tom, co TeX právě přečetl ze svého vstupu:
* **znaku**: Pokud je naposledy načtenou položkou znak, **curchr** ukládá aktuální *znakový kód*.
* **příkaz**: Pokud je naposledy načtenou položkou příkaz, **curchr** ukládá *modifikátor příkazu*: doplňující informace, které TeX používá k podpoře/upřesnění **curcmd**—protože, jak jsme viděli výše, některé příkazy sdílejí stejnou hodnotu **curcmd**
* **curcs**: (aktuální řídicí sekvence) celočíselná proměnná, která ukládá hodnotu vypočítanou z řetězce znaků v názvu příkazu. **curcs** = 0, pokud poslední přečtená položka byla jednotlivý znak a ne název řídicí sekvence (název příkazu);
* **curtok**: (aktuální token) celočíselná proměnná, která uchovává hodnotu aktuálního tokenu — buď tokenu příkazu, nebo znakového tokenu.

Zde jsou výše uvedené informace zobrazeny v tabulce:

|                                              |                                                                                                                                                                                                             |                                                                                                                                                                                                                                                               |
| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Globální proměnná používaná uvnitř TeXu:** | **Když TeX skenuje znak:**                                                                                                                                                                                  | **Když TeX skenuje příkaz:**                                                                                                                                                                                                                                  |
| **curcmd**                                   | Ukládá kód kategorie aktuálního znaku                                                                                                                                                                       | Ukládá *kód příkazu*—který identifikuje „typ“ aktuálního příkazu                                                                                                                                                                                              |
| **curchr**                                   | Ukládá kód znaku aktuálního znaku                                                                                                                                                                           | Ukládá doplňující údaje (nazývané *modifikátor příkazu*), které poskytují dodatečné informace o aktuálním příkazu                                                                                                                                             |
| **curcs**                                    | 0                                                                                                                                                                                                           | Kladné nenulové celé číslo, které je vypočítáno (pomocí hashovací funkce) z řetězce znaků obsaženého v názvu příkazu. Používá se k přístupu do TeXova „slovníku“ a vyhledání aktuálního významu příkazu — k získání jeho kódu příkazu a modifikátoru příkazu. |
| **curtok**                                   | Pro 8bitové enginy TeXu je *znakový token* vypočítán pomocí vzorce: $$\text{curtok}=256\times \text{curcmd} + \text{curchr}$$ kde $$\text{curcmd}$$ je kód kategorie znaku a $$\text{curchr}$$ je kód znaku | Pro 8bitové enginy TeXu je *příkazový token* vypočítán pomocí vzorce: $$\text{curtok}=4095 + \text{curcs}$$                                                                                                                                                   |

### Další poznámky k aktuálnímu tokenu

U znaků je maximální možná hodnota tokenu získána použitím největšího kódu kategorie (15) a největšího kódu znaku, který je u 8bitových enginů TeXu 255. Teoreticky (u 8bitových enginů TeXu) je maximální hodnota znakového tokenu, $$\text{curtok}\_{\text{max}}$$,

$$\text{curtok}\_{\text{max}}= 256\times 15 + 255 = 4095$$

Poznamenáváme „teoreticky“, protože kód kategorie 15 se používá k označení „neplatného znaku“, který způsobí, že TeX vygeneruje chybu: neplatný znak se nikdy nedostane přes TeXův proces skenování vstupu, a proto se nikdy nestane znakový tokenem.

U příkazů je aktuální token ($$\text{curtok}$$) vypočítán z $$\text{curtok}=4095 + \text{curcs}$$ ale u příkazů $$\text{curcs}$$ je *vždy* nenulová, takže TeX může snadno určit, co token představuje:

* Pokud $$\text{curtok} > 4095$$ pak je to token příkazu;
* Pokud $$\text{curtok} < 4095$$ je to znakový token.

Ve výsledku TeX používá tokeny, jednoduchou celočíselnou hodnotu, k „zabalení“ všech informací, které potřebuje vědět o položce přečtené ze vstupu.

## Část 4

V 4. dílu zkoumáme řadu příkladů maker, abychom demonstrovali roli a účel makra `<parametrický text>` sekce, která slouží jako „šablona tokenů“ a může být sestavena pomocí oddělovacích tokenů.

[Čá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/21-how-tex-macros-actually-work-part-3.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.
