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

# Sådan virker TeX-makroer egentlig: Del 5

[Del 1](/latex/da/flere-emner/19-how-tex-macros-actually-work-part-1.md) [Del 2](/latex/da/flere-emner/20-how-tex-macros-actually-work-part-2.md) [Del 3](/latex/da/flere-emner/21-how-tex-macros-actually-work-part-3.md) [Del 4](/latex/da/flere-emner/22-how-tex-macros-actually-work-part-4.md) [Del 5](/latex/da/flere-emner/23-how-tex-macros-actually-work-part-5.md) [Del 6](/latex/da/flere-emner/24-how-tex-macros-actually-work-part-6.md)

## Introduktion og oversigt

I del 4 gennemgik vi nogle grundlæggende egenskaber ved TeX-makroer som forberedelse til de næste to artikler, hvor vi ser nærmere på den underliggende mekanik i TeX-makroer: specialiserede tokenlister. I disse sidste to artikler bruger vi diagrammer, kaldet nodelister, som blev udarbejdet fra data genereret med en særligt modificeret version af Knuths oprindelige TeX-software—disse ændringer var udformet til at få adgang til interne TeX-datastrukturer, som normalt er utilgængelige for brugeren. Ved at ”koble sig på” TeX’ interne rutiner for makrobehandling og eksekvering var det muligt at udskrive grafiske data, som muliggør en mere detaljeret og præcis diskussion af TeX’ makrobehandlingsadfærd. Overleaf håber, at disse diagrammer hjælper læserne med at opnå en bedre forståelse af, hvordan TeX-makroer egentlig fungerer.

### Mulig yderligere baggrundslæsning

Overleaf har allerede udgivet to tokenrelaterede artikler, der giver yderligere baggrundsinformation om TeX-tokens og TeX-tokenlister. Tag dig endelig tid til at se dem, hvis du har brug for at udfylde eventuelle huller i din forståelse og få mest muligt ud af del 5 og 6 i denne serie.

* [Hvad er et "TeX-token"?](/latex/da/dybtgaende-artikler/53-what-is-a-tex-token.md)
* [Hvad er en TeX-tokenliste?](/latex/da/dybtgaende-artikler/54-what-is-a-tex-token-list.md)

## Makroer som tokenlister

Når TeX registrerer en kommando til oprettelse af en makro (`\def`, `\edef`, `\gdef` eller `\xdef`) i inputstrømmen, udløser det en proces, som konverterer begge sektionerne `<parametertekst><erstatningstekst>` i vores makrodefinition til én lang tokenliste—men en helt særlig type tokenliste.

Tokenlister for makroer adskiller sig en smule fra andre tokenlister, der bruges i TeX, fordi de indeholder ”særlige” tokenværdier, som kun processer internt i TeX selv kan oprette/generere: Disse særlige tokens kan ikke oprettes direkte af kommandoer, som du kan inkludere i din .tex-fil. TeX opretter og bruger disse ”særlige” tokenværdier til at hjælpe med behandlingen af dit makrokald, som vi vil undersøge og forklare nedenfor.

### Et kort ord om, hvordan tokenlister lagres: noder

For at lagre en liste over tokens (heltalsværdier) bruger TeX en datastruktur kaldet en [kædet liste](https://en.wikipedia.org/wiki/Linked_list), som i TeX’ tilfælde består af en liste af såkaldte *noder*. Du kan betragte en node som en lille pakke computermemory, der kan bruges til at lagre en samling dataelementer. For at lagre en makro kædes disse noder sammen som en kæde, hvor hver node (led i kæden) kan lagre flere oplysninger—herunder en tokenværdi og hukommelsesadressen på den næste node i listen. Du kan læse artiklen [Hvad er en TeX-tokenliste](/latex/da/dybtgaende-artikler/54-what-is-a-tex-token-list.md) for yderligere oplysninger, men følgende diagram sammenfatter de vigtigste egenskaber ved en makro, der er lagret som en tokenliste:

![Diagram over en TeX-makrotokenliste lagret som en kædet nodeliste](/files/e09dc0551a9dd63cf2c69bb4c6e12759a044634d)

### Påmindelse: De 4 dele af en makrodefinition

Som gennemgået i del 4 kan strukturen af enhver makro skrives som:

```
<TeX-makroprimitiv><makronavn><parametertekst>{<erstatningstekst>}
```

hvor:

* `<TeX-makroprimitiv>` = en af `\def`, `\edef`, `\gdef` eller `\xdef`;
* `<makronavn>`= navnet på din makro, såsom `\foo`;
* `<parametertekst>` kan være ”nul” (ikke til stede), eller den kan være en streng af afgrænsningstokens og makroparametertokens;
* `<erstatningstekst>` er selve brødteksten i din makro: den sektion, der ”eksekveres”, når du kalder makroen.

**BEMÆRK**: (Som også bemærket i del 4) antager vi gennem hele diskussionen, at `<makronavn>` efterfølges af et mellemrumstegn med kategorikode 10, der fungerer som afgrænser for at afslutte `<makronavn>`. Vi *har ikke* eksplicit vist dette mellemrumstegn i vores tekst/diskussion, men vi antager, at det er der. Strengt taget burde vi repræsentere det nogenlunde sådan:

```
<TeX-makroprimitiv><makronavn><mellemrum><parametertekst>{<erstatningstekst>}
```

Vi vil dog udelade den eksplicitte inklusion af et `<mellemrum>` tegn og implicit antage dets tilstedeværelse.

**BEMÆRK**: Tegnene `{` og `}` *bliver ikke* en del af makrotokenlisten: Deres formål er blot at fortælle TeX’ inputscanner (som opretter tokens), hvor `<erstatningstekst>` starter og slutter.

Når TeX definerer en makro, bliver sektionerne `<parametertekst><erstatningstekst>` konverteret til én lang sammenhængende tokenliste—det samlede antal tokens i listen afhænger af makroens kompleksitet. Som vi har set, har sektionen et specifikt formål som en ”tokenskabelon” eller ”tegning”, som TeX bruger til at udvælge de tokens, der udgør argumenterne (værdierne), som skal bruges med selve makroen: dvs. de tokens, der skal fødes ind i `<erstatningstekst>`.

For at gøre disse idéer mere konkrete, lad os tage en eksempelmakro, men holde den kort, så de efterfølgende diagrammer ikke bliver for overfyldte:

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

For vores makro, `\foo`

* `<parametertekst>` = `A#1\fake`
* `<erstatningstekst>` = `123 #1`

Selv om dette eksempel er en simpel makro, indeholder det alle de funktioner, vi har brug for at undersøge.

Som bemærket vil TeX konvertere `<parametertekst><erstatningstekst>` til én lang tokenliste, som du kan se i diagrammet nedenfor. I vores eksempel er tokens dannet fra `A#1\fake{123 #1}` blevet konverteret til en sammenhængende sekvens af tokens lagret i en tokenliste (som en kædet liste af noder).

## Grafik, der viser en faktisk makrotokenliste

Det følgende diagram, der viser, hvordan makroen `\def\foo A#1\fake{123 #1}` lagres, bruger faktiske data fra inde i en TeX-motor. Det blev oprettet ved hjælp af en [tilpasset version af Knuths TeX](/latex/da/dybtgaende-artikler/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) som blev modificeret med ekstra kode til at opfange makrokald, undersøge TeX’ interne data og eksportere dem til formatering med et open source-grafikprogram kaldet [Graphviz](https://www.graphviz.org/).

Du kan downloade følgende grafik som en [PDF-fil](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) eller [SVG-fil](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 MB).

![Diagram over en annoteret TeX-tokenliste](/files/e09df19c2a2961513f36d620733978ff3eaf3cf9)

#### Forståelse af noderne

I diagrammet ovenfor kan du se, at hver node indeholder to dataelementer, der kaldes **næste node** og **aktuelle node**. Dette er blot heltalsværdier, der repræsenterer hukommelsesplaceringer inde i TeX—placeringer, hvor andre noder er lagret. Værdierne af **næste node** og **aktuelle node** er ikke vigtige; de lagrer blot placeringerne (hukommelsesadresserne), som gør det muligt at kæde noder sammen i en liste.

![Betydningen af næste node og aktuelle node](/files/36abd15b6fb732b800d6b65f1e1a5e5e8643a84c)

#### Tilbage til eksemplet

I nodediagrammet indeholder tokenlisten dannet fra `A#1\fake{123 #1}` flere ”særlige tokens”, der blev introduceret i begyndelsen af denne artikel. Desuden starter nodelisten, der repræsenterer vores makro, med en ”særlig første node”: Vi vil undersøge, hvad disse er, og hvad de gør.

Det allerførste element i en makrotokenliste (og nogle andre typer tokenlister) lagrer ikke en tokenværdi, men et dataelement kaldet makroens *referencetæller* som TeX bruger til at spore brugen af makroen.

![En referencetællernode er den første i en tokenliste](/files/9fac19588e299c68f89233b71cf898c823258f1c)

Det første token i `<parametertekst>` lagres i noden, der følger umiddelbart efter referencetælleren: Du kan se, at det er et token, der repræsenterer bogstavet `Et` med kategorikode 11. Fra diskussionerne i del 2 og 3 ved vi, at et tegntoken beregnes ved hjælp af

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

hvilket for et bogstav `Et` med kategorikode 11 er

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

hvilket giver værdien 2881, som vist i noden.

#### Kommandoen ”\fake”, der bruges i \foo

I vores makrodefinition `\def\foo A#1\fake{123 #1}` er en af afgrænserne en *udefineret* kommandoen `\fake` som lagres i tokenlisten som en del af `<parametertekst>` sektionen. Som du kan se, er der i den samlede makrotokenliste `\fake` et token, hvis værdi er `19491`—en heltalsværdi, som TeX beregner ved hjælp af formlen, der blev gennemgået i del 3. Når TeX forsøger at eksekvere `\foo` forventer den at finde `\fake` tokenværdien i slutningen af `<parametertekst>` sektionen. TeX *vil ikke* forsøge at eksekvere `\fake` kommandoen, fordi dens rolle blot er at fungere som en form for ”tegnsætning” i `<parametertekst>` ”tokenskabelonen”.

![Brug af et kommandotoken som makroafgrænser](/files/1c99913dfc5715a5345f6b3761571131eb6256fc)

#### Særlige tokens i tokenlisten

**”End match”-tokenet**

Når en makro kaldes, er TeX’ første opgave at scanne makroen, sådan som den er indtastet af brugeren, og sammenligne tokens i brugerens `<parametertekst>` sektion med de tokens, der findes i skabelonen `<parametertekst>` lagret i hukommelsen (oprettet, da makroen blev defineret). Da makroens fulde definition, som er konstrueret fra `<parametertekst><erstatningstekst>` lagres som én lang sammenhængende liste af tokens, har TeX brug for at vide, hvor i tokenlisten `<parametertekst>` *stopper* og hvor `<erstatningstekst>` *starter*. For at opnå dette indsætter TeX, når den definerer makroen (opbygger tokenlisten), et særligt afsluttende token kaldet et **end match** -token som det allersidste token i det sæt af tokens, der genereres fra `<parametertekst>`. **end match** -tokenet kan ikke genereres fra brugerkommandoer; kun TeX selv kan oprette det, og derfor er TeX sikker på at registrere slutningen af `<parametertekst>`.

![Visning af end match-tokenet i en TeX-tokenliste](/files/e77f500588c9229952d82536815c32aa14474cb3)

Her kan vi se, at det første token, der følger efter **end match** er et token, der repræsenterer cifret `1` med kategorikode 12. Dette bør forventes, fordi `<erstatningstekst>` for vores makro `\foo` er `123 #1`—dvs. den starter med tokenet, der repræsenterer cifret `1` (med kategorikode 12).

Fra diskussionen i del 2 og 3 ved vi, at et tegntoken beregnes ved hjælp af

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

hvilket for et ciffer `1` med kategorikode 12 er

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

hvilket giver tokenværdien 3121, som vist i noden.

**”match parameter”-tokens**

Når TeX lagrer makrodefinitionen, konverterer den eventuelle parametertokens (`#1`, `#2`… `#9`) i `<parametertekst>` til et token kaldet et **match parameter** -token. Disse tokens fortæller TeX, at den skal begynde at lede efter tokens i brugerens makrokald, som er makroens argumenter.

![Visning af match parameter-tokenet i en TeX-tokenliste](/files/28655c0c3ff140f0044983e43282717c2cf145d2)

### Særlige tokens i tokenlisten

#### ”output parameter”-tokens

Når TeX har behandlet alt og er klar til faktisk at køre (ekspandere) makroen, **output parameter** -tokens instruerer TeX om placeringer i `<erstatningstekst>` hvor den skal indsætte de tokens, der repræsenterer argumenterne, som brugeren angav, da makroen blev kaldt. I praksis: ”På denne placering indsættes de tokens, der repræsenterer brugerens argument n, hvor n=1...9”.

I `<erstatningstekst>` sektionen af den lagrede tokenliste for makrodefinitionen vil der være et **output parameter** token svarende til hvert `#1`, `#2`... `#9` der findes i den oprindelige definition.

![Visning af output parameter-tokenet i en TeX-tokenliste](/files/7f4900af54762fce0dc9c49b4164959d97188921)

Hvis vi ser på vores definition af `\foo` (`\def\foo A#1\fake{123 #1}`) ser vi, at der kun er 1 makroparameter (`#1`) i `<parametertekst>` (`A#1\fake`) og dermed kun 1 makroparameter (`#1`) forekommer i `<erstatningstekst>` (`123 #1`): Dette resulterer i kun 1 **output parameter** token i tokenlisten, der repræsenterer `<erstatningstekst>`.

Bemærk følgende i nodelisten, der repræsenterer `\foo`’s `<erstatningstekst>`:

* tokenet umiddelbart før **output parameter** -tokenet repræsenterer et mellemrumstegn (kategorikode 10, tegnkode 32), fordi der er et mellemrum mellem `123` og makroparameteren (`#1`) i den oprindelige definition af `\foo`;
* den **output parameter** er det sidste token i listen: **næste node** har en særlig værdi, ”null” (som betyder ”tom”), der bruges til at afslutte listen: Der er ingen flere noder efter **output parameter** fordi det er det sidste token, som angiver slutningen af `<erstatningstekst>` og dermed slutningen på makrodefinitionen.

## Del 6

I del 6 bruger vi nogle detaljerede grafikker til at forklare og undersøge den præcise betydning af makroekspansion og konsekvenserne af TeX’ tokenisering af makroargumenter, før de fødes ind i en makros `<erstatningstekst>`.

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