> 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/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md).

# Jak funguje \expandafter: Úvod do tokenů TeXu

[Část 1](/latex/cs/clanky-do-hloubky/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Část 2](/latex/cs/clanky-do-hloubky/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Část 3](/latex/cs/clanky-do-hloubky/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Část 4](/latex/cs/clanky-do-hloubky/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Část 5](/latex/cs/clanky-do-hloubky/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Část 6](/latex/cs/clanky-do-hloubky/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## Pozadí k \expandafter: tokeny TeXu a seznamy tokenů

Jako první krok k pochopení, jak `\expandafter` to skutečně funguje, se podíváme na dvě součásti TeXu, které jsou zásadní pro fungování `\expandafter`: tokeny TeXu (celá čísla) a seznamy tokenů (seznamy celých čísel). Čtenáře, kteří by chtěli tato témata prozkoumat mnohem podrobněji, mohou zajímat následující články publikované Overleafem:

* [Co je token TeXu?](/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)-[Jak makra TeXu vlastně fungují?](/latex/cs/dalsi-temata/01-a-six-part-series-how-do-tex-macros-actually-work.md)

### Odkud pocházejí data o tokenech?

V tomto článku používáme skutečné hodnoty tokenů vypočtené TeXem — data, která běžně nejsou uživatelům přístupná. Pro čtenáře, kteří jsou zvědaví, jak byla tato data o hodnotách tokenů získána, má Overleaf vlastní sestavení několika TeXových enginů, která používáme pro výzkum. Tyto enginy jsou upraveny tak, aby vypisovaly informace o vnitřních zpracovatelských aktivitách TeXu — což pomáhá poskytovat dodatečné podklady pro některé články, které vytváříme. Tím, že ukazujeme a rozebíráme číselné hodnoty tokenů, je naším cílem zahrnout detaily, které, jak doufáme, pomohou čtenářům lépe porozumět „tokenům TeXu“ a učinit tento důležitý pojem o něco méně neprůhledným.

## Tokeny TeXu 101 (a pojmy expanze)

Když TeX zpracovává váš vstupní soubor, čte text a převádí jednotlivé znaky a posloupnosti znaků (příkazy) na takzvané *tokeny*. Token TeXu je jednoduše celočíselná hodnota vypočtená TeXem, která se používá k „zakódování“ dat, jež si TeX potřebuje uložit o položce načtené z jejího aktuálního vstupního zdroje. Představte si tokeny jako malé balíčky informací, které „sbalí dohromady“ data, jež si TeX potřebuje zaznamenat, připravená k předání do další fáze zpracování. Interně TeX pracuje s těmito celočíselnými hodnotami tokenů — nepoužívá skutečná písmena, symboly, číslice apod. původně obsažené ve vašem vstupním souboru: vše se převede na token (celé číslo) a TeX s nimi pracuje.

## Jak TeX vypočítává hodnoty tokenů

Zde se podíváme na výpočty tokenů používané v původním TeXu od Knutha, e-TeXu a pdfTeXu; u jiných TeXových enginů, zejména XeTeXu a LuaTeXu, je třeba jejich výpočet tokenů mírně upravit, aby se zohlednilo použití Unicode, ale způsoby výpočtu jsou podobné těm popsaným níže.

### Tokeny znaků (neaktivní znaky)

Výpočet hodnot tokenů pro neaktivní znaky je přímočarý:

$$\text{character token} = 256\times \text{(category code)} + \text{character (ASCII) code}$$

**Příklad**: Písmeno A s [kategoriální kód](/latex/cs/dalsi-temata/43-table-of-tex-category-codes.md) 11, kód znaku 65 je v TeXu reprezentován jako hodnota tokenu znaku $$256\times 11 + 65 = 2881$$.

Možná jste se v texové literatuře setkali s popisem, že jakmile TeX načte znak, jeho hodnota kategorického kódu je k danému znaku „natrvalo přiřazena“: výše uvedený výpočet hodnoty tokenu ukazuje, proč je to pravda. Později při zpracování v TeXu však může — a také to dělá — „rozbalit“ tokeny znaků a odhalit dvojici (kód znaku, kategorický kód), z níž byl token vytvořen; když TeX toto „rozbalení“ provede, kategorický kód daného znaku tím nezmění, pouze tyto informace používá při dalším zpracování.

### Tokeny příkazů

Zpracování vstupu a generování tokenů v TeXu rozpoznává dva typy příkazů:

* příkazy složené z jednoho nebo více znaků, které mají kategorický kód 11;
* jednoznakové příkazy, u nichž kategorický kód daného znaku není 11; například `\$` nebo `\#`.

V obou případech TeX vynechá úvodní `\` znak a použije kód znaku každého zbývajícího znaku k výpočtu celého čísla, které TeX nazývá `curcs` (**cur**rent **c**ontrol **s**sekvence). TeX pak použije hodnotu `curcs` k výpočtu hodnoty tokenu pro příkaz.

#### Příkazy tvořené znaky s kategorickým kódem 11

Předpokládejme, že náš příkaz (bez úvodního `\` znaku) se skládá z posloupnosti znaků: $$\mathrm{C\_1C\_2C\_3...C\_N}$$ kde $$\mathrm{C}\_i$$ je kód znaku každého znaku — např. kód znaku A je 65. TeX použije všechny kódy znaků $$\mathrm{C}\_i$$ k výpočtu celého čísla `curcs` (použitím [hašovací funkce](https://en.wikipedia.org/wiki/Hash_function)). Jakmile TeX vypočítá hodnotu `curcs` jednoduše k ní přičte 4095, čímž získá hodnotu tokenu:

$$\text{command token} = \text{curcs + 4095}$$

Všimněte si, že proměnná `curcs` hraje ve vnitřním zpracování TeXu nesmírně důležitou roli.

#### Jednoznakové příkazy

Tokeny reprezentující příkazy jako `\$`, `\#` atd. podléhají mírně odlišnému výpočtu: celé číslo `curcs` se nyní počítá jednodušeji:

$$\text{curcs} = 257 + \text{character (ASCII) code}$$

Například při `\$`, $$\text{curcs}=257 + 36 = 293$$. TeX k této hodnotě opět přičte 4095 (použitím $$\text{command token} = \text{curcs} + 4095$$) a výsledkem je `\$` s hodnotou tokenu $$293 + 4095 = 4388$$.

Ve srovnání s příkazy složenými ze znaků s kategorickým kódem 11 je zde jediný rozdíl v tom, jak TeX vypočítává hodnotu pro `curcs`.

**Poznámka**: celé číslo `curcs` se pro tokeny znaků nepočítá: při vytváření nebo práci s tokeny znaků je vždy nastaveno na 0.

#### Tokeny aktivních znaků

TeX má pojem takzvaných *aktivních znaků*: jakýkoli znak, kterému je přiřazen kategorický kód 13. Tokeny pro tuto zvláštní třídu znaků podléhají oproti běžným znakům odlišnému výpočtu.

Mechanismus aktivních znaků umožňuje TeXu vytvářet to, co jsou ve skutečnosti jednoznaková makra, která můžete používat *bez* aniž byste museli před aktivní znak psát únikový znak (typicky `\`): samostatný znak spustí své makro chování. Klasickým příkladem je znak tilda (\~), který TeX/LaTeX používá pro nezalomitelné mezery, a lze jej definovat/povolit následovně:

```
\catcode`~=13 % přiřaď kategorický kód 13 znaku ~
\def~{\penalty100000\ } % definuj ~, aby se choval jako makro
```

Když TeX následně přečte `~` znak, zjistí, že jeho kategorický kód je 13, a zpracuje ho jako „minimakro“. Pro výpočet tokenu představujícího aktivní znak TeX použije další variantu výpočtu `curcs`:

$$\begin{align\*} \text{curcs} &= \text{character code} + 1\ \text{active character token} &= \text{curcs} + 4095\ \end{align\*}$$

Například znak \~ má kód znaku 126, což znamená, že jeho reprezentace hodnoty tokenu aktivního znaku se vypočítá takto:

$$\begin{align\*} \text{curcs} &= 126 + 1\ \text{active character token} &= 127 + 4095\ &=4222\ \end{align\*}$$

Všimněte si, že podobně jako příkazy jsou tokeny představující aktivní znaky > 4095.

### Důsledky/poznámky

* Jakýkoli token, jehož hodnota přesahuje 4095, je okamžitě identifikovatelný jako token příkazu — proto TeX může velmi snadno zjistit, zda konkrétní token představuje znak nebo příkaz.
* Pro libovolnou hodnotu tokenu může TeX, když potřebuje, daný token „rozbalit“ a odhalit znak (a jeho kategorický kód) nebo příkaz, který byl původně přítomen ve vašem `.tex` souboru, uložený v definici makra nebo obsažený v nějakém jiném seznamu tokenů.
* Takzvaná „mezilehlá“ veličina nazývaná `curcs`—kterou TeX používá k výpočtu hodnot tokenů příkazů—hraje důležitou roli v nízkoúrovňovém zpracování TeXu. `curcs` slouží jako „indexová hodnota“, kterou TeX používá k uložení/vyhledání aktuálního významu příkazu. Má-li TeX jakýkoli token příkazu, $$\mathrm{T}$$, TeX jednoduše odečte 4095, aby získal hodnotu `curcs`: $$\text{curcs} = \mathrm{T}-4095$$

Mimochodem, TeX skutečně ukládá čitelný řetězec znaků, z něhož je token příkazu generován — to je nezbytné pro hlášení chyb a další příkazy, jako je `\string` jehož expanze je čitelná verze hodnoty tokenu. Tyto čitelné řetězce znaků uložené uvnitř TeXu se však používají/vypisují pouze na požádání: pro veškeré ostatní zpracování se používá celočíselná hodnota tokenu.

## Podívejme se na některé skutečné tokeny

Aby pojem tokenů působil o něco méně neprůhledně, definujeme následující jednoduché makro a podíváme se na tokeny, které TeX vytváří:

```
\def\hello{Zdravíme z \TeX. \hskip 10pt}
```

Pro `\hello` makro TeX používá znaky `h`, `e`, `l`, `l`, `o` k výpočtu hodnoty 3745 pro `curcs`; TeX pak přičte 4095, aby vytvořil hodnotu tokenu $$3745 + 4095 = 7840$$ (pro TeX od Knutha, e-TeX nebo pdfTeX).

Po vytvoření tokenu reprezentujícího `\hello`, `\def` příkaz způsobí, že TeX přečte následující tokeny a použije je k vytvoření seznamu tokenů, který je uložen jako *definicí* toho `\hello` příkaz. Tuto uloženou definici (seznam tokenů) lze pak načíst vždy, když TeXu řeknete, aby použil `\hello` příkaz.

Následující tabulka uvádí skutečné hodnoty tokenů vytvořené pro každou položku (znak, makro nebo primitivum) obsaženou v `\hello` definici makra — tento seznam tokenů (celých čísel) je to, co TeX ukládá ve své paměti (jako datovou strukturu známou jako [spojový seznam](https://en.wikipedia.org/wiki/Linked_list)). Čtenáři, kteří chtějí seznamům tokenů porozumět podrobněji, jsou odkázáni na článek Overleafu [Co je seznam tokenů TeXu?](/latex/cs/clanky-do-hloubky/54-what-is-a-tex-token-list.md)

|                         |                            |
| ----------------------- | -------------------------- |
| **Hodnota tokenu TeXu** | **Reprezentovaná položka** |
| 2887                    | G                          |
| 2930                    | r                          |
| 2917                    | e                          |
| 2917                    | e                          |
| 2932                    | t                          |
| 2921                    | i                          |
| 2926                    | n                          |
| 2919                    | g                          |
| 2931                    | s                          |
| 3116                    | ,                          |
| 2592                    |                            |
| 2918                    | f                          |
| 2930                    | r                          |
| 2927                    | o                          |
| 2925                    | m                          |
| 2592                    |                            |
| 5235                    | \TeX                       |
| 3118                    | .                          |
| 2592                    |                            |
| 7943                    | \hskip                     |
| 3121                    | 1                          |
| 3120                    | 0                          |
| 2928                    | p                          |
| 2932                    | t                          |

V seznamu tokenů výše mají znaky kategorické kódy 10, 11 nebo 12. Například:

* znaky mají kategorický kód 10 a kód znaku 32, což dává hodnotu tokenu $$256\times 10 + 32 = 2592$$
* `,` a `.` mají kategorický kód 12 a kódy znaků 44 a 46, což dává tokeny:
* token pro `,` $$= 256 \times 12 + 44 = 3116$$
* token pro `.` $$= 256\times 12+ 46 = 3118$$

Kdykoli TeX následně narazí na hodnotu tokenu 7840 (reprezentující `\hello`) může, je-li to třeba, tento token „rozbalit“ a extrahovat `curcs` prostřednictvím jednoduchého výpočtu $$\text{curcs} = \text{token value} - 4095$$ (viz výše). Použitím hodnoty `curcs` může TeX nahlédnout do svých vnitřních datových tabulek a určit, že token příkazu 7840 představuje makro příkaz. Navíc opět prostřednictvím `curcs`, může TeX také vyhledat a načíst uloženou definici `\hello`.

Když TeX potřebuje token 7840 plně zpracovat, tj. spustit `\hello` makro, už token 7840 nepotřebuje: tento token již *splnil svůj úkol*—tj. přiměl TeX spustit makro `\hello`. TeX může nyní token 7840 zahodit a načíst tokeny, které představují definici (seznam tokenů) uloženou v paměti. Ve skutečnosti `\hello` makro-příkaz (token 7840) byl *odstraněn* z aktuálního vstupního zdroje TeXu a *nahrazen* tokeny obsaženými v definici `\hello`. To, co jsme právě popsali, je jedna forma *expanze tokenů*.

Ta `\TeX` příkazu (hodnota tokenu 5235 uvedená výše) používaného v `\hello` je samo makro sestavené z více tokenů — takže jeho definice je také uložena jako seznam tokenů:

|                         |                            |
| ----------------------- | -------------------------- |
| **Hodnota tokenu TeXu** | **Reprezentovaná položka** |
| 2900                    | T                          |
| 19598                   | \kern                      |
| 3117                    | -                          |
| 3118                    | .                          |
| 3121                    | 1                          |
| 3126                    | 6                          |
| 3126                    | 6                          |
| 3127                    | 7                          |
| 2917                    | e                          |
| 2925                    | m                          |
| 19597                   | \lower                     |
| 3118                    | .                          |
| 3125                    | 5                          |
| 2917                    | e                          |
| 2936                    | x                          |
| 6175                    | \hbox                      |
| 379                     | {                          |
| 2885                    | E                          |
| 637                     | }                          |
| 19598                   | \kern                      |
| 3117                    | -                          |
| 3118                    | .                          |
| 3121                    | 1                          |
| 3122                    | 2                          |
| 3125                    | 5                          |
| 2917                    | e                          |
| 2925                    | m                          |
| 2904                    | X                          |

Kdybychom nahradili `\hello` příkaz úplným seznamem tokenů, z nichž je sestaven, včetně `\TeX` makra, byl by to dosti dlouhý seznam — tj. kdybychom také *rozbalili* webových stránkách `\TeX` makro, viděli bychom:

![Seznam tokenů uložený v makru TeXu](/files/6a7f656eaf5e0acf3fac8db21e43a4917bfc0198)

V podstatě by jediná hodnota tokenu 7840 (pro `\hello`) při úplné expanzi vytvořila celkem 51 tokenů (celých čísel) představujících znaky a primitivní příkazy. V následujícím seznamu je znak nebo příkaz reprezentovaný každým tokenem uveden v závorkách „(...)“ — tyto údaje se přímo neukládají do seznamů tokenů TeXu a jsou uvedeny pro usnadnění čtenáři:

```
2887 (G), 2930 (r), 2917 (e), 2917 (e), 2932 (t), 2921 (i), 2926 (n), 2919 (g), 2931 (s), 3116 (,), 2592 (<space>), 2918 (f), 2930 (r), 2927 (o), 2925 (m), 2592 (<space>),  2900 (T), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3126 (6), 3126 (6), 3127 (7), 2917 (e), 2925 (m), 19597 (\lower), 3118 (.), 3125 (5), 2917 (e), 2936 (x), 6175 (\hbox), 379 ({), 2885 (E), 637 (}), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3122 (2), 3125 (5), 2917 (e), 2925 (m), 2904 (X), 3118 (.), 2592 (<space>), 7943 (\hskip), 3121 (1), 3120 (0), 2928 (p), 2932 (t)
```

Lidskému čtenáři je to jen řada celých čísel, ale pro TeX to zakóduje velké množství informací.

## Přečtěte tokeny nyní a uložte je na později

Při čtení vašeho vstupu mohou nastat chvíle, kdy potřebuje (nebo je instruován) odložit úplné zpracování určité sady tokenů. Je-li k tomu veden, TeX bude, dokud mu nebude řečeno, aby přestal, pokračovat ve vytváření tokenů ze vstupu, ale bude je ukládat pro pozdější použití — následně je bude načítat a zpracovávat jako součást svých sazečských aktivit. Tyto uložené tokeny se ukládají jako takzvané *seznamy tokenů* které jsou ve skutečnosti jediným (vnitřním) mechanismem TeXu pro ukládání dat tokenů.

Příklady seznamů tokenů už jsme viděli — `\hello` a `\TeX` makra uvedená výše: definice těchto maker jsou uloženy v paměti TeXu jako seznamy tokenů. TeX bude takové seznamy tokenů zpracovávat (vykonávat) až tehdy, když se rozhodnete tato makra zavolat. Pamatujte také, že každý token (celočíselná hodnota) kóduje dostatek informací, aby TeX snadno zjistil, zda každý token uložený v definici makra představuje znak nebo příkaz.

### Ukládání tokenů pomocí registrů tokenů

Dalším příkladem ukládání tokenů je explicitní vytváření seznamů tokenů, které se ukládají do takzvaných *registrů tokenů*: vyhrazených vnitřních paměťových oblastí, které TeX poskytuje uživatelům k ukládání seznamů tokenů. TeXovské primitivum `\toksdef` je jeden ze způsobů, jak používat registry tokenů; například pro použití registru tokenů `100` a odkazování na něj pomocí příkazu `\mylist`:

```
        \toksdef\mylist=100
        \mylist={nějaké tokeny \TeX{} zde}
```

`\mylist` je ve skutečnosti jen název, který přiřadíte seznamu tokenů uloženému v umístění registru `100`. `\mylist` obsahuje následující seznam tokenů:

|                         |                            |
| ----------------------- | -------------------------- |
| **Hodnota tokenu TeXu** | **Reprezentovaná položka** |
| 2931                    | s                          |
| 2927                    | o                          |
| 2925                    | m                          |
| 2917                    | e                          |
| 2592                    |                            |
| 5235                    | \TeX                       |
| 379                     | {                          |
| 637                     | }                          |
| 2592                    |                            |
| 2932                    | t                          |
| 2927                    | o                          |
| 2923                    | k                          |
| 2917                    | e                          |
| 2926                    | n                          |
| 2931                    | s                          |
| 2592                    |                            |
| 2920                    | h                          |
| 2917                    | e                          |
| 2930                    | r                          |
| 2917                    | e                          |

**Poznámka**: k ukončení `\TeX` makra a zabránění tomu, aby pohltilo následující `<mezera>` znak jsme použili dvojici složených závorek `{}` bezprostředně za `\TeX`—tokeny pro `{` (379) a `}` (637) jsou uloženy v seznamu tokenů. Další možností je použít token „řídicí mezera“ `\<space>` který by se v seznamu tokenů objevil, jak je znázorněno níže (tučně):

|                         |                            |
| ----------------------- | -------------------------- |
| **Hodnota tokenu TeXu** | **Reprezentovaná položka** |
| 2931                    | s                          |
| 2927                    | o                          |
| 2925                    | m                          |
| 2917                    | e                          |
| 2592                    |                            |
| 5235                    | \TeX                       |
| **4384**                | **\\**                     |
| 2932                    | t                          |
| 2927                    | o                          |
| 2923                    | k                          |
| 2917                    | e                          |
| 2926                    | n                          |
| 2931                    | s                          |
| 2592                    |                            |
| 2920                    | h                          |
| 2917                    | e                          |
| 2930                    | r                          |
| 2917                    | e                          |

Všimněte si, že `<mezera>` znak je reprezentován jako *znakový token* s hodnotou $$256\times 10 + 32 = 2592$$ ale `\﻿<space>` se zachází jako s jednoznakovým *tokenem příkazu* (hodnota 4384), která se vypočítá pomocí výše uvedených vzorců:

\begin{align\*} \text{curcs} & = 257 + \text{character (ASCII) code}\\\ & = 257 + 32\\\ &=289\\\ \text{command token for} \left<\text{\\\space}\right> & = \text{curcs + 4095}\\\ & = 289+4095\\\ &=4384\\\ \end{align\*}

V podstatě `\mylist={nějaké tokeny \TeX{} zde}` říká TeXu: prosím prohledej můj vstupní soubor, převeď následující znaky/příkazy na tokeny a ulož je pro pozdější použití. TeX vyhoví a uloží tyto tokeny do paměťového umístění, k němuž můžete přistoupit napsáním `\the\mylist`, čímž TeXu nařizujete vložit kopii tokenů obsažených v registru tokenů `\mylist`. TeXové enginy obsahují řadu primitivních příkazů, které explicitně generují a ukládají seznamy tokenů — například `\everyjob`, `\everypar`, `\mark`, a mnohé další.

[Část 1](/latex/cs/clanky-do-hloubky/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Část 2](/latex/cs/clanky-do-hloubky/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Část 3](/latex/cs/clanky-do-hloubky/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Část 4](/latex/cs/clanky-do-hloubky/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Část 5](/latex/cs/clanky-do-hloubky/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Část 6](/latex/cs/clanky-do-hloubky/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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/clanky-do-hloubky/19-how-does-expandafter-work-an-introduction-to-tex-tokens.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.
