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

# Hoe TeX-macro's echt werken: Deel 5

[Deel 1](/latex/nl/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.md) [Deel 2](/latex/nl/meer-onderwerpen/20-how-tex-macros-actually-work-part-2.md) [Deel 3](/latex/nl/meer-onderwerpen/21-how-tex-macros-actually-work-part-3.md) [Deel 4](/latex/nl/meer-onderwerpen/22-how-tex-macros-actually-work-part-4.md) [Deel 5](/latex/nl/meer-onderwerpen/23-how-tex-macros-actually-work-part-5.md) [Deel 6](/latex/nl/meer-onderwerpen/24-how-tex-macros-actually-work-part-6.md)

## Inleiding en overzicht

In Deel 4 hebben we enkele basiskenmerken van TeX-macro’s besproken ter voorbereiding op de volgende twee artikelen, waarin we een nadere blik werpen op de onderliggende mechaniek van TeX-macro’s: gespecialiseerde tokenlijsten. In deze laatste twee artikelen gebruiken we diagrammen, node-lijsten genoemd, die zijn voorbereid op basis van gegevens die zijn gegenereerd met behulp van een speciaal aangepaste versie van Knuths oorspronkelijke TeX-software—die aanpassingen waren bedoeld om toegang te krijgen tot interne TeX-gegevensstructuren die normaal niet toegankelijk zijn voor de gebruiker. Door te “koppelen” aan TeX’ interne routines voor macroverwerking en uitvoering was het mogelijk grafische gegevens uit te schrijven, wat een meer gedetailleerde en nauwkeurige bespreking van TeX’ macroverwerkingsgedrag mogelijk maakt. Overleaf hoopt dat deze diagrammen lezers helpen een beter begrip te krijgen van hoe TeX-macro’s echt werken.

### Mogelijk aanvullende achtergrondlectuur

Overleaf heeft al twee artikelen over tokens gepubliceerd die aanvullende achtergrondinformatie bieden over TeX-tokens en TeX-tokenlijsten. Neem vooral de tijd om ze te bekijken als u hiaten in uw begrip wilt opvullen en het meeste uit Deel 5 en 6 van deze reeks wilt halen.

* [Wat is een "TeX-token"?](/latex/nl/diepgaande-artikelen/53-what-is-a-tex-token.md)
* [Wat is een TeX-tokenlijst?](/latex/nl/diepgaande-artikelen/54-what-is-a-tex-token-list.md)

## Macro’s als tokenlijsten

Wanneer TeX een commando voor het aanmaken van een macro detecteert (`\def`, `\edef`, `\gdef` of `\xdef`) in de invoerstroom, activeert het een proces dat beide secties `<parameter text><replacement text>` van de definitie van onze macro omzet in één lange tokenlijst—maar wel een heel specifiek type tokenlijst.

Tokenlijsten voor macro’s verschillen enigszins van andere tokenlijsten die binnen TeX worden gebruikt, omdat ze “speciale” tokenwaarden bevatten die alleen door interne processen van TeX zelf kunnen worden aangemaakt/gegenereerd: die speciale tokens kunnen niet rechtstreeks worden gemaakt door commando’s die u in uw .tex-bestand kunt opnemen. TeX maakt en gebruikt die “speciale” tokenwaarden om te helpen bij het verwerken van uw macro-aanroep, zoals we hieronder zullen onderzoeken en uitleggen.

### Een korte opmerking over hoe tokenlijsten worden opgeslagen: nodes

Om een lijst van tokens (gehele getallen) op te slaan, gebruikt TeX een gegevensstructuur die een [gekoppelde lijst](https://en.wikipedia.org/wiki/Linked_list)heet, die in TeX bestaat uit een lijst van zogenaamde *nodes*. U kunt een node zien als een klein pakketje computergeheugen dat gebruikt kan worden om een verzameling gegevensitems op te slaan. Om een macro op te slaan, worden deze nodes als een ketting aan elkaar geregen, waarbij elke node (schakel in de ketting) verschillende stukken informatie kan opslaan—including een tokenwaarde en het geheugenadres van de volgende node in de lijst. Voor meer informatie kunt u het artikel lezen [Wat is een TeX-tokenlijst](/latex/nl/diepgaande-artikelen/54-what-is-a-tex-token-list.md) maar het volgende diagram vat de belangrijkste kenmerken samen van een macro die als tokenlijst is opgeslagen:

![Diagram van een TeX-macrotokenlijst opgeslagen als een gekoppelde node-knooplijst](/files/7bddd3d6b51b7802619b795374fd1b76e224bbb3)

### Herinnering: de 4 onderdelen van een macrodefinitie

Zoals besproken in Deel 4 kan de structuur van elke macro worden geschreven als:

```
<TeX macro primitive><macro name><parameter text>{<replacement text>}
```

waarbij:

* `<TeX macro primitive>` = een van `\def`, `\edef`, `\gdef` of `\xdef`;
* `<macro name>`=de naam van uw macro, zoals `\foo`;
* `<parameter text>` kan “null” (niet aanwezig) zijn of het kan een tekenreeks zijn van scheidingstoken en macroparametertokens;
* `<replacement text>` is de daadwerkelijke inhoud van uw macro: het gedeelte dat wordt “uitgevoerd” wanneer u de macro aanroept.

**OPMERKING**: (Zoals ook opgemerkt in Deel 4) gaan we in de hele bespreking ervan uit dat `<macro name>` wordt gevolgd door een spatiekarakter met categoricode 10 om als scheidingsteken te dienen en de `<macro name>`te beëindigen. We *hebben* dat spatiekarakter niet expliciet weergegeven in onze tekst/bespreking, maar we gaan ervan uit dat het er is. Strikt genomen zouden we het ongeveer zo moeten weergeven:

```
<TeX macro primitive><macro name><space><parameter text>{<replacement text>}
```

We zullen echter de expliciete opname van een `<space>` karakter weglaten en impliciet aannemen dat het aanwezig is.

**OPMERKING**: De tekens `{` en `}` *worden niet* onderdeel van de macro-tokenlijst: hun doel is simpelweg om de invoerscanner van TeX (die tokens aanmaakt) te vertellen waar de `<replacement text>` begint en eindigt.

Wanneer TeX een macro definieert, worden de secties `<parameter text><replacement text>` omgezet in één lange, doorlopende tokenlijst—het totale aantal tokens in die lijst hangt af van de complexiteit van de macro. Zoals we hebben gezien, heeft de sectie een specifiek doel als een “tokensjabloon” of “blauwdruk” die TeX gebruikt om de tokens eruit te halen die de argumenten (waarden) vormen die met de feitelijke macro worden gebruikt: d.w\.z. de tokens die in de `<replacement text>`.

Laten we om deze ideeën concreet te maken een voorbeeldmacro nemen, maar het kort houden zodat de daaropvolgende diagrammen niet te druk worden:

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

Voor onze macro, `\foo`

* `<parameter text>` = `A#1\fake`
* `<replacement text>` = `123 #1`

Hoewel dit voorbeeld een eenvoudige macro is, bevat het alle kenmerken die we moeten verkennen.

Zoals opgemerkt zal TeX `<parameter text><replacement text>` omzetten in één lange tokenlijst, die u in het diagram hieronder kunt zien. In ons voorbeeld zijn de tokens gevormd uit `A#1\fake{123 #1}` omgezet in een opeenvolgende reeks tokens die zijn opgeslagen in een tokenlijst (als een gekoppelde lijst van nodes).

## Grafiek die een echte macro-tokenlijst laat zien

Het volgende diagram, dat laat zien hoe de macro `\def\foo A#1\fake{123 #1}` wordt opgeslagen, gebruikt echte gegevens uit een TeX-engine. Het is gemaakt met behulp van een [aangepaste versie van Knuths TeX](/latex/nl/diepgaande-artikelen/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) die is gewijzigd met aanvullende code om macro-aanroepen te onderscheppen, TeX’ interne gegevens te onderzoeken en deze te exporteren in een formaat voor verwerking met een open-source grafisch programma genaamd [Graphviz](https://www.graphviz.org/).

U kunt de volgende grafiek downloaden als een [PDF-bestand](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) of als een [SVG-bestand](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 MB).

![Diagram van een geannoteerde TeX-tokenlijst](/files/f6167e2c31377c74c6d6d7f9b7d01c1a823777f1)

#### De nodes begrijpen

In het diagram hierboven ziet u dat elke node twee gegevensitems bevat, genaamd de **volgende node** en de **huidige node**. Dit zijn gewoon gehele getallen die geheugenlocaties binnen TeX voorstellen—locaties waar andere nodes zijn opgeslagen. De waarden van **volgende node** en **huidige node** zijn niet belangrijk; ze slaan simpelweg de locaties (geheugenadressen) op waarmee nodes aan elkaar kunnen worden gekoppeld in een lijst.

![De betekenis van volgende node en huidige node](/files/f6f0c45e13d8cfa92761d33b099790a364404942)

#### Terug naar het voorbeeld

In het node-diagram bevat de tokenlijst gevormd uit `A#1\fake{123 #1}` verschillende “speciale tokens” die aan het begin van dit artikel zijn geïntroduceerd. Daarnaast begint de node-lijst die onze macro voorstelt met een “speciale eerste node”: we zullen onderzoeken wat die zijn en wat ze doen.

Het allereerste item in een macro-tokenlijst (en sommige andere typen tokenlijsten) slaat geen tokenwaarde op maar een gegevensitem dat de *referentietelling* van de macro heet, die TeX gebruikt om het gebruik van de macro bij te houden.

![Een referentietellingsnode is de eerste in een tokenlijst](/files/97eb7720a40df979226177a60d0d2f976937fb1f)

De eerste token van de `<parameter text>` wordt opgeslagen in de node die onmiddellijk volgt op de referentietelling: u kunt zien dat het een token is dat de letter `A` voorstelt met categoricode 11. Uit de besprekingen in Deel 2 en 3 weten we dat een karaktertoken wordt berekend met

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

wat voor een letter `A` met categoricode 11

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

de waarde 2881 oplevert, zoals in de node te zien is.

#### Het “commando” \fake gebruikt in \foo

Binnen onze macrodefinitie `\def\foo A#1\fake{123 #1}` is een van de scheidingstekens een *ongedefinieerde* commando `\fake` dat binnen de tokenlijst is opgeslagen als onderdeel van de `<parameter text>` sectie. Zoals u kunt zien, is binnen de volledige macro-tokenlijst `\fake` een token waarvan de waarde `19491`is—een gehele waarde die door TeX wordt berekend met behulp van de formule die in Deel 3 is besproken. Wanneer TeX probeert `\foo` uit te voeren, verwacht het het `\fake` tokenwaarde aan het einde van de `<parameter text>` sectie te vinden. TeX *zal niet* proberen de `\fake` opdracht uit te voeren, omdat de rol ervan enkel is om een vorm van “interpunctie” binnen het `<parameter text>` “tokensjabloon” te leveren.

![Een commando-token als macro-scheidingsteken gebruiken](/files/ecfc36f88198207d317524879992d6591ffd0701)

#### Speciale tokens in de tokenlijst

**De token voor “eindovereenkomst”**

Wanneer een macro wordt aangeroepen, is de eerste taak van TeX om de macro te scannen zoals door de gebruiker getypt en de tokens in de `<parameter text>` sectie te vergelijken met de tokens in het sjabloon `<parameter text>` dat in het geheugen is opgeslagen (gemaakt op het moment dat de macro werd gedefinieerd). Omdat de volledige definitie van de macro, opgebouwd uit `<parameter text><replacement text>` is opgeslagen als één lange opeenvolgende tokenlijst, moet TeX weten waar in die tokenlijst `<parameter text>` *eindigt* en waar `<replacement text>` *begint*. Om dit te bereiken zal TeX, wanneer het de macro definieert (de tokenlijst opbouwt), een speciaal eindmarkeringstoken invoegen dat een **eindovereenkomst** token heet als allerlaatste token in de reeks tokens die uit `<parameter text>`zijn gegenereerd. Het **eindovereenkomst** token kan niet worden gegenereerd door gebruikerscommando’s; alleen TeX zelf kan het aanmaken, en daarom zal TeX zeker het einde van de `<parameter text>`.

![Het eindovereenkomsttoken tonen in een TeX-tokenlijst](/files/1bae9849f9825ac19cd68145dbb15175255a971c)

Hier kunnen we zien dat de eerste token die volgt op **eindovereenkomst** een token is dat het cijfer `1` voorstelt met categoricode 12. Dat is te verwachten omdat de `<replacement text>` voor onze macro `\foo` is `123 #1`—d.w\.z. het begint met de token die het cijfer `1` voorstelt (met categoricode 12).

Uit de bespreking in Deel 2 en 3 weten we dat een karaktertoken wordt berekend met

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

wat voor een cijfer `1` met categoricode 12

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

de tokenwaarde 3121 oplevert, zoals in de node te zien is.

**“match-parameter”-tokens**

Wanneer TeX de macrodefinitie opslaat, zet het eventuele parametertokens (`#1`, `#2`… `#9`) binnen `<parameter text>` om in een token genaamd een **match-parameter** token. Deze tokens vertellen TeX dat het moet beginnen met zoeken naar tokens binnen de macro-aanroep van de gebruiker die de argumenten van de macro zijn.

![Het match-parameter-token tonen in een TeX-tokenlijst](/files/330f199733fcbf8a1c0a9d86113b128bb3efd8d2)

### Speciale tokens in de tokenlijst

#### “outputparameter”-tokens

Wanneer TeX alles heeft verwerkt en klaar is om de macro daadwerkelijk uit te voeren (uit te breiden), instrueren de **outputparameter** tokens TeX over locaties binnen de `<replacement text>` waar het de tokens moet invoegen die de argumenten voorstellen die door de gebruiker zijn opgegeven toen de macro werd aangeroepen. In feite: “Voeg op deze locatie de tokens in die het argument n van de gebruiker voorstellen, waarbij n=1...9.”

Binnen de `<replacement text>` sectie van de opgeslagen macrodefinitie-tokenlijst zal er een **outputparameter** token zijn dat overeenkomt met elk `#1`, `#2`... `#9` dat in de oorspronkelijke definitie aanwezig is.

![Het outputparameter-token tonen in een TeX-tokenlijst](/files/bee07bcc954108ae4413aa3e48e27e272150ffe5)

Als we kijken naar onze definitie van `\foo` (`\def\foo A#1\fake{123 #1}`) zien we dat er slechts 1 macroparameter is (`#1`) in de `<parameter text>` (`A#1\fake`) en vervolgens verschijnt slechts 1 macroparameter (`#1`) in de `<replacement text>` (`123 #1`): dit resulteert in slechts 1 **outputparameter** token aanwezig in de tokenlijst die de `<replacement text>`.

Let op het volgende in de node-lijst die `\foo`voorstelt: `<replacement text>`:

* de token direct vóór de **outputparameter** token stelt een spatiekarakter voor (categoricode 10, tekenkode 32) omdat er een spatie staat tussen de `123` en de macroparameter (`#1`) in de oorspronkelijke definitie van `\foo`;
* het **outputparameter** is de laatste token in de lijst: de **volgende node** heeft een speciale waarde van “null” (betekenis: “leeg”) die wordt gebruikt om de lijst te beëindigen: er zijn geen nodes meer na **outputparameter** omdat het de laatste token is, wat het einde van de `<replacement text>` en dus het einde van de macrodefinitie aangeeft.

## Deel 6

In Deel 6 gebruiken we enkele gedetailleerde afbeeldingen om de precieze betekenis van macro-expansie uit te leggen en te onderzoeken, evenals de gevolgen van TeX’ tokenisatie van macroargumenten voordat ze in een macro worden ingevoerd `<replacement text>`.

[Deel 1](/latex/nl/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.md) [Deel 2](/latex/nl/meer-onderwerpen/20-how-tex-macros-actually-work-part-2.md) [Deel 3](/latex/nl/meer-onderwerpen/21-how-tex-macros-actually-work-part-3.md) [Deel 4](/latex/nl/meer-onderwerpen/22-how-tex-macros-actually-work-part-4.md) [Deel 5](/latex/nl/meer-onderwerpen/23-how-tex-macros-actually-work-part-5.md) [Deel 6](/latex/nl/meer-onderwerpen/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/nl/meer-onderwerpen/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.
