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

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

[Čá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 a přehled

V části 4 jsme si prošli některé základní vlastnosti maker TeXu jako přípravu na následující dva články, ve kterých se podrobně podíváme na mechanismus, který je podstatou maker TeXu: specializované seznamy tokenů. V těchto závěrečných dvou článcích používáme diagramy, nazývané seznamy uzlů, které byly připraveny z dat vygenerovaných pomocí speciálně upravené verze původního Knuthova softwaru TeX — tyto úpravy byly navrženy tak, aby bylo možné přistupovat k interním datovým strukturám TeXu, které jsou běžně pro uživatele nepřístupné. Díky „napojení“ na interní rutiny TeXu pro zpracování maker a jejich vykonávání bylo možné vypsat grafická data, která umožňují podrobnější a přesnější diskusi o chování TeXu při zpracování maker. Overleaf doufá, že tyto diagramy čtenářům pomohou lépe pochopit, jak makra TeXu skutečně fungují.

### Možné doplňující čtení pro kontext

Overleaf již publikoval dva články týkající se tokenů, které poskytují další informace pro kontext o tokenech TeXu a seznamech tokenů TeXu. Prosím, věnujte čas jejich přečtení, pokud potřebujete doplnit mezery ve svém porozumění a chcete z této série vytěžit maximum z částí 5 a 6.

* [Co je „TeX token“?](/latex/cs/clanky-do-hloubky/53-what-is-a-tex-token.md)
* [Co je seznam tokenů TeXu?](/latex/cs/clanky-do-hloubky/54-what-is-a-tex-token-list.md)

## Makra jako seznamy tokenů

Když TeX detekuje příkaz pro vytvoření makra (`\def`, `\edef`, `\gdef` nebo `\xdef`) ve vstupním proudu, spustí proces, který převede obě části `<parametrický text><náhradní text>` definice našeho makra do jednoho dlouhého seznamu tokenů — ale do velmi specifického typu seznamu tokenů.

Seznamy tokenů pro makra se mírně liší od jiných seznamů tokenů používaných v TeXu, protože obsahují „speciální“ hodnoty tokenů, které mohou vytvářet/generovat pouze procesy uvnitř samotného TeXu: tyto speciální tokeny nelze přímo vytvořit žádnými příkazy, které můžete zahrnout do svého souboru .tex. TeX tyto „speciální“ hodnoty tokenů vytváří a používá, aby si pomohl se zpracováním vašeho volání makra, jak si níže vysvětlíme a objasníme.

### Krátce o tom, jak se seznamy tokenů ukládají: uzly

K uložení seznamu tokenů (celých čísel) TeX používá datovou strukturu zvanou [spojový seznam](https://en.wikipedia.org/wiki/Linked_list), který v případě TeXu zahrnuje seznam takzvaných *uzlů*. Uzel si můžete představit jako malý balíček paměti počítače, který lze použít k uložení kolekce datových položek. Pro uložení makra jsou tyto uzly propojeny do řetězu, kde každý uzel (článek řetězu) může uchovávat několik informací — včetně hodnoty tokenu a paměťové adresy dalšího uzlu v seznamu. Další informace najdete v článku [Co je seznam tokenů TeXu](/latex/cs/clanky-do-hloubky/54-what-is-a-tex-token-list.md) ale následující diagram shrnuje klíčové vlastnosti makra uloženého jako seznam tokenů:

![Diagram seznamu tokenů makra TeXu uloženého jako spojový seznam uzlů](/files/b6c417ac405fbba3e7af7d7de727729b2072056d)

### Připomínka: 4 části definice makra

Jak jsme probírali v části 4, strukturu libovolného makra lze zapsat jako:

```
<primitivum makra TeXu><název makra><parametrický text>{<náhradní text>}
```

kde:

* `<primitivum makra TeXu>` = jedno z `\def`, `\edef`, `\gdef` nebo `\xdef`;
* `<název makra>`= název vašeho makra, například `\foo`;
* `<parametrický text>` může být „prázdný“ (nepřítomný), nebo může být řetězec oddělovacích tokenů a tokenů parametrů makra;
* `<náhradní text>` je vlastní tělo vašeho makra: část, která se „vykoná“ při volání makra.

**POZNÁMKA**: (Jak jsme také pozorovali v části 4) v celém výkladu předpokládáme, že `<název makra>` bude následováno znakem mezery s kategoriálním kódem 10, který bude sloužit jako oddělovač k ukončení `<název makra>`. My *jsme* ten znak mezery výslovně neukázali v našem textu/výkladu, ale předpokládáme, že tam je. Přesně vzato bychom to měli znázornit asi takto:

```
<primitivum makra TeXu><název makra><mezera><parametrický text>{<náhradní text>}
```

Nicméně budeme vynechávat explicitní zahrnutí `<space>` znaku a jeho přítomnost budeme implicitně předpokládat.

**POZNÁMKA**: Znaky `{` a `}` *se* nestávají součástí seznamu tokenů makra: jejich účelem je pouze sdělit vstupnímu skeneru textu (který vytváří tokeny), kde `<náhradní text>` začíná a končí.

Když TeX definuje makro, části `<parametrický text><náhradní text>` se převedou do jednoho dlouhého souvislého seznamu tokenů — celkový počet tokenů v tom seznamu závisí na složitosti makra. Jak jsme viděli, část má specifický účel: slouží jako „šablona tokenů“ nebo „plán“, který TeX používá k vybrání tokenů, jež tvoří argumenty (hodnoty) použité s vlastním makrem: tj. tokeny, které se předávají do `<náhradní text>`.

Abychom si tyto myšlenky upevnili, vezměme si příklad makra, ale nechme jej krátký, aby následující diagramy nebyly příliš přeplněné:

```
\def\foo A#1\fake{123 #1}
```

U našeho makra, `\foo`

* `<parametrický text>` = `A#1\fake`
* `<náhradní text>` = `123 #1`

Ačkoli je tento příklad jednoduché makro, obsahuje všechny vlastnosti, které potřebujeme prozkoumat.

Jak bylo poznamenáno, TeX převede `<parametrický text><náhradní text>` do jednoho dlouhého seznamu tokenů, který můžete vidět na diagramu níže. V našem příkladu byly tokeny vytvořené z `A#1\fake{123 #1}` převedeny na souvislou posloupnost tokenů uloženou v seznamu tokenů (jako spojový seznam uzlů).

## Grafika zobrazující skutečný seznam tokenů makra

Následující diagram ukazující, jak je makro `\def\foo A#1\fake{123 #1}` uloženo, využívá skutečná data z nitra enginu TeXu. Byl vytvořen pomocí [upravené verze Knuthova TeXu](/latex/cs/clanky-do-hloubky/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) který byl upraven dalším kódem, aby zachytával volání maker, zkoumal interní data TeXu a exportoval je do formátu pro zpracování pomocí open-source grafického programu zvaného [Graphviz](https://www.graphviz.org/).

Následující grafiku si můžete stáhnout jako [soubor PDF](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 kB) nebo [soubor SVG](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 MB).

![Diagram anotovaného seznamu tokenů TeXu](/files/4d3ddc772c95d7dbe8d41254f9291253a7d49a7b)

#### Pochopení uzlů

V diagramu výše uvidíte, že každý uzel obsahuje dvě datové položky zvané **následující uzel** a **aktuální uzel**. Jsou to pouze celočíselné hodnoty představující umístění paměti uvnitř TeXu — místa, kde jsou uloženy jiné uzly. Hodnoty **následující uzel** a **aktuální uzel** nejsou důležité, pouze uchovávají umístění (paměťové adresy), která umožňují propojit uzly do seznamu.

![Význam položek next node a current node](/files/d99741d3352e8d8d2035cfb5cf27675608f7f3ee)

#### Zpět k příkladu

V diagramu uzlů seznam tokenů vytvořený z `A#1\fake{123 #1}` obsahuje několik „speciálních tokenů“, představených na začátku tohoto článku. Kromě toho seznam uzlů představující naše makro začíná „speciálním prvním uzlem“: prozkoumáme, co to je a co dělá.

Úplně první položka v seznamu tokenů makra (a v některých dalších typech seznamů tokenů) neukládá hodnotu tokenu, ale datovou položku zvanou *referenčním počtem* který TeX používá ke sledování používání makra.

![Uzel referenčního počtu je prvním uzlem v seznamu tokenů](/files/badf221b4fb60c3582bdf675a6548ecaace79337)

První token `<parametrický text>` je uložen v uzlu, který bezprostředně následuje za referenčním počtem: můžete vidět, že jde o token představující písmeno `Zkopírovaný` s kategoriálním kódem 11. Z diskusí v částech 2 a 3 víme, že znakový token se počítá pomocí

$$\text{token value}=256\times \text{category code} + \text{character code}$$

který pro písmeno `Zkopírovaný` s kategoriálním kódem 11 je

$$\text{token value}=256\times 11 + 65$$

čímž vzniká hodnota 2881, jak je ukázáno v uzlu.

#### „Příkaz“ \fake použitý v \foo

V definici našeho makra `\def\foo A#1\fake{123 #1}` jeden z oddělovačů je *nedefinovaný* příkaz `\fake` který je uložen v seznamu tokenů jako součást `<parametrický text>` části. Jak můžete vidět, v celém seznamu tokenů makra `\fake` je token, jehož hodnota je `19491`— celočíselná hodnota vypočtená TeXem pomocí vzorce probrané v části 3. Když se TeX pokusí vykonat `\foo` bude očekávat, že najde `\fake` hodnotu tokenu na konci `<parametrický text>` části. TeX *nebude* se pokoušet spustit `\fake` příkaz, protože jeho role spočívá pouze v poskytování formy „interpunkce“ v rámci `<parametrický text>` „šablony tokenů“.

![Použití tokenu příkazu jako oddělovače makra](/files/01079231d565428f40fb13c59c7ede09e012a7c3)

#### Speciální tokeny v seznamu tokenů

**Token „end match“**

Při volání makra je prvním úkolem TeXu prozkoumat makro tak, jak je napsáno uživatelem, a porovnat tokeny obsažené v uživatelově `<parametrický text>` části s tokeny obsaženými v šabloně `<parametrický text>` uložené v paměti (vytvořené v době, kdy bylo makro definováno). Protože úplná definice makra, sestavená z `<parametrický text><náhradní text>` je uložena jako jeden dlouhý souvislý seznam tokenů, TeX potřebuje vědět, kde v tom seznamu tokenů `<parametrický text>` *končí* a kde `<náhradní text>` *začíná*. Aby toho dosáhl, když TeX definuje makro (vytváří seznam tokenů), vloží speciální ukončovací token zvaný **end match** token jako úplně poslední token v sadě tokenů vygenerovaných z `<parametrický text>`. Balíček **end match** token nelze vygenerovat uživatelskými příkazy, může jej vytvořit pouze samotný TeX, a proto TeX jistě rozpozná konec `<parametrický text>`.

![Zobrazení tokenu end match v seznamu tokenů TeXu](/files/7f341a4b49a180b42a54c3353d7cf8dadff0f3be)

Zde můžeme vidět, že první token následující po **end match** je token představující číslici `1` s kategoriálním kódem 12. To se dalo očekávat, protože `<náhradní text>` pro naše makro `\foo` je `123 #1`— tj. začíná tokenem představujícím číslici `1` (s kategoriálním kódem 12).

Z diskuse v částech 2 a 3 víme, že znakový token se počítá pomocí

$$\text{token value}=256\times \text{category code} + \text{character code}$$

který pro číslici `1` s kategoriálním kódem 12 je

$$\text{token value}=256\times 12 + 49$$

čímž vzniká hodnota tokenu 3121, jak je ukázáno v uzlu.

**tokeny „match parameter“**

Když TeX ukládá definici makra, převádí všechny tokeny parametrů (`#1`, `#2`… `#9`) v `<parametrický text>` na takzvaný **match parameter** token. Tyto tokeny říkají TeXu, že má začít hledat tokeny v uživatelově volání makra, které představují argumenty makra.

![Zobrazení tokenu match parameter v seznamu tokenů TeXu](/files/26469fdcfd92954fbea6108882311bc60aca9d70)

### Speciální tokeny v seznamu tokenů

#### tokeny výstupního parametru

Když TeX vše zpracoval a je připraven makro skutečně spustit (expandovat), **výstupní parametr** tokeny informují TeX o místech v `<náhradní text>` kde je třeba vložit tokeny představující argumenty poskytnuté uživatelem při volání makra. Ve skutečnosti: „Na tomto místě vlož tokeny představující uživatelův argument n, kde n=1...9“.

V `<náhradní text>` části uloženého seznamu tokenů definice makra bude **výstupní parametr** token odpovídající každému `#1`, `#2`... `#9` přítomnému v původní definici.

![Zobrazení tokenu výstupního parametru v seznamu tokenů TeXu](/files/f6e7a4fcd93228c4eb1c1417518711fea89a6138)

Pokud se podíváme na naši definici `\foo` (`\def\foo A#1\fake{123 #1}`) vidíme, že existuje pouze 1 parametr makra (`#1`) v `<parametrický text>` (`A#1\fake`) a následně pouze 1 parametr makra (`#1`) se objevuje v `<náhradní text>` (`123 #1`): to vede jen k 1 **výstupní parametr** tokenu přítomnému v seznamu tokenů představujícím `<náhradní text>`.

Všimněte si následujícího v seznamu uzlů představujícím `\foo`’s `<náhradní text>`:

* token bezprostředně před **výstupní parametr** token představuje znak mezery (kategoriální kód 10, znakový kód 32), protože mezi `123` a parametrem makra (`#1`) v původní definici `\foo`;
* webových stránkách **výstupní parametr** je poslední token v seznamu: token **následující uzel** má zvláštní hodnotu „null“ (tj. „prázdný“), která se používá k ukončení seznamu: po **výstupní parametr** protože je posledním tokenem, který označuje konec `<náhradní text>` a tím i konec definice makra.

## Část 6

V části 6 použijeme podrobnou grafiku k vysvětlení a prozkoumání přesného významu expanze makra a důsledků tokenizace argumentů makra TeXem před jejich předáním do makra `<náhradní text>`.

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