> 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/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# Jak funguje \expandafter: Význam expanze

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

## Představení TeXovho pojmu „expanze“

Poté, co jsme si prošli [TeXové tokeny a seznamy tokenů](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true), bude dalším tématem našeho seznamu souvisejících pojmů pro `\expandafter` TeXův pojem *rozšiřování*: základní proces TeXu `\expandafter` je navržen tak, aby pracoval s.

### O obtížnosti vysvětlování expanze...

Pro většinu z nás může být TeXův pojem expanze a důvody/mechanismus(y), které za ním stojí, matoucí — není snadné to *zcela* vysvětlit jednoduchým a stručným způsobem. Mnohé vnitřní operace/procesy TeXu jsou navzájem propojeny poměrně složitými způsoby, což může přinášet potíže, když se snažíme „rozebrat“ určité aspekty TeXových operací: tedy pokusit se o nich diskutovat izolovaně od programu jako celku. Expanze je určitě pojem, který do této kategorie spadá, protože je *zásadním* prvkem TeXova chování a je hluboce zakořeněna ve všech vnitřních procesech TeXu. Tento článek se však pokouší sestavit vysvětlení expanze a nabídnout základ, na němž mohou čtenáři stavět.

Abychom vysvětlili expanzní mechanismus TeXu, budeme postupovat krok za krokem, projdeme si řadu souvisejících/relevantních témat a spojíme je dohromady, abychom si vytvořili porozumění tomuto klíčovému prvku TeXova chování. Později v článku, a pro odvážnějšího čtenáře, který má rád detaily, nahlédneme přímo do TeXu a shrneme klíčový zdrojový kód, který pohání proces expanze.

### Klíčové body o TeXových tokenech

V následující diskusi je důležité mít na paměti, že TeX může získat svou další vstupní položku ze dvou zdrojů:

1. **fyzických textových souborů**: vytvářením *nové tokeny* čtením/skenováním znaků a příkazů v těchto souborech, nebo
2. **seznamů tokenů**: získáváním vstupu čtením ze seznamu existujících, *předpřipravených*, tokenů uložených v paměti TeXu.

Také si připomeňme, že TeX používá tokeny jako pohodlný způsob, jak přehledně „zabalit“ informace o jakékoli položce (znaku nebo příkazu), kterou přečetl.

Když TeX vytváří *nové tokeny* bude *v okamžiku vytváření tokenu*mít okamžitý přístup k informacím o položce, jejíž tokenovou hodnotu právě počítá. Například při vytváření nových tokenů příkazů TeX nejprve vypočítá hodnotu zvanou `curcs` která TeXu umožňuje vyhledat informace o příkazu, jehož token se chystá vytvořit.

Pokud však TeX čte ze seznamů tokenů (sekvencí *uložených tokenů*), musel by nejprve každý token v tomto seznamu „rozbalit“, než by mohl určit, co který token představuje. Například TeX může číst tokeny uložené jako součást definice makra: tyto tokeny byly vytvořeny z textu, který už dávno byl přečten, převeden na tokeny a uložen. Typ tokenu (znak nebo příkaz) určuje, co vlastně TeXovo „rozbalení“ znamená:

* pro *příkazové tokeny* (hodnota tokenu je > 4095): vypočítej `curcs` prostřednictvím $$\text{curcs}=\text{token value}-4095$$ a použij `curcs` k vyhledání informací o příkazu;
* pro *znakové tokeny* (hodnota tokenu < 4095): rozděl znakový token na jeho složky tvořené dvojicí (kód znaku, kategorie znaku).

### Na začátku...

Na začátek našeho zkoumání expanze se podíváme na to, jak TeXové enginy třídí nebo kategorizují množinu příkazů, které mohou zpracovávat. Pro tuto chvíli předpokládejme, že „expandovatelný“ je prostě nějaká dosud nevysvětlená „vlastnost“ TeXového příkazu.

### Pojem „expandovatelných“ příkazů

Všechny sázecí programy založené na TeXu („enginy“ TeXu) rozumějí dvěma hlavním „třídám“ příkazů:

* příkazy zabudované přímo do spustitelného enginu: tzv. *primitivy*;
* příkazy definované uživatelem: tzv. *makra*.

TeXové enginy také používají „být expandovatelný“, tedy typ chování příkazu, jako mechanismus pro klasifikaci všech příkazů do dvou skupin:

* expandovatelné příkazy;
* neexpandovatelné příkazy.

Můžeme tedy uvažovat, že množinu všech příkazů (primitiv a maker) lze klasifikovat tak, jak ukazuje následující obrázek:

![Diagram znázorňující klasifikaci všech TeXových příkazů](/files/65032ca116439ad5bf60b0b97e8f2d204a4aab9f)

Ačkoli zatím nevíme, co přesně expanze/expandovatelný znamená, lze vidět, že:

* všechna makra jsou klasifikována jako expandovatelné příkazy;
* některé primitivní (vestavěné) příkazy jsou také klasifikovány jako expandovatelné (naprostá většina nikoli).

**Poznámka k aktivním znakům**: Kromě primitiv a maker existuje třetí třída „expandovatelné“ položky: aktivní znaky — jakékoli znaky, kterým je přiřazen kód kategorie 13, jsou také považovány za „expandovatelné“, protože se zpracovávají jako „miniaturní makra“.

#### Jak TeX pozná, že je příkaz „expandovatelný“?

Z našeho [výkladu o TeXových tokenech](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) víme, že tokeny nejsou nic víc než celá čísla, která TeX počítá a používá k „zabalení“ informací o položce vstupu: znaku nebo příkazu. Také jsme poznamenali, že pro libovolnou hodnotu tokenu (celé číslo) může TeX, je-li to potřeba, obrátit proces tokenizace, aby token „rozbalil“ a odhalil údaje o příkazu nebo znaku, který představuje.

Pomocí dat vzniklých při vytváření nového tokenu TeXem nebo dat získaných z existujícího tokenu — např. uloženého v makru nebo jiném seznamu tokenů — může TeX prohledat své interní tabulky datového úložiště a najít podrobné informace o příkazu (nebo znaku) reprezentovaném tímto tokenem. Následující obrázek shrnuje proces vytváření tokenu příkazu („balení“) a poté, když TeX potřebuje nějakou informaci, obrácení tohoto procesu („rozbalení“ tokenu) za účelem získání dat o příkazu reprezentovaném konkrétní hodnotou tokenu.

![Diagram znázorňující, jak TeX balí/rozbaluje tokeny](/files/31bbdb75bcf68e5dfd362e060b586f078fb0d708)

### Kódy příkazů

Součástí informací, které TeX ukládá o každém příkazu (primitivu nebo makru), je něco zvaného jeho *kód příkazu*: celočíselná hodnota, kterou TeXové enginy (interně) používají ke klasifikaci příkazů — příkazy se podobným chováním/funkčností sdílejí stejný kód příkazu.

**Poznámka**: U jednotlivého, *neaktivních*, znaku je jeho kód příkazu *kategoriální kód* hodnota, která mu byla přiřazena v okamžiku, kdy jej TeX přečetl (skenoval). Všimněte si také, že s výjimkou znaků jsou kódy příkazů čistě interní záležitostí TeXu: nejsou přístupné prostřednictvím maker nebo primitivních příkazů — pro tyto podrobnosti budete muset nahlédnout do zdrojového kódu TeXu!

Zde jsou některé příklady kódů příkazů:

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` (a další) jsou všechny klasifikovány jako příkazy pro „sestavování boxů“ a sdílejí kód příkazu 20;
* `\def`, `\edef`, `\gdef`, `\xdef` jsou všechny příkazy pro „definici makra“ a sdílejí kód příkazu 97;
* všechna makra jsou klasifikována jedním z kódů příkazů 111, 112, 113 nebo 114: různé kódy příkazů jsou určeny použitím `\long` nebo `\outer` při definování makra:
* 111: kód příkazu pro makro, které není long ani outer (např. `\def\foo{...}`)
* 112: kód příkazu pro long, neouter makro (např. `\long\def\foo{...}`)
* 113: kód příkazu pro ne-long, outer makro (např. `\outer\def\foo{...}`)
* 114: kód příkazu pro long, outer makro (např. `\long\outer\def\foo{...}`)

TeX také používá kódy příkazů k identifikaci podmnožiny příkazů klasifikovaných jako „expandovatelné“. Aby to udělal, TeX spojuje expandovatelné příkazy s hodnotami kódu příkazu, které překračují prahovou hodnotu 100 (hodnota používaná původním TeXem od Knutha, e-TeXem a pdfTeXem). Z toho plyne, že:

* *nerozšiřitelných* příkazy (naprostá většina) mají kód příkazu <= 100
* *expandovatelné* příkazy mají kód příkazu > 100

Pokud tedy TeX vyhledá podrobnosti o určitém příkazu a zjistí, že kód příkazu > 100, okamžitě ví, že je expandovatelný. Všechna makra a malý počet primitivních (vestavěných) příkazů je přiřazen kód příkazu, který naznačuje, že jsou expandovatelné: ale proč si TeX s touto klasifikací „expandovatelný“ vůbec dělá starosti? Jak možná tušíte, znamená to prostě, že tyto příkazy jsou do určité míry „speciální“; tj. mohou být podrobeny TeXovu procesu *rozšiřování*.

**Poznámka (znaky)**: Pokud znak nebyl definován jako aktivní (kód kategorie 13), jsou všechny znaky neexpandovatelné. Aktivní znaky lze chápat jako jednoliterová „mini makra“.

## Ano, ano, ale co je vlastně expanze???

Poznamenali jsme, že hodnoty tokenů větší než 4095 se používají k reprezentaci příkazů; proto může TeX, pokud je to potřeba, tento token „rozbalit“, aby získal přístup k informacím o TeXovém příkazu, který daný token představuje. TeX může vyhledat hodnotu kódu příkazu, aby určil, zda spadá do speciální kategorie expandovatelných. Co však TeX s touto informací dělá a co „být expandovatelný“, tj. expanze, *doopravdy znamená*?

### Expace: obecný termín pro soubor operací

V určitých okamžicích během zpracování TeX potřebuje vědět, zda token představuje expandovatelný příkaz:

* **Ne**: Pokud token tohoto příkazu *ne* nespadá do kategorie expandovatelných, TeX jej jednoduše „předá dál“ do další fáze zpracování.
* **Ano**: Pokud token tohoto příkazu *ne* spadá do kategorie expandovatelných, lze si představit, že TeX musí provést akci, která vede k „odfiltrování“ tohoto konkrétního tokenu pomocí procesu, který TeX označuje jako „expanzi tohoto tokenu“, tedy provedení expanze.

V podstatě expanze znamená, že TeX *odstranění* ten token z jeho vstupu a *nahrazení* nahradí jej tokeny vzniklými z „expanzního procesu“ specifického pro daný příkaz nebo skupinu příkazů sdílejících stejný kód příkazu.

Chce to praxi a zkušenosti, abychom poznali, kdy TeX tokenovou expanzi provádí a kdy ne — strana 215 knihy The TeXbook uvádí situace, ve kterých expandovatelné tokeny expandovány nejsou. Skutečnost je taková, že proces provádění expanze v TeXu je složitý a jemně odstíněný.

#### Které příkazy jsou expandovatelné?

Když se podíváte na seznam primitivních (vestavěných) příkazů, které TeXové enginy klasifikují jako expandovatelné (např. strany 212–215 knihy The TeXbook), stává se zřejmým, že v praxi je expanze spíše obecný termín, který TeX používá k popisu chování poněkud eklektické skupiny příkazů. Výsledky expanze konkrétního (expandovatelného) příkazu se liší a lze to vidět na seznamu expandovatelných příkazů — seskupených podle jejich funkčnosti. Přesná sémantika jednotlivých příkazů zde není důležitá; nejzajímavější jsou obecné důsledky jejich akcí — co jejich expanze vlastně *dělá nebo čeho dosahuje*.

| **Příkaz**                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | **Popis**                                                                                                                                              | **Chování expanze**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>všechna makra</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                            | Uložená sekvence tokenů příkazů/znaků                                                                                                                  | <p>Ve skutečnosti expanze makra znamená vložení seznamu tokenů, které má TeX přečíst. To zahrnuje:</p><ul><li>vytváření seznamů tokenů pro jakékoli argumenty makra — tento proces zahrnuje identifikaci/absorbování oddělovacích tokenů;</li><li>získání seznamu uložených tokenů (definice makra) a přípravu na vložení (do definice makra) parametrických tokenů vytvořených v prvním kroku.</li></ul><p>Ve skutečnosti expanze makra <em>odstraní token makra</em> ze vstupu a <em>nahradí jej</em> tokeny obsaženými v definici.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | Změna pořadí expanze                                                                                                                                   | Filtrování/promíchávání tokenů                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | Zabránění expanzi (ano, překvapivě je to klasifikováno jako expandovatelný příkaz)                                                                     | Zpoždění expanze (jakési filtrování tokenů)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | Souvisí se vstupem nového zdroje tokenů prostřednictvím zdrojových souborů — ano, `\scantokens` v této kategorii kvůli použití tzv. „pseudo-souborů“   | Fungovat jako zdroj nových tokenů                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | Zahájit podmíněný výraz                                                                                                                                | Začít „filtrování“ tokenů: rozhodování, které z následujících tokenů zpracovat.                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | Ukončit podmíněný výraz                                                                                                                                | Ukončit „filtrování“ tokenů: rozhodování, které tokeny zpracovat                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | Sestavit/vytvořit token příkazu                                                                                                                        | Převést sekvenci tokenů na jediný token příkazu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | Převést něco na sekvenci tokenů                                                                                                                        | Vygenerovat nějaké tokeny (které představují vnitřní množství nebo hodnotu)                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` má různá použití včetně vkládání tokenů; `\detokenize` převádí seznam tokenů na seznam znakových tokenů; `\unexpanded` zabraňuje expanzi tokenů | Vložit/vygenerovat nějaké tokeny nebo řídit expanzi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | Příkazy pro přístup k seznamům tokenů, které mají specializované použití                                                                               | Přistupovat ke zdroji uložených tokenů (seznamy tokenů)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |

Je možné na základě výše uvedeného seznamu vyvodit nějaká „obecná chování“ z této množiny příkazů — a dále tak zpřesnit naše chápání expanze? Zhruba řečeno, výsledky expanze příkazu spadají do několika klíčových činností:

* generování tokenů
* vkládání tokenů
* filtrování tokenů
* změna/řízení expanze následujícího tokenu

### A nakonec: význam expanze?

Můžeme uvažovat, že expanze tokenu příkazu (včetně aktivních znaků) zahrnuje, že TeX **odstranění** ten token příkazu ze vstupu a **nahrazení** tento token s jinými tokeny, které vznikají jeho expanzním chováním: generováním/vkládáním tokenů, filtrováním tokenů nebo změnou/řízením expanze následujícího tokenu. Jakmile je token expandován, TeX bude pokračovat ve čtení/zpracování všech tokenů, které mohou z expanzního procesu vzniknout. Kdy nebo kde přesně TeX expanzi provede, je zcela jiná otázka: vzhledem k jemnostem a složitosti zpracování TeXu ji v tomto článku nemůžeme plně vyčerpat, ale můžeme podat přehled hlavního chování TeXu při zpracování vstupu.

## Expace a struktura TeXu

Lze říci, že nejlepší způsob, jak vidět, jak/kde TeX rozlišuje mezi expandovatelnými a neexpandovatelnými příkazy, je podívat se do zdrojového kódu TeXu.

Uvnitř je TeX mimořádně složitý kus softwaru; proto je nepraktické pokoušet se o úplný popis mnoha jemně odstíněných chování, která jsou pro činnost TeXu vlastní. Jak bylo řečeno, přesně kdy nebo kde TeX při čtení tokenů skutečně provede expanzi, je „poněkud složité“; následující diskuse tedy předpokládá, že TeX je ve stavu, který vyžaduje, aby k expanzi došlo. Situace, kdy by TeX četl/vytvářel tokeny, ale neprováděl expanzi, zahrnují vytváření/ukládání tokenů pro `\def` příkaz definice makra nebo ukládání tokenů do `\toks` registru.

Následující diagram poskytuje zjednodušený přehled základních částí struktury TeXu, které se zabývají vstupem a zpracováním tokenů: cílem je zdůraznit způsob, jakým jsou expandovatelné a neexpandovatelné tokeny během zpracování vstupu v TeXu „filtrovány“. K popisu různých klíčových funkcí se používá programovací jazyk C, ale snad by měla být základní struktura srozumitelná i tehdy, pokud jazyk C neznáte.

![](/files/b0d53f4913885cdf2f722a3dc3793a6adb6464f1)

### Vysvětlení diagramu struktury TeXu

V zásadě je zpracování TeXu řízeno funkcí nazvanou `maincontrol()` kterou Knuth ve zdrojovém kódu TeXu označuje jako „chief executive“ a popisuje ji takto:

> „Nyní přicházíme k `maincontrol` rutině, která obsahuje hlavní přepínač, jenž způsobuje, že všechny různé části TeXu dělají své věci ve správném pořadí… toto je velké vyvrcholení programu… Nyní jsme v uzlu sítě, v centrálním nervovém systému, který se dotýká většiny ostatních částí a spojuje je dohromady.“

Následující popis je poněkud zjednodušený, ale dává „pocit“ základní struktury softwaru založeného na TeXu: jak jsou expandovatelné příkazy během zpracování vstupu v TeXu identifikovány („zachyceny“) a odfiltrovány.

Ve své podstatě TeX v nejranější fázi zpracování vstupu používá hodnotu kódu příkazu aktuálního příkazu (tokenu) k detekci expandovatelných příkazů (maker, expandovatelných primitiv a aktivních znaků); pokud je nějaký nalezen, takové příkazy jsou „zachyceny“ a „předzpracovány“ — tím, že se expandují. Prostřednictvím tohoto procesu filtrování (expanze) TeX odstraňuje expandovatelné příkazy ze vstupu a nahrazuje je tokeny vzniklými z jejich příslušného expanzního chování. Jakmile je proces expanze dokončen, TeX přečte všechny tokeny vzniklé z této expanze. Do další fáze TeXova zpracování se předávají pouze neexpandovatelné položky: do „velkého switchu“, kde TeX provede všechny neexpandovatelné primitivní příkazy a vysází znaky.

### Porozumění maincontrol()

Ta `maincontrol()` funkce obsahuje velký tzv. [switch statement](https://en.wikipedia.org/wiki/Switch_statement)—Knuth jej nazývá „velký switch“—který TeX používá k provádění všech *nerozšiřitelných* primitivních příkazů: těch s kódem příkazu <=100.

Aby bylo možné provést určitý příkaz (nebo znak), tento „velký switch“ používá kombinaci aktuálního režimu TeXu:

* vnitřní/vnější vertikální režim, nebo
* omezený/odstavcový horizontální režim, nebo
* režim inline/display matematiky

*plus* hodnoty kódu příkazu pro každý primitiv nebo znak — kód příkazu *neaktivních* znaku je jeho *kategoriální kód* hodnota. Pro úplnost, všech 6 režimů TeXu má přiřazenu celočíselnou hodnotu, kterou může TeX použít k uložení a obnovení svého aktuálního režimu při přepínání mezi sazbou různých konstrukcí — matematiky, odstavců, boxů a podobně. Zde jsou celá čísla přiřazená různým režimům TeXu:

|                              |                                     |                    |
| ---------------------------- | ----------------------------------- | ------------------ |
| **Režim**                    | **Význam**                          | **Hodnota režimu** |
| Vnější vertikální            | Mezi odstavci (sestavování stránek) | 1                  |
| Vnitřní vertikální           | Bezprostředně uvnitř `\vbox{...}`   | -1                 |
| Horizontální                 | Při sazbě/sestavování odstavců      | 102                |
| Omezený horizontální         | Bezprostředně uvnitř `\hbox{...}`   | -102               |
| Display matematika           | Sazba *zobrazeného* rovnic/vzorců   | 203                |
| Inline (vzorcová) matematika | Sazba *v řádku* rovnic/vzorců       | -203               |

Všimněte si použití záporných hodnot pro doplněk různých režimů, například vnitřního vs. vnějšího vertikálního režimu. Při zpracování příkazů v `maincontrol()`TeX používá absolutní hodnotu aktuálního režimu — tj. ignoruje záporné znaménko. Takže například pokud je TeX v některém ze svých horizontálních režimů a potřebuje zpracovat znak s kódem kategorie 11, použije součet $$102 + 11 = 113$$ uvnitř svého „velkého switchu“, aby se od větve odpojil ke kódu, který tyto znaky zpracovává v libovolném horizontálním režimu (sestavování odstavců nebo uvnitř `\hbox`).

#### Získání dalšího tokenu

Ta `maincontrol()` funkce volá funkci `getxtoken()` pro získání dalšího vstupního tokenu; následně `getxtoken()` volá nejnižší vstupní funkci `getnext()`. Po skončení práce `getnext()` a nastavení hodnot klíčových *globálních proměnných*, `getxtoken()` zkoumá, zda právě přečtená položka představuje makro nebo expandovatelné primitivum.

Několik poznámek k `getnext()` a `getxtoken()`:

* **`getnext()`**: toto je hlavní vstupní funkce TeXu. Čte a zpracovává znaky zadané z fyzického souboru nebo čte tokeny ze seznamu tokenů. Všimněte si, že `getnext()` ve skutečnosti nepočítá hodnoty tokenů, ale nastavuje řadu klíčových *globálních* proměnných (např. kód příkazu a `curcs`), které se používají později při zpracování.
* **`getxtoken()`**: „get expanded token“ používá `getnext()` ke čtení další vstupní položky. Poté testuje kód příkazu právě přečtené položky, aby ověřil, zda tato položka představuje expandovatelný příkaz: pokud ano, expanduje se nebo se zavolá makro. U neexpandovatelných položek `getxtoken()` vypočítá hodnotu tokenu a tyto údaje se předají do další fáze zpracování: do „velkého switchu“, kde se vykonávají neexpandovatelné primitivy a znaky se sází.

Ve své podstatě je to právě prostřednictvím `getxtoken()` že jsou všechny expandovatelné položky „odfiltrovány“ dříve, než jsou zpracovány v `maincontrol()`: to vede k tomu, že TeXův „velký switch“ zpracovává pouze neexpandovatelné primitivní příkazy.

Ještě jednou zdůrazňujeme, že výše uvedený diagram je zjednodušením, protože i jiné části zpracování TeXu budou tokeny expandovat; například:

* když TeX hledá (skenuje) číselné hodnoty, spustí expanzi při hledání celých čísel (voláním `getxtoken()`) ;
* primitivního příkazu `\romannumeral` způsobuje expanzi — viz článek [Expanze pomocí `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) pro jemně odstíněné použití této skutečnosti;
* Ta `\edef` makrodefiniční příkaz („expanded definition“) vynucuje úplnou expanzi;
* TeX bude expandovat tokeny v určitých bodech při zpracování preambule `\halign` nebo `\valign` (oba příkazy souvisejí s algoritmy TeXu pro sazbu tabulek).

[Čá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/22-how-does-expandafter-work-the-meaning-of-expansion.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.
