> 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/fi/syvalliset-artikkelit/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# Miten \expandafter toimii: laajentamisen merkitys

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

## TeX:n “laajennus”-käsitteen esittely

Kun olemme tarkastelleet [TeX-tokeneita ja token-listoja](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true), seuraavana taustateemalistallamme `\expandafter` on TeX:n käsite *laajennus*: TeX:n ydintoiminto `\expandafter` jonka kanssa se on suunniteltu toimimaan.

### Laajennuksen selittämisen haasteesta...

Useimmille meistä TeX:n laajennuskäsite ja sen taustalla olevat syyt/mekanismit voivat olla hämmentäviä—niitä ei ole helppo *täysin* selittää yksinkertaisella, tiiviillä tavalla. Monet TeX:n sisäisistä toiminnoista/prosesseista liittyvät toisiinsa melko monimutkaisilla tavoilla, mikä voi tehdä tiettyjen TeX:n toimintojen osa-alueiden “erittelyn” haastavaksi: niiden käsittelemisen ohjelmasta kokonaisuutena irrallaan. Laajennus on ehdottomasti käsite, joka kuuluu tähän kategoriaan, koska se on *perustavanlaatuinen* osa TeX:n käyttäytymistä ja syvälle kietoutunut koko TeX:n sisäisiin prosesseihin. Tässä artikkelissa pyritään kuitenkin rakentamaan selitys laajennukselle ja tarjoamaan perusta, jonka varaan lukijat voivat rakentaa.

Selittääksemme TeX:n laajennusmekanismin etenemme vaihe vaiheelta, tarkastelemme joukkoa siihen liittyviä olennaisia aiheita ja kokoamme ne yhteen kehittääksemme ymmärrystä tästä TeX:n käyttäytymisen tärkeästä osasta. Myöhemmin artikkelissa, ja yksityiskohdista pitävälle rohkeammalle lukijalle, kurkistamme itse TeX:n sisään ja tiivistämme keskeisen lähdekoodin, joka ohjaa laajennusprosessia.

### Keskeisiä huomioita TeX-tokeneista

Seuraavassa keskustelussa on tärkeää muistaa, että TeX voi saada seuraavan syöte-elementtinsä kahdesta lähteestä:

1. **fyysisistä tekstitiedostoista**: luomalla *uusia tokeneita* lukemalla/skannaamalla näiden tiedostojen merkkejä ja komentoja, tai
2. **token-listoihin**: saamalla syötteen lukemalla olemassa olevien, *ennalta valmisteltujen*, TeX:n muistiin tallennettujen tokenien joukosta.

Muista myös, että TeX käyttää tokeneita kätevänä tapana paketoida siististi tietoa mistä tahansa sen lukemasta elementistä (merkistä tai komennosta).

Kun TeX luo *uusia tokeneita* se *tokenin tuottamisen hetkellä*, sillä on välitön pääsy tietoon siitä elementistä, jonka token-arvoa se laskee. Esimerkiksi uusia komentotokeneita luodessaan TeX laskee ensin arvon nimeltä `curcs` joka mahdollistaa TeX:n hakevan tietoa komennosta, jonka tokenia se on juuri tuottamassa.

Jos TeX kuitenkin lukee token-listoista (sarjoista *tallennettuja tokeneita*) sen pitäisi ensin “purkaa paketti” kyseisestä listasta löytyvä token, ennen kuin se voisi määrittää, mitä kukin token edustaa. Esimerkiksi TeX voisi lukea makromäärittelyn osana tallennettuja tokeneita: ne tokenit olisi luotu tekstistä, joka on jo kauan sitten luettu, muunnettu tokeneiksi ja talletettu pois. Tokenin tyyppi (merkki tai komento) määrää, mitä TeX:n “paketin purkaminen” todella tarkoittaa:

* kohtaan *komentotokenit* (tokenin arvo on > 4095): laske `curcs` kautta $$\text{curcs}=\text{token value}-4095$$ ja käytä `curcs` etsiäksesi tietoa komennosta;
* kohtaan *merkkitokenit* (tokenin arvo < 4095): jaa merkkitoken sen muodostaviin parejaan (merkkikoodi, kategoriakoodi).

### Alussa...

Aloittaaksemme laajennuksen tarkastelun katsomme, miten TeX-moottorit luokittelevat eli kategorisoivat käsiteltävissä olevat komennot. Toistaiseksi oletetaan, että “laajennettava” on vain jokin vielä selittämätön TeX-komennon “ominaisuus”.

### Käsitys “laajennettavista” komennoista

Kaikki TeX-pohjaiset ladontaohjelmat (TeX-“moottorit”) ymmärtävät kaksi pääasiallista komentoluokkaa:

* suoraan suoritettavaan moottoriin sisäänrakennetut komennot: niin sanotut *primitiiveistä*;
* käyttäjän määrittämät komennot: niin sanotut *makroja*.

TeX-moottorit käyttävät myös “laajennettavuutta”, eräänlaista komentojen “käyttäytymistä”, mekanismina kaikkien komentojen luokittelemiseksi kahteen ryhmään:

* laajennettavat komennot;
* ei-laajennettavat komennot.

Voimme siis ajatella, että kaikkien komentojen joukko (primitiivit plus makrot) voidaan luokitella seuraavan kuvan mukaisesti:

![Kaavio, joka näyttää kaikkien TeX-komentojen luokittelun](/files/5898a4441edf34df2bd806e7c0858446e95a0ea8)

Vaikka emme vielä tiedä, mitä laajennus/laajennettava todella tarkoittaa, voidaan nähdä, että:

* kaikki makrot luokitellaan laajennettaviksi komennoiksi;
* myös osa primitiiveistä (sisäänrakennetuista) komennoista luokitellaan laajennettaviksi (valtaosa ei ole).

**Huomautus aktiivisista merkeistä**: Primitiivien ja makrojen lisäksi on olemassa kolmas “laajennettavan” kohteen luokka: aktiiviset merkit—kaikki merkit, joille on annettu kategoriakoodi 13, katsotaan myös “laajennettaviksi”, koska niitä käsitellään “pienoismakroina”.

#### Mistä TeX tietää, onko komento “laajennettava”?

Edellisestä [keskustelustamme TeX-tokeneista](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) tiedämme, että tokenit eivät ole muuta kuin kokonaislukuja, jotka TeX laskee ja käyttää syötteen elementtiä—merkkiä tai komentoa—koskevan tiedon “paketoimiseen”. Huomasimme myös, että minkä tahansa tokenin (kokonaisluvun) arvon perusteella TeX voi tarvittaessa kääntää tokenisointiprosessin päinvastaiseksi, “purkaa” tokenin ja paljastaa tiedot siitä komentosta tai merkistä, jota se edustaa.

Käyttämällä tietoja, jotka syntyvät kun TeX luo uuden tokenin, tai tietoja, jotka on poimittu olemassa olevasta tokenista—esim. makrossa tai muussa token-listassa tallennetusta—TeX voi tarkistaa sisäiset tietotietotaulunsa löytääkseen yksityiskohtaista tietoa tuon tokenin edustamasta komennosta (tai merkistä). Seuraava kuva havainnollistaa komentotokenin luomisen (“paketoimisen”) ja sitten, kun TeX tarvitsee jotain tietoa, prosessin kääntämisen päinvastaiseksi (“tokenin purkamisen”), jotta saadaan tietoja tietyn token-arvon edustamasta komennosta.

![Kaavio, joka näyttää, miten TeX pakkaa/purkaa tokeneita](/files/794a06d70a3d01cdb346cf47117f40fa97b0b086)

### Komentokoodit

Osa siitä tiedosta, jonka TeX tallentaa jokaisesta komennosta (primitiivistä tai makrosta), on niin sanottu sen *komentokoodi*: kokonaisluku, jota TeX-moottorit käyttävät (sisäisesti) komentojen luokitteluun—komennot, joilla on samanlainen käyttäytyminen/toiminnallisuus, jakavat saman komentokoodin.

**Huomaa**: Yksittäisen *ei-aktiiviset*, merkin, sen komentokoodi on *kategoriakoodi* se, joka sille annettiin sillä hetkellä, kun TeX luki sen sisään (skannasi). Huomaa myös, että merkkejä lukuun ottamatta komentokoodit ovat täysin TeX:n sisäisiä: niihin ei pääse käsiksi makrojen tai primitiivikomentojen kautta—näiden yksityiskohtien näkemiseksi sinun täytyy lukea TeX:n lähdekoodi!

Tässä on joitakin esimerkkejä komentokoodeista:

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` (ja muut) luokitellaan kaikki “laatikoita tekeviksi” komennoiksi ja ne jakavat komentokoodin 20;
* `\def`, `\edef`, `\gdef`, `\xdef` ovat kaikki “makromäärittely”-komentoja ja jakavat komentokoodin 97;
* kaikki makrot luokitellaan yhteen komentokoodeista 111, 112, 113 tai 114: eri komentokoodit määräytyvät sen mukaan, käytetäänkö `\long` tai `\outer` makron määrittelyssä:
* 111: ei-long, ei-outer-makron komentokoodi (esim., `\def\foo{...}`)
* 112: longin, ei-outer-makron komentokoodi (esim., `\long\def\foo{...}`)
* 113: ei-longin, outer-makron komentokoodi (esim., `\outer\def\foo{...}`)
* 114: longin, outer-makron komentokoodi (esim., `\long\outer\def\foo{...}`)

TeX käyttää komentokoodeja myös tunnistaakseen komentojen alajoukon, joka luokitellaan “laajennettavaksi”. Tehdäkseen niin TeX liittää laajennettavat komennot komentokoodiarvoihin, jotka ylittävät kynnysarvon 100 (arvo, jota käyttivät Knuthin alkuperäinen TeX, e-TeX ja pdfTeX). Näin ollen:

* *laajentumattomia* komentojen (valtaosan) komentokoodi on <= 100
* *laajennettavilla* komennoilla on komentokoodi > 100

Jos TeX siis hakee tietoja tietystä komennosta ja havaitsee komentokoodin > 100, TeX tietää heti sen olevan laajennettava. Kaikille makroille ja pienelle määrälle primitiivejä (sisäänrakennettuja komentoja) annetaan komentokoodi, joka osoittaa niiden olevan laajennettavia: mutta miksi TeX ylipäätään vaivautuu tähän “laajennettava”-luokitteluun? Kuten saatat epäillä, se tarkoittaa yksinkertaisesti, että nämä komennot ovat jossain määrin “erityisiä”; ts. niitä voidaan kohdistaa TeX:n *laajennus*.

**Huomautus (merkit)**: Ellei merkkiä ole määritelty aktiiviseksi (kategoriakoodi 13), kaikki merkit ovat ei-laajennettavia. Aktiivisia merkkejä voi ajatella yksikirjaimisina “minimakroina”.

## Niin, niin, mutta mikä on laajennus???

Huomasimme, että token-arvoja, jotka ovat suurempia kuin 4095, käytetään komentojen esittämiseen; näin ollen TeX voi tarvittaessa “purkaa” tuon tokenin saadakseen tietoa siitä TeX-komennosta, jota tuo token edustaa. TeX voi hakea tuon komennon komentokoodiarvon määrittääkseen, kuuluuko se erityiseen laajennettavien kategoriaan. Mutta mitä TeX tekee tällä tiedolla ja mitä “laajennettava oleminen”, eli laajennus, *oikeastaan tarkoittaa*?

### Laajennus: yleinen termi joukolle toimintoja

Tietyissä kohdissa TeX:n käsittelyä sen täytyy tietää, edustaako token laajennettavaa komentoa:

* **Ei**: Jos tuo komentotoken *ei* kuuluu laajennettavaan luokkaan, TeX yksinkertaisesti “välittää sen eteenpäin” seuraavaan käsittelyvaiheeseen.
* **Kyllä**: Jos tuo komentotoken *ei* kuuluu laajennettavaan luokkaan, voit ajatella, että TeX:n täytyy ryhtyä toimiin, jotka johtavat kyseisen tokenin “suodattamiseen pois” suorittamalla prosessin, jota TeX kutsuu “tuon tokenin laajentamiseksi”, eli laajennuksen suorittamiseksi.

Pohjimmiltaan laajennus tarkoittaa, että TeX *poistamista* tuon tokenin syötteestään ja *korvaamista* korvaa sen tokeneilla, jotka syntyvät kyseisen komennon tai saman komentokoodin jakavan komentoryhmän “laajennusprosessissa”.

Tarvitaan harjoitusta ja kokemusta tietääksesi, milloin TeX suorittaa tokenien laajennusta ja milloin ei—The TeXbookin sivulla 215 luetellaan tilanteet, joissa laajennettavia tokeneita ei laajenneta. Todellisuudessa TeX:n laajennusprosessi on monimutkainen ja hienovarainen.

#### Mitkä komennot ovat laajennettavia?

Jos katsot luetteloa primitiiveistä (sisäänrakennetuista) komennoista, jotka TeX-moottorit luokittelevat laajennettaviksi (esim. The TeXbookin sivut 212–215), käy ilmeiseksi, että käytännössä laajennus on varsin yleinen termi, jota TeX käyttää kuvaamaan hieman eklektisen komentoryhmän käyttäytymistä. Tietyn (laajennettavan) komennon laajennuksen tulokset vaihtelevat, ja tämän voi nähdä listaamalla joukon laajennettavia komentoja—ryhmiteltyinä niiden toiminnallisuuden mukaan. Yksittäisten komentojen tarkka semantiikka ei tässä ole tärkeää; kiinnostavinta ovat niiden toimien yleiset seuraukset—mitä niiden laajennus itse asiassa *tekee tai saavuttaa*.

| **Komento**                                                                                                                                                                                                                                                                                                                                                                                                                                                                | **Kuvaus**                                                                                                                                                                          | **Laajennuskäyttäytyminen**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>kaikki makrot</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                            | Tallennettu sarja komento-/merkkitokeneita                                                                                                                                          | <p>Käytännössä makron laajentaminen tarkoittaa token-listan lisäämistä TeX:n luettavaksi. Tämä sisältää:</p><ul><li>token-listojen luomisen kaikille makron argumenteille—prosessi sisältää erotintokeneiden tunnistamisen/imeytymisen;</li><li>tallennettujen tokenien listan hakemisen (makron määrittelyn) ja valmistautumisen lisäämään (makromäärittelyyn) ensimmäisessä vaiheessa luodut parametrtokeneet.</li></ul><p>Käytännössä makron laajentaminen <em>poistaa makrotokenin</em> syötteestä ja <em>korvaa sen</em> määrittelyssä olevilla tokeneilla.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | Muuta laajennusjärjestystä                                                                                                                                                          | Tokenien suodatus/sekoittelu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | Estä laajennus (kyllä, yllättäen se on luokiteltu laajennettavaksi komennoksi)                                                                                                      | Viivästytä laajennusta (eräänlainen tokenien suodatus)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | Liittyy uuden token-lähteen syöttämiseen lähdetiedostojen kautta—kyllä, `\scantokens` tässä kategoriassa sen niin sanottujen “näennäistiedostojen” käytön vuoksi                    | Toimi uusien tokenien lähteenä                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | Aloita ehdollinen lauseke                                                                                                                                                           | Aloita tokenien “suodatus”: päätä, mitkä seuraavista tokeneista käsitellään.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | Lopeta ehdollinen lauseke                                                                                                                                                           | Pysäytä tokenien “suodatus”: päätä, mitkä tokenit käsitellään                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | Rakenna/tuota komentotoken                                                                                                                                                          | Muunna token-jono yhdeksi komentotokeniksi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | Muunna jokin tokenien sarjaksi                                                                                                                                                      | Tuota joitakin tokeneita (jotka edustavat sisäistä määrää tai arvoa)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` sillä on useita käyttötarkoituksia, mukaan lukien tokenien lisääminen; `\detokenize` muuntaa token-listan merkkitokenien listaksi; `\unexpanded` estää tokenien laajenemisen | Lisää/tuota tokeneita tai hallitse laajennusta                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | Komennot token-listojen käyttämiseen erikoistarkoituksissa                                                                                                                          | Käytä tallennettujen tokenien lähdettä (token-listoja)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |

Voidaanko yllä olevan luettelon perusteella poimia tästä komentokokoelmasta joitakin “yleisiä käyttäytymismalleja” ymmärryksemme laajentamiseksi? Melko hyvällä tarkkuudella komennon laajentamisen tulokset voidaan jakaa muutamaan keskeiseen toimintaan:

* tokenien tuottaminen
* tokenien lisääminen
* tokenien suodatus
* seuraavan tokenin laajenemisen muutos/hallinta

### Ja lopuksi: mitä laajennus tarkoittaa?

Voimme ajatella, että komentotokenin (mukaan lukien aktiiviset merkit) laajentaminen sisältää sen, että TeX **poistamista** ottaa tuon komentotokenin syötteestä ja **korvaamista** korvaa tuon tokenin muilla tokeneilla, jotka syntyvät sen laajennuskäyttäytymisestä: tokeneiden tuottamisella/lisäämisellä, tokeneiden suodattamisella tai seuraavan tokenin laajenemisen muuttamisella/hallinnalla. Kun token on laajennettu, TeX jatkaa kaikkien niiden tokenien lukemista/käsittelyä, jotka saattavat syntyä laajennusprosessista. Täsmälleen se, milloin tai missä TeX suorittaa laajennuksen, on aivan eri kysymys: TeX:n käsittelyn hienouksien ja monimutkaisuuden vuoksi sitä emme voi tässä artikkelissa täysin käsitellä, mutta voimme antaa yleiskatsauksen TeX:n tärkeimmästä syötteenkäsittelykäyttäytymisestä.

## Laajennus ja TeX:n rakenne

Väittäisin, että paras tapa nähdä, miten/ missä TeX erottaa laajennettavat ja ei-laajennettavat komennot, on tarkastella TeX:n lähdekoodia.

Sisäisesti TeX on erittäin monimutkainen ohjelmisto; näin ollen ei ole käytännöllistä yrittää kuvata täysin TeX:n toimintaan sisältyviä monia hienovaraisia käyttäytymismalleja. Kuten todettu, täsmälleen se, milloin tai missä TeX todella suorittaa laajennuksen lukiessaan tokeneita, on “jonkin verran monimutkaista”; siksi seuraava keskustelu olettaa, että TeX on tilassa, jossa laajennus täytyy suorittaa. Tilanteita, joissa TeX lukisi/loisi tokeneita mutta ei suorittaisi laajennusta, ovat muun muassa tokenien luominen/tallentaminen `\def` makromäärittelykomentoa varten tai tokenien tallentaminen `\toks` rekisteriin.

Seuraava kaavio antaa yksinkertaistetun yleiskuvan TeX:n rakenteen ydinosiin, jotka käsittelevät syötettä ja tokenien prosessointia: tavoitteena on korostaa sitä, miten laajennettavia ja ei-laajennettavia tokeneita “suodatetaan” TeX:n syötteenkäsittelyn aikana. C-ohjelmointikieltä käytetään eri keskeisten funktioiden kuvaamiseen, mutta toivottavasti perusrakenne on selkeä, vaikka et tuntisikaan C-kieltä.

![](/files/0adadb1bb7c4a193c7e632516b5fea21e4823b3e)

### Selitys TeX-rakennediagrammista

Pääpiirteissään TeX:n käsittelyä ohjaa funktio nimeltä `maincontrol()` johon TeX:n lähdekoodissa Knuth viittaa “pääjohtajana” ja kuvaa sitä seuraavasti:

> “Tulemme nyt `maincontrol` rutiiniin, joka sisältää pääkytkimen, joka saa TeX:n kaikki eri osat tekemään omat asiansa oikeassa järjestyksessä… tämä on ohjelman suuri huipentuma… Olemme nyt verkon keskipisteessä, keskushermostossa, joka koskettaa useimpia muita osia ja sitoo ne yhteen.”

Seuraava kuvaus on jonkin verran yksinkertaistettu, mutta antaa “maku” TeX-pohjaisen ohjelmiston taustarakenteesta: siitä, miten laajennettavat komennot tunnistetaan (“siepataan”) ja suodatetaan pois TeX:n syötteenkäsittelyn aikana.

Pohjimmiltaan TeX:n varhaisimmassa syötteenkäsittelyvaiheessa se käyttää nykyisen komennon (tokenin) komentokoodiarvoa havaitakseen laajennettavat komennot (makrot, laajennettavat primitiivit ja aktiiviset merkit); jos sellainen tunnistetaan, tällaiset komennot “siepataan” ja “esikäsitellään” — laajentamalla ne. Tämän suodatus- (laajennus-) prosessin kautta TeX poistaa laajennettavat komennot syötteestä ja korvaa ne tokeneilla, jotka syntyvät niiden vastaavasta laajennuskäyttäytymisestä. Kun laajennusprosessi on valmis, TeX lukee kaikki tuosta laajennuksesta syntyneet tokenit. Vain ei-laajennettavat kohteet välitetään TeX:n käsittelyn seuraavaan vaiheeseen: “suureen kytkimeen”, jossa TeX suorittaa kaikki ei-laajennettavat primitiivikomennot ja ladottaa merkit.

### maincontrol()-funktion ymmärtäminen

Se `maincontrol()` funktio sisältää suuren niin sanotun [switch-lauseen](https://en.wikipedia.org/wiki/Switch_statement)—Knuth kutsuu sitä “suureksi kytkimeksi”—jota TeX käyttää suorittaakseen kaikki *laajentumattomia* primitiivikomennot: ne, joiden komentokoodi on <=100.

Suorittaakseen tietyn komennon (tai merkin) tämä “suuri kytkin” käyttää yhdistelmää TeX:n nykyisestä tilasta:

* sisäinen/ulkoisen pystymoodin, tai
* rajoitetun/kappalevaakamuodon, tai
* rivi- tai näyttömatematiikan moodin

*sekä* kunkin primitiivin tai merkin komentokoodiarvo—merkin komentokoodi on *ei-aktiiviset* sen *kategoriakoodi* arvo. Tiedoksi: kaikille TeX:n kuudelle tilalle on annettu kokonaislukuarvo, jota TeX voi käyttää tallentaakseen ja palauttaakseen nykyisen tilansa vaihtaessaan ladottavien rakenteiden—matematiikan, kappaleiden, laatikoiden ja niin edelleen—välillä. Tässä ovat TeX:n eri tiloille osoitetut kokonaisluvut:

|                           |                                             |              |
| ------------------------- | ------------------------------------------- | ------------ |
| **Tila**                  | **Merkitys**                                | **Tilaarvo** |
| Ulkoinen pystymuoto       | Kappaleiden välissä (sivuja rakennettaessa) | 1            |
| Sisäinen pystymuoto       | Välittömästi sisällä `\vbox{...}`           | -1           |
| Vaakamuoto                | Kappaleita ladottaessa/rakennettaessa       | 102          |
| Rajoitettu vaakamuoto     | Välittömästi sisällä `\hbox{...}`           | -102         |
| Näyttömatematiikka        | Ladonta *näyttö* yhtälöitä/kaavoja          | 203          |
| Rivimatematiikka (kaavat) | Ladonta *sulautettuun* yhtälöitä/kaavoja    | -203         |

Huomaa negatiivisten arvojen käyttö eri tilojen vastinpareissa, kuten sisäisen ja ulkoisen pystymuodon välillä. Kun käsitellään komentoja tilassa `maincontrol()`, TeX käyttää nykyisen tilan itseisarvoa—eli jättää negatiivisen merkin huomiotta. Esimerkiksi, jos TeX on jommassakummassa vaakamuodossaan ja sen täytyy käsitellä merkki, jonka kategoriakoodi on 11, se käyttäisi summaa $$102 + 11 = 113$$ sen “suurella kytkimellä” haarautuakseen koodiin, joka käsittelee nämä merkit kummassakin vaakamuodossa (kappaleita rakentaen tai sisällä `\hbox`).

#### Seuraavan tokenin hankkiminen

Se `maincontrol()` funktio kutsuu funktiota `getxtoken()` saadakseen syötteen seuraavan tokenin; puolestaan `getxtoken()` kutsuu alimmantason syöttöfunktiota `getnext()`. Kun `getnext()` on suorittanut työnsä loppuun ja asettanut keskeisten *globaalien muuttujien*, `getxtoken()` tarkistaa, edustaako juuri luettu kohde makroa tai laajennettavaa primitiiviä.

Muutamia huomioita `getnext()` ja `getxtoken()`:

* **`getnext()`**: tämä on TeX:n ydin-syöttöfunktio. Se lukee ja käsittelee merkkejä syötteenä fyysisestä tiedostosta tai lukee tokeneita token-listasta. Huomaa, että `getnext()` ei varsinaisesti laske token-arvoja, mutta se asettaa joukon keskeisiä *globaaleja* muuttujia (esim. komentokoodi ja `curcs`) joita käytetään myöhemmin käsittelyssä.
* **`getxtoken()`**: “get expanded token” käyttää `getnext()` lukeakseen syötteen seuraavan kohteen. Sitten se testaa juuri luetun kohteen komentokoodin tarkistaakseen, edustaako tuo kohde laajennettavaa komentoa: jos edustaa, se laajennetaan tai makro kutsutaan. Ei-laajennettaville kohteille `getxtoken()` lasketaan token-arvo, ja nämä tiedot välitetään käsittelyn seuraavaan vaiheeseen: “suureen kytkimeen”, jossa ei-laajennettavat primitiivit suoritetaan ja merkit ladotaan.

Pohjimmiltaan juuri `getxtoken()` kautta kaikki laajennettavat kohteet “suodatetaan pois” ennen kuin niitä käsitellään `maincontrol()`: näin TeX:n “suuri kytkin” käsittelee vain ei-laajennettavia primitiivikomentoja.

Korostamme jälleen, että yllä oleva kaavio on yksinkertaistus, koska myös muut TeX:n käsittelyn osa-alueet saavat tokenit laajenemaan; esimerkiksi:

* kun TeX etsii (skannaa) numeerisia arvoja, se laukaisee laajennuksen etsiessään kokonaislukuja (kutsumalla `getxtoken()`) ;
* primitiivikomentoa `\romannumeral` aiheuttaa laajennuksen—katso artikkeli [Laajennus käyttämällä `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) tuon tosiasian vivahteikkaasta käytöstä;
* Se `\edef` (“laajennettu määrittely”) makromäärittelykomento pakottaa täyden laajennuksen;
* TeX laajentaa tokeneita tietyissä kohdissa käsitellessään `\halign` tai `\valign` (molemmat komennot liittyvät TeX:n taulukkoladonta-algoritmeihin).

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