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

# Miten TeX-makrot oikeastaan toimivat: osa 5

[Osa 1](/latex/fi/lisaa-aiheita/19-how-tex-macros-actually-work-part-1.md) [Osa 2](/latex/fi/lisaa-aiheita/20-how-tex-macros-actually-work-part-2.md) [Osa 3](/latex/fi/lisaa-aiheita/21-how-tex-macros-actually-work-part-3.md) [Osa 4](/latex/fi/lisaa-aiheita/22-how-tex-macros-actually-work-part-4.md) [Osa 5](/latex/fi/lisaa-aiheita/23-how-tex-macros-actually-work-part-5.md) [Osa 6](/latex/fi/lisaa-aiheita/24-how-tex-macros-actually-work-part-6.md)

## Johdanto ja yleiskatsaus

Osassa 4 tarkastelimme joitakin TeX-makrojen perusominaisuuksia valmistautuaksemme seuraaviin kahteen artikkeliin, joissa tarkastelemme läheltä TeX-makrojen taustalla olevaa mekaniikkaa: erikoisia tokenlistoja. Näissä kahdessa viimeisessä artikkelissa käytämme kaavioita, joita kutsutaan solmulistoiksi, ja jotka on laadittu Knuthin alkuperäisestä TeX-ohjelmistosta erityisesti muokattua versiota käyttäen tuotetusta datasta — nämä muutokset suunniteltiin pääsemään käsiksi TeX:n sisäisiin tietorakenteisiin, joihin käyttäjällä ei normaalisti ole pääsyä. Kytkeytymällä TeX:n sisäisiin makrojen käsittely- ja suoritusrutiineihin oli mahdollista kirjoittaa ulos graafista dataa, joka mahdollistaa yksityiskohtaisemman ja tarkemman keskustelun TeX:n makrojen käsittelyn toiminnasta. Overleaf toivoo, että nämä kaaviot auttavat lukijoita ymmärtämään paremmin, miten TeX-makrot todella toimivat.

### Mahdollista lisätaustalukemista

Overleaf on jo julkaissut kaksi tokeneihin liittyvää artikkelia, jotka tarjoavat lisätietoa TeX-tokeneista ja TeX-tokenlistoista. Käythän tutustumassa niihin, jos sinun täytyy paikata aukkoja ymmärryksessäsi ja saada tästä sarjasta mahdollisimman paljon irti osista 5 ja 6.

* [Mikä on "TeX-token"?](/latex/fi/syvalliset-artikkelit/53-what-is-a-tex-token.md)
* [Mikä on TeX-tokenlista?](/latex/fi/syvalliset-artikkelit/54-what-is-a-tex-token-list.md)

## Makrot tokenlistoina

Kun TeX havaitsee makron luontikomennon (`\def`, `\edef`, `\gdef` tai `\xdef`) syöttövirrassa, se käynnistää prosessin, joka muuntaa molemmat osiot `<parametriteksti><korvausteksti>` makromme määritelmästä yhdeksi pitkäksi tokenlistaksi — mutta hyvin erityyppiseksi tokenlistaksi.

Makrojen tokenlistat eroavat hieman muista TeXissä käytettävistä tokenlistoista, koska ne sisältävät “erityisiä” token-arvoja, joita vain TeX:n omat sisäiset prosessit voivat luoda/generoida: näitä erikoistokeneita ei voi suoraan luoda millään komennoilla, joita voit sisällyttää .tex-tiedostoosi. TeX luo ja käyttää näitä “erityisiä” token-arvoja auttaakseen makrokutsusi käsittelyssä, kuten tutkimme ja selitämme alla.

### Lyhyt huomio tokenlistojen tallentamisesta: solmut

Tokenien (kokonaislukuarvojen) listan tallentamiseen TeX käyttää tietorakennetta nimeltä [linkitetty lista](https://en.wikipedia.org/wiki/Linked_list), joka TeXin tapauksessa koostuu niin sanotuista *solmuista*. Voit ajatella solmua pienenä tietokoneen muistipakettina, jota voidaan käyttää tietoelementtien kokoelman tallentamiseen. Makron tallentamiseksi nämä solmut ketjutetaan yhteen kuin ketju, jossa jokainen solmu (ketjun lenkki) voi tallentaa useita tietoja — mukaan lukien token-arvon ja listan seuraavan solmun muistiosoitteen. Lisätietoja varten voit lukea artikkelin [Mikä on TeX-tokenlista](/latex/fi/syvalliset-artikkelit/54-what-is-a-tex-token-list.md) mutta seuraava kaavio tiivistää makrona tallennetun tokenlistan keskeiset piirteet:

![Kaavio TeX-makron tokenlistasta linkitettynä solmulistana](/files/031bad1cb4ccf961df52d51f7e8776ca4e6c48da)

### Muistutus: makromääritelmän 4 osaa

Kuten osassa 4 käsiteltiin, minkä tahansa makron rakenne voidaan kirjoittaa muodossa:

```
<TeX-makroprimitiivi><makron nimi><parametriteksti>{<korvausteksti>}
```

jossa:

* `<TeX-makroprimitiivi>` = on yksi seuraavista `\def`, `\edef`, `\gdef` tai `\xdef`;
* `<makron nimi>`= makron nimesi, kuten `\foo`;
* `<parametriteksti>` voi olla “null” (ei läsnä) tai se voi olla merkkijono erotintokeneita ja makroparametritokeneita;
* `<korvausteksti>` on makrosi varsinainen runko: osa, joka “suoritetaan”, kun kutsut makroa.

**HUOMAUTUS**: (Kuten myös osassa 4 todettiin) oletamme koko keskustelun ajan, että `<makron nimi>` sitä seuraa kategoriakoodin 10 välilyöntimerkki toimimaan erotinmerkkinä päättämään `<makron nimi>`. Me *emme ole* esittäneet tuota välilyöntimerkkiä nimenomaisesti tekstissämme/keskustelussamme, mutta oletamme sen olevan siellä. Tarkkaan ottaen meidän pitäisi esittää se jotakuinkin näin:

```
<TeX-makroprimitiivi><makron nimi><välilyönti><parametriteksti>{<korvausteksti>}
```

Kuitenkin jätämme pois `<välilyönti>` merkin nimenomaisen sisällyttämisen ja oletamme sen läsnäolon implisiittisesti.

**HUOMAUTUS**: Merkit `{` ja `}` *eivät* muutu osaksi makron tokenlistaa: niiden tarkoitus on vain kertoa TeXin syöttöskannerille (joka luo tokeneita), missä `<korvausteksti>` alkaa ja päättyy.

Kun TeX määrittelee makron, osiot `<parametriteksti><korvausteksti>` muunnetaan yhdeksi pitkäksi yhtenäiseksi tokenlistaksi — listassa olevien tokenien kokonaismäärä riippuu makron monimutkaisuudesta. Kuten olemme nähneet, osalla on erityinen tarkoitus toimia “token-pohjana” tai “piirustuksena”, jota TeX käyttää poimiakseen ne tokenit, jotka muodostavat argumentit (arvot), joita käytetään varsinaisessa makrossa: ts. tokeneita, jotka syötetään `<korvausteksti>`.

Näiden ajatusten vahvistamiseksi otetaan esimerkkinä makro, mutta pidetään se lyhyenä, jotta seuraavat kaaviot eivät tule liian sekaviksi:

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

Makrollemme, `\foo`

* `<parametriteksti>` = `A#1\fake`
* `<korvausteksti>` = `123 #1`

Vaikka tämä esimerkki on yksinkertainen makro, se sisältää kaikki ominaisuudet, joita meidän tarvitsee tutkia.

Kuten todettiin, TeX muuntaa `<parametriteksti><korvausteksti>` yhdeksi pitkäksi tokenlistaksi, kuten alla olevasta kaaviosta näkyy. Esimerkissämme tokeneiksi muodostuneet `A#1\fake{123 #1}` on muunnettu peräkkäiseksi tokenien jonoksi, joka on tallennettu tokenlistaan (linkitettynä solmuluettelona).

## Kuva todellisesta makron tokenlistasta

Seuraava kaavio, joka näyttää, miten makro `\def\foo A#1\fake{123 #1}` on tallennettu, käyttää todellista dataa TeX-moottorin sisältä. Se luotiin käyttäen [mukautettua versiota Knuthin TeXistä](/latex/fi/syvalliset-artikkelit/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) joka oli muokattu lisäkoodilla sieppaamaan makrokutsuja, tutkimaan TeXin sisäisiä tietoja ja viemään ne formaattiin käsiteltäväksi avoimen lähdekoodin grafiikkaohjelmalla nimeltä [Graphviz](https://www.graphviz.org/).

Voit ladata seuraavan grafiikan [PDF-tiedostona](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) tai [SVG-tiedostona](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 Mt).

![Kaavio selitteillä varustetusta TeX-tokenlistasta](/files/617b459570c16737fd429746fd0f3bc39a0b524e)

#### Solmujen ymmärtäminen

Yllä olevasta kaaviosta näet, että jokainen solmu sisältää kaksi tietokenttää, joita kutsutaan **seuraava solmu** ja **nykyinen solmu**. Nämä ovat vain kokonaislukuarvoja, jotka edustavat muistipaikkoja TeXissä — paikkoja, joihin muut solmut on tallennettu. Arvoilla **seuraava solmu** ja **nykyinen solmu** ei ole merkitystä; ne vain tallentavat paikat (muistiosoitteet), joiden avulla solmut voidaan kytkeä yhteen listaksi.

![Seuraavan solmun ja nykyisen solmun merkitys](/files/7c4486f229279ee5df4eff4d33ad785b2c694bff)

#### Takaisin esimerkkiin

Solmukaaviossa tokeneista muodostettu tokenlista `A#1\fake{123 #1}` sisältää useita alussa esiteltyjä “erikoistokeneita”. Lisäksi makroamme edustava solmulista alkaa “erityisellä ensimmäisellä solmulla”: tutkimme, mitä nämä ovat ja mitä ne tekevät.

Ensimmäinen merkintä makron tokenlistassa (ja joissakin muissa tokenlistatyypeissä) ei tallenna token-arvoa, vaan tietoelementin nimeltä makron *viitemäärä* jota TeX käyttää makron käytön seuraamiseen.

![Viitemääräsolmu on ensimmäinen tokenlistassa](/files/d7b19857423809b21efe462b4e90db8b49fc5631)

Ensimmäinen token `<parametriteksti>` tallennetaan solmuun, joka seuraa välittömästi viitemäärän jälkeen: näet, että se on token, joka edustaa kirjainta `Yksi` luokkakoodilla 11. Osien 2 ja 3 keskusteluista tiedämme, että merkkitoken lasketaan käyttäen

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

joka kirjaimelle `Yksi` luokkakoodilla 11 on

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

jolloin arvoksi saadaan 2881, kuten solmussa näkyy.

#### Komento \fake, jota käytetään \foo:ssa

Makromääritelmässämme `\def\foo A#1\fake{123 #1}` yksi erottimista on *määrittelemätön* komento `\fake` joka on tallennettu tokenlistaan osana `<parametriteksti>` osiota. Kuten näet, koko makron tokenlistassa `\fake` on token, jonka arvo on `19491`—kokonaislukuarvo, jonka TeX laskee osassa 3 käsitellyllä kaavalla. Kun TeX yrittää suorittaa `\foo` se odottaa löytävänsä `\fake` token-arvon `<parametriteksti>` osion lopusta. TeX *ei* yritä suorittaa `\fake` komentoa, koska sen rooli on vain tarjota eräänlainen “välimerkki” `<parametriteksti>` “token-mallissa”.

![Komennon tokenin käyttäminen makron erottimena](/files/32331ff4eee4bc74d4494b1ba4393ed9db2e4f23)

#### Erityistokenit tokenlistassa

**“Lopputäsmäyksen” token**

Makroa kutsuttaessa TeXin ensimmäinen tehtävä on skannata käyttäjän kirjoittama makro ja verrata käyttäjän `<parametriteksti>` osiossa olevia tokeneita mallissa oleviin tokeneihin `<parametriteksti>` muistiin tallennettuun (luotu makron määrittämisen hetkellä). Koska makron koko määritelmä, joka on rakennettu `<parametriteksti><korvausteksti>` on tallennettu yhtenä pitkänä peräkkäisenä tokenien luettelona, TeXin on tiedettävä, missä siinä tokenlistassa `<parametriteksti>` *päättyy* ja missä `<korvausteksti>` *alkaa*. Tämän saavuttamiseksi TeXin määrittäessä makron (rakentaessa tokenlistaa) se lisää erityisen päättävätokenin, jota kutsutaan **lopputäsmäys** tokeniksi aivan viimeisenä tokenina joukossa, joka on generoitu `<parametriteksti>`. Se **lopputäsmäys** tokenia ei voi generoida käyttäjän komennoilla, vain TeX itse voi luoda sen, joten TeX varmasti tunnistaa `<parametriteksti>`.

![Lopputäsmäystokenin näyttäminen TeX-tokenlistassa](/files/24f88b99fe1a0565e294e3feafca7c1983338580)

Tässä näemme, että ensimmäinen sen jälkeen tuleva token **lopputäsmäys** on token, joka edustaa numeroa `1` luokkakoodilla 12. Tämän pitäisi olla odotettua, koska `<korvausteksti>` makrollemme `\foo` on `123 #1`—eli se alkaa tokenilla, joka edustaa numeroa `1` (luokkakoodilla 12).

Osien 2 ja 3 keskustelusta tiedämme, että merkkitoken lasketaan käyttäen

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

joka numerolle `1` luokkakoodilla 12 on

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

jolloin token-arvoksi saadaan 3121, kuten solmussa näkyy.

**“Täsmäysparametri”-tokenit**

Kun TeX tallentaa makromääritelmän, se muuntaa kaikki parametrien tokenit (`#1`, `#2`… `#9`) sisällä `<parametriteksti>` yhdeksi nimeltä **täsmäysparametri** tokeniksi. Nämä tokenit kertovat TeXille, että sen täytyy alkaa etsiä tokeneita, käyttäjän makrokutsussa, jotka ovat makron argumentteja.

![Täsmäysparametritokenin näyttäminen TeX-tokenlistassa](/files/60e985fd40a904677a36239d52e0e2bd6f5fd943)

### Erityistokenit tokenlistassa

#### “Ulostuloparametri”-tokenit

Kun TeX on käsitellyt kaiken ja on valmis varsinaisesti ajamaan (laajentamaan) makron, **ulostuloparametri** tokeneilla TeX ohjataan niiden kohtien sijaintiin `<korvausteksti>` johon sen täytyy syöttää käyttäjän makrokutsun yhteydessä antamia argumentteja edustavat tokenit. Käytännössä: “Tähän kohtaan lisää tokenit, jotka edustavat käyttäjän argumenttia n, missä n=1...9”.

Tallennetun makromääritelmän tokenlistan `<korvausteksti>` osassa on **ulostuloparametri** token, joka vastaa kutakin `#1`, `#2`... `#9` alkuperäisessä määritelmässä olevaa.

![Ulostuloparametritokenin näyttäminen TeX-tokenlistassa](/files/d1b813061a281034441fd277b15325ff7f2b7d5c)

Jos katsomme määritelmäämme `\foo` (`\def\foo A#1\fake{123 #1}`) näemme, että siinä on vain 1 makroparametri (`#1`) `<parametriteksti>` (`A#1\fake`) ja sen jälkeen vain 1 makroparametri (`#1`esiintyy `<korvausteksti>` (`123 #1`): tämä johtaa vain yhteen **ulostuloparametri** tokeniin, joka on läsnä tokenlistassa ja joka edustaa `<korvausteksti>`.

Huomaa seuraava solmulistassa, joka edustaa `\foo`’n `<korvausteksti>`:

* token välittömästi **ulostuloparametri** ennen `123` tokenia edustaa välilyöntimerkkiä (luokkakoodi 10, merkkikoodi 32), koska`#1`ja makroparametrin ( `\foo`;
* sivustolta **ulostuloparametri** ) välissä on välilyönti alkuperäisessä määritelmässä **seuraava solmu** sillä on erityinen arvo “null” (eli “tyhjä”), jota käytetään listan päättämiseen: sen jälkeen ei ole enää solmuja **ulostuloparametri** koska se on viimeinen token, mikä ilmaisee `<korvausteksti>` makromääritelmän päättymisen.

## Osa 6

Osassa 6 käytämme yksityiskohtaisia grafiikoita selittämään ja tutkimaan makrolaajennuksen täsmällistä merkitystä sekä TeXin makroargumenttien tokenisoinnin seurauksia ennen niiden syöttämistä makron `<korvausteksti>`.

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