> 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/18-how-overleaf-created-the-tex-primitive-reference-data.md).

# Kuinka Overleaf loi TeX-primitiivien viitetiedot

Tässä artikkelissa kuvataan menetelmät ja tekniikat, joita käytettiin TeX:n peruskomentojen kahden ristiviittaustaulukon laatimiseen:

* [TeX:n peruskomennot TeX-moottoreittain](/latex/fi/lisaa-aiheita/46-tex-primitives-listed-by-tex-engine.md) ja;
* [TeX:n peruskomennot CJK-TeX-moottoreittain](/latex/fi/lisaa-aiheita/45-tex-primitives-listed-by-cjk-tex-engine.md).

Tämä tieto on tarkoitettu lukijoille, jotka ovat kiinnostuneita yksityiskohdista, mutta se ei ole edellytys itse ristiviittaustaulukon käyttämiselle. Vastataksemme erilaisten lukijoiden tarpeisiin tarjoamme hyvin lyhyen yhteenveto-/yleiskatsausversion sekä pidemmän selityksen niille, jotka haluavat perehtyä aiheeseen syvemmin.

## Lyhyt yhteenveto/yleiskatsausversio

Ristiviittaustaulukon rakentamiseksi Overleaf käsitteli 9 TeX-moottorin lähdekoodia poimiakseen kunkin tukemien peruskomentojen luettelon: tämä tuotti 9 tekstitiedostoa (1 tiedosto per TeX-moottori). Nämä 9 peruskomentojoukkoa yhdistettiin “pääluetteloksi”, joka käytännössä oli yksittäisten joukkojen unioni: tuloksena oli yhteensä noin 1000 ainutlaatuista peruskomentoa eri moottoreissa. Kullekin moottorille sen oma peruskomentoluettelo ristiviitattiin pää­tiedostoon (kaikkien komentojen joukkoon) sen määrittämiseksi, mitkä näistä noin 1000 komennosta se tuki: nämä vertailut on koottu seuraaviin kahteen taulukkoon:

* [TeX:n peruskomentojen ristiviittaustiedot](/latex/fi/lisaa-aiheita/46-tex-primitives-listed-by-tex-engine.md)
* [TeX:n peruskomentojen ristiviittaustiedot (CJK-moottoreille)](/latex/fi/lisaa-aiheita/45-tex-primitives-listed-by-cjk-tex-engine.md)

## “Ohjelmiston rakentaminen” 101: Mitä se tarkoittaa?

Tämän artikkelin loppuosassa viittaamme käsitteeseen “TeX-moottoreiden rakentaminen”, joka voi olla vieras, jos et ole ohjelmoija tai et ohjelmoi käännettävillä kielillä, kuten C:llä tai C++:lla. Meidän tarkoituksiimme ohjelmiston rakentaminen — eli TeX-moottoreiden — on prosessi, jossa lähdekoodeista, eli ohjelman kehittämisessä käytetystä ohjelmointikielestä kirjoitetuista lähdekooditiedostoista, luodaan suoritettava TeX-ohjelma.

## Täysi versio: Haluatko yksityiskohdat? Jatka lukemista...

Jokainen TeX-pohjainen ladontamoottori tukee TeX-kielen “murretta”: tiettyä joukkoa peruskomentoja, jotka ohjaavat kunkin moottorin ladontaominaisuuksia ja tarjoavat rakennuspalikat makrojen: käyttäjän määrittelemien komentojonojen, luomiseksi/määrittelemiseksi. Jokainen makro, olipa se kirjoitettu LaTeX:lle, plain TeX:lle tai mille tahansa muulle makropaketille, on lopulta rakennettu peruskomentojen varaan — vaikka saatat joutua kaivautumaan melko pitkälle, lisämakrojen kerrosten läpi, ennen kuin pääset TeX:n peruskomentojen “kallioiseen peruskallioon”. Niillä 9 TeX-moottorilla, joita analysoitiin peruskomentojen viitetietojen tuottamiseksi, on tietysti monia komentoja yhteisiä, mutta jokaisella TeX-moottorilla on myös omat kehittäjiensä lisäämät peruskomentonsa, jotka tukevat juuri tuolle TeX:n “versiolle” ominaisia ominaisuuksia.

TeX-moottorin peruskomennot on rakennettu suoritettavaan TeX-ohjelmistoon: peruskomennot eivät ole käyttäjien rakentamia makroja, vaan ne ovat perusluonteisia, jakamattomia/atomisia käskyjä, joita käytetään kunkin moottorin ladontakäyttäytymisen ohjaamiseen. Siksi luotettavin tapa laatia lopullinen luettelo minkä tahansa TeX-moottorin tukemista peruskomennoista on tarkastella varsinaista lähdekoodia, josta suoritettavat TeX-ohjelmat käännetään, ja poimia lähdekoodissa määritellyt peruskomennot. Kuulostaa siltä, että sen pitäisi olla helppoa, eikö? Kuitenkin TeX:n 40 vuoden kehityshistorian vuoksi TeX-moottoreiden lähdekooditiedostojen tutkiminen (lukuun ottamatta LuaTeXiä) ei ole erityisen suoraviivaista. Näiden monimutkaisuuksien syy on niissä työkaluissa, ohjelmointikielessä (Pascal) ja menetelmässä (selittävä ohjelmointi), joita Knuth käytti kirjoittaakseen alkuperäisen TeX-lähdekoodin — josta kaikki muut moottorit ovat lopulta periytyneet.

Huomautamme poikkeuksen LuaTeXistä, koska sen ytimen moottorikoodi kirjoitettiin uudelleen C:llä, jotta Pascalin ja muiden alla kuvattujen perinteisten monimutkaisuuksien käyttö poistettiin (Web2C); tästä syystä, vaikka LuaTeXin lähdekoodi on laaja, tapa jolla se on “paketoitu” ja jaettu on paljon ymmärrettävämpi verrattuna muihin TeX-moottoreihin. Tämän vuoksi ja sen perusteella, miten ne rakennetaan lähdekoodista, on kätevää ryhmitellä TeX-moottorit kahteen luokkaan:

1. LuaTeX: mukautettu (modernimpi) rakennusprosessi
2. Kaikki muut moottorit: perinteinen (Web2C) rakennusprosessi

## Vanhan koodin perintö: Miksi useimpien TeX-moottoreiden rakentaminen on monimutkaista

Kuten alla tarkastelemme, Knuth julkaisi alkuperäisen TeX-lähdekoodinsa yhtenä ainoana, monoliittisena tiedostona nimeltä `tex.web` jota Knuth päivittää edelleen joka seitsemäs vuosi korjatakseen mahdolliset jäljellä olevat virheet — uusia ominaisuuksia ei koskaan lisätä, kyse on puhtaasti virheenkorjauksesta.

TeX:n lähdekoodin tiedostopääte (`.web`) ei todennäköisesti ole tuttu, ja saatat ihmetellä, millä kielellä Knuth kirjoitti TeXin? Vastaus on Pascal, mutta `.web` päätteeseen tarvitaan vähän lisäselitystä. Knuth kehitti ohjelmointimenetelmän, jota hän kutsui [selittäväksi ohjelmoinniksi](https://en.wikipedia.org/wiki/Literate_programming) jossa ohjelman lähdekoodi ja dokumentaatio yhdistetään ja julkaistaan yhtenä koostetiedostona (koodi + dokumentaatio) päätteellä `.web`: tätä tiedostotyyppiä kutsutaan WEB-tiedostoksi. Selitämme WEB-tiedostoja hieman tarkemmin alla.

### Uusien TeX-moottoreiden luominen: Knuthin ehdot

Vaikka Knuth on jo pitkään tehnyt TeX-lähdekoodinsa (`tex.web`) vapaasti kaikkien saataville, hän asetti — mikä on hänen ehdoton oikeutensa — keskeisen ehdon, ettei hänen (`tex.web`) lähdekoodiaan saa suoraan muokata/editoida ja levittää ohjelman nimellä “TeX”. Lähdekoodissa hän kirjoittaa:

```
% Tekijänoikeus (C) 1982 D. E. Knuth; kaikki oikeudet pidätetään.
% Tämän tiedoston kopiointi on sallittua vain, jos (1) olet D. E. Knuth tai jos
% (2) et tee kopioosi yhtään muutoksia. (WEB-järjestelmä tarjoaa
% muutoksia varten aputiedoston kautta; pää­tiedoston tulee pysyä koskemattomana.)
```

ja myös:

```
Jos tätä ohjelmaa muutetaan, siitä syntyvää järjestelmää ei pitäisi kutsua
`\TeX'; virallinen nimi `\TeX' sellaisenaan on varattu
ohjelmistojärjestelmille, jotka ovat keskenään täysin yhteensopivia.
Erityinen testisarja nimeltä ``\.{TRIP} test'' on käytettävissä
auttamaan määrittämään, ansaitseeko jokin tietty toteutus tulla
tunnetuksi nimellä `\TeX' [vrt. Stanford Computer Science -raportti CS1027,
marraskuu 1984].
```

Periaatteessa: älä tee muutoksia muokkaamalla ja jakamalla muokattuja versioita TeXin pää­lähdekoodista ja jatka sen kutsumista `tex.web`. Jos haluat tehdä muutoksia, esim. lisätä uusia peruskomentoja jne., sinun on tehtävä nämä muutokset “muutoksina apu­tiedoston kautta” ja annettava “TeXin johdannaiselle” ohjelmallesi nimi, joka erottaa sen “TeXistä”, joka ladottuna muodossa ($$\mathrm\TeX$$), on American Mathematical Societyn tavaramerkki.

### Vanhan koodin perintö

Vaikka TeXiä on yritetty kirjoittaa kokonaan uudelleen nykyaikaisilla ohjelmointikielillä ja menetelmillä — kuten kahdella Java-pohjaisella hankkeella [Uusi ladontajärjestelmä](https://en.wikipedia.org/wiki/New_Typesetting_System) ja [εχTEX](http://www.extex.org/) ja muita, kuten [eräs Clojurella toteutettu](https://www.infoq.com/news/2015/01/implementing-tex-in-clojure), mikään ei ole ollut täysin onnistunut. TeXin jatkokehittämiseen suunniteltujen projektien ja aloitteiden historia on kiinnostava aihe, ja lukijat saattavat haluta [vierailla UK TeX FAQ:ssa](https://texfaq.org/FAQ-enginedev) saadakseen lisätietoja.

Niiden ei-LuaTeX-aloitteiden, jotka ovat myös onnistuneet, kuten e-TeX, pdfTeX, XeTeX ja muut moottorit, on rakennettu *suoraan päälle* Knuthin alkuperäistä koodia: hänen lähdekoodinsa otetaan ja siihen “tehdään muutoksia” uuden moottorin johtamiseksi lisäominaisuuksilla — kuten uusien peruskomentojen lisääminen, PDF-tulosteen tuottaminen, UTF-8-tekstisyötteen tukeminen ja niin edelleen. Vaikka tämä reitti on johtanut merkittäviin onnistumisiin, se tarkoittaa myös, että nämä johdannaismoottorit perivät perintökoodin ja kehitystekniikat, jotka Knuth loi 40 vuotta sitten.

Keskeinen huomio tässä on, että LuaTeXiä lukuun ottamatta useimmat Knuthin alkuperäisestä lähdekoodista johdetut TeX-moottorit luodaan ottamalla yksi monoliittinen tiedosto (yleensä `tex.web`) ja tekemällä muutoksia, jotka tuottavat vielä yhden yksittäisen monoliittisen tiedoston, joka sisältää kyseisen uuden moottorin ydinalähdekoodin. Edistyneet lukijat saattavat haluta siirtyä suoraan kvalifioiviin [huomautuksiin pdfTeXistä ja XeTeXistä](#aside-xetex-and-pdftex).

### Joitakin lisätietoja TeXin historiasta/taustasta

TeXin syntyhetki oli [merkittiin Knuthin päiväkirjaan 30. maaliskuuta 1977](/latex/fi/syvalliset-artikkelit/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md#the-genesis-of-tex-a-brief-history), nykyään yli 40 vuotta sitten. Sisäisesti TeX on poikkeuksellisen monimutkainen ohjelma, jonka lähdekoodin Knuth näki valtavasti vaivaa [dokumentoida poikkeuksellisen yksityiskohtaisesti](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373). Tämän tekemiseksi Knuth kehitti ohjelmointityylin, jota hän kutsui [selittäväksi ohjelmoinniksi](https://en.wikipedia.org/wiki/Literate_programming) jossa ohjelman lähdekoodi ja dokumentaatio yhdistetään ja julkaistaan koostetiedostona päätteellä `.web` (jota kutsutaan WEB-tiedostoksi). Knuth valitsi Pascalin TeX-ohjelmistonsa ohjelmointikieleksi ja, ei yllättäen, käytti TeX-ladontakieltä lopullisen dokumentaation kirjoittamiseen. Siksi Knuthin TeXin pää­lähdekoodi julkaistaan yhtenä ainoana, monoliittisena tiedostona nimeltä `tex.web`: sekoitus Pascal-lähdekoodia ja TeX-ladontakoodia dokumentaatiota varten.

Jos ohjelma on kirjoitettu Knuthin selittävän ohjelmoinnin tyyliä/menetelmää käyttäen (kuten TeX, MetaFont, BibTeX ja muut), WEB-tiedosto on esikäsiteltävä dokumentaation tai lähdekoodin poimimiseksi. Ohjelman dokumentaatioon pääsemiseksi käsittelet WEB-tiedostoa (esim., `tex.web`) työkalulla nimeltä [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) joka tuottaa dokumentaation `.tex` tiedostona, jonka voit ladota. Pascal-lähdekoodin poimimiseksi käytät toista apuohjelmaa nimeltä [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) joka tuottaa tiedoston, jonka pääte on `.p` ja joka sisältää Pascal-lähdekoodia.

Kirjoitushetkellä (alkuvuonna 2019) Knuthin TeXin uusin versio on 3.14159265, päivätty tammikuulle 2014. Huomaa jälleen, että Knuthin TeX-lähdekoodi on yhdessä ainoassa tiedostossa, jossa on noin 25 000 riviä TeX/Pascal-koodia!

### Pascalista C:hen

TeXin synnystä kuluneiden yli 40 vuoden aikana Pascal meni pois muodista, ja nykyään vain harvat, jos lainkaan?, harkitsevat TeXin rakentamista sen alkuperäisestä Pascal-lähdekoodista. Ohittaakseen Knuthin käyttämän Pascalin kehitettiin työnkulku nimeltä [Web2C](http://tug.org/texinfohtml/web2c.html) jossa TeXin Pascal-lähdekoodi muunnetaan mekaanisesti (eli ohjelmiston avulla) sen C-kieliseen vastineeseen, jota sitten käytetään TeXin kääntämiseen ja suoritettavan ohjelman rakentamiseen. Se toimii hyvin, mutta ainoa haittapuoli on, että mekaanisesti tuotettua C-lähdekoodia ei ole tarkoitettu satunnaiseen ihmistarkasteluun: se on *erittäin* sanava ja lähes läpipääsemätön, koska se on tarkoitettu kääntäjille, ei ihmisille — tässä on kuvakaappaus, joka näyttää pienen katkelman TeXin Pascal-lähdekoodista tuotetusta C-koodista:

![](/files/8bfaee79a40020c77f4fc9913c0687a6c8ca5190)

### Toinen Knuthin erikoisuus: WEB-muutostiedostot

Kuten edellä todettiin, rakentaaaksesi Knuthin alkuperäisen lähdekoodin päälle sinun täytyy “tehdä muutoksia” tai Knuthin sanojen mukaan tehdä “muutoksia apu­tiedoston kautta”: mutta mitä tämä oikeastaan tarkoittaa? Tässä tulee mukaan *muutostiedostomekanismi*.

### Muutostiedostot: mekanismi uusien TeX-moottoreiden luomiseksi

Kehittäjät, jotka haluavat laajentaa Knuthin TeXiä jollakin tavalla, eli rakentaa Knuthin alkuperäisen työn päälle, haluavat tyypillisesti luoda kokonaan uuden TeXin “version” tai tarjota *laajennuksen* jonka voi lisätä mihin tahansa TeX-moottoriin. Esimerkkejä laajennuksista ovat [SyncTeX](https://github.com/jlaurens/synctex) ja [EncTeX](https://ctan.org/pkg/enctex?lang=en)—SyncTeX on esimerkiksi erittäin hyödyllinen laajennus, joka sisältyy nykyään kaikkiin TeX-moottoreihin. EncTeXin tarve on suurelta osin syrjäytynyt Unicodea tukevien TeX-moottoreiden kehityksen myötä — mutta huomaa, että EncTeX on rakennettu pdfTeXiin.

Oli tavoitteena sitten tuottaa uusi TeXin “versio” (eli Knuthin alkuperäisestä TeXistä johdettu versio) tai luoda laajennus, sen kehittäjät aloittavat Knuthin alkuperäisestä lähdekoodista ja tekevät tarvittavat muutokset uuden TeX-moottorin (tai lisäosalaajennuksen) luomiseksi. Kuten edellä todettiin, jokaisen, joka haluaa muuttaa TeXin käyttäytymistä, on tehtävä se käyttämällä “muutoksia apu­tiedoston kautta”, koska näitä muutoksia/muutoksia ei saa tehdä *suoraan* muokkaamalla Knuthin alkuperäistä lähdekoodia: kehittäjien on käytettävä niin sanottua WEB *muutostiedostomekanismi*. Knuthin TeXin muokkaamiseen tarkoitettu koodi kirjoitetaan WEB-“kielellä” ja tallennetaan yhteen tai useampaan kooditiedostoon (joita kutsutaan *muutostiedostoiksi*) jotka sen jälkeen *yhdistetään* Knuthin alkuperäiseen, muuttamattomaan, pää­lähdekoodiin. Tämä yhdistämisprosessi luo uuden koostetun WEB-tiedoston, joka sisältää nyt *ydin* uuden/muutetun TeX-pohjaisen ohjelmiston lähdekoodin. *Muutostiedostoilla* on usein pääte `.ch` mutta käytännössä niillä voi olla mikä tahansa kehittäjien haluama pääte.

#### Miten muutostiedostoja käytetään/otetaan käyttöön?

Nykyään helpoin tapa ottaa muutostiedostoja käyttöön ja muokata “pää”WEB-tiedostoa on apuohjelmalla nimeltä [TIE](https://ctan.org/pkg/tie). Esimerkiksi, oletetaan että haluaisit muokata Knuthin TeXiä lisäämällä vaikkapa pari uutta peruskomentoa tai haluaisit muuttaa olemassa olevan (vakio) TeX-peruskomennon käyttäytymistä. Kirjoittaisit koodisi (Pascalilla!) käyttäen WEB:n selittävää ohjelmointijärjestelmää ja tallentaisit sen tiedostoon nimeltä, esimerkiksi, `myprim.ch`. Seuraava vaihe on yhdistää koodisi ( `myprim.ch`Pascalissa) `tex.web` Knuthin pää­lähdetiedoston `ja tuottaa uusi, koostettu, WEB-tiedosto, jota kutsumme`. Tätä varten suoritat yksinkertaisesti TIE-ohjelman näin:

```
tie -m mytex.web tex.web myprim.ch
```

Olettaen että yhdistäminen onnistuu, tuloksena on uusi WEB-tiedosto, `ja tuottaa uusi, koostettu, WEB-tiedosto, jota kutsumme`jolloin Knuthin pää­lähdetiedosto `tex.web` jää täysin muuttumattomaksi, kuten vaaditaan.

Oletetaan nyt, että joku muu pitää tekemistäsi muutoksista ja haluaa muokata työtäsi lisätäkseen omat muutoksensa sinun tekemäsi päälle tai lisäksi. Sen sijaan, että jakaisit muokatun TeX-versiosi (`ja tuottaa uusi, koostettu, WEB-tiedosto, jota kutsumme`) päätät julkaista/jakaa vain muutostiedoston, `myprim.ch`. Kuka tahansa, joka haluaa rakentaa työsi päälle, voi nyt luoda ja jakaa oman muutostiedostonsa nimeltä vaikkapa `moreprim.ch` , joka laajentaa koodiasi jollakin tavalla. Kuka tahansa muu, joka haluaa hyödyntää molempia muutostiedostoja, voi nyt luoda uuden koostetun WEB-tiedoston yhdistämällä *molemmat* muutostiedostot Knuthin alkuperäiseen ja tuottaa vielä yhden TeX-ohjelman nimeltä vaikkapa `newmytex.web`:

```
tie -m newmytex.web tex.web myprim.ch moreprim.ch
```

### Todelliset TeX-järjestelmät: useita muutostiedostoja

Yllä oleva kuvaus TIE:stä on itse asiassa hyvin lähellä sitä tapaa, jolla monet TeX-moottorit rakennetaan käytännössä: ne alkavat Knuthin `tex.web` ja lisäävät useita peräkkäisiä muutostiedostoja tuottaakseen kyseisen moottorin WEB-lähdetiedoston. Jokainen TeX-moottori tarvitsee oman erityisen muutostiedostojoukkonsa, jotka on otettava käyttöön/käsiteltävä (yhdistettävä) tiukassa järjestyksessä: jos järjestys menee väärin, yhdistämisprosessi epäonnistuu, koska sarjan jokainen muutostiedosto perustuu ketjussa aiemmin esiintyneiden muutostiedostojen tuomiin muutoksiin.

Tässä on esimerkkiajo TIE:stä, jossa Knuthin `tex.web` käytetään tuottamaan `ktex.web`—koostettu WEB-tiedosto, jonka Knuthin TeXiin tehdyt muutokset tekevät siitä valmiin (sopivan) muunnettavaksi C:ksi Web2C-prosessin kautta. Huomaa myös seuraava:

* `tex.ch` on hyvin suuri muutostiedosto, joka muun muassa muokkaa TeXiä käyttämään Kpathseaa;
* SyncTeX-laajennus lisätään useiden muutostiedostojen kautta.

```
tie -m ktex.web tex.web tex.ch enctex.ch synctex-def.ch0 synctex-mem.ch0 synctex-mem.ch2 synctex-rec.ch0 synctex-rec.ch1 synctex-rec.ch2 tex-binpool.ch
Tämä on TIE, CWEB-versio 2.4.
Tekijänoikeus (c) 1989,1992 THD/ITI. Kaikki oikeudet pidätetään.
(tex.web)
(tex.ch)
(enctex.ch)
(synctex-def.ch0)
(synctex-mem.ch0)
(synctex-mem.ch2)
(synctex-rec.ch0)
(synctex-rec.ch1)
(synctex-rec.ch2)
(tex-binpool.ch)
....500....1000....1500....2000....2500....3000....3500....4000....4500
....5000....5500....6000....6500....7000....7500....8000....8500....9000
....9500....10000....10500....11000....11500....12000....12500....13000
....13500....14000....14500....15000....15500....16000....16500....17000
....17500....18000....18500....19000....19500....20000....20500....21000
....21500....22000....22500....23000....23500....24000....24500....
(Virheitä ei löytynyt.)
```

#### Sivuhuomio: XeTeX ja pdfTeX

Täydellisyyden vuoksi on syytä huomata, että pdfTeXin ja XeTeXin rakennusprosessi ei itse asiassa ala Knuthin `tex.web`; sen sijaan ne alkavat tiedostoista nimeltä `pdftex.web` ja `xetex.web` vastaavasti: oletettavasti siksi, että muutokset ovat niin laajoja, että on järkevämpää jakaa/julkaista WEB-tiedostoja, jotka sisältävät jo erittäin merkittävät muutokset Knuthin alkuperäiseen koodiin.

### Esimerkki: e-upTeX

Japanilainen TeX-yhteisö on kehittänyt joukon TeX-moottoreita, jotka on suunniteltu vastaamaan japanilaisen tekstin ladonnan monimutkaisuuksiin:

* **pTeX**: Knuthin TeX-moottori laajennettuna tukemaan japanilaista ladontaa;
* **e-pTeX**: e-TeXin ja pTeXin yhdistelmä (sekä muutama pdfTeXin tuoma peruskomento);
* **upTeX**: Unicodea tukeva pTeXin versio sekä laajennuksia CJK:n (kiina, japani ja korea) parempaan käsittelyyn;
* **e-upTeX**: e-TeXin ja upTeXin yhdistelmä (fuusio).

#### e-upTeXin koostetun lähdetiedoston luominen

Luodaksesi e-upTeXin koostetun WEB-lähdetiedoston (SyncTeXin kanssa) aloitat Knuthin `tex.web` mutta sinun on otettava käyttöön **26** yksittäiset muutostiedostot seuraavassa järjestyksessä, jotta syntyy yksi koostettu tiedosto, josta peruskomentojen luettelo voidaan poimia:

```
etex.ch, tex.ch0, tex.ch, tex.ech, etex.ch0,
ptex-base.ch, uptex-m.ch, euptex.ch0, eptex.ech,
etex.ch1, euptex.ch1, synctex-def.ch0, synctex-ep-mem.ch0,
synctex-mem.ch0, synctex-e-mem.ch0, synctex-ep-mem.ch1,
synctex-p-rec.ch0, synctex-rec.ch0, synctex-rec.ch1,
synctex-e-rec.ch0, synctex-p-rec.ch1, fam256.ch,
pdfstrcmp-eup-pre.ch, pdfutils.ch, pdfstrcmp-eup-post.ch,
tex-binpool.ch
```

#### Muutostiedostojen käyttäminen: mitä tiedostoja ja missä järjestyksessä?

Kuten todettu, muutostiedostot on ehdottomasti otettava käyttöön/käsiteltävä tiukassa järjestyksessä — mutta miten saat selville, mitä tiedostoja tarvitaan ja missä järjestyksessä ne käsitellään? Onneksi tämä ratkaiseva tieto on tallennettu TeX Live -jakeluun sisältyviin tiedostoihin, ja TeX Live -lähdekoodin tutkiminen paljasti säännöt, jotka ohjaavat kunkin TeX-moottorin rakennusvaatimuksia. Näitä sääntöjä noudattamalla Overleaf pystyi rekonstruoimaan kunkin TeX-moottorin koostetun WEB-lähdekooditiedoston ja poimimaan peruskomentoluettelon jatkokäsittelyä varten.

## Ja lopuksi: miten peruskomentoluettelo poimitaan?

Kun koostettu WEB-tiedosto on rakennettu, peruskomentoluettelon poimiminen säännöllisiä lausekkeita käyttäen on suoraviivaista, koska kaikki peruskomennot määritellään (“rekisteröidään”) yhden Pascal-funktion avulla nimeltä `primitive(...)`. Tässä on todellisia esimerkkejä Knuthin `tex.web` lähdekoodista:

```
primitive("lineskip",assign_glue,glue_base+line_skip_code)
primitive("baselineskip",assign_glue,glue_base+baseline_skip_code)
primitive("parskip",assign_glue,glue_base+par_skip_code)
primitive("abovedisplayskip",assign_glue,glue_base+above_display_skip_code)
primitive("belowdisplayskip",assign_glue,glue_base+below_display_skip_code)
primitive("abovedisplayshortskip",assign_glue,glue_base+above_display_short_skip_code)
...
...
```

Kuten näet, `primitive(...)` funktio soveltuu erittäin hyvin tekstinkäsittelyyn säännöllisillä lausekkeilla: rekisteröitävän peruskomennon nimi on lainausmerkeissä (`"..."`) yhdessä lisätietojen kanssa, jotka luokittelevat kunkin peruskomennon käyttäytymisen (emme käsittele sitä yksityiskohtaisesti). Kun kunkin moottorin peruskomentoluettelo oli poimittu, Lua-skriptit käsittelivät nämä tiedot ja tuottivat HTML:n, joka sisältää taulukoidut tulokset.

### Palatkaamme LuaTeXiin

Olemme todenneet, että LuaTeX ei käytä täsmälleen samoja rakennusprosesseja kuin muut 8 TeX-moottoria. Kun olemme lyhyesti tarkastelleet Web2C-prosessia, Pascalin muuntamista C:ksi ja muutostiedostomekanismia, voimme nyt selittää, missä LuaTeX eroaa: LuaTeXin kehittäjät päättivät luopua vaivalloisesta Pascalin muuntamisesta C:ksi — kuten [LuaTeXin viiteoppaassa](http://www.pragma-ade.com/general/manuals/luatex):

> ...käännöskehys on web2c, ja käytämme sitä edelleen, mutta ilman Pascalista C:hen -vaihetta.

LuaTeXin ydinputki kirjoitettiin uudelleen C:llä, mikä tarkoittaa, että sen rakennusprosessi on jonkin verran tavanomaisempi ja varmasti paljon kätevämpi. Yksi hyödyllinen seuraus on, että LuaTeXin tukemat peruskomennot on siististi erotettu omaan C-kieliseen lähdekooditiedostoonsa, mikä helpotti huomattavasti niiden käsittelyn/luetteloinnin tehtävää.

Tarkkaan ottaen on myös huomattava, että jotkin LuaTeXin lähdekooditiedostot käyttävät Knuthin selittävän ohjelmoinnin muunnelmaa, jota kutsutaan [CWEB](https://en.wikipedia.org/wiki/CWEB), joka perustuu C:hen eikä Pascaliin.

### Ei vain WEB-tiedostoja: myös muuta lähdekoodia tarvitaan

Kun minkä tahansa TeX-moottorin (LuaTeXiä lukuun ottamatta) koostettu WEB-lähdetiedosto on luotu, Pascal-lähdekoodi on poimittava ja muunnettava C-koodiksi, mutta se ei vielä ole täydellinen ratkaisu. WEB-lähteestä (Pascal⮕C) tuotetun C-koodin lisäksi useimmat TeX-moottorit tukeutuvat myös useisiin lisäapulähdetiedostoihin (kirjastoihin), jotka on tyypillisesti kirjoitettu C:llä—kuten [Kpathsea](https://www.tug.org/kpathsea/). Apulähdetiedostot (kirjastot) toteuttavat toiminnallisuutta, jota ei tarvitse tai ei voida kirjoittaa WEB:llä (Pascalilla). Kaiken TeXin WEB-“kielellä” kirjoitetun on käytettävä Pascal-kieltä, joka poimitaan myöhemmin ja muunnetaan koneen tuottamaksi C:ksi: jos sinun ei tarvitse tehdä niin, miksi et kirjoittaisi sitä alun perinkin yksinkertaisesti C:llä tai C++:lla.


---

# 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/18-how-overleaf-created-the-tex-primitive-reference-data.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.
