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

# Hoe werkt \expandafter: een gedetailleerde studie van opeenvolgende \expandafter-opdrachten

&#x20;[Deel 1](/latex/nl/diepgaande-artikelen/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Deel 2](/latex/nl/diepgaande-artikelen/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Deel 3](/latex/nl/diepgaande-artikelen/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Deel 4](/latex/nl/diepgaande-artikelen/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Deel 5](/latex/nl/diepgaande-artikelen/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Deel 6](/latex/nl/diepgaande-artikelen/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)&#x20;

## Casestudy: Begrijpen \expandafter\expandafter\expandafter...

Geavanceerde macro's, zoals die in LaTeX-pakketten voorkomen, maken vaak uitgebreid gebruik van meerdere opeenvolgende `\expandafter` commando's om geavanceerde token-“jongleertrucs” uit te voeren. Voor de meesten van ons kunnen zulke macro's moeilijk te begrijpen of ontmoedigend om te schrijven zijn. In deze sectie bekijken we de mechanismen achter TeX' verwerking van opeenvolgende `\expandafter` commando's:

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

Ter ondersteuning van onze uitleg voegen we subscripts toe aan elk `\expandafter`—om aan te geven naar welke we verwijzen:

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

Daarnaast breiden we de notatie voor tokens die door elk `\expandafter` worden verwerkt uit met $$\mathrm{T^i\_1}$$ en $$\mathrm{T^i\_2}$$ om de tokens weer te geven $$\mathrm{T\_1}$$ en $$\mathrm{T\_2}$$ ingelezen door `\expandafter` met subscript `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. We nemen ook aan dat twee tokens $$\mathrm{T\_X}$$ en $$\mathrm{T\_Y}$$ volgen na `\expandafter<sub>3</sub>` zodat onze invoer er zo uitziet: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Wanneer TeX begint met het verwerken van deze invoer, zal het voor `\expandafter<sub>1</sub>` zien

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` dat wordt opgeslagen voor later *opnieuw invoegen* terug in de invoer
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, die wordt uitgebreid

Als we terugverwijzen naar onze eerdere bespreking van de [code in TeX](/latex/nl/diepgaande-artikelen/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) die implementeert `\expandafter`, dan is het bij de expansie van `\expandafter<sub>3</sub>` dat we recursie zien plaatsvinden. Om `\expandafter<sub>1</sub>` TeX heeft zijn interne functie al aangeroepen `expand()`, dus om (uit te breiden) `\expandafter<sub>3</sub>` TeX maakt een *tweede* aanroep naar `expand()`—vanuit de `expand()` functie zelf.

Voor `\expandafter<sub>3</sub>` we hebben

* $$\mathrm{T^3\_1 = T\_X}$$, dat wordt opgeslagen voor later *opnieuw invoegen* terug in de invoer
* $$\mathrm{T^3\_2 = T\_Y}$$, waarvan we aannemen dat het uitbreidbaar is

Laten we verder aannemen dat de expansie van $$\mathrm{T\_Y}$$ de volgende reeks tokens oplevert: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. We hebben nu het einde bereikt van het expansieproces gestart door de commandoreeks `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ en TeX gaat verder met het “afwikkelen” van het recursieproces dat begon met `\expandafter<sub>1</sub>`.

Na het verwerken van `\expandafter<sub>3</sub>` TeX heeft in zijn geheugen een tokenlijst met tokens uit de expansie van $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX begint nu met het opnieuw invoegen van de tokens die het heeft opgeslagen tijdens het verwerken van `\expandafter` commando's:

1. TeX begint met het opnieuw invoegen van token $$\mathrm{T\_X}$$ opgeslagen door `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ wordt opnieuw ingevoegd *vóór* van de expansie van $$\mathrm{T\_Y}$$, wat resulteert in een tokenreeks: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. We moeten echter nog steeds het proces voltooien dat is gestart door `\expandafter<sub>1</sub>` dat het token opsloeg dat staat voor `\expandafter<sub>2</sub>`
3. De uiteindelijke tokenreeks die door TeX wordt samengesteld, klaar om te worden ingelezen in de volgende fase van TeX' verwerking, is `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX heeft nu de “eerste ronde” van verwerking voltooid en schakelt over naar het lezen van de reeks tokenlijsten die het heeft gegenereerd—die reeks begint met `\expandafter<sub>2 (token)</sub>` die TeX vervolgens verwerkt. Voor `\expandafter<sub>2</sub>` we hebben
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ dat wordt opgeslagen voor later *opnieuw invoegen* terug in de invoer
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ dat het eerste token is dat voortkomt uit de expansie van $$\mathrm{T\_Y}$$; indien uitbreidbaar, wordt het uitgebreid
5. Als we aannemen dat token $$\mathrm{T^1\_Y}$$, het eerste token uit de expansie van $$\mathrm{T\_Y}$$, uitbreidt tot $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ dan zou, nadat TeX $$\mathrm{T\_X}$$opnieuw heeft ingevoegd, de resulterende tokenreeks die door TeX opnieuw moet worden verwerkt zijn: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   wat we kunnen herformuleren als

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

Het volgende diagram illustreert de tokenlijsten die zijn gemaakt door de TeX-code

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

![Afbeelding die laat zien hoe TeX meerdere \expandafter-commando's verwerkt](/files/4040ce950b62f36cecffef0454ae0eca39f1116e)

### Theorie in de praktijk

Bij wijze van voorbeeld definiëren we de volgende macro's die dienen als $$\mathrm{T\_X}$$ en $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` waarbij we definiëren `\foo` als `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` waarbij we eerst definiëren `\def\abc{Hello}`, `\def\xyz{, World!}` en vervolgens `\def\bar{\abc\xyz}`

We gebruiken het volgende codefragment om onze eerdere analyse te demonstreren:

\expandafter\expandafter\expandafter\foo\bar

Uit onze bespreking volgt dat het resultaat van `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ een reeks tokens in de vorm:

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

waarbij de exacte reeks afhangt van de aard van token $$\mathrm{T\_Y}$$. Als we onze voorbeeldcommando's invoegen met $$\mathrm{T\_X}=$$`\foo` en $$\mathrm{T\_Y}=$$`\bar`, dat is gedefinieerd als `\def\bar{\abc\xyz}`, zien we:

* het eerste token in $$\mathrm{T\_Y}$$ is `\abc` en de expansie ervan is een reeks karaktertokens: `Hello`
* de resterende tokens in $$\mathrm{T\_Y}$$ is het enkele token dat staat voor `\xyz`.

Als we deze informatie in onze “analyse” stoppen, krijgen we

$$\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\*}$$

Merk op dat subscripts <sub>token</sub> en <sub>tokenlijst (tekens)</sub> worden gebruikt om te benadrukken (ons eraan te herinneren) dat TeX leest *gehele tokenwaarden*, niet *teksttekens*, daarom is er geen noodzaak om spaties of andere scheidingstekens na `\foo`: dergelijke scheidingstekens zijn allang verwerkt of verworpen; hier bevinden we ons stevig in TeX' innerlijke wereld van tokenlijsten en gehele tokenwaarden.

Wanneer TeX de tokenlijstreeks verwerkt die door onze `\expandafter` commando's wordt geproduceerd, zal het `**H**ello, World!`—alleen `H` wordt vetgedrukt gezet. We kunnen hetzelfde resultaat bereiken door de equivalente TeX-code te schrijven `\foo Hello\xyz`. Merk op dat de definitie van `\foo` een enkel parameter gebruikte; bijgevolg, `\foo` neemt het enkele `H` karaktertoken voor zijn argument in zich op, waarbij de resterende karaktertokens (`ello`) onaangeroerd blijven.

**Opmerkingen:**

* het schrijven van `\foo\bar` geeft een heel andere uitvoer: het token voor `\bar` zou worden gebruikt als het argument voor `\foo` wat resulteert in het zetten van **`Hello, World`**—alles wordt vetgedrukt gezet.
* het schrijven van `\expandafter\foo\bar` zorgt ervoor dat `\bar` wordt uitgebreid, wat twee tokens oplevert: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Dan, nadat de $$\text{foo}*\text{token}$$ is opnieuw ingevoegd door `\expandafter` verwerkt TeX de tokenreeks $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ wat opmaakt `**Hello**, World`—alleen **`Hello`** wordt vetgedrukt gezet. Hier wordt het enkele token $$\text{abc}*\text{token}$$ verwerkt als het argument voor het macro-token $$\text{foo}*\text{token}$$, waarbij het token $$\text{xyz}\_\text{token}$$ onaangeroerd blijft en de inhoud ervan in het huidige lettertype wordt gezet.

## Opmerking over \expandafter en macro's met argumenten

Bij gebruik van `\expandafter` om de expansie van macro's af te dwingen, is het de moeite waard om te weten hoe macro-expansie werkt—vooral voor macro's die argumenten nemen. Voordat TeX een macro kan uitvoeren—d.w\.z. tokens lezen en verwerken die in de definitie van de macro staan—moet TeX de macro “klaar om uit te voeren” maken door het initiële macro-expansieproces uit te voeren. Als de definitie van een macro het gebruik van parameters omvat (`#1`, `#2`, ... `#9`), vereist een deel van het macro-expansieproces dat TeX de invoer scant op tokens die het/de door de gebruiker opgegeven argument(en) vormen: die argumenttokens worden geabsorbeerd (verwijderd) uit de invoer. Tijdens macro-expansie leest en absorbeert TeX tokens uit de invoer om mini-tokenlijsten te maken, één lijst per argument; die tokenlijsten worden vervolgens ingevoegd op de juiste plaats binnen de body van de macro—wanneer TeX deze uitvoert. De laatste stap in macro-expansie houdt in dat TeX de in het geheugen opgeslagen macrodefinitie opzoekt en ervoor zorgt dat die locatie de bron wordt waaruit TeX de volgende set invoertokens leest. Macro-uitvoering begint wanneer TeX die tokens begint te lezen en te verwerken, waarbij de eerder gemaakte tokenlijsten voor de argumenten worden ingevoerd.

### Scheidingstokens worden ook geabsorbeerd

Als de oorspronkelijke macrodefinitie ook tokens gebruikte die als scheidingstekens fungeren, zou TeX ook de oorspronkelijke macrodefinitie moeten vergelijken met het gebruik (de aanroep) van die macro door de gebruiker, op zoek naar en het matchen van scheidingstokens. Zodra ze overeenkomen/gevonden zijn, worden scheidingstokens vervolgens genegeerd omdat hun enige doel is om als “interpunctie” te dienen, waardoor TeX de daadwerkelijke tokens kan uitpikken en identificeren die bedoeld zijn om elk argument te vormen.

&#x20;[Deel 1](/latex/nl/diepgaande-artikelen/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Deel 2](/latex/nl/diepgaande-artikelen/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Deel 3](/latex/nl/diepgaande-artikelen/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Deel 4](/latex/nl/diepgaande-artikelen/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Deel 5](/latex/nl/diepgaande-artikelen/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Deel 6](/latex/nl/diepgaande-artikelen/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/nl/diepgaande-artikelen/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.
