> 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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Jak funguje \expandafter: Podrobná studie po sobě jdoucích příkazů \expandafter

&#x20;[Čá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)&#x20;

## Případová studie: Pochopení \expandafter\expandafter\expandafter...

Pokročilé makra, jako jsou ta v balíčcích LaTeXu, často hojně využívají několik po sobě jdoucích `\expandafter` příkazů k provádění sofistikované „žonglování“ s tokeny. Pro většinu z nás mohou být taková makra obtížná na pochopení nebo zastrašující na psaní. V této části si projdeme mechanismy, na nichž stojí zpracování po sobě jdoucích `\expandafter` příkazů:

```
\expandafter\expandafter\expandafter...
```

Abychom si výklad usnadnili, přidáme ke každému `\expandafter`—aby bylo jasné, na který odkazujeme:

```
        \expandafter1\expandafter2\expandafter3...
```

Kromě toho rozšíříme zápis tokenů zpracovaných každým `\expandafter` tak, aby používal $$\mathrm{T^i\_1}$$ a $$\mathrm{T^i\_2}$$ značící tokeny $$\mathrm{T\_1}$$ a $$\mathrm{T\_2}$$ načtené `\expandafter` s dolním indexem `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Také budeme předpokládat, že dva tokeny $$\mathrm{T\_X}$$ a $$\mathrm{T\_Y}$$ následují po `\expandafter<sub>3</sub>` takže náš vstup vypadá takto: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Když TeX začne zpracovávat tento vstup, pro `\expandafter<sub>1</sub>` uvidí

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` který se uloží na později *znovuvložení* zpět do vstupu
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, který se expanduje

Když se vrátíme k naší dřívější diskusi o [kódu uvnitř TeXu](/latex/cs/clanky-do-hloubky/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) který implementuje `\expandafter`, je to s expandováním `\expandafter<sub>3</sub>` že vidíme, jak probíhá rekurze. Aby se zpracovalo `\expandafter<sub>1</sub>` TeX už zavolal svou interní funkci `expand()`, takže pro zpracování (expandování) `\expandafter<sub>3</sub>` TeX provádí *druhý* volání `expand()`—zevnitř `expand()` samotné funkce.

Pro `\expandafter<sub>3</sub>` máme

* $$\mathrm{T^3\_1 = T\_X}$$, který se uloží na později *znovuvložení* zpět do vstupu
* $$\mathrm{T^3\_2 = T\_Y}$$, o kterém budeme předpokládat, že je rozšiřitelný

Předpokládejme dále, že expandování $$\mathrm{T\_Y}$$ dá následující posloupnost tokenů: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Tím jsme nyní dospěli na konec procesu expandování zahájeného sekvencí příkazů `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ a TeX pokračuje v „rozmotávání“ procesu rekurze, který začal s `\expandafter<sub>1</sub>`.

Po zpracování `\expandafter<sub>3</sub>` má TeX ve své paměti seznam tokenů obsahující tokeny z expandování $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX nyní začíná znovu vkládat tokeny, které si uložil během zpracování `\expandafter` příkazů:

1. TeX začíná znovuvkládáním tokenu $$\mathrm{T\_X}$$ uloženého pomocí `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ se znovu vloží *před* expandování $$\mathrm{T\_Y}$$, což vede k posloupnosti tokenů: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Stále však musíme dokončit proces zahájený `\expandafter<sub>1</sub>` který uložil token reprezentující `\expandafter<sub>2</sub>`
3. Konečná posloupnost tokenů sestavená TeXem, připravená k načtení v další fázi zpracování TeXem, je `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX nyní dokončil „první kolo“ zpracování a přechází ke čtení posloupnosti seznamů tokenů, které vytvořil—tato posloupnost začíná `\expandafter<sub>2 (token)</sub>` kterou TeX následně zpracuje. Pro `\expandafter<sub>2</sub>` máme
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ který se uloží na později *znovuvložení* zpět do vstupu
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ který je prvním tokenem vzniklým expandováním $$\mathrm{T\_Y}$$; je-li rozšiřitelný, expanduje se
5. Předpokládejme, že token $$\mathrm{T^1\_Y}$$, první token z expandování $$\mathrm{T\_Y}$$, se expanduje na $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ pak po tom, co TeX znovu vložil $$\mathrm{T\_X}$$, by výsledná posloupnost tokenů, kterou má TeX znovu zpracovat, byla: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   což můžeme přepsat jako

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

Následující diagram znázorňuje seznamy tokenů vytvořené kódem TeXu

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![Obrázek znázorňující zpracování několika příkazů \expandafter v TeXu](/files/16af7c72372411f73b2d39a95e05f32bc226b6cd)

### Teorie v praxi

Jako příklad si definujeme následující makra, která budou sloužit jako $$\mathrm{T\_X}$$ a $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` kde definujeme `\foo` jako `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` kde nejprve definujeme `\def\abc{Hello}`, `\def\xyz{, World!}` a poté `\def\bar{\abc\xyz}`

Následující úryvek kódu použijeme k demonstraci naší předchozí analýzy:

\expandafter\expandafter\expandafter\foo\bar

Z naší diskuse plyne, že výsledek `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ vytvoří posloupnost tokenů ve tvaru:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

kde přesná posloupnost závisí na povaze tokenu $$\mathrm{T\_Y}$$. Pokud vložíme naše ukázkové příkazy pomocí $$\mathrm{T\_X}=$$`\foo` a $$\mathrm{T\_Y}=$$`\bar`, který je definován jako `\def\bar{\abc\xyz}`, vidíme:

* první token v $$\mathrm{T\_Y}$$ je `\abc` a jeho expandování je posloupnost znakových tokenů: `Hello`
* zbývající tokeny v $$\mathrm{T\_Y}$$ je jediný token reprezentující `\xyz`.

Pokud tuto informaci dosadíme do naší „analýzy“, dostaneme

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

Všimněte si, že dolní indexy <sub>token</sub> a <sub>seznam tokenů (znaky)</sub> se používají k zdůraznění (připomenutí), že TeX čte *číselné hodnoty tokenů*, nikoli *textové znaky*, a proto není třeba zobrazovat žádné mezery ani jiné oddělovače za `\foo`: takové oddělovače už byly dávno zpracovány nebo zahozены; zde jsme pevně v TeXově vnitřním světě seznamů tokenů a číselných hodnot tokenů.

Když TeX zpracovává posloupnost seznamů tokenů vytvořenou našimi `\expandafter` příkazy, vysází `**H**ello, World!`—pouze `H` je vysazeno tučně. Stejného výsledku bychom mohli dosáhnout napsáním ekvivalentního kódu TeXu `\foo Hello\xyz`. Všimněte si, že definice `\foo` použila jediný parametr; důsledkem toho `\foo` absorbuje jediný `H` znakový token pro svůj argument a ponechává zbývající znakové tokeny (`ello`) nedotčené.

**Poznámky:**

* psaní `\foo\bar` vytváří zcela odlišný výstup: token pro `\bar` by byl použit jako argument pro `\foo` což vede k vysázení **`Hello, World`**—vše je vysazeno tučně.
* psaní `\expandafter\foo\bar` způsobí `\bar` se expanduje, což vytvoří dva tokeny: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Poté, po $$\text{foo}*\text{token}$$ je znovu vložen pomocí `\expandafter` TeX zpracuje posloupnost tokenů $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ která vysází `**Hello**, World`—pouze **`Hello`** je vysazeno tučně. Zde je jediný token $$\text{abc}*\text{token}$$ zpracován jako argument pro token makra $$\text{foo}*\text{token}$$, přičemž token $$\text{xyz}\_\text{token}$$ zůstává nedotčený a jeho obsah je vysazen aktuálním písmem.

## Poznámka k \expandafter a makerům s argumenty

Při použití `\expandafter` pro vynucení expandování maker je dobré vědět, jak funguje expandování maker—zejména u maker, která přijímají argumenty. Než může TeX makro spustit—tj. číst a zpracovávat tokeny obsažené v definici makra—musí TeX makro „připravit ke spuštění“ provedením počátečního procesu expandování makra. Pokud definice makra zahrnuje použití parametrů (`#1`, `#2`, ... `#9`), část procesu expandování makra vyžaduje, aby TeX prohledal vstup a hledal tokeny tvořící argument(y) poskytnuté uživatelem: tyto argumentové tokeny jsou absorbovány (odebrány) ze vstupu. Během expandování makra TeX čte a absorbuje tokeny ze vstupu, aby vytvořil malé seznamy tokenů, jeden seznam na každý argument; tyto seznamy tokenů budou následně vloženy na příslušné místo v těle makra—když je TeX vykoná. Závěrečná fáze expandování makra zahrnuje to, že TeX najde definici makra uloženou v paměti a zařídí, aby se toto místo stalo zdrojem, z něhož TeX bude číst další sadu vstupních tokenů. Spuštění makra začíná, když TeX začne číst a zpracovávat tyto tokeny a vkládat seznamy tokenů vytvořené dříve k uložení argumentů.

### Oddělovací tokeny jsou také absorbovány

Pokud původní definice makra používala také tokeny fungující jako oddělovače, TeX by také musel porovnat původní definici makra s použitím (voláním) toho makra ze strany uživatele a hledat nalezení a shodu oddělovacích tokenů. Jakmile jsou spárovány/nalezeny, oddělovací tokeny se následně ignorují, protože jejich jediným účelem je fungovat jako „interpunkce“, která TeXu pomáhá vybrat a identifikovat skutečné tokeny určené k vytvoření každého argumentu.

&#x20;[Čá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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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.
