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

# Hvordan TeX-makroer egentlig fungerer: Del 5

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

## Introduksjon og oversikt

I Del 4 gjennomgikk vi noen grunnleggende egenskaper ved TeX-makroer som forberedelse til de neste to artiklene, der vi tar en nærmere titt på de underliggende mekanismene bak TeX-makroer: spesialiserte tokenlister. I disse to siste artiklene bruker vi diagrammer, kalt nodelister, som ble utarbeidet fra data generert ved hjelp av en spesialtilpasset versjon av Knuths opprinnelige TeX-programvare — disse endringene var utformet for å få tilgang til interne TeX-datastrukturer som normalt er utilgjengelige for brukeren. Ved å «koble oss inn» i TeXs interne rutiner for makrobehandling og kjøring var det mulig å skrive ut grafiske data som muliggjør en mer detaljert og nøyaktig diskusjon av TeXs atferd ved makrobehandling. Overleaf håper at disse diagrammene hjelper leserne til å få en bedre forståelse av hvordan TeX-makroer वास्तव fungerer.

### Mulig ytterligere bakgrunnslitteratur

Overleaf har allerede publisert to artikler om tokens som gir ytterligere bakgrunnsinformasjon om TeX-tokens og TeX-tokenlister. Ta deg gjerne tid til å se på dem hvis du trenger å fylle eventuelle hull i forståelsen din og få mest mulig ut av Del 5 og 6 i denne serien.

* [Hva er et «TeX-token»?](/latex/no/dybdeartikler/53-what-is-a-tex-token.md)
* [Hva er en TeX-tokenliste?](/latex/no/dybdeartikler/54-what-is-a-tex-token-list.md)

## Makroer som tokenlister

Når TeX oppdager en makroopprettelseskommando (`\def`, `\edef`, `\gdef` eller `\xdef`) i inndatastrømmen utløser det en prosess som konverterer begge delene `<parametertekst><erstatningstekst>` av definisjonen av makroen vår til én lang tokenliste — men en helt spesiell type tokenliste.

Tokenlister for makroer er litt annerledes enn andre tokenlister som brukes i TeX fordi de inneholder «spesielle» tokenverdier som bare prosesser internt i TeX selv kan lage/generere: disse spesielle tokenene kan ikke opprettes direkte av noen kommandoer du kan ta med i .tex-filen din. TeX lager og bruker disse «spesielle» tokenverdiene for å hjelpe til med behandlingen av makrokallet ditt, som vi skal utforske og forklare nedenfor.

### En kort bemerkning om hvordan tokenlister lagres: noder

For å lagre en liste av tokens (heltallsverdier) bruker TeX en datastruktur kalt en [lenket liste](https://en.wikipedia.org/wiki/Linked_list), som i TeXs tilfelle består av en liste av såkalte *noder*. Du kan tenke på en node som en liten pakke med dataminne som kan brukes til å lagre en samling dataelementer. For å lagre en makro blir disse nodene lenket sammen som en kjede, der hver node (ledd i kjeden) kan lagre flere biter informasjon — inkludert en tokenverdi og minneadressen til neste node i listen. For mer informasjon kan du lese artikkelen [Hva er en TeX-tokenliste](/latex/no/dybdeartikler/54-what-is-a-tex-token-list.md) men følgende diagram oppsummerer de viktigste egenskapene ved en makro lagret som en tokenliste:

![Diagram av en TeX-makro-tokenliste lagret som en lenket nodeliste](/files/8c635e18c99d4ffc3ffe4af7eea5ab5c88e4b8c4)

### Påminnelse: de 4 delene av en makrodefinisjon

Som diskutert i Del 4 kan strukturen til enhver makro skrives som:

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

der:

* `<TeX-makroprimitiv>` = er en av `\def`, `\edef`, `\gdef` eller `\xdef`;
* `<makronavn>`= navnet på makroen din, for eksempel `\foo`;
* `<parametertekst>` kan være «null» (ikke til stede), eller det kan være en streng av skilletegntokens og makroparametertokens;
* `<erstatningstekst>` er selve brødteksten i makroen din: delen som blir «utført» når du kaller makroen.

**MERK**: (Som også observert i Del 4) gjennom hele diskusjonen antar vi at `<makronavn>` vil bli fulgt av et mellomromstegn med kategori-kode 10 for å fungere som et skilletegn som avslutter `<makronavn>`. Vi *har ikke* vist dette mellomromstegnet eksplisitt i teksten/diskusjonen vår, men vi antar at det er der. Strengt tatt burde vi representere det omtrent slik:

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

Vi vil imidlertid utelate den eksplisitte inkluderingen av et `<mellomrom>` tegn og implisitt anta at det er til stede.

**MERK**: Tegnene `{` og `}` *blir ikke* en del av makroens tokenliste: deres formål er ganske enkelt å fortelle TeXs inndatascanner (som lager tokens) hvor `<erstatningstekst>` starter og stopper.

Når TeX definerer en makro, blir delene `<parametertekst><erstatningstekst>` konvertert til én lang sammenhengende tokenliste — det totale antallet tokens i den listen avhenger av makroens kompleksitet. Som vi har sett, har delen et spesifikt formål som en «tokentemplate» eller «blåkopi» som TeX bruker til å plukke ut tokenene som utgjør argumentene (verdiene) som brukes med selve makroen: dvs. tokenene som mates inn i `<erstatningstekst>`.

For å gjøre disse ideene klarere, la oss ta et eksempel på en makro, men holde den kort slik at de påfølgende diagrammene ikke blir for rotete:

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

For makroen vår, `\foo`

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

Selv om dette eksemplet er en enkel makro, inneholder det alle egenskapene vi trenger for å utforske.

Som nevnt vil TeX konvertere `<parametertekst><erstatningstekst>` til én lang tokenliste, som du kan se i diagrammet nedenfor. I eksemplet vårt har tokenene dannet fra `A#1\fake{123 #1}` blitt konvertert til en sammenhengende sekvens av tokens lagret i en tokenliste (som en lenket liste av noder).

## Grafikk som viser en ekte makro-tokenliste

Følgende diagram, som viser hvordan makroen `\def\foo A#1\fake{123 #1}` lagres, bruker reelle data fra innsiden av en TeX-motor. Det ble laget ved hjelp av en [tilpasset versjon av Knuths TeX](/latex/no/dybdeartikler/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) som ble endret med ekstra kode for å avskjære makrokall, undersøke TeXs interne data og eksportere det til format for behandling ved hjelp av et åpen kildekode-grafikkprogram kalt [Graphviz](https://www.graphviz.org/).

Du kan laste ned den følgende grafikken 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 av en annotert TeX-tokenliste](/files/77b4af49a1fdf929bd963f3a4e7f1b1b08021b22)

#### Forstå nodene

I diagrammet ovenfor vil du se at hver node inneholder to dataelementer kalt **neste node** og **gjeldende node**. Dette er bare heltallsverdier som representerer minneplasseringer inne i TeX — steder der andre noder er lagret. Verdiene til **neste node** og **gjeldende node** er ikke viktige, de lagrer bare plasseringene (minneadresser) som gjør at noder kan lenkes sammen i en liste.

![Betydningen av neste node og gjeldende node](/files/cde1c0c7eea7b7c2f4c2ffd7e5b7d124ddd69a1d)

#### Tilbake til eksemplet

I nodediagrammet inneholder tokenlisten dannet fra `A#1\fake{123 #1}` flere «spesielle tokens» introdusert i starten av denne artikkelen. I tillegg starter nodelisten som representerer makroen vår med en «spesiell første node»: vi skal utforske hva disse er og hva de gjør.

Det aller første elementet i en makro-tokenliste (og noen andre typer tokenlister) lagrer ikke en tokenverdi, men et dataelement kalt makroens *referansetelling* som TeX bruker til å holde oversikt over bruken av makroen.

![En referansetellingsnode er den første i en tokenliste](/files/7b1d53e79f6c17c77bc956240b9e5a9477b394ba)

Den første tokenen til `<parametertekst>` er lagret i noden som følger umiddelbart etter referansetellingen: du kan se at det er en token som representerer bokstaven `Et` med kategori-kode 11. Fra diskusjonene i Del 2 og 3 vet vi at en tegntoken beregnes ved hjelp av

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

som, for en bokstav `Et` med kategori-kode 11, er

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

og gir verdien 2881, som vist i noden.

#### «Kommandoen» \fake brukt i \foo

Innenfor makrodefinisjonen vår `\def\foo A#1\fake{123 #1}` er en av skilletegnene en *udefinert* kommandoen `\fake` som er lagret i tokenlisten som en del av `<parametertekst>` delen. Som du kan se, er `\fake` i den samlede makro-tokenlisten en token hvis verdi er `19491`—en heltallsverdi beregnet av TeX ved hjelp av formelen omtalt i Del 3. Når TeX prøver å utføre `\foo` vil den forvente å finne `\fake` tokenverdien på slutten av `<parametertekst>` delen. TeX *vil ikke* prøve å utføre `\fake` kommandoen fordi dens rolle bare er å gi en form for «tegnsetting» innenfor `<parametertekst>` «tokentemplaten».

![Bruk av en kommandotoken som makroskilletegn](/files/7ffa3c31d7b0d52f4317783390aa349bbfdc9352)

#### Spesialtokens i tokenlisten

**Tokenen «sluttmatch»**

Når TeX kaller en makro, er den første oppgaven å skanne makroen slik den er skrevet inn av brukeren og sammenligne tokenene som finnes i brukerens `<parametertekst>` seksjon med tokenene som finnes i templatet `<parametertekst>` lagret i minnet (opprettet da makroen ble definert). Fordi makroens fulle definisjon, konstruert fra `<parametertekst><erstatningstekst>` lagres som én lang sammenhengende liste av tokens, må TeX vite hvor i den tokenlisten `<parametertekst>` *stopper* og hvor `<erstatningstekst>` *starter*. For å oppnå dette, når TeX definerer makroen (bygger tokenlisten), vil det sette inn en spesiell avslutningstoken kalt en **sluttmatch** token som selve siste token i settet av tokens generert fra `<parametertekst>`. **sluttmatch** token kan ikke genereres av brukerekommandoer, bare TeX selv kan lage den, derfor er TeX sikker på å oppdage slutten på `<parametertekst>`.

![Visning av sluttmatch-tokenen i en TeX-tokenliste](/files/987351dd56ed4408f52433a97f0711b5aec25ed2)

Her kan vi se at den første tokenen etter **sluttmatch** er en token som representerer sifferet `1` med kategori-kode 12. Dette bør forventes fordi `<erstatningstekst>` for makroen vår `\foo` er `123 #1`—dvs. den begynner med tokenen som representerer sifferet `1` (med kategori-kode 12).

Fra diskusjonen i Del 2 og 3 vet vi at en tegntoken beregnes ved hjelp av

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

som, for et siffer `1` med kategori-kode 12, er

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

og gir tokenverdien 3121, som vist i noden.

**«Matchparameter»-tokens**

Når TeX lagrer makrodefinisjonen, konverterer den alle parametertokens (`#1`, `#2`… `#9`) i `<parametertekst>` til en som kalles en **matchparameter** token. Disse tokenene forteller TeX at den må begynne å lete etter tokens i brukerens makrokall som er makroens argumenter.

![Visning av matchparameter-tokenen i en TeX-tokenliste](/files/48aca6fa6977065579b3416887cc3a09e2dcf436)

### Spesialtokens i tokenlisten

#### «Utdata-parameter»-tokens

Når TeX har behandlet alt og er klar til faktisk å kjøre (utvide) makroen, **utdata-parameter** tokenene instruerer TeX om plasseringer innenfor `<erstatningstekst>` der den må mate inn tokenene som representerer argumentene brukeren ga da makroen ble kalt. I praksis: «På dette stedet setter du inn tokenene som representerer brukerens argument n, der n=1...9».

Innenfor `<erstatningstekst>` delen av den lagrede makrodefinisjonens tokenliste vil det være en **utdata-parameter** token som svarer til hver `#1`, `#2`... `#9` som finnes i den opprinnelige definisjonen.

![Visning av utdata-parameter-tokenen i en TeX-tokenliste](/files/39fa4b1886a16ca813b2e354e19d46dfda3cf0ea)

Hvis vi ser på definisjonen vår av `\foo` (`\def\foo A#1\fake{123 #1}`) ser vi at det bare er 1 makroparameter (`#1`) i `<parametertekst>` (`A#1\fake`) og deretter vises bare 1 makroparameter (`#1`) i `<erstatningstekst>` (`123 #1`): dette resulterer i bare 1 **utdata-parameter** token til stede i tokenlisten som representerer `<erstatningstekst>`.

Merk følgende i nodelisten som representerer `\foo`s `<erstatningstekst>`:

* tokenet rett før **utdata-parameter** tokenet representerer et mellomromstegn (kategori-kode 10, tegnkode 32) fordi det er et mellomrom mellom `123` og makroparameteren (`#1`) i den opprinnelige definisjonen av `\foo`;
* den **utdata-parameter** er det siste tokenet i listen: **neste node** har en spesiell verdi «null» (som betyr «tom») som brukes til å avslutte listen: det finnes ikke flere noder etter **utdata-parameter** fordi det er det siste tokenet, som indikerer slutten på `<erstatningstekst>` og dermed slutten på makrodefinisjonen.

## Del 6

I Del 6 bruker vi noen detaljerte illustrasjoner for å forklare og utforske den nøyaktige betydningen av makroekspansjon og konsekvensene av TeXs tokenisering av makroargumenter før de mates inn i en makros `<erstatningstekst>`.

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