> 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/20-how-tex-macros-actually-work-part-2.md).

# Miten TeX-makrot oikeastaan toimivat: osa 2

[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: Tarina kuvin

Kuten osassa 1 todettiin, TeXin täytyy “lukea” jokainen merkki sinun `.tex` tiedostossasi, ja tuota lukuprosessia kutsutaan tarkemmin *skannaukseksi*. Perinteisesti TeXin syötteenkäsittelyä (skannausta) verrataan siihen, että TeXillä olisi “silmät”, joilla se tarkkailee syötettä, joten otamme käyttöön tämän aikaa kestaneen analogian alla olevissa kuvissa.

### Kuva 1: Silmät ovat valmiina

Oletamme, että TeX on saanut syötettä `.tex` tiedostosta ja on käsittelemässä merkkijonoamme `Hello World \jobname` joka sisältyy tekstikappaleeseen. Se tarkistaa jokaisen merkin vuorollaan ja tutkii sen luokkakoodin.

![TeXin silmät valmiina skannaamaan tekstiriviä](/files/2076a51e658e31d0fd06477e73e4b5f4a05cd8f0)

### Kuva 2: Luokkakoodien käsittely

Seuraavassa kuvassa näemme pääpiirteittäin (lisätietoineen alla), miten TeX reagoi useisiin eri luokkakoodeihin. Huomaa, että luokkakoodeja on yhteensä 16, mutta yksinkertaisuuden vuoksi kuvaamme vain kolmen käyttöä: 11, 10 ja 0. Muut merkkikoodit tulevat tärkeiksi TeXin ladontaprosesseissa, kuten taulukoiden rakentamisessa, matematiikan ladonnassa ja makroparametrien tunnistamisessa.

![TeX reagoi useisiin eri luokkakoodeihin](/files/05aaed4492a9aff37e106829a2c8dfc824ee1190)

#### Huomautuksia kuvaan 2

Tässä tarkastelemme TeXiä sen lukiessa (skannatessa) merkkejä, jotka ovat osa tekstikappaletta. TeX tutkii jokaisen merkin, tarkistaa sen luokkakoodin ja tekee sopivan toimenpiteen luokkakoodin ja TeXin “tilan” (senhetkiseen toimintaan perustuvan tilan) mukaan.

* **(vihreät silmät)** TeX huomaa, että jokaisella näistä merkeistä on luokkakoodi 11 (“kirjain”) ja välittää nämä merkit ladottaviksi osana rakentamaansa kappaletta. TeX ei kuitenkaan välitä (käytä) pelkkää merkkikoodia, vaan käyttää numeroiden paria (merkkikoodi, luokkakoodi) laskeakseen yhdistetyn kokonaislukuarvon, jota kutsutaan *merkkitokeniksi* (katso alla). Kun tuo merkkitoken on tuotettu, se siirtyy TeXin sisäisiin ladontaoperaatioihin/-algoritmeihin.
* **(siniset silmät)** TeX näkee välilyöntimerkin (ASCII 32), jonka luokkakoodi on 10 (“välilyönnit”) — huomaa, että kuten on käsitelty, on täysin mahdollista, että välilyönnin (ASCII 32) tai minkä tahansa merkin luokkakoodi on muutettu toiseen arvoon — ennen kuin TeX lukee sen sisään.

Se, miten TeX todellisuudessa käsittelee merkit, joilla on luokkakoodi 10 (“välilyönnit”), vaihtelee sen mukaan, milloin/ missä TeX näkee ne — TeXin nykyisen “tilan” mukaan. Esimerkiksi on aikoja, jolloin TeX yksinkertaisesti ohittaa ne. Tässä TeX tietää havainneensa merkin, jonka luokkakoodi on 10 (ja joka sattuu olemaan välilyönti, ASCII 32), samalla kun se käsittelee tekstikappaletta, joten se muuntaa sen lopulta niin sanotuksi sanaväliksi: eräänlaiseksi joustavaksi väliksi, joka voi venyä tai kutistua.

* **(punaiset silmät)** Tässä TeX on havainnut merkin, jolla on erittäin tärkeä luokkakoodi: 0 (escape-merkki).

Escape-merkki—*mikä tahansa* merkki, jonka luokkakoodi on 0 — käskee TeXiä siirtymään erityiseen lukutilaan ja skannaamaan (lukemaan) huolellisesti seuraavat merkit, koska ne ilmaisevat *komento*, ei ladottavaa tekstiä. TeX-kirjallisuudessa termiä “komento” kutsutaan myös *ohjaussekvenssin*. Kun TeX on nähnyt escape-merkin, se tarkistaa seuraavan merkin luokkakoodin *välittömästi sen jälkeen*; tämä johtuu siitä, että TeX tunnistaa kahdenlaisia komentoja:

* monikirjaimisia komentoja, joita kutsutaan *komentosanojen*: escape-merkin jälkeen heti seuraavalla merkillä on luokkakoodi 11. Kaikkien sitä seuraavien merkkien, joilla on luokkakoodi 11, katsotaan olevan osa komennon nimeä. TeX lopettaa komentonimeen kuuluvien merkkien etsimisen, kun se havaitsee minkä tahansa merkin, joka *ei* joilla ei ole luokkakoodia 11 — kuten välilyöntimerkin, jonka luokkakoodi on 10.
* yksikirjaimisia komentoja, joita kutsutaan *ohjaussymboleiksi*: escape-merkin jälkeen heti seuraava merkki *ei* on luokkakoodi 11.

Escape-merkkiä voi ajatella siten, että se laukaisee TeXin “poistumaan” tavanomaisesta skannauskäyttäytymisestään ja omaksumaan erilaisen lähestymistavan seuraaville muutamille merkeille — tätä osoittaa punainen pisteviivalaatikko, joka näyttää, että TeX tulee **Aloittaa skannauksen komentoa varten**.

### Kuva 3: Luokkakoodin 11 (“kirjaimet”) käsittely

Tämän sarjan osassa 1 totesimme, että jokaista merkkiä, jonka TeX lukee syötteestään, kuvaavat kaksi kokonaislukua:

* merkkikoodi: kokonaisluku, joka määrittää merkin numeerisen esityksen;
* luokkakoodi: arvo 0–15, jonka TeX antaa jokaiselle merkille, joka voi esiintyä sen syötteessä.

TeX käyttää näitä kahta tietoa käsittelynsä seuraavassa vaiheessa: merkkitokenien luomisessa.

Kuva 3 laajentaa kuvaa 2 näyttämään, mitä TeX tekee näille luokkakoodin 11 (kirjain) syötemerkeille: se luo *merkkitokeneita*— kokonaislukuarvoja, jotka TeX laskee käyttämällä kyseisen merkin luokkakoodin ja merkkikoodin yhdistelmää.

**Huomaa**: Tässä esimerkissä käsittelemme vain merkkejä, joiden luokkakoodi on 11, mutta on syytä tiedostaa, että TeX luo token-arvoja myös muille syötemerkeille, joilla on muita luokkakoodeja — paitsi luokkakoodi 0, jota ei koskaan muuteta tokeniksi: escape-merkki toimii vain “kytkimenä” erityiskäsittelyn käynnistämiseksi.

![TeX käsittelee merkkejä, joiden luokkakoodi on 11](/files/c0d07ef3a4920b81226c927295bbbcdc140eae00)

Alla oleva kuva 5 näyttää, mitä TeX tekee, kun se näkee merkin, jonka luokkakoodi on 0 (escape-merkki).

#### Huomautuksia kuvaan 3: Luokkakoodin 11 (“kirjain”) käsittely

Tässä keskitymme **green** toimintaan: mitä tapahtuu, kun TeX näkee merkkejä, joiden luokkakoodi on 11 (“kirjain”). Kun TeX on lukenut merkin ja määrittänyt sen luokkakoodin (tässä se on 11), TeX tekee seuraavaksi *yhdistää* tämän numerosarjan yhdeksi kokonaisluvuksi, jota kutsutaan merkkitokeniksi: nämä tokenit (kokonaisluvut) välitetään TeXin sisäisten ladonta-algoritmien/käsittelyn seuraavaan vaiheeseen. Kuten todettu, TeX luo merkkitokeneita myös muiden luokkakoodien merkeille (eli ei vain 11:n), mutta tässä käytämme vain luokkakoodia 11 esimerkkinä.

Jokainen merkkitoken (kokonaisluku) sitoo pysyvästi syötemerkin siihen merkkiluokkakoodiin, joka kyseiselle merkille on annettu **sillä hetkellä, kun TeX skannasi (luki) sen sisään**: tämä seikka on ratkaisevan tärkeä TeX/LaTeX-makrojen käyttäytymisen ymmärtämisessä. Tietysti jatkokäsittelyn aikana TeX joutuu joskus purkamaan merkkitokenin selvittääkseen, mitä (merkkikoodi, luokkakoodi) -paria sen rakentamiseen käytettiin. Kuitenkin, kun merkki on luettu sisään TeXin syöte- (skannaus-)prosessissa, TeXin laskema merkkitoken-arvo tekee siitä merkistä *pysyvästi* sidotun sille annettuun luokkakoodiin *sillä hetkellä, kun se luettiin sisään*.

**Merkkitokenien laskeminen**

TeX-moottorit käyttävät yksinkertaista kaavaa merkkitokenin laskemiseen, $$T$$, merkistä, jonka luokkakoodi on $$C$$ ja merkkikoodi $$A$$:

$$T = \text{constant} \times C + A$$

8-bittiset moottorit, kuten pdfTeX, käyttävät:

$$T = 256\times C + A$$

Unicodea tukevien moottorien, kuten XeTeXin tai LuaTeXin, täytyy käyttää toista kaavaa, koska Unicode-maailmassa merkkikoodit voivat olla paljon suurempia kuin vanhan 8-bittisen ASCII-koodauksen maailman enimmäisarvo 255. XeTeX esimerkiksi käyttää:

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

Vielä kerran: on syytä huomata, että luokkakoodin 0 merkkejä ei muunneta merkkitokeneiksi: luokkakoodilla 0 on hyvin erityinen asema TeXin syötteen suodatuksessa, ja sitä käytetään puhtaasti “kytkimenä” ohjaamaan TeX erityiseen tilaan skannaamaan seuraavat muutamat merkit. Kuva 5 käsittelee tätä.

### Kuva 4: Luokkakoodin 10 (“välilyönti”) käsittely

TeXin käsittely luokkakoodin 10 (“välilyönti”) merkeille riippuu siitä, mitä TeX kulloinkin käsittelee, kun se havaitsee syötteessä merkin, jonka luokkakoodi on 10. Esimerkissämme TeX suorittaa tavanomaista kappalekäsittelyä, ja välilyöntimerkki, jonka luokkakoodi on 10, muunnetaan sanaväliksi.

![TeX käsittelee merkkejä, joiden luokkakoodi on 10](/files/d186e0b3fb63a1fef57858aec6d1af85c78d9357)

TeXin välilyöntien käsittely voi vaikuttaa varsin omalaatuiselta, mutta hyvä yleiskatsaus löytyy teoksen luvuista 1 ja 2 [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) Victor Eijkhoutin kirjoittamasta — voit [ladata ilmaiseksi PDF-kopion](https://bitbucket.org/VictorEijkhout/tex-by-topic) hänen verkkosivustonsa kautta.

Esimerkiksi, kun TeX näkee merkin, jonka luokkakoodi on 10, on tilanteita, joissa TeX:

* ohittaa (jättää huomiotta) kaikki — esim. kun TeX on pystysuorassa tilassa;
* muuntaa useat välilyönnit yhdeksi välilyönniksi — ohittaen ylimääräiset välit, kuten kappaletta käsiteltäessä;
* imee ne itseensä — esim. imee yhden välilyönnin komentonimen jälkeen;

Huomaa myös, että on tilanteita, joissa TeX myös *tuottaa* välilyöntejä — muuntamalla rivinlopun merkit välilyönniksi. Välilyöntimerkkien käyttäytyminen/käsittely (mikä tahansa merkki, jonka luokkakoodi on 10) on yksi TeXin “erikoisuuksista”: tämän TeXin puolen kanssa tutuksi (ja mukavaksi) tuleminen vaatii aikaa/harjoitusta.

### Kuva 5a: Luokkakoodin 0 käsittely (”escape-merkki”)

Tässä kuvassa TeX on käsitellyt kaikki merkit aina `\` merkkiin asti, jolla on luokkakoodi 0: “escape-merkki” — käytämme lisää kuvia näyttämään, miten TeX käsittelee escape-merkin ja tunnistaa komennon nimen.

![TeX käsittelee merkkejä, joiden luokkakoodi on 0](/files/78f55c64f999bde5bca6eeeae40f667c875f2f47)

### Kuva 5b: Komennon nimen etsiminen

Tässä kuvassa katsomme punaisella pisteviivalla rajattuun laatikkoon (**Aloittaa skannauksen komentoa varten**) nähdäksämme, mitä TeX tekee nähtyään escape-merkin.

![TeX etsii komennon nimeä](/files/77d475284b6cab179e2eb7f772d919403117ef05)

**Huomautuksia kuvaan 5b**

* Kun escape-merkki on tunnistettu, se on tehnyt tehtävänsä: se toimi kytkimenä eikä osallistu mihinkään jatkokäsittelyyn — tarkemmin sanottuna se on **sisällä** muunnettu merkkitokeniksi.
* Mukavuuden vuoksi toistamme aiemmin mainitun yksityiskohdan. Kun TeX on nähnyt escape-merkin, se tarkistaa seuraavan merkin luokkakoodin *välittömästi sen jälkeen*; tämä johtuu siitä, että TeX tunnistaa kahdenlaisia komentoja:
* * monikirjaimisia komentoja, joita kutsutaan *komentosanojen*: escape-merkin jälkeen heti seuraavalla merkillä on luokkakoodi 11. Kaikkien sitä seuraavien merkkien, joilla on luokkakoodi 11, katsotaan muodostavan komennon nimen (*ohjaussanaa*). TeX lopettaa komentonimeen kuuluvien merkkien etsimisen, kun se havaitsee minkä tahansa merkin, joka *ei* joilla ei ole luokkakoodia 11 — kuten välilyöntimerkin, jonka luokkakoodi on 10.
  * yksikirjaimisia komentoja, joita kutsutaan *ohjaussymboleiksi*: escape-merkin jälkeen heti seuraava merkki *ei* on luokkakoodi 11.
* Esimerkissämme ensimmäinen merkki sen jälkeen, kun `\` on `j` (luokkakoodi 11), mikä kertoo TeXille, että sen tulee etsiä komentoa, joka on (mahdollisesti) monikirjaiminen luokkakoodin 11 merkkijono.
* TeX jatkaa tarkistamista löytääkseen lisää merkkejä, joiden luokkakoodi on 11. Heti kun se havaitsee merkin, jolla on jokin muu luokkakoodi, kuten välilyönnin luokkakoodilla 10, TeX tietää saavuttaneensa komennon nimen lopun. Asian korostamiseksi: tässä komennon lopun “päätti” välilyöntimerkki (luokkakoodi 10), mutta sen olisi voinut tehdä mikä tahansa merkki, joka **ei** on luokkakoodi 11.

## Osa 3

Osassa 3 jatkamme kuvan 5b jälkeen tämän tarinan osan — miten TeX tunnistaa komennon — loppuun ja siirrymme siihen, mitä se tekee seuraavaksi. Tarkastelemme myös syvemmin joitakin TeXin käsittelyn sisäisiä puolia — joista osa voidaan ohittaa ensimmäisellä lukukerralla, ellet todella nauti yksityiskohdista.

[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/20-how-tex-macros-actually-work-part-2.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.
