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

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

[Čá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: Cíle této série

Tato série článků má ambiciózní cíl: vysvětlit *jak* jak makra TeXu (například příkazy LaTeXu) ve skutečnosti fungují – na té nejzákladnější úrovni, přímo uvnitř samotného softwaru TeXového enginu. Místo toho, aby se spoléhalo *výhradně* na sadu ukázkových maker navržených tak, aby demonstrovala různé vlastnosti, okrajové případy a chování TeXu, podíváme se přímo do TeXu samotného, abychom viděli *jak* a *proč* proč jeho metody programování maker fungují tak, jak fungují.

Abychom našeho cíle dosáhli, musíme začít diskusí o tématech, která jsou poměrně nízkoúrovňová a zpočátku se mohou zdát poněkud vzdálená úkolu sazby vašich dokumentů. Doufejme, že po hlubším ponoru získáte pevný základ pro vybudování lepšího porozumění, které vám nakonec ušetří spoustu času a možná také sníží míru frustrace.

### Programovací jazyk TeXu: Znáte ten pocit?

Není nijak přehnané označit programovací jazyk TeXu za poněkud tajemný, protože takový je – alespoň podle měřítek většiny dnešních běžně používaných programovacích jazyků. Jak začínáte svou cestu k hlubšímu poznání TeXu/LaTeXu, zvláště pokud chcete psát netriviální makra, rychle narazíte na pojmy jako kategoriové kódy, tokeny/tokenizace a „expanze“ příkazů nebo maker. Tato záplava konceptů vám pravděpodobně bude velmi cizí, možná se budete cítit zmateně a někdy i mírně frustrovaně, protože vaše cesta k úspěchu není vždy usnadněna téměř neproniknutelnými chybovými hlášeními TeXu/LaTeXu.

## Tak kde začneme? U kategoriových kódů.

Enginy TeXu spadají do třídy softwaru nazývané [kompilátory](https://en.wikipedia.org/wiki/Compiler): programy, které jako vstup přijímají soubor napsaný v *zdrojovém* jazyce a *překládají* (transformují) jej na výstupní soubor napsaný v *cílovém* jazyce. Přesněji řečeno, TeX je *kompilátor dokumentů*. U enginů TeXu (kompilátorů) je vstupní soubor napsán v sazbovém jazyce TeXu a cílem je výstupní soubor napsaný v jiném „jazyce“, jako je [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) nebo PDF – i když pojem „jazyk“ používáme poněkud volně.

Podívejme se blíže na zdrojový, neboli vstupní, „jazyk“ použitý k zápisu vašeho souboru TeXu.  `.tex` Soubor je nakonec jednou dlouhou sekvencí znaků (včetně znaků zalomení řádku): tvoří jej text určený k sazbě prokládaný `\`, `}`, `$`, `[` a všelijakými znaky, které se mohou objevovat v zdánlivě téměř nekonečné škále kombinací. Každý, kdo nepoužívá TeX/LaTeX, se může podívat na typický `.tex` soubor a být omluven, pokud jej vnímá jako spíše matoucí změť znaků s malou, pokud vůbec nějakou, viditelnou strukturou souboru. Balík maker LaTeXu jistě do jisté míry „vnucuje“ souboru .tex nějakou základní strukturu. Nicméně mezi `\begin{document}` a `\end{document}` je na autorovi dokumentu, co do něj vloží. Pokud se podíváte na `.tex` soubory napsané pomocí Knuthova původního balíku maker Plain TeX, uvidíte, že struktura dokumentu je téměř zcela nepřítomná.

Obecně tedy může vstupní soubor TeXu působit poměrně neuspořádaně, jako zdánlivě nahodilá směs obsahu určeného k sazbě prokládaná pokyny (příkazy), které sazbu tohoto obsahu řídí. Jak je vůbec možné, aby TeX dával smysl typickému `.tex` vstupnímu souboru: aby filtroval tuto příchozí změť znaků na použitelné pokyny pro sazební engine a na obsah, který má být vysázen?

### Filtrování zmatku: Seznamte se s kategoriovými kódy

Každý lidský pozorovatel, který o TeXu nic neví, se může podívat na `.tex` soubor a rozpoznat určité znaky, jako například `$` a vědět, že je to znak měny, nebo spatřit `&` a identifikovat jej jako ampersand. Takový pozorovatel odvozuje *významem* pro každý znak, který vidí – význam založený na roli, kterou tento znak hraje v lidské komunikaci. Navíc mohou vidět znaky jako `a`, `e`, `nebo` a vědět, že jsou klasifikovány jako samohlásky, zatímco jiné, například `b`, `c` nebo `d` jsou klasifikovány jako souhlásky. Jako lidé máme jakousi vestavěnou vyhledávací tabulku (v naší paměti), pomocí níž přiřazujeme každému znaku, který vidíme, význam – význam založený na roli, kterou tento znak plní v jazycích, jimiž jsme schopni komunikovat.

Při zpracování `.tex` souboru musí software TeXu také pohlédnout na každý znak ve vašem vstupu a také mu musí přiřadit *významem* každému jednotlivému znaku, který „vidí“. TeX je však jen softwarový stroj, který zpracovává text – uložený jako sekvenci celých čísel (znakových kódů) umístěných ve vstupním souboru. Jako stroj musí být TeX naprogramován příslušnými daty, která mu říkají, jak určit význam znaku, na který se „dívá“, a následně co s ním má dělat. Jak toho TeX dosahuje?

Odpověď je jedním z těch pojmů typických pouze pro TeX: *kategoriové kódy,* kterých je 16, od 0 do 15. Z hlediska TeXu má každý znak, který kdy očekává, že uvidí v `.tex` souboru, takzvaný *kategoriální kód* předem přiřazen. *aktuálně* přiřazený každému znaku, který by TeX mohl uvidět ve vstupním souboru .tex. Měli byste na kategoriové kódy TeXu pohlížet jako na přiřazení *významem* každému jednotlivému znaku ve vstupním proudu, který musí TeX prozkoumat (skenovat).

Aby bylo možné vysázet váš dokument, musí engine TeXu přečíst (skenovat) každý jednotlivý znak, ale bezprostřední zájem TeXu se netýká samotných znaků (znakových kódů): *kategoriální kód* větší důležitost má při skenování vstupu *aktuální* kategorie kódu určuje *aktuální význam* tohoto znaku *v okamžiku, kdy jej TeX čte*: tento kategoriový kód určuje, jak bude TeX s každým znakem zacházet/zpracovávat jej – vysvětlíme, proč říkáme „aktuální kategoriový kód“ a „aktuální význam“. Právě prostřednictvím kategoriových kódů dokáže TeX filtrovat příchozí změť znaků a rozlišovat mezi znaky (obsahem) určenými k sazbě a znaky, které tvoří pokyny určené ke zpracování –*příkazy* které TeX potřebuje vykonat.

Následující tabulka uvádí těchto 16 kategoriových kódů: co každý z nich znamená spolu s příklady znaků obvykle přiřazených do každé kategorie.

| **Kategoriální kód** | **Popis**                                                      | **Standardní LATEX/TEX**                                               |
| -------------------- | -------------------------------------------------------------- | ---------------------------------------------------------------------- |
| 0                    | Únikový znak — říká TEXu, aby začal hledat příkaz              | `\`                                                                    |
| 1                    | Začátek skupiny                                                | {                                                                      |
| 2                    | Konec skupiny                                                  | }                                                                      |
| 3                    | Matematický přepínač — přepíná do/z matematického režimu       | $                                                                      |
| 4                    | Zarovnávací tabulátor                                          | &                                                                      |
| 5                    | Konec řádku                                                    | ASCII kód 13 (`\r`)                                                    |
| 6                    | Parametr makra                                                 | #                                                                      |
| 7                    | Horní index — pro sazbu matematiky: `$y=x^2$` $$y=x^2$$        | ˆ                                                                      |
| 8                    | Dolní index — pro sazbu matematiky: `$y=x_2$` $$y=x\_2$$       | \_                                                                     |
| 9                    | Ignorovaný znak                                                | ASCII 0 `<null>`                                                       |
| 10                   | Mezera                                                         | ASCII kódy 32 (mezera) a 9 (znak tabulátoru)                           |
| 11                   | Písmeno                                                        | A...Z, a...z (a tisíce znaků Unicode)                                  |
| 12                   | Ostatní                                                        | 0...9 plus ,.;?" a mnoho dalších                                       |
| 13                   | Aktivní znak                                                   | Speciální kód kategorie pro vytváření maker o jediném znaku, jako je ˜ |
| 14                   | Znak komentáře — ignoruje vše, co následuje až do konce řádku  | %                                                                      |
| 15                   | Neplatný znak, který se nesmí objevit ve vstupním souboru .tex | ASCII kód 127 (`DEL`)                                                  |

Použití kategoriových kódů je základním mechanismem TeXu pro filtrování jeho příchozího proudu znaků, aby dával smysl vašemu vstupu a určil:

* znaky, které tvoří text určený k sazbě;
* oddělovací znaky vymezující obsah, který má být sázen jako matematika;
* posloupnosti znaků, které jsou názvy příkazů určených ke zpracování nebo vykonání;
* ... a mnoho dalších sazebních operací.

Zpočátku byste si mohli myslet, že kategoriový kód (význam) každého znaku je jakési pevné přiřazení: neměnné a natrvalo zapečené do vnitřních základů softwaru TeXu, ale tak to není. Jak bylo uvedeno, TeX udržuje interní vyhledávací tabulku pro ukládání podrobností o tom, který kategoriový kód je *aktuálně* přiřazen každému znaku – zcela záměrně říkáme *aktuálně přiřazen* protože kategoriový kód libovolného znaku (ještě nepřečteného) lze změnit pomocí primitivního (vestavěného) příkazu zvaného `\catcode`. To přináší značnou flexibilitu, protože můžete-li si přát, zcela změnit způsob, jakým bude TeX zacházet s významem libovolného znaku následně přečteného ze vstupu nebo jej vykládat, což poskytuje obrovský prostor pro sofistikované sazební aplikace.

Pokud vás zajímá hlavně použití LaTeXu k tomu, aby se „práce udělala“, je pravděpodobné, že jste se s kategoriovými kódy přímo nesetkali, snad kromě chybových hlášení, která jste možná viděli. Ale buďte bez obav, kategoriové kódy jsou klíčovou součástí fungování TeXového enginu: umožňují LaTeXu (a balíkům LaTeXu) skutečně vykonávat práci sazby vašeho dokumentu.

Když se váš TeX engine spouští („[se zavádí](https://en.wikipedia.org/wiki/Bootstrapping)“) použije sadu výchozích přiřazení znaků ke kategoriovým kódům, ale prostřednictvím `\catcode` příkazu lze tato výchozí nastavení změnit jádrovým kódem LaTeXu (makry) a/nebo balíky LaTeXu, které jste načetli – nebo dokonce vaším vlastním kódem nebo makry TeXu. Postupem času a díky tradici/používání se však určité znaky přiřazené ke konkrétním kategoriovým kódům staly uznávanými „standardy“ a dodržování těchto standardů je rozhodně žádoucí, pokud chcete, aby vaše dokumenty byly přenosné a snadno sdílené s kolegy nebo jinými uživateli. Například `\` znaku je přiřazen kategoriový kód 0, což označuje začátek příkazu TeXu/LaTeXu – viz [výše uvedená tabulka](#tbl-0).

### Čtení (skenování) vstupu

Když TeX přečte (skenuje) další znak z vašeho vstupního souboru, úplně první věc, kterou udělá, je, že se podívá na jeho kategoriový kód, takže se podívejme blíže na to, co se děje, když TeX čte typický řádek vstupu.

Předpokládejme, že máme soubor .tex, který obsahuje text `Hello World \jobname` někde uvnitř odstavce. Pokud se podíváme do `.tex` souboru pomocí [hexadecimálního editoru](https://en.wikipedia.org/wiki/Hex_editor), vidíme, že posloupnost znaků `Hello World \jobname` v našem `.tex` souboru je jen řada celých čísel, neboli *znakových kódů*, jak je na snímku obrazovky níže zobrazeno jako hexadecimální posloupnost:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Hexadecimální znakové kódy v souboru TeXu](/files/7a9a953b131a2f878ee323a3fe586e5e3382f15b)

Pokud převedeme z hexadecimální soustavy (základ 16) na desítkovou soustavu (základ 10), posloupnost znakových kódů je:

![Desítkové znakové kódy v souboru TeXu](/files/8f8ff24c2af2b5e562c9e462b5bd37d5f2144861)

Také víme, že pro TeX má každý znak odpovídající kategoriový kód; takže na základě [výše uvedená tabulka](#tbl-0) víme, že se pravděpodobně používají také následující výchozí přiřazení kategoriových kódů:

![Kategoriové kódy TeXu](/files/ff9f005b267aa3ba3d7180429f9440cecb96f935)

Každý znak ve vstupním souboru je tedy pro TeX reprezentován *dva* číselnými hodnotami – jeho znakový kód a kategoriový kód:

![Znakové kódy a odpovídající kategoriové kódy TeXu](/files/16ed3d3cca7af71fea9df938154e9ab8ce7f6c15)

V tuto chvíli zvažujeme pouze úplně první fázi zpracování vašeho souboru TeXem: skenování jednotlivých znaků. Co tedy TeX s těmito dvojicemi znakových kódů a kategoriových kódů vlastně dělá? Jak přesně TeX použije tuto informaci k „filtrování“ příchozích znaků, jakmile naskenuje jednotlivý znak a vyhledá jeho odpovídající kategoriový kód?

## Část 2

Ve 2. části se blíže podíváme na to, jak TeX čte váš vstup: budeme předstírat, že jsme TeXovy „oči“, když se dívá na váš vstup znak po znaku.

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