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

# Miten TeX-makrot oikeastaan toimivat: osa 1

[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: tämän artikkelisarjan tavoitteet

Tällä artikkelisarjalla on kunnianhimoinen tavoite: selittää, miten *miten* TeX-makrot (kuten LaTeX-komennot) todella toimivat – kaikkein perustavimmalla tasolla, varsinaisen TeX-moottoriohjelmiston sisällä. Sen sijaan, että turvauduttaisiin *ainoastaan* joukkoon esimerkkimakroja, jotka on suunniteltu havainnollistamaan TeXin erilaisia ominaisuuksia, reunatapauksia ja toimintatapoja, tarkastelemme itse TeXiä nähdäksemme, miten *miten* ja *miksi* sen makro-ohjelmointimenetelmät toimivat niin kuin toimivat.

Tavoitteemme saavuttamiseksi meidän on aloitettava käsittelemällä melko matalan tason aiheita, jotka saattavat aluksi vaikuttaa hieman etäisiltä asiakirjojesi ladonnan kannalta. Toivottavasti syvällisemmän tarkastelun jälkeen saat perustan paremman ymmärryksen rakentamiseen, mikä lopulta säästää sinulta paljon aikaa ja ehkä myös vähentää turhautumista.

### TeX-ohjelmointikieli: tunnistatko tunteen?

TeX-ohjelmointikieltä ei ole kohtuuttoman ankaraa kuvailla jokseenkin arkaaniseksi, sillä sitä se on – ainakin useimpien nykyisin käytössä olevien valtavirran ohjelmointikielten mittapuulla. Kun aloitat matkasi oppiaksesi lisää TeXistä/LaTeXistä, etenkin jos haluat kirjoittaa mutkikkaita makroja, kohtaat nopeasti käsitteitä kuten luokkakoodit, tokenit/tokenisointi ja komentojen tai makrojen ”laajentaminen”. Tuo käsitteiden ryöppy on todennäköisesti varsin vieras ja voi jättää sinut hämmentyneeksi sekä toisinaan ehkä hieman turhautuneeksi, koska TeXin/LaTeXin lähes läpitunkemattomat virheilmoitukset eivät aina helpota tietäsi onnistumiseen.

## Mistä siis aloitamme? Luokkakoodeista.

TeX-moottorit kuuluvat ohjelmistoluokkaan, jota kutsutaan nimellä [kääntäjät](https://en.wikipedia.org/wiki/Compiler): ohjelmat, jotka lukevat tiedoston, joka on kirjoitettu *lähde* kielellä, ja *kääntävät* (muuntavat) sen tulostiedostoksi, joka on kirjoitettu *kohde* kielellä. Tarkemmin sanottuna TeX on *asiakirjakääntäjä*. TeX-moottoreille (kääntäjille) syötetiedosto on kirjoitettu TeX-ladontakielellä, ja kohde on tulostiedosto, joka on kirjoitettu toisella ”kielellä”, kuten [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) tai PDF – vaikka suhtaudummekin tässä hieman väljästi ”kielen” käsitteeseen.

Tarkastellaan lähemmin TeX-tiedostosi kirjoittamiseen käytettävää lähde- eli syöte”kieltä”. `.tex` Tiedosto on lopulta yksi pitkä merkkijono (mukaan lukien rivinvaihtomerkit): se koostuu ladottavaksi tarkoitetusta tekstistä, jonka väliin on sijoitettu `\`, `}`, `$`, `[` sekä kaikenlaisista merkeistä, joita voi esiintyä näennäisesti lähes äärettömän monenlaisina yhdistelminä. Jokainen, joka ei käytä TeXiä/LaTeXiä, voisi katsoa tyypillistä `.tex` tiedostoa, ja hänelle voisi antaa anteeksi, jos hän pitäisi sitä varsin hämmentävänä merkkien sekamelskana, jossa tiedostorakennetta on vähän tai ei lainkaan nähtävissä. LaTeX-makropaketti toki jossain määrin ”pakottaa” .tex-syötetiedostoon jonkin perusrakenteen. Kuitenkin `\begin{document}` ja `\end{document}` välissä asiakirjan kirjoittaja päättää itse, mitä sinne tulee. Jos katsot `.tex` tiedostoja, jotka on kirjoitettu Knuthin alkuperäisellä Plain TeX -makropaketilla, huomaat, että asiakirjarakenne puuttuu lähes kokonaan.

Yleisesti ottaen TeX-syötetiedosto voi siis vaikuttaa varsin jäsentymättömältä: näennäisen mielivaltaiselta sekoitukselta ladottavaa sisältöä, jonka väliin on sijoitettu sisällön ladontaa ohjaavia ohjeita (komentoja). Miten TeXin on ylipäätään mahdollista ymmärtää tyypillistä `.tex` syötetiedostoa: suodattaa saapuva merkkisekamelska ladontamoottorin toteutettaviksi ohjeiksi ja ladottavaksi sisällöksi?

### Sekamelskan suodattaminen: tutustu luokkakoodeihin

Kuka tahansa TeXistä tietämätön ihminen voisi katsoa `.tex` tiedostoa ja tunnistaa tiettyjä merkkejä, kuten `$` ja tietää sen olevan valuutan merkki, tai nähdä `&` ja tunnistaa sen et-merkiksi. Tällainen tarkkailija päättelee *merkityksen* merkityksen jokaiselle näkemälleen merkille – merkityksen, joka perustuu merkin rooliin ihmisten välisessä viestinnässä. Lisäksi hän saattaa nähdä merkkejä, kuten `a`, `e`, `tai` ja tietää, että ne luokitellaan vokaaleiksi, kun taas muut merkit, kuten `b`, `c` tai `d` luokitellaan konsonanteiksi. Ihmisinä meillä on eräänlainen sisäänrakennettu hakutaulukko (muistissamme), jonka avulla annamme merkityksen jokaiselle näkemällemme merkille – merkityksen, joka perustuu merkin tehtävään niissä kielissä, joilla kykenemme viestimään.

Käsitelläkseen `.tex` tiedostoa TeX-ohjelmiston on myös tarkasteltava jokaista syötteesi merkkiä, ja senkin on annettava *merkityksen* jokaiselle näkemälleen merkille. TeX on kuitenkin vain ohjelmistopohjainen kone, joka käsittelee tekstiä – syötetiedostoon tallennettuna kokonaislukujen (merkkikoodien) sarjana. Koneena TeX on ohjelmoitava asiaankuuluvilla tiedoilla, jotka kertovat sille, miten määritetään tarkasteltavana olevan merkin merkitys ja mitä sille on tämän jälkeen tehtävä. Miten TeX onnistuu tässä?

Vastaus on yksi TeXille ominaisista käsitteistä: *luokkakoodit,* joita on 16, välillä 0–15. TeXin näkökulmasta jokaisella merkillä, jonka se odottaa koskaan näkevänsä `.tex` tiedostossa, on niin sanottu *kategoriakoodi* sille ennalta määrätty. TeX-ohjelmiston sisällä on eräänlainen ”hakutaulukko”, jossa luetellaan luokkakoodi *tällä hetkellä* määritettynä kullekin merkille, jonka TeX saattaa nähdä .tex-syötetiedostossa. TeXin luokkakoodien voidaan ajatella antavan *merkityksen* jokaiselle yksittäiselle merkille syötevirrassa, jonka TeXin on tutkittava (skannattava).

Ladoakseen asiakirjasi TeX-moottorin on luettava (skannattava) jokainen yksittäinen merkki, mutta TeXiä ei ensisijaisesti kiinnosta itse merkki (merkkikoodi): merkin *kategoriakoodi* on tärkeämpi syötettä skannattaessa. Merkin *nykyiseen* luokkakoodi määrittää *nykyisen merkityksen* tälle merkille *sillä hetkellä, kun TeX lukee sen*: luokkakoodi määrittää, miten TeX kohtelee/käsittelee kutakin merkkiä – selitämme, miksi puhumme ”nykyisestä luokkakoodista” ja ”nykyisestä merkityksestä”. Luokkakoodien avulla TeX pystyy suodattamaan saapuvan merkkisekamelskan erottaakseen ladottavaksi tarkoitetut merkit (sisällön) käsiteltäviä ohjeita muodostavista merkeistä –*komennot* jotka TeXin on suoritettava.

Seuraavassa taulukossa luetellaan nämä 16 luokkakoodia: mitä kukin niistä tarkoittaa sekä esimerkkejä merkeistä, jotka yleensä määritetään kuhunkin luokkaan.

| **Kategoriakoodi** | **Kuvaus**                                                            | **Tavallinen LATEX/TEX**                                            |
| ------------------ | --------------------------------------------------------------------- | ------------------------------------------------------------------- |
| 0                  | Escape-merkki—kertoo TEXille, että sen on alettava etsiä komentoa     | `\`                                                                 |
| 1                  | Aloita ryhmä                                                          | {                                                                   |
| 2                  | Lopeta ryhmä                                                          | }                                                                   |
| 3                  | Matematiikkavaihdos—vaihda matemaattiseen tilaan ja siitä pois        | $                                                                   |
| 4                  | Tasaussarkain                                                         | &                                                                   |
| 5                  | Rivin loppu                                                           | ASCII-koodi 13 (`\r`)                                               |
| 6                  | Makroparametri                                                        | #                                                                   |
| 7                  | Yläindeksi—matematiikan ladontaan: `$y=x^2$` $$y=x^2$$                | ˆ                                                                   |
| 8                  | Alaindeksi—matematiikan ladontaan: `$y=x_2$` $$y=x\_2$$               | \_                                                                  |
| 9                  | Ohitettava merkki                                                     | ASCII 0 `<null>`                                                    |
| 10                 | Väli                                                                  | ASCII-koodit 32 (välilyönti) ja 9 (sarkainmerkki)                   |
| 11                 | Kirjain                                                               | A...Z, a...z, (ja tuhansia Unicode-merkkejä)                        |
| 12                 | Muut                                                                  | 0...9 sekä ,.;?" ja monia muita                                     |
| 13                 | Aktiivinen merkki                                                     | Erityinen kategoriakoodi yksimerkkisten makrojen luomiseen, kuten ˜ |
| 14                 | Kommenttimerkki—jätä huomiotta kaikki, mikä seuraa rivin loppuun asti | %                                                                   |
| 15                 | Virheellinen merkki, jota ei saa esiintyä .tex-syötetiedostossa       | ASCII-koodi 127 (`DEL`)                                             |

Luokkakoodien käyttö on TeXin keskeinen mekanismi, jolla se suodattaa saapuvaa merkkivirtaansa ja tulkitsee syötettäsi määrittääkseen:

* ladottavan tekstin muodostavat merkit;
* matematiikkana ladottavan sisällön rajaavat merkit;
* merkkijonot, jotka ovat käsiteltävien tai toteutettavien komentojen nimiä;
* … ja monia muita ladontatoimintoja.

Aluksi saatat ajatella, että kunkin merkin luokkakoodi (merkitys) on jonkinlainen kiinteä määritys: muuttumaton ja pysyvästi sisäänrakennettu TeX-ohjelmiston sisäisiin perusteisiin, mutta näin ei ole. Kuten todettiin, TeX ylläpitää sisäistä hakutaulukkoa, johon tallennetaan tieto siitä, mikä luokkakoodi on *tällä hetkellä* määritetty kullekin merkille – sanomme aivan tarkoituksella *tällä hetkellä määritetty* koska minkä tahansa merkin (jota ei ole vielä luettu) luokkakoodia voidaan muuttaa käyttämällä primitiivistä (sisäänrakennettua) komentoa nimeltä `\catcode`. Tämä tuo huomattavaa joustavuutta, sillä voit halutessasi muuttaa täysin sitä, miten TeX käsittelee tai tulkitsee minkä tahansa syötteestä myöhemmin luettavan merkin merkityksen. Tämä tarjoaa valtavat mahdollisuudet kehittyneisiin ladontasovelluksiin.

Jos olet pääasiassa kiinnostunut LaTeXin käytöstä ”työn hoitamiseen”, et luultavasti ole kohdannut luokkakoodeja suoraan muuten kuin ehkä näkemissäsi virheilmoituksissa. Voit kuitenkin olla varma, että luokkakoodit ovat TeX-moottorin toiminnan ydinosia: niiden avulla LaTeX (ja LaTeX-paketit) voi todella latoa asiakirjasi.

Kun TeX-moottorisi käynnistyy (”[käynnistyy alustavasti](https://en.wikipedia.org/wiki/Bootstrapping)”), se käyttää oletusmäärityksiä merkeille ja luokkakoodeille, mutta `\catcode` komennon avulla LaTeXin ydinkoodi (makrot) ja/tai lataamasi LaTeX-paketit – tai oma TeX-koodisi tai makrosi – voivat muuttaa näitä oletuksia. Ajan mittaan sekä perinteen ja käytön kautta tiettyjen merkkien määrittämisestä tietyille luokkakoodeille on kuitenkin tullut hyväksyttyjä ”standardeja”, ja näiden standardien noudattaminen on ehdottomasti toivottavaa, jos haluat asiakirjojesi olevan siirrettäviä ja helposti jaettavissa kollegoiden tai muiden käyttäjien kanssa. Esimerkiksi `\` merkille on määritetty luokkakoodi 0 osoittamaan TeX/LaTeX-komennon alkua – katso kohta [yllä oleva taulukko](#tbl-0).

### Syötteen lukeminen (skannaaminen)

Kun TeX lukee (skannaa) seuraavan merkin syötetiedostostasi, aivan ensimmäiseksi se tarkistaa sen luokkakoodin. Tarkastellaan siis lähemmin, mitä tapahtuu, kun TeX lukee tyypillisen syöterivin.

Oletetaan, että meillä on .tex-tiedosto, joka sisältää tekstin `Hello World \jobname` jossakin kappaleessa. Jos tarkastelemme `.tex` tiedostoa käyttämällä [heksadesimaalieditoria](https://en.wikipedia.org/wiki/Hex_editor), näemme, että merkkijono `Hello World \jobname` meidän `.tex` tiedostossamme on vain kokonaislukujen eli *merkkikoodien*sarja, joka näkyy alla olevassa kuvakaappauksessa heksadesimaalisena sarjana:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Heksadesimaaliset merkkikoodit TeX-tiedostossa](/files/f4446c63d329ec0d597e3672a0bf3c302c344a6d)

Jos muunnetaan heksadesimaalijärjestelmästä (kantaluku 16) desimaalijärjestelmään (kantaluku 10), merkkikoodien sarja on:

![Desimaaliset merkkikoodit TeX-tiedostossa](/files/cc7983259e37c1cdc8f9b9a9665fcba6e9479e7f)

Tiedämme myös, että TeXille jokaisella merkillä on vastaava luokkakoodi; joten seuraavien perusteella [yllä oleva taulukko](#tbl-0) tiedämme, että myös seuraavat luokkakoodien oletusmääritykset ovat (luultavasti) käytössä:

![TeXin luokkakoodit](/files/9964093b6f3f9bdb65f14825f49d8fb4704862a3)

Näin ollen TeXille jokainen syötetiedoston merkki esitetään *kahta* numeerisena arvona – sen merkkikoodina ja luokkakoodina:

![Merkkikoodit ja vastaavat TeXin luokkakoodit](/files/b2d5ecb378b74b31740b36dcb87b96a27d76db3f)

Tässä vaiheessa tarkastelemme vasta TeXin tiedostosi käsittelyn aivan ensimmäistä vaihetta: yksittäisten merkkien skannaamista. Mitä TeX sitten todella tekee näillä merkkikoodien ja luokkakoodien pareilla? Kun TeX on skannannut yksittäisen merkin ja hakenut sitä vastaavan luokkakoodin, miten TeX tarkalleen käyttää tätä tietoa saapuvien merkkien ”suodattamiseen”?

## Osa 2

Osassa 2 tarkastelemme lähemmin sitä, miten TeX lukee syötettäsi: kuvittelemme olevamme TeXin ”silmät”, kun se katsoo syötettäsi merkki merkiltä.

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