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

# Hur fungerar \expandafter: en detaljerad studie av på varandra följande \expandafter-kommandon

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

## Fallstudie: Förstå \expandafter\expandafter\expandafter...

Avancerade makron, såsom de som finns i LaTeX-paket, använder ofta i stor utsträckning flera på varandra följande `\expandafter` kommandon för att utföra avancerad token-“jonglering”. För de flesta av oss kan sådana makron vara svåra att förstå eller avskräckande att skriva. I det här avsnittet ska vi gå igenom mekaniken bakom TeX:s behandling av på varandra följande `\expandafter` kommandon:

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

För att underlätta vår förklaring lägger vi till index till varje `\expandafter`—för att ange vilken vi syftar på:

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

Dessutom utökar vi notationen för token som behandlas av varje `\expandafter` till att använda $$\mathrm{T^i\_1}$$ och $$\mathrm{T^i\_2}$$ som representerar tokenen $$\mathrm{T\_1}$$ och $$\mathrm{T\_2}$$ inlästa av `\expandafter` med index `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Vi kommer också att anta att två token $$\mathrm{T\_X}$$ och $$\mathrm{T\_Y}$$ följer efter `\expandafter<sub>3</sub>` så att vår inmatning ser ut så här: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

När TeX börjar behandla denna inmatning kommer den, för `\expandafter<sub>1</sub>` att se

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` som sparas för senare *återinsättning* tillbaka i inmatningen
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, som expanderas

Om vi återknyter till vår tidigare diskussion om [koden i TeX](/latex/sv/fordjupade-artiklar/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) som implementerar `\expandafter`, är det i expansionen av `\expandafter<sub>3</sub>` som vi ser att rekursion uppstår. För att behandla `\expandafter<sub>1</sub>` har TeX redan anropat sin interna funktion `expand()`, så för att behandla (expandera) `\expandafter<sub>3</sub>` gör TeX ett *andra* anrop till `expand()`—inifrån själva `expand()` funktionen.

För `\expandafter<sub>3</sub>` har vi

* $$\mathrm{T^3\_1 = T\_X}$$, som sparas för senare *återinsättning* tillbaka i inmatningen
* $$\mathrm{T^3\_2 = T\_Y}$$, som vi antar är expanderbar

Låt oss vidare anta att expansionen av $$\mathrm{T\_Y}$$ ger följande sekvens av token: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Vi har nu nått slutet på expansionsprocessen som startades av kommandosekvensen `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ och TeX fortsätter med att “veckla upp” rekursionsprocessen som började med `\expandafter<sub>1</sub>`.

Efter att ha behandlat `\expandafter<sub>3</sub>` har TeX i sitt minne en tokenlista som innehåller token från expansionen av $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX börjar nu återinsätta de token som sparades medan det behandlade `\expandafter` kommandon:

1. TeX börjar med att återinsätta token $$\mathrm{T\_X}$$ som sparades av `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ återinsätts *framför* expansionen av $$\mathrm{T\_Y}$$, vilket resulterar i en tokensekvens: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Vi behöver dock fortfarande slutföra processen som startades av `\expandafter<sub>1</sub>` som sparade token som representerar `\expandafter<sub>2</sub>`
3. Den slutliga sekvensen av token som TeX sammanställt, redo att läsas in i nästa steg av TeX:s behandling, är `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX har nu avslutat den “första rundan” av behandlingen och går vidare till att läsa den sekvens av tokenlistor som det har genererat—den sekvensen börjar med `\expandafter<sub>2 (token)</sub>` som TeX fortsätter att behandla. För `\expandafter<sub>2</sub>` har vi
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ som sparas för senare *återinsättning* tillbaka i inmatningen
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ som är den första token som uppstår från expansionen av $$\mathrm{T\_Y}$$; om den är expanderbar, expanderas den
5. Om vi antar att token $$\mathrm{T^1\_Y}$$, den första tokenen från expansionen av $$\mathrm{T\_Y}$$, expanderar till $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ sedan, efter att TeX har återinsatt $$\mathrm{T\_X}$$, skulle den resulterande tokensekvensen som ska bearbetas på nytt av TeX vara: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   vilket vi kan omformulera som

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

Följande diagram illustrerar tokenlistorna som skapas av TeX-koden

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

![Bild som visar TeX:s behandling av flera \expandafter-kommandon](/files/31bdfc0e2623da27d2ca931dc5abbf6745c9b9f2)

### Teori i praktiken

Som exempel definierar vi följande makron som ska fungera som $$\mathrm{T\_X}$$ och $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` där vi definierar `\foo` som `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` där vi först definierar `\def\abc{Hej}`, `\def\xyz{, Värld!}` och sedan `\def\bar{\abc\xyz}`

Vi använder följande kodfragment för att demonstrera vår tidigare analys:

\expandafter\expandafter\expandafter\foo\bar

Av vår diskussion följer resultatet av `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ ger en tokensekvens av formen:

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

där den exakta sekvensen beror på tokenens natur $$\mathrm{T\_Y}$$. Om vi sätter in våra exempelkommandon med $$\mathrm{T\_X}=$$`\foo` och $$\mathrm{T\_Y}=$$`\bar`, som definieras som `\def\bar{\abc\xyz}`, ser vi:

* den första tokenen i $$\mathrm{T\_Y}$$ är `\abc` och dess expansion är en sekvens av tecken-token: `Hej`
* de återstående tokenen i $$\mathrm{T\_Y}$$ är den enda token som representerar `\xyz`.

Om vi stoppar in denna information i vår “analys” får vi

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

Observera att index <sub>token</sub> och <sub>tokenlista (tecken)</sub> används för att betona (påminna oss om) att TeX läser *heltals-tokenvärden*, inte *texttecken*, därför finns det inget behov av att visa några blanktecken eller andra avgränsare efter `\foo`: sådana avgränsare har sedan länge redan bearbetats eller kastats bort; här befinner vi oss stadigt i TeX:s inre värld av tokenlistor och heltals-tokenvärden.

När TeX bearbetar tokenlistesekvensen som produceras av våra `\expandafter` kommandon kommer det att sätta `**H**ej, världen!`—endast `H` sätts i fetstil. Vi skulle kunna uppnå samma resultat genom att skriva motsvarande TeX-kod `\foo Hej\xyz`. Lägg märke till att definitionen av `\foo` använde en enda parameter; följaktligen, `\foo` suger upp den enda `H` tecken-tokenen för sitt argument och lämnar de återstående tecken-tokenen (`ej`) orörda.

**Anmärkningar:**

* att skriva `\foo\bar` ger ett mycket annorlunda resultat: tokenen för `\bar` skulle användas som argument för `\foo` vilket resulterar i sättningen **`Hej, Värld`**—allt sätts i fetstil.
* att skriva `\expandafter\foo\bar` gör att `\bar` expanderas, vilket producerar två token: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Sedan, efter att $$\text{foo}*\text{token}$$ återinförts av `\expandafter` bearbetar TeX tokensekvensen $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ som sätter `**Hej**, Värld`—endast **`Hej`** sätts i fetstil. Här behandlas den enda tokenen $$\text{abc}*\text{token}$$ som argument för makrotokenen $$\text{foo}*\text{token}$$, vilket lämnar tokenen $$\text{xyz}\_\text{token}$$ orörd och dess innehåll sätts i det aktuella typsnittet.

## Anmärkning om \expandafter och makron med argument

När du använder `\expandafter` För att tvinga fram expansion av makron är det värt att veta hur makroexpansion fungerar—särskilt för makron som tar argument. Innan TeX kan köra ett makro—dvs. läsa och bearbeta token som finns i makrots definition—behöver TeX göra makrot “klart att köras” genom att utföra den inledande makroexpansionsprocessen. Om en makrodefinition innehåller användning av parametrar (`#1`, `#2`, ... `#9`), kräver en del av makroexpansionsprocessen att TeX skannar inmatningen och letar efter token som utgör användarens angivna argument: dessa argumenttoken absorberas (tas bort) från inmatningen. Under makroexpansion läser och absorberar TeX token från inmatningen för att skapa små tokenlistor, en lista per argument; dessa tokenlistor kommer därefter att sättas in på lämplig plats i makrots kropp—när TeX exekverar det. Det sista steget i makroexpansion innebär att TeX lokaliserar den makrodefinition som är lagrad i minnet och ordnar så att den platsen blir den källa varifrån TeX läser sin nästa uppsättning inmatningstoken. Makroexekvering börjar när TeX börjar läsa och bearbeta dessa token och matar in de tokenlistor som tidigare skapats för att lagra argumenten.

### Avgränsartoken absorberas också

Om den ursprungliga makrodefinitionen också använde token som fungerade som avgränsare, skulle TeX också behöva jämföra den ursprungliga makrodefinitionen med användarens användning (anrop) av det makrot, för att hitta och matcha avgränsartoken. När de väl har matchats/hittats ignoreras avgränsartoken därefter eftersom deras enda syfte är att fungera som “interpunktion” och hjälpa TeX att plocka ut och identifiera de faktiska token som ska bilda varje argument.

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