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

# Hur TeX-makron egentligen fungerar: Del 5

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

## Introduktion och översikt

I Del 4 granskade vi några grundläggande egenskaper hos TeX-makron som förberedelse för de nästa två artiklarna där vi tar en närmare titt på de underliggande mekanismerna hos TeX-makron: specialiserade tokenlistor. I dessa två avslutande artiklar använder vi diagram, kallade nodlistor, som utarbetades från data som genererades med hjälp av en specialmodifierad version av Knuths ursprungliga TeX-programvara — dessa modifieringar var utformade för att komma åt interna TeX-datastrukturer som normalt är otillgängliga för användaren. Genom att “koppla in sig” på TeX:s interna makrobearbetnings- och exekveringsrutiner var det möjligt att skriva ut grafiska data som möjliggör en mer detaljerad och exakt diskussion av TeX:s makrobearbetningsbeteende. Overleaf hoppas att dessa diagram hjälper läsarna att få en bättre förståelse för hur TeX-makron verkligen fungerar.

### Möjlig ytterligare bakgrundsläsning

Overleaf har redan publicerat två artiklar om token som ger ytterligare bakgrundsinformation om TeX-token och TeX-tokenlistor. Ta gärna dig tid att titta på dem om du behöver fylla i eventuella luckor i din förståelse och få ut det mesta av Del 5 och 6 i denna serie.

* [Vad är en "TeX-token"?](/latex/sv/fordjupade-artiklar/53-what-is-a-tex-token.md)
* [Vad är en TeX-tokenlista?](/latex/sv/fordjupade-artiklar/54-what-is-a-tex-token-list.md)

## Makron som tokenlistor

När TeX upptäcker ett makroskapande kommando (`\def`, `\edef`, `\gdef` eller `\xdef`) i indataflödet utlöser det en process som omvandlar båda avsnitten `<parameter text><replacement text>` i vår makrodefinition till en enda lång tokenlista – men en mycket särskild typ av tokenlista.

Tokenlistor för makron skiljer sig något från andra tokenlistor som används inom TeX eftersom de innehåller “speciella” tokenvärden som endast processer interna för TeX självt kan skapa/generera: dessa speciella token kan inte skapas direkt av några kommandon som du kan inkludera i din .tex-fil. TeX skapar och använder dessa “speciella” tokenvärden för att hjälpa till med bearbetningen av ditt makroanrop, som vi kommer att utforska och förklara nedan.

### En kort kommentar om hur tokenlistor lagras: noder

För att lagra en lista med token (heltalvärden) använder TeX en datastruktur som kallas en [länkad lista](https://en.wikipedia.org/wiki/Linked_list), som i TeX:s fall består av en lista av så kallade *noder*. Du kan tänka på en nod som ett litet paket datorminne som kan användas för att lagra en samling dataobjekt. För att lagra ett makro strängas dessa noder ihop som en kedja, där varje nod (länk i kedjan) kan lagra flera informationsbitar — inklusive ett tokenvärde och minnesadressen för nästa nod i listan. För mer information kan du läsa artikeln [Vad är en TeX-tokenlista](/latex/sv/fordjupade-artiklar/54-what-is-a-tex-token-list.md) men följande diagram sammanfattar de viktigaste egenskaperna hos ett makro lagrat som en tokenlista:

![Diagram över en TeX-makros tokenlista lagrad som en länkad nodlista](/files/10ac86b41331bfeb26865fedcd8421669767c86b)

### Påminnelse: de fyra delarna av en makrodefinition

Som diskuterades i Del 4 kan strukturen hos vilket makro som helst skrivas som:

```
<TeX-makroprimitiv><makronamn><parametertext>{<ersättningstext>}
```

där:

* `<TeX-makroprimitiv>` = en av `\def`, `\edef`, `\gdef` eller `\xdef`;
* `<makronamn>`=namnet på ditt makro, till exempel `\foo`;
* `<parametertext>` kan vara “null” (inte närvarande) eller så kan det vara en sträng av avgränsartoken och makroparametertoken;
* `<ersättningstext>` är själva kroppen i ditt makro: avsnittet som “körs” när du anropar makrot.

**OBS**: (Som också noterades i Del 4) genom hela diskussionen antar vi att `<makronamn>` kommer att följas av ett mellanslagstecken med kategorikod 10 som fungerar som en avgränsare för att avsluta `<makronamn>`. Vi *har inte* explicit visat detta mellanslagstecken i vår text/diskussion, men vi antar att det finns där. Strängt taget borde vi återge det ungefär så här:

```
<TeX-makroprimitiv><makronamn><mellanslag><parametertext>{<ersättningstext>}
```

Men vi kommer att utelämna den explicita inkluderingen av ett `<mellanslag>` tecken och underförstått anta att det finns.

**OBS**: Tecknen `{` och `}` *blir inte* en del av makrots tokenlista: deras syfte är helt enkelt att tala om för textens inläsningsscanner (som skapar token) var `<ersättningstext>` börjar och slutar.

När TeX definierar ett makro omvandlas avsnitten `<parameter text><replacement text>` till en enda lång, sammanhängande tokenlista — det totala antalet token i den listan beror på makrots komplexitet. Som vi har sett har avsnittet ett särskilt syfte att fungera som en “tokenmall” eller “ritning” som TeX använder för att plocka ut de token som bildar argumenten (värdena) som ska användas med det faktiska makrot: det vill säga token som ska matas in i `<ersättningstext>`.

För att förtydliga dessa idéer, låt oss ta ett exempelmakro men hålla det kort så att efterföljande diagram inte blir alltför röriga:

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

För vårt makro, `\foo`

* `<parametertext>` = `A#1\fake`
* `<ersättningstext>` = `123 #1`

Även om detta exempel är ett enkelt makro, innehåller det alla de funktioner vi behöver utforska.

Som nämnt kommer TeX att omvandla `<parameter text><replacement text>` till en enda lång tokenlista som du kan se i diagrammet nedan. I vårt exempel har token som bildats från `A#1\fake{123 #1}` omvandlats till en sammanhängande sekvens av token som lagras i en tokenlista (som en länkad lista av noder).

## Grafik som visar en verklig makrotokenlista

Följande diagram, som visar hur makrot `\def\foo A#1\fake{123 #1}` lagras, använder verkliga data inifrån en TeX-motor. Det skapades med hjälp av en [anpassad version av Knuths TeX](/latex/sv/fordjupade-artiklar/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) som modifierades med ytterligare kod för att fånga upp makroanrop, undersöka TeX:s interna data och exportera dem i ett format för bearbetning med hjälp av ett grafikprogram med öppen källkod som heter [Graphviz](https://www.graphviz.org/).

Du kan ladda ner följande 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 över en annoterad TeX-tokenlista](/files/8ac36473bd4e1e85360737c7a908f1b5b574492f)

#### Att förstå noderna

I diagrammet ovan ser du att varje nod innehåller två dataobjekt som kallas **nästa nod** och **aktuell nod**. Dessa är bara heltalsvärden som representerar minnesplatser inne i TeX — platser där andra noder lagras. Värdena för **nästa nod** och **aktuell nod** är inte viktiga; de lagrar helt enkelt platserna (minnesadresserna) som gör det möjligt att länka noderna samman i en lista.

![Betydelsen av nästa nod och aktuell nod](/files/3272cef1d1cb50549b4fd0487c382bb5e5516bd5)

#### Tillbaka till exemplet

I noddiagrammet innehåller tokenlistan som bildats från `A#1\fake{123 #1}` flera “specialtoken” som introducerades i början av denna artikel. Dessutom börjar nodlistan som representerar vårt makro med en “speciell första nod”: vi ska utforska vad dessa är och vad de gör.

Det allra första objektet i en makrotokenlista (och vissa andra typer av tokenlistor) lagrar inte ett tokenvärde utan ett dataobjekt som kallas makrots *referensräkning* som TeX använder för att hålla reda på användningen av makrot.

![En referensräkningsnod är den första i en tokenlista](/files/7ffc6a22feec698ce7762bd422058d1043079a8d)

Den första token i `<parametertext>` lagras i noden som följer omedelbart efter referensräkningen: du kan se att det är en token som representerar bokstaven `Ett` med kategorikod 11. Från diskussionerna i Del 2 och 3 vet vi att en karaktärstoken beräknas med hjälp av

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

vilket, för en bokstav `Ett` med kategorikod 11, är

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

vilket ger värdet 2881, som visas i noden.

#### Kommandot “\fake” som används i \foo

Inom vår makrodefinition `\def\foo A#1\fake{123 #1}` är en av avgränsarna en *odefinierad* kommandot `\fake` som lagras i tokenlistan som en del av `<parametertext>` avsnittet. Som du kan se, inom den övergripande makrotokenlistan `\fake` finns en token vars värde är `19491`—ett heltalsvärde som beräknas av TeX med hjälp av formeln som diskuterades i Del 3. När TeX försöker köra `\foo` kommer den att förvänta sig att hitta `\fake` tokenvärdet i slutet av `<parametertext>` avsnittet. TeX *kommer inte att* försöka köra `\fake` kommandot eftersom dess roll endast är att fungera som ett slags “interpunktion” inom `<parametertext>` “tokentemplatet”.

![Att använda en kommandotoken som makroavgränsare](/files/757207b7ece4e0dbc9b8b15dde1d6f809acfc1d8)

#### Specialtoken i tokenlistan

**Tokenen “slutmatchning”**

När ett makro anropas är TeX:s första uppgift att skanna makrot som det skrivits av användaren och jämföra token som finns i användarens `<parametertext>` avsnitt med token som finns i mallen `<parametertext>` som lagras i minnet (skapad när makrot definierades). Eftersom makrots fullständiga definition, konstruerad av `<parameter text><replacement text>` lagras som en enda lång sammanhängande lista av token behöver TeX veta var, i den tokenlistan, `<parametertext>` *avslutas* och var `<ersättningstext>` *startar*. För att åstadkomma detta kommer TeX, när det definierar makrot (bygger tokenlistan), att infoga en särskild avslutningstoken som kallas en **slutmatchningstoken** token som den allra sista tokenen i uppsättningen token som genererats från `<parametertext>`. Paketet **slutmatchningstoken** token kan inte genereras från användarkommandon; endast TeX självt kan skapa den, och därför är TeX säker på att upptäcka slutet av `<parametertext>`.

![Visning av slutmatchningstoken i en TeX-tokenlista](/files/133c7c8729ce5d50606bc9b6088014ec1afd7a8d)

Här kan vi se att den första token som följer efter **slutmatchningstoken** är en token som representerar siffran `1` med kategorikod 12. Detta borde vara väntat eftersom `<ersättningstext>` för vårt makro `\foo` är `123 #1`—det vill säga, det börjar med token som representerar siffran `1` (med kategorikod 12).

Från diskussionen i Del 2 och 3 vet vi att en karaktärstoken beräknas med hjälp av

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

vilket, för en siffra `1` med kategorikod 12, är

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

vilket ger tokenvärdet 3121, som visas i noden.

**“matchparametertoken”**

När TeX lagrar makrodefinitionen omvandlar den alla parametertoken (`#1`, `#2`… `#9`) inom `<parametertext>` till en som kallas en **matchparameter** token. Dessa token talar om för TeX att den behöver börja leta efter token, i användarens makroanrop, som utgör makrots argument.

![Visning av matchparametertoken i en TeX-tokenlista](/files/5fe88504abcbb06a1c9a034b2abb1aee1fac1da4)

### Specialtoken i tokenlistan

#### “utdataparametertoken”

När TeX har bearbetat allt och är redo att faktiskt köra (expandera) makrot, instruerar **utdataparameter** token TeX om platser inom `<ersättningstext>` där det behöver mata in token som representerar de argument som användaren gav när makrot anropades. I praktiken: “På denna plats, infoga token som representerar användarens argument n, där n=1...9”.

Inom `<ersättningstext>` avsnittet i den lagrade tokenlistan för makrodefinitionen kommer det att finnas en **utdataparameter** token som motsvarar varje `#1`, `#2`... `#9` som finns i den ursprungliga definitionen.

![Visning av utdataparametertoken i en TeX-tokenlista](/files/10c1b4b55cf39bab4408fc051c68e6d83fb8d936)

Om vi tittar på vår definition av `\foo` (`\def\foo A#1\fake{123 #1}`) ser vi att det bara finns 1 makroparameter (`#1`) i `<parametertext>` (`A#1\fake`) och därefter förekommer bara 1 makroparameter (`#1`) i `<ersättningstext>` (`123 #1`): detta resulterar i bara 1 **utdataparameter** token närvarande i tokenlistan som representerar `<ersättningstext>`.

Observera följande i nodlistan som representerar `\foo`’s `<ersättningstext>`:

* tokenen omedelbart före **utdataparameter** token representerar ett mellanslagstecken (kategorikod 10, teckenkod 32) eftersom det finns ett mellanslag mellan `123` och makroparametern (`#1`) i den ursprungliga definitionen av `\foo`;
* den **utdataparameter** är den sista token i listan:  **nästa nod** har ett särskilt värde på “null” (som betyder “tom”) som används för att avsluta listan: det finns inga fler noder efter **utdataparameter** eftersom det är den sista tokenen, vilket markerar slutet av `<ersättningstext>` och därmed slutet av makrodefinitionen.

## Del 6

I Del 6 använder vi några detaljerade illustrationer för att förklara och utforska den exakta betydelsen av makroexpansion och konsekvenserna av TeX:s tokenisering av makroargument innan de matas in i ett makros `<ersättningstext>`.

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