> 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/53-what-is-a-tex-token.md).

# Mikä on "TeX-token"?

## Motivaatio TeX-tokenien ja niihin liittyvien käsitteiden sarjalle

Tässä artikkelissa käsitellään motivaatiota ja menetelmää, joilla artikkelisarja TeX-tokenien ja niihin liittyvien käsitteiden aiheesta on tuotettu [Uusi artikkelisarja: TeX-tokenit ja niihin liittyvät käsitteet—mutta miksi (ja miten)?](https://www.overleaf.com/blog/521-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how) Kuten siinä artikkelissa todettiin, koko tämän sarjan ajan perustamme keskustelumme ja selityksemme Knuthin alkuperäisestä TeX-ohjelmasta räätälöidyn koontiversion avulla saatuihin havaintoihin — käytämme sitä tuottamaan artikkelisarjaa, jonka tavoitteena on tarjota yksinkertaisia kuvauksia ja helposti seurattavia selityksiä keskeisistä TeX-käsitteistä.

## Johdanto: mikä on tavoitteemme?

Tässä artikkelissa selvitämme täsmälleen, mikä TeX-token on, jäljittämällä käsittelymatkan syötetiedoston merkeistä TeX-tokenien varsinaiseen luomiseen. Käytännössä se on varsin monimutkaista, joten olemme pelkistäneet prosessin sen ydinvaiheisiin pyrkien tekemään siitä helpon seurata ja ymmärtää säilyttäen samalla teknisen tarkkuuden.

Aloitamme esittelemällä joitakin tärkeitä TeXin sisäisiä käsitteitä: *primitiiveistä*, *komentokoodit* ja *komentomääritteet*. Siitä eteenpäin käytämme hyvin yksinkertaista makroesimerkkiä nähdäksemme täsmälleen, miten TeX käsittelee komennon `\def` ja sen seurauksena syntyvän tokenin, jonka TeX luo edustamaan kyseistä komentoa.

Lopuksi tarkastelemme lyhyesti, miten TeX luo merkkejä edustavia tokeneita ja miten merkin `\catcode` kiinnittyy tosiaan pysyvästi merkkitokeniin — jotain, mitä TeX-kirjoissa usein mainitaan, mutta tässä näemme täsmälleen, miten se saadaan aikaan.

Seuraava kuva havainnollistaa matkan, jonka tiivistämme — syötetekstistä TeX-tokenien muodostumiseen:

![Matka TeX-syötteestä TeX-tokeniin.](/files/e6d0ddca41aa49471ce2ee0d67ec216712774f01)

## Mutta ensin: primitiivit ja komentokoodit

Jokainen TeX-moottori (Knuthin TeX, pdfTeX, XeTeX, LuaTeX) ymmärtää joukon sisäänrakennettuja komentoja: niin kutsutut *primitiiveistä*—TeXin ohjelmoitavuuden perusrakennuspalikoita. Niitä kutsutaan ”primitiiveiksi”, koska toisin kuin käyttäjän määrittelemät makrot, niitä ei rakenneta muista komennoista eikä niitä voida enää purkaa yksinkertaisemmiksi käskyiksi. Knuthin TeXissä on noin 320 primitiiviä — tosin on hyvä huomata, että muut TeX-moottorit, kuten pdfTeX, XeTeX ja LuaTeX, ovat kaikki lisänneet uusia komentoja Knuthin alkuperäiseen ohjelmaan, ja niissä on primitiivejä, joita Knuthin TeX-ohjelmistossa ei ole.

Sisäisesti TeX antaa numeerisen *komentokoodi* kaikille komennoille — olivatpa ne käyttäjän määrittelemiä makroja tai sisäänrakennettuja primitiivejä. Nämä komentokoodit eivät ole TeX:n käyttäjän käytettävissä; ne ovat yksinkertaisesti osa TeXin käsittelyn sisäistä mekanismia, mutta niistä on hyödyllistä tietää myöhempää TeX-tokenien käsittelyä varten.

Samaan toiminnallisuuteen liittyvät komentoryhmät jakavat saman komentokoodin. Esimerkiksi `\def`, `\gdef`, `\edef` ja `\xdef` kaikki primitiivit käytetään makrojen määrittämiseen, ja niillä on komentokoodi 97 (Knuthin TeXissä). On selvää, että nämä neljä makronmäärittelykomentoa luovat makroja hieman eri tavoin; siksi TeXin on käsittelyn aikana kyettävä erottamaan ne toisistaan.

Pelkkä komentokoodi (esimerkiksi 97) ei kerro, mikä makronluontikomento on kyseessä; joten kuten voi odottaa, jokaiselle TeX-komennolle annetaan lisäksi toinen tieto nimeltä sen *komennon muokkausosa* (katso esimerkit alla).

### Komentomääritteet: kahta tyyppiä

Komentomääritteet jaetaan kahteen luokkaan, joihin viittaamme nimillä ”Tyyppi 1” ja ”Tyyppi 2” — TeX ei käytä tätä terminologiaa; se on vain tässä kätevä tapa:

* **Tyyppi 1**: Yksinkertaisia kokonaislukuarvoja, joita TeX voi tarvittaessa käyttää erottamaan toisistaan komennot, joilla on sama komentokoodi.
* **Tyyppi 2**: Kokonaislukuarvo, joka on TeXin muistissa oleva numeerinen sijainti ja kertoo TeXille, minne sen on mentävä hakemaan kyseisen komennon tiedot. Tämä koskee esimerkiksi käyttäjän määrittelemiä komentoja (makroja), joissa komentomäärite kertoo TeXille, missä makron määritelmä on muistissa.

#### Tyyppi 1 -komentomääritteet (esimerkki)

Kuten todettiin, Knuthin TeXissä neljä makroja määrittävää primitiivikomentoa: `\def`, `\gdef`, `\edef`, `\xdef` jakavat kaikki komentokoodin 97: ne erotetaan toisistaan komentomääritteiden avulla, jotka on lueteltu seuraavassa taulukossa:

| Komento | Komento\nkoodi | Komento\nmäärite |
| ------- | -------------- | ---------------- |
| `\def`  | 97             | 0                |
| `\gdef` | 97             | 1                |
| `\edef` | 97             | 2                |
| `\xdef` | 97             | 3                |

Toisena esimerkkinä Knuth päätti toteuttaa komennot `\openout`, `\write-komennon`, `\closeout`, `\special`, `\immediate` ja `\setlanguage` TeXin ”laajennuksina” pelkästään osoittaakseen, miten TeXiin voi lisätä uusia primitiivejä. Tässä tapauksessa näillä komennoilla ei oikeastaan ole ”samanlaista toiminnallisuutta” muuten kuin että Knuth päätti ryhmitellä ne yhteen TeXin laajentamisen selittämistä varten. Nämä kuusi komentoa luokitellaan ”laajennuksiksi” ja ryhmitellään komentokoodin arvolla 59, mutta jokaisella on sopiva komentomäärite, joka erottaa sen muista:

| Komento           | Komento\nkoodi | Komento\nmäärite |
| ----------------- | -------------- | ---------------- |
| `\openout`        | 59             | 0                |
| `\write-komennon` | 59             | 1                |
| `\closeout`       | 59             | 2                |
| `\special`        | 59             | 3                |
| `\immediate`      | 59             | 4                |
| `\setlanguage`    | 59             | 5                |

#### Tyyppi 2 -komentomääritteet (lyhyt selitys)

Vaikka kaikki komentomääritteet ovat kokonaislukuja, Tyyppi 2 -määritteet vaativat hieman enemmän selitystä. TeX kutsuu näitä komentomääritteitä ”osoittimiksi”, koska ne osoittavat muistissa olevaan paikkaan, josta TeX löytää kyseisen komennon lisätiedot. Tämä saattaa kuulostaa hieman epämääräiseltä, mutta tapa, jolla TeX käyttää näitä osoittimia tiedon hakemiseen, vaihtelee paljon, ja täydellisempi selitys veisi huomiota tämän artikkelin ydintavoitteesta. Yksi esimerkki auttaa: makrot. Kun makrokomento määritellään, TeXin on tallennettava korvaava teksti johonkin muistin paikkaan. Kuten alla näemme, käyttäjän määrittelemillä makroilla on komentokoodit välillä 111 ja 114, ja niiden komentomäärite on muistiin osoittava osoitin, joka kertoo TeXille, mihin niiden korvaava teksti (makron määritelmä) on tallennettu.

### Komentokoodit: laajennettavat ja ei-laajennettavat

Knuthin TeX-lähdekoodissa komentokoodit vaihtelevat välillä 0–120 — huomaa, että jotkin tuon alueen koodit on varattu puhtaasti erikoistuneeseen sisäiseen käyttöön eikä niitä ole annettu komentoihin, joihin käyttäjä pääsee käsiksi. On syytä huomata, että muut TeX-moottorit, kuten pdfTeX, XeTeX ja LuaTeX, ovat kaikki lisänneet uusia komentoja Knuthin alkuperäiseen joukkoon, ja niissä on enemmän primitiivejä sekä niitä vastaavia komentokoodeja; kuitenkin tässä esitetyt periaatteet ovat keskeisiä kaikille Knuthin lähdekoodista johdetuille TeX-pohjaisille moottoreille.

Komentokoodien joukko jakautuu kahteen pääjoukkoon:

* *ei-laajennettavat komennot*: niiden komentokoodit ovat enintään 100;
* *laajennettavat komennot*: niiden komentokoodit ovat yli 100, enintään 120. Välille 101–120 sisältyvät käyttäjän määrittelemät makrot sekä komennot kuten `\csname`, `\expandafter` ja `\the`.

Ei-laajennettavat komennot yleensä asettavat arvon jollekin sisäiselle parametrille tai tuottavat suoraan ladottavaa aineistoa. Laajennettavat komennot yleensä ”syöttävät” tokenivirran TeXin nykyiseen käsittelytoimintaan tai muuttavat tokenien käsittelyjärjestystä.

Kuten edellä todettiin, kaikille makroille (käyttäjän määrittelemille komennoille) annetaan komentokoodit välillä 111–114: eri arvot heijastavat sitä, määriteltiinkö makro `\long`, `\outer`molempana vai ei kumpanakaan. Tässä on esimerkki:

| Makron tyyppi         | Esimerkki                      | Kommentti                  |
| --------------------- | ------------------------------ | -------------------------- |
| Ei-pitkä, ei-ulkoinen | `\def\ohyeah{....}`            | `\ohyeah` komentokoodi=111 |
| Pitkä, ei-ulkoinen    | `\long\def\ohyeah{....}`       | `\ohyeah` komentokoodi=112 |
| Ei-pitkä, ulkoinen    | `\outer\def\ohyeah{....}`      | `\ohyeah` komentokoodi=113 |
| Pitkä, ulkoinen       | `\long\outer\def\ohyeah{....}` | `\ohyeah` komentokoodi=114 |

Muistutuksena komentomääritteistä: kun makro määritellään, TeX tallentaa makron määritelmän johonkin muistipaikkaan: tästä paikasta (osoittimesta) tulee makrokäskyn komentomäärite, joka tallennetaan komentokoodin 111–114 kanssa riippuen siitä, miten se määriteltiin. Käyttäjän määrittelemälle makrolle annettu varsinainen nimi ei oikeastaan ole merkityksellinen: syötteen käsittelyn jälkeen niille kaikille annetaan komentokoodi välillä 111–114, ja lopulta kaikki komennot, jotka TeX lukee syötteestäsi, olivatpa ne primitiivejä tai käyttäjän määrittelemiä makroja, muunnetaan lopulta numeeriseksi esitykseksi nimeltä a *tokenin*.

## Matka syötetekstistä TeX-tokeneihin

Tässä osiossa käytämme hyvin yksinkertaista makroesimerkkiä nähdäksemme täsmälleen, miten TeX käsittelee komennon `\def` luodakseen tokenin, joka edustaa `\def` komentoa. TeXin yksityiskohtainen käsittelytoiminta voi olla äärimmäisen monimutkaista, joten emme käytä makroparametreja tai erottimia, koska se lisäisi monimutkaisuutta ja veisi huomion matkastamme.

Oletetaan, että TeX-syötetiedostosi sisältää seuraavan rivin:

```latex
\def\ohyeah{Overleaf is cool!}
```

Kun TeX alkaa käsitellä tätä syöteriviä, se tarkistaa `\catcode` kunkin merkin `\` (ensimmäinen merkki `\def`). Se havaitsee (etsii sen sisäisestä taulukosta), että `\` on `\catcode` 0, mikä tarkoittaa, että se aloittaa *ohjaussekvenssin*. Tietysti minkä tahansa merkin voi määritellä uudelleen siten, että sen `\catcode` on 0, mutta oletamme, että käytössä ovat plain TeX:n tai LaTeXin tavanomaiset määritelmät.

Tarkasti ottaen termillä *ohjaussekvenssin* on kaksi alaluokkaa: *ohjaussanaa* ja *ohjaussymbolia*:

* *ohjaussanaa*: merkkijono, jolla on `\catcode` kirjain (11);
* *ohjaussymbolia*: yksittäinen merkki, jonka `\catcode` on *sisällä* kirjain (11).

Tässä vaiheessa, `\` escape-merkki on tehnyt tehtävänsä ja on nyt valmis. Havaitessaan escape-merkin TeXin reaktio on alkaa lukea kaikkia myöhempiä merkkejä syötteestä tavoitteenaan havaita control word tai control symbol.

Alkuperäisen `\`, TeX havaitsee välittömästi `d`: merkin, jonka `\catcode` on 11, mikä kertoo TeXille, että se on löytänyt *ohjaussanaa*. *ei* käyttäjät ovat `\catcode` kirjain (11). Kaikki myöhemmät merkit (alkuperäisen `\`) `\catcode` 11 (kirjain) katsotaan muodostavan komentosanan nimen: eli komennon nimen — ehkä makron tai primitiivin, mutta TeXillä ei vielä ole aavistustakaan, minkä tyyppinen komento se on. Tässä vaiheessa se on vain merkkijono.

Niinpä esimerkissämme TeX skannaa tyytyväisenä eteenpäin, tarkistaen jokaisen merkin, kunnes se saavuttaa alkuperäisen `\` kohteelle `\ohyeah` jolla myös on `\catcode` 0. TeX huomaa skannanneensa liian pitkälle ja palauttaa kohteliaasti tuon `\` takaisin tekstivirtaan, jotta siitä tulee seuraava merkki, joka nähdään tekstin myöhemmässä skannauksessa. Tässä vaiheessa TeX on tunnistanut merkkijonon (`def`alkuperäisen `\catcode` 11 (`d`, `e` ja `f`), jonka se tietää muodostavan komentosanan tekstin, joka koostuu kolmesta merkistä, joista jokaisella on `def` tarkoittaa: mitä sen on tarkoitus tehdä? Kuten olet ehkä arvannut, TeXin on löydettävä komennon komentokoodi ja komentotunniste `def` jotta se voi päätellä, mitä tälle komennolle tehdään.

## Hajautetaanpa se

Havaittuaan komentosanan (`def`), ensimmäinen asia, jonka TeX tekee, on ”muuntaa” merkkijono (`def` esimerkissämme) kokonaisluvuksi käyttämällä niin kutsuttua hajautusfunktiota. Yksityiskohtiin ei tarvitse mennä syvälle, riittää yleiskuva. Pohjimmiltaan TeX tarkastelee jokaista juuri havaitsemansa komentosanan merkkiä ja käyttää kunkin merkin ASCII-koodiarvoa (tai XeTeX/LuaTeX:ssä Unicode-arvoa) laskiakseen luvun, jota kutsutaan hajautusarvoksi: se on vain tavallinen kokonaisluku.

Osana tätä hajautuslaskentaprosessia TeX tarkistaa myös, onko uuden havaitun komentosanan merkkijono sille jo ennestään tuttu. Kaikkien komentojen ihmisluettava teksti, olivatpa ne primitiivejä tai käyttäjän määrittelemiä makroja, on talletettu sisäiseen säilytysalueeseen nimeltä *merkkipooli*. TeXin on tehtävä näin, koska sen on ehkä tuotettava komennon ihmisluettava nimi — esimerkiksi silloin, kun TeXin täytyy ilmoittaa virhe ja antaa ongelmallisen komennon nimi. Esimerkiksi makromme `\def\ohyeah{Overleaf is cool!}` määrittelee uuden komennon nimeltä `\ohyeah` ja TeXin täytyy (myöhemmässä vaiheessa) laskea hajautusarvo paitsi `ohyeah` (*ilman* alkuperäisen `\` merkin) myös tallentaa tekstimerkkijonon (ihmisluettavassa muodossa), jos sitä tarvitaan virheraportointiin (tai muihin tehtäviin).

Jos haluat lisää yksityiskohtia TeXin merkkijonojen käsittelyprosesseista, olen kirjoittanut siitä omalla [henkilökohtaisella blogisivustollani](http://www.readytext.co.uk/?p=3590).

Lopputuloksena komentoa edustava merkkijono `def` muutetaan numeeriseksi arvoksi 1218 (se on TeXin itse laskema todellinen arvo). Tässä vaiheessa yksittäiset merkit `d`, `e` ja `f` eivät enää kuulu pääkertomukseen — ne on luettu syötteestä ja ne ovat tehneet tehtävänsä: tästä eteenpäin kyse on kokonaisluvuista ja *tokenit*—pian näemme, mikä token oikeastaan on! Sisäisesti TeX viittaa näihin hajautusarvolukuihin nimellä *nykyinen ohjaussekvenssi* mutta lähdekoodissa tuo termi lyhennetään muuttujaan nimeltä `curcs`. TeXin lähdekoodi on täynnä hyvin lyhyitä, usein varsin kryptisiä muuttujien nimiä.

Mutta mitä TeX *oikeastaan tekee* tällä vastalasketulla 1218:n kokonaisluvulla? Miten TeX saa selville, että alkuperäinen merkkijono `def`", jota nyt edustaa kokonaisluku 1218, viittaa itse asiassa käskyyn määritellä makro? Vastaus on, että TeXillä on eräänlainen sisäinen ”arkistokaappi”, jossa se säilyttää jokaisen tällä hetkellä tuntemansa komennon nykyisen merkityksen ja arvon — oli komento käyttäjän määrittelemä makro tai sisäänrakennettu primitiivi. Syy siihen, että TeX näki vaivaa muuntaakseen `def` 1218:n hajautusarvoksi (joka on nyt tallennettu muuttujaan nimeltä `curcs`on käyttää sitä hakemiseen *merkityksen* kohteelle `def`. TeX toistaa tietenkin tämän hajautuslaskennan kaikille syötteestä havaitsemilleen komentosanoille — tosin eri komentosanat tuottavat tietenkin eri kokonaislukuarvoja hajautusfunktiosta: juuri siinä on koko idea.

TeXin sisäinen ”arkistokaappi” on nimeltään *vastaavuustaulukko* ja se on seuraavan osion aihe.

### Vastaavuustaulukon tarkastelu

Kerrataanpa, mitä olemme tähän mennessä oppineet:

* `\` aloittaa ohjaussekvenssin (joko *ohjaussymbolia* tai *ohjaussanaa*).
* Jos ensimmäinen merkki `\` on `\catcode` on 11 (kirjain), se on alku *ohjaussanaa*.
* Tiedostoissa *komentosanojen* TeX skannaa tarkistaakseen kaikki myöhemmät syötemerkit, joilla on `\catcode` 11 ja lopettaa skannauksen heti, kun se löytää ensimmäisen merkin, jolla on *sisällä* on `\catcode` arvo 11.
* Syötemerkkien merkkijono (joka seuraa `\`), joilla on `\catcode` 11, katsotaan olevan *ohjaussanaa* käyttäjän kirjoittama komento: käsky, joka pyytää TeXiä ”tekemään jotakin”.
* Aloittaakseen prosessin ”tehdä jotakin” TeX muuntaa komentosanan merkkijonon kokonaisluvuksi. Se tekee tämän niin sanotulla hajautusfunktiolla, joka tuottaa kokonaisluvun.
* Kokonaisluku (laskettu hajautusarvo) tunnetaan nimellä *nykyinen ohjaussekvenssi*nykyinen ohjaussekvenssi `curcs`.
* mutta TeX antaa sille lyhyemmän nimen `def` Esimerkissämme komentosana `curcs`: eli `curcs=1218`.

TeXin on nyt selvitettävä, mitä juuri havaittu *nykyinen ohjaussekvenssi* todella tarkoittaa — mitä TeX tekee sillä?

#### Huomio ryhmittelystä: tiedon tallentamisen ja palauttamisen tarve

Tässä teemme pienen sivupolun muistuttaaksemme itseämme siitä, että TeXillä on kyky tallentaa ja palauttaa tietoa: toisin sanoen sillä on jonkinlainen sisäänrakennettu ”muisti”.

Kenen tahansa, joka on kirjoittanut edes yksinkertaisimman makron, pitäisi olla tietoinen TeXin ryhmittelymekanismista — esimerkiksi käyttämällä `\def` makrojen luomiseen ryhmän sisällä. Ellet käytä `\global` etuliitettä `\def`-luotuihin makroihin, jotka on määritelty ryhmän sisällä, kyseisen makron arvo tai merkitys säilyy vain tuossa ryhmässä (ja sen alaryhmissä): sen määritelmä katoaa, kun ryhmä päättyy. Esimerkiksi jos määrittelet yksinkertaisen makron ryhmän sisällä, näin:

```latex
{\def\foo{Hello}}
```

ja yrität käyttää `\foo` ryhmän ulkopuolella

```latex
{\def\foo{Hello}}% \foo määritelty ryhmän sisällä (huom: \globalia ei käytetä)
\foo %<--- ei enää määritelty, nyt määrittelemätön
```

silloin saamme tutun virheen: `Määrittelemätön ohjaussekvenssi`. `\foo` on merkityksellinen vain siinä ryhmässä (ja sen alaryhmissä), jossa se määriteltiin. Lisäksi kun määrittelet makron uudelleen ryhmän sisällä, uusi arvo voi kadota ryhmän päättyessä ja aiempi merkitys (joka oli olemassa ryhmän ulkopuolella) palautuu.

```latex
\def\foo{Goodbye}
\foo\par% Tulostaa Goodbye
{\def\foo{Hello}% Määritelty uudelleen ryhmän sisällä:
{Toisen tason ryhmän sisällä: \foo\par}}% Käytetty toisen tason ryhmässä: \foo tulostaa Hello
Ryhmän ulkopuolella vanha arvo palautetaan: \foo\par% Tulostaa Goodbye
```

Näiden yksinkertaisten esimerkkien tarkoitus on osoittaa, että TeXillä on jonkinlainen ”tallennusmekanismi” tai ”muisti”, joka tallentaa ja palauttaa komentojen ”merkityksen” — ja tietenkin tekee niin. Vihjasimme tähän edellisessä osiossa: tuo ”tallennusmekanismi” tai ”arkistokaappi” on suuri sisäinen taulukko nimeltä *vastaavuustaulukko*. Sinne TeX tallentaa kaikkien tällä hetkellä tuntemiensa komentojen nykyisen merkityksen tai arvot — sisäänrakennetut primitiivit ja käyttäjän määrittelemät makrot.

### Vastaavuustaulukko: analogian kautta

Selittääksemme vastaavuustaulukkoa etenemme analogian avulla. Jatkamme ajatusta arkistokaapista, jossa on tuhansia pieniä laatikoita, joista jokainen on merkitty yksilöllisellä kokonaisluvulla. Käsittelyn tässä vaiheessa TeX sanoo käytännössä:

”OK, minulla on tämä 1218:n kokonaisarvo, jonka juuri laskin ja tallensin muuttujaan nimeltä `curcs`. Minun täytyy nyt selvittää, mitä se tarkoittaa: tehdäkseni sen menen ja katson arkistokaappini laatikkoa numero 1218 nähdäkseni, mitä siellä sanotaan.”

TeX käyttää lukua 1218 oikean laatikon paikantamiseen, ja sieltä se löytää pienen muistilapun, joka sisältää kolme tietoa, joiden nimet ovat samat kuin TeXin lähdekoodissa käytetyt:

* **`eq_level:`** ryhmittelyn taso, jolla tämä tietue määriteltiin (taso 1 = globaalisti määritelty). Näimme ryhmittelyn vaikutukset toiminnassa yllä: vastaavuustaulukossa tämä ryhmittelytason tieto säilytetään;
* **`eq_type:`** tämän tietueen komentokoodi;
* **`equiv:`** tämän tietueen nykyinen ”arvo” — se voi olla yksinkertainen kokonaisluku, kuten edellä mainittu komentomäärite, tai osoitin muistialueeseen; esimerkiksi muistipaikka tokenijoukolle, joka edustaa makron määritelmää.

Joten hajautusarvomme 1218 (tallennettuna muuttujaan `curcs`curcs *avaimena* laatikkoon, joka sisältää alun perin kirjainten merkkijonona syötetyn komennon nykyisen merkityksen ja arvon `\def`.

TeX-ohjelman lähdekoodissa `eq_type` minkä tahansa komennon osalta tallennetaan käyttämällä muuttujaa nimeltä `curcmd` ja arvon `equiv` tallennetaan muuttujaan nimeltä `curchr`.

### Mitä vastaavuustaulukko sanoo defistä?

Kuten todettiin, minkä tahansa komennon laskettu hajautusarvo tallennetaan muuttujaan nimeltä `curcs`; siten komennolle `def` meillä on `curcs=1218`. Kun TeX katsoo vastaavuustaulukon sijaintia 1218, se löytää seuraavat tiedot:

* `curcmd`=97. Tämä on komennon `\def`;
* `curchr`=0. Tämä on komennon `\def`.

`\def` on primitiivinen (sisäänrakennettu) TeX-komento, ja ellei sitä ole jossakin määritelty uudelleen, kolmannen ja viimeisen tiedon pitäisi olla `eq_level=1` mikä osoittaa, että `\def` on määritelty globaalisti eikä rajoitu johonkin alempaan ryhmittelytasoon. Sisäisesti `eq_level` komentoon liitetty eq\_level-arvo on TeXin ryhmittelymekanismissa äärimmäisen tärkeässä roolissa, mutta emme käsittele sitä tämän enempää.

Seuraava kuva tiivistää selityksen, jonka olemme käyneet läpi:

![Matka TeX-syötteestä TeX-tokeniin.](/files/e6d0ddca41aa49471ce2ee0d67ec216712774f01)

## Komentojen TeX-tokenit

Kun olemme kahlanneet läpi yllä olevat selitykset, TeX-tokenien varsinainen laskeminen ohjaussekvensseille osoittautuu todella hyvin yksinkertaiseksi. TeX käyttää arvon `curcs` (1218) hajautusfunktiosta luodakseen yksinkertaisen kokonaisluvun, jota se kutsuu *tokenin*tokeniksi. `curcs` on:

```c
curtok = 4095 + curcs
```

TeX tallentaa nykyisen tokenin arvon (viimeksi lasketun) muuttujaan nimeltä `curtok`.

Yhteenvetona siis TeX-token, joka edustaa `\def` on `4095 + 1218 = 5313`. Ja siinä kaikki ohjaussekvenssejä edustaville TeX-tokeneille: ne ovat yksinkertaisesti kokonaisluku, joka lasketaan hajautustaulukon arvosta plus 4095.

## Merkkien TeX-tokenit

Kun TeXin on luotava merkkiä edustava token, se käyttää seuraavaa, yhtä yksinkertaista laskutoimitusta:

```c
curtok = 256*catcode + (ASCII value of character)
```

Huomaa, että Unicodea tukevissa moottoreissa, kuten LuaTeXissä, käytetään hieman erilaisia laskutoimituksia.

Esimerkiksi välilyöntimerkkiä edustava TeX-token, jonka `\catcode` catcode on 10 ja ASCII-arvo 32, on:

```c
256*10 + 32 = 2592
```

### Merkkejä sisältävät tokenilistat

Kun luot yksinkertaisen tokenilistan esimerkiksi näin,

```latex
\toks100={Hello}
```

TeX luo seuraavan tokenilistan ja tallentaa sen muistiin myöhempää käyttöä varten:

* H→ 256 × 11 + 72 = 2888
* e→ 256 × 11 + 101 = 2917
* l→ 256 × 11 +108 = 2924
* l→ 256 × 11 +108 = 2924
* o→256 × 11 + 111 = 2927

Syvällä TeXin muistissa tokenirekisteri 100 tarjoaa pääsyn ”Hello”-tekstin säilytyspaikkaan, joka on tallennettu viitenä token-arvona: 2888, 2917, 2924, 2924, 2927. Huomaa, että nämä tokenit yhdistävät kunkin merkin ASCII-koodin ja sen `\catcode`catcode-arvon silloin, `\catcode` niihin liitetty arvo on pysyvä ja tallennetaan tokeneihin myöhempää käyttöä varten, kun käyttäjä sanoo esimerkiksi `\the\toks100`.

Kuten todettiin, merkkitoken lasketaan kaavalla `256*catcode + (ASCII value)` kun taas ohjaussekvenssitoken lasketaan kaavalla `4095 + curcs` jossa `curcs` on TeX:n syötteestä havaitseman komentosanan (käyttäjän kirjoittaman komennon tekstimerkkijono) hajautusarvo. On syytä huomata, että merkkitokenit ovat aina alle 4095. Näin TeX voi helposti määrittää, edustaako jokin token ohjaussekvenssiä (komentoa) vai merkkiä, ja sitten päätellä, mikä ohjaussekvenssi tai merkki ja `\catcode` pari on koodattu kyseiseen tokeniin.


---

# 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/53-what-is-a-tex-token.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.
