> 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/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Johdanto LuaTeXiin (Osa 1): Mikä se on — ja mikä tekee siitä niin erilaisen?

LuaTeX on *työkalupakki*—se sisältää kehittyneitä ohjelmistotyökaluja ja -komponentteja, joiden avulla voit rakentaa (ladella) laajan valikoiman asiakirjoja. Tämän artikkelin alaotsikko esittää myös kaksi kysymystä LuaTeXistä: mitä se on — ja mikä tekee siitä niin erilaisen? Vastaus kysymykseen “Mitä se on?” saattaa vaikuttaa ilmeiseltä: “Se on TeX-ladontaohjelma!” Niin se onkin, mutta laajempi näkemys, jota tämä kirjoittaja kannattaa, on että LuaTeX on äärimmäisen monipuolinen TeX-pohjainen *dokumenttien rakentamis- ja suunnittelujärjestelmä*.

### LuaTeXin selittäminen: mistä aloittaa?

Tämän ensimmäisen LuaTeXia käsittelevän artikkelin tavoitteena on tarjota konteksti sen ymmärtämiselle, mitä tämä TeX-moottori tarjoaa ja miksi/miten sen suunnittelu mahdollistaa käyttäjille laajan valikoiman ratkaisuja monimutkaisiin ladonta- ja suunnitteluongelmiin — ehkä myös tarjoten jonkinasteista “tulevaisuuden kestävyyttä”, kun käyttäjät tarvitsevat yhä enemmän TeX-pohjaista ohjelmistoa, joka kykenee mukautumaan alati muuttuvaan tekniseen ekosysteemiin. Tämän kirjoittajan mielestä sen ominaisuuksien/kyvykkyyksien listaaminen ja kuvaileminen ei välttämättä ole paras paikka aloittaa, kun pyritään ymmärtämään LuaTeXin kyvykkyyksiä ja potentiaalia. Tällainen lähestymistapa ei ole erityisen hyödyllinen lukijoille, jotka eivät tunne muita TeX-moottoreita ja joille ominaisuuksiin perustuvat vertailut eivät todennäköisesti ole erityisen merkityksellisiä.

Lukijan kärsivällisyyden vaarantamisen kustannuksella (“Pääse nyt asiaan!”) aion lähestyä asiaa enemmän “kokonaisvaltaisesti”, toivottavasti tarjoten hyödyllistä taustaa, mutta hieman lisälukemisen — ja muutaman ohjelmointiaiheen läpikäymisen — hinnalla ymmärtämisen tueksi. Tässä [Osa 2](/latex/fi/syvalliset-artikkelit/09-an-introduction-to-luatex-part-2-understanding-directlua.md) tutkimme käyttämistä `\directlua` mutta tällä hetkellä pyrimme luomaan perustan LuaTeXin ymmärtämiselle.

Tämä artikkeli heijastaa vahvasti kirjoittajan henkilökohtaista “matkaa” LuaTeXin ymmärtämisen ja arvostamisen kehittämisessä: kun ensin tietää jotakin LuaTeXin kehityksen taustalla olevasta filosofiasta ja näkee sen ohjelmistotyökalujen kokoelmana, arvostaa paremmin tämän hämmästyttävän ohjelmiston avaamia laajoja ratkaisualoja.

## LuaTeX: Ei vain akateemiseen käyttöön tai matematiikkaan!

LuaTeXiin rakennetut runsaat ominaisuudet ja toiminnallisuus tarjoavat paitsi poikkeuksellisen korkealaatuista ladontaa perinteisen LaTeXin kautta myös valtavasti mahdollisuuksia kehittää räätälöityjä, ei-LaTeX-pohjaisia ratkaisuja monimutkaisiin asiakirjatuotannon ja -suunnittelun ongelmiin. LuaTeXiin on upotettu tehokas Lua-skriptikieli, mikä tarkoittaa esimerkiksi sitä, että voit käyttää Luaa “lisäosien” (ulkopuolisten ohjelmistokirjastojen) lataamiseen LuaTeXiä varten; tämä mahdollistaa entistä korkeamman automaatiotason, integroinnin olemassa oleviin ohjelmistojärjestelmiin tai työnkulkuihin sekä erikoistuneen ohjelmiston hyödyntämisen datan, tekstin tai grafiikan käsittelyssä.

Historiallisesti TeX on liitetty tieteelliseen kirjoittamiseen/julkaisemiseen, erityisesti matematiikkaan, mutta LuaTeXillä erityisesti on merkittävää potentiaalia monilla muillakin aloilla — mukaan lukien kaupallinen PDF-asiakirjatuotanto. Yksi tällainen esimerkki on [speedata publisher](https://speedata.github.io/publisher/) joka käyttää LuaTeXia pelkästään PDF:n tuottomoottorina XML-pohjaisessa työnkulussaan — se ei käytä LaTeXia lainkaan. Itse asiassa speedata publisher sisältää käytännössä ei lainkaan TeX-koodia — kysyin [Patrick Gundlach](https://twitter.com/patrickgundlach)speedata publisherin kehittäjältä, joka vahvisti, että yhteensä siinä käytetään noin kolme riviä TeX-koodia. Sen tehokkaat ladontaominaisuudet on suunniteltu ja toteutettu Lua-koodilla LuaTeXin Lua-APIa käyttäen (aihetta käsittelemme myöhemmin tässä artikkelissa).

## Lyhyt henkilökohtainen tarina: miten löysin LuaTeXin ensimmäisen kerran

Kuulin LuaTeXistä ensimmäisen kerran loppuvuodesta 2009/alkuvuodesta 2010, kun se oli vielä keskimmäisessä beta-vaiheessa (versio 0.50). Tuolloin etsin TeX-pohjaista ohjelmistoa käsin kirjoitettujen muistiinpanojeni ladontaan, jotka syntyivät arabian opiskeluyritysteni tuloksena. Google-haut paljastivat kokoelman videoita TUG 2009 -konferenssista ([nyt YouTubessa](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) joihin sisältyi erittäin laadukkaan arabian ladonnan esittelyjä (Hans Hagenin [ConTeXt-paketin](http://wiki.contextgarden.net/Main_Page)). Nuo videot sisältävät myös esityksen nimeltä [LuaTeX-projekti: puolivälissä versioon 1](https://youtu.be/AKv4po9PGW0).

Tämän upean arabian ladonnan tuottamiseen käytetty TeX-moottori oli nimeltään “LuaTeX”. Tuolloin työskentelin tieteellisessä (fysiikan) julkaisutoiminnassa, mutta vaikka olin täysin perillä TeXistä/LaTeXista, en ollut kuullut LuaTeXistä: se kiinnosti minua ja halusin oppia lisää tästä uudesta TeX-moottorista. Koska LuaTeX oli yhä beta-kehitysvaiheessa ja kehittyi nopeasti, halusin pysyä ajan tasalla aivan viimeisimmistä päivityksistä, joten paras vaihtoehto (minulle) oli tee-se-itse-reitti: LuaTeX-suoritettavan tiedoston rakentaminen (kääntäminen) sen lähdekoodista. Suoritettavan LuaTeX-ohjelman lisäksi tarvitset myös “TeX-asennuksen”, joka tarjoaa ympäristön LuaTeXin ajamiseen (esim. texmf.cnf, makropaketit, fontit jne.). Sen sijaan, että olisin ladannut ja asentanut valtavan [TeX Live](https://www.tug.org/texlive/) jakelun, päätin luoda täysin minimaalisen mukautetun TeX-asennuksen, jonka avulla voisin tutkia LuaTeXia (”kiinnostava” harjoitus, jonka minä [dokumentoin henkilökohtaisessa blogissani](http://www.readytext.co.uk/?cat=30)). Jokaisen uuden LuaTeX-julkaisun mukana tulee sen viitemanuaali (esim.[versiolle 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)), joka dokumentoi ohjelmiston uusimmat ominaisuudet ja toiminnallisuuden. Se on kuitenkin *viite* manuaali ja (väistämättä) melko niukka selityksiltään aloittelijalle, joka haluaa päästä alkuun tämän uskomattoman TeX-moottorin kanssa — oletetaan tiettyä perehtyneisyyttä TeX:n matalan tason käsitteisiin. Koska olin löytänyt LuaTeXin sen kehityksen suhteellisen varhaisessa vaiheessa, hyvää johdantomateriaalia oli tuolloin melko vaikea löytää, joten palasten loksahtaminen paikoilleen vaati hieman tutkiskelua, kokeilua (ja jonkin verran turhautumista…) ennen kuin kokonaisuus alkoi hahmottua. Sanomattakin on selvää, että arabian opintoni pysähtyivät äkillisesti, kun hurmaannuin tästä upeasta ohjelmistosta ja siirryin lopulta kirjoittamaan LuaTeX [lisäosia arabian ladontaan](http://www.readytext.co.uk/?p=3143) sen sijaan!

Oma “LuaTeX-matkani” oli varmasti hyvin epälineaarinen, mutta matkan varrella se tarjosi mahdollisuuden oppia (Lua)TeXistä (ja TeX-asennuksista) “alusta alkaen”: blogini isännöi eklektistä kokoelmaa [artikkeleihin](http://www.readytext.co.uk/?cat=3) perustuen erilaisiin aiheisiin, joita tutkin ja joiden parissa työskentelin tuona aikana. Toivottavasti tämä artikkeli hyödyntää tuota aikaa ja kokemusta asianmukaisesti ja auttaa muita kiinnostumaan LuaTeXin ominaisuuksien tutkimisen aloittamisesta. LuaTeXia kehitetään edelleen, ja kirjoitushetkellä se on saavuttanut version 1.0.4, joka julkaistiin TeX Live 2017:n mukana. Kehittäjät ovat erittäin aktiivisia, ja kaikki löydetyt bugit korjataan yleensä pian ilmoittamisen jälkeen — esimerkiksi [dev-luatex-postituslistan](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) tai kautta [online LuaTeX-bugiseurannan](http://tracker.luatex.org/my_view_page.php). Kauan ennen kuin se saavutti version 1.0 LuaTeX oli tuotantokelpoinen — vaikka tietenkin piti hyväksyä, että ominaisuudet kehittyivät jatkuvasti ja että toisinaan muutokset saattoivat rikkoa olemassa olevan TeX-koodisi. Nykyään LuaTeXia tukevat tietenkin Overleaf- ja ShareLaTeX-alustat (LuaLaTeXina).

## TeX muuttuvassa maailmassa: uudet teknologiat ja työnkulut

On selvää, että TeX-moottorit eivät toimi teknologisesti staattisessa maailmassa, ja toisinaan esiin nousee innovaatioita, jotka ovat välittömiä ja ilmeisiä ehdokkaita TeX-moottoreihin sisällytettäviksi — yksi tällainen innovaatio on OpenType-muuttuvat fontit, joita käsittelemme lyhyesti alla. Vaikka TeX-pohjaisen ladontaohjelmiston monipuolisuudesta ei ole juurikaan epäilystä, TeX-moottorit toimivat nykyään nopeasti muuttuvassa ja hyvin monimuotoisessa ohjelmistoekosysteemissä — uudet työnkulut korostavat integraation tarvetta ja joustavuutta toteuttaa laaja valikoima asiakirja-/ladontaratkaisuja, joista TeX saattaa olla vain yksi osa.

TeX:n on pysyttävä relevanttina paitsi nykyisille käyttäjilleen myös houkuteltava uusia käyttäjiä mahdollistamalla sisällöntuotantoratkaisut, jotka säilyvät hyödyllisinä tuleville sukupolville — ihmisille, jotka eivät välttämättä halua käyttää TeXiä erillisenä työkaluna vaan ehkä osana kokonaisvaltaista työnkulkua verkossa toimivien yhteistyöalustojen, kuten Overleafin, kautta.

Jo lyhyt vilkaisu [tex.stackexchange](https://tex.stackexchange.com/) osoittaa valtavan moninaisuuden asiakirjoja ja ratkaisuja, joita tuotetaan ja toteutetaan TeX-pohjaisella ohjelmistolla — usein uskomatonta kekseliäisyyttä osoittaen, kun ihmiset löytävät yhä uusia käyttötapauksia ja sisältötyyppejä, joita he haluavat generoida. Lisäksi tarve työnkuluille, jotka voivat käsitellä TeX-pohjaista merkintää/sisältöä tuottaakseen muita kuin PDF- (ja muita kuin DVI-) tuloksia, ei ole koskaan ollut suurempi — kuten MathML/XML ja HTML. Esimerkiksi TeX:n “muuntaminen” [JATS XML](https://jats.nlm.nih.gov/) -muotoon (jota on pitkään käytetty tieteellisten aikakauslehtien julkaisemisessa) mutta myös viime aikoina ePubin nousu e-kirjojen julkaisemisessa.

### Muuttuvien fonttien teknologia — ajat muuttuvat

14\. syyskuuta 2016 Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) ja Apple ilmoittivat uudesta fonttiteknologiasta: [OpenType-muuttuvat fontit](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Emme perehdy tähän teknologiaan yksityiskohtaisesti, mutta riittää todeta, että arvostetut fonttiasiantuntijat kuten [Thomas Phinney](https://twitter.com/ThomasPhinney) ja [John Hudson](https://twitter.com/TiroTypeworks) ovat todenneet ([Twitterissä](https://twitter.com/ThomasPhinney/status/917087509342851072)), että muuttuvien fonttien teknologia omaksutaan paljon nopeammin kuin monet aiemmat fontti-innovaatiot — todennäköisesti taustalla ovat verkkosuunnittelijoiden tarpeet responsiivisille suunnitelmille, jotka mukautuvat mobiililaitteissa esiintyvien lukuisten erilaisten näytön kokojen/resoluutioiden mukaan.

On selvää, että OpenType-muuttuvat fontit ovat kiinnostava ja innostava kehitysaskel fonttiteknologioissa, josta TeX-käyttäjät voisivat epäilemättä hyötyä — itse asiassa tätä kysymystä on väistämättä [nostettu esiin tex.stackexchange-sivustolla](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) ja LuaTeXin tukiä on käsitelty LuaTeXin [postituslistalla](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

Sivuhuomautuksena kannattaa todeta, että “parametriseen” fonttien luontiin perustuva fonttiteknologia ei ole täysin uusi ajatus: Knuthin METAFONT ja Adoben Multiple Master -teknologiat ovat tietyissä mielissä varhaisia esiasteita, vaikka toteutuksen yksityiskohdat ovatkin varsin erilaisia.

### Muuttuvat fontit: milloin haluamme ne — nytkö?

Jokainen uusi ja hyödyllinen teknologian standardi/määrittely tarvitsee aikaa “juurtuakseen” kohde-ekosysteemiinsä kehittäjineen ja toteuttajineen — mukaan lukien aikaa poistaa mahdolliset epäselvyydet tai sanamuotojen tulkinnat itse määrittelystä. Kehittäjien on luettava ja ymmärrettävä dokumentaatio ja muutettava se oikeaksi toimivaksi ohjelmistoksi — mikä tässä sisältää fonttien ja niitä käyttävien teknologioiden luomisen: yhteensopivat selaimet ja ladontaohjelmistot. TeX-kehittäjät tarvitsevat selvästi käyttöönsä korkealaatuisia muuttuvia fontteja, joita voidaan käyttää luotettavina “vertailukohtina” muuttuvien fonttiteknologioiden tuen toteuttamisessa (ohjelmoinnissa).

Minkä tahansa uuden teknologian, kuten muuttuvien fonttien, toteuttaminen TeXissä nostaa esiin *mahdollisen* tarpeen muokata TeX-moottoreiden sisäosia — tietenkin tarve tehdä niin riippuu kyseisen teknologian luonteesta ja ratkaisevasti siitä, mitä TeXin käyttäytymisen osa-aluetta muutetaan. TeX-moottoreita ei aina tarvitse muokata itse, vaan muutokset voivat koskea vain tukevia/avustavia ohjelmistoja, mukaan lukien ohjelmissa käytetyt “komponentit” (kolmannen osapuolen koodikirjastot). Sisäisesti TeX-moottorit ovat *pirullisen* monimutkaisia — TeX:n lähdekoodin ymmärtäminen niin hyvin, että siihen voi tehdä luotettavia muutoksia, vaatii huomattavaa ja hyvin erikoistunutta asiantuntemusta (jota on hyvin vähän tarjolla). On myös olennaista, etteivät muutokset vaikuta haitallisesti TeX-moottoreiden pitkän aikavälin vakauteen/yhteensopivuuteen — mikä on elintärkeää TeX-yhteisölle ja niille, jotka myöhemmin käsittelevät kirjoittajan (La)TeX-tiedostoja: erityisesti akateemisille kustantajille sekä pilvipohjaisille palveluille kuten Overleaf ja ShareLaTeX.

Monet TeX-käyttäjät ovat todennäköisesti kiinnostuneita hyödyntämään muuttuvia fontteja; esimerkiksi uusien suunnittelumahdollisuuksien toteuttamiseen tai hankalien ladontaongelmien ratkaisemiseen. Joten jossain mielessä tässä on pulma: TeX-käyttäjät haluavat pääsyn uuteen teknologiaan, mutta sen toteutus riippuu hyvin rajallisesta resurssista: kehittäjien määrästä, joilla on pätevyys ja kyky saada se aikaan. TeX:n sisäosien muokkaaminen on vaikeaa ja yleensä mahdollisuuksien mukaan parasta välttää, joten onko olemassa toinen tapa lisätä TeXiinsä uusia ominaisuuksia/kyvykkyyksiä (tiettyihin luokkiin kuuluvia)? Kyllä! ja LuaTeX on valinnut tämän tien.

#### Varhaiset kokeilut: OpenType-muuttuvat fontit ja LuaTeX

LuaTeXin suunnittelu on mahdollistanut nopean kokeilun muuttuvien fonttien teknologiassa. Jo huhtikuussa 2017 LuaTeXia käyttävällä ConTeXt TeX -formaatilla oli [beta-versio](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) joka toteutti OpenType-muuttuvat fontit. Tämä oli mahdollista, koska ConTeXtin fonttituki on rakennettu Lua-koodiin (ja ConTeXtilla on oma Lua-kielellä kirjoitettu fontinlataaja).

## LuaTeX: tausta ja historia

TeX-termeillä LuaTeX on “uusi tulokas”, vaikka sitä on kehitetty aktiivisesti yli 10 vuoden ajan. LuaTeXin verkkosivusto [dokumentoi](http://www.luatex.org/roadmap.html) että LuaTeX sai alkunsa vuonna 2005, ja aktiivisen ja jatkuvan kehityksen uskon alkaneen vuonna 2006. Sen sisäisen monimutkaisuuden ja sen rakentajien ahkeruuden vuoksi LuaTeXiltä todella kului 10 vuotta päästäkseen versioon 1.0, joka oli [sen kehittäjien ilmoittama](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) 27. syyskuuta 2016.

Tuo julkistustiedote sisältää tärkeän periaatejulistuksen:

> “Päätavoitteenamme on tarjota TeXin muunnelma, joka sallii käyttäjien laajennukset ilman tarvetta mukauttaa sisäistä toimintaa.”

Tämä sanamuoto kiteyttää täydellisesti LuaTeXin kehityksen taustalla olevan filosofian ja osoittaa reitin, jonka kautta TeX-pohjainen ohjelmisto voi vastata jo mainitsemiimme haasteisiin: uusien teknologioiden omaksumiseen ja relevanssin säilyttämiseen uusille käyttäjäsukupolville.

On nyt aika käsitellä tämän artikkelin alaotsikossa oleva toinen kysymys: “mikä tekee siitä niin erilaisen”. Tutkimalla merkitystä ilmauksessa “...sallii käyttäjien laajennukset ilman tarvetta mukauttaa sisäistä toimintaa” voimme paremmin ymmärtää, mitä LuaTeX “tuo pöytään”.

## LuaTeX: TeXin “mustan laatikon” avaaminen

Knuthin alkuperäinen TeX-ohjelma on kaikkien nykyisten TeX-moottoreiden yhteinen kantaisä, ja LuaTeX on käytännössä viimeisin evolutiivinen askel: se on johdettu pdfTeX-ohjelmasta, mutta siihen on lisätty joitakin tehokkaita ohjelmistokomponentteja, jotka tuovat mukanaan runsaasti lisätoiminnallisuutta. Kun Knuth kirjoitti TeX-ohjelmiston alkuperäisen version, hän tarjosi myös TeX-kielen sen ladontakäyttäytymisen ohjaamiseen ja ohjelmointiin: käyttäjien ja TeX-makropakettien kehittäjien käyttöön annettiin noin 320 matalan tason komentoa (primitiiviä). Nämä komennot tarjosivat vaihtelevan määrän hallintaa tai vaikutusmahdollisuuksia TeXin ladontakäyttäytymisen tiettyihin osa-alueisiin, mutta suuri osa TeXin sisäisestä toiminnallisuudesta, algoritmeista, päätöksentekoprosesseista, datasta ja tietorakenteista oli käyttäjältä piilossa. Voisi väittää, ettei Knuthin TeX-ohjelma ollut täysin “musta laatikko”, vaan pikemminkin hyvin tummanharmaa — lähdekoodi toki tehtiin saataville, mutta valtaosalle ihmisistä sekin on ymmärrettävyydeltään musta laatikko.

Viittaamme siihen, että TeXin sisäiset prosessit ovat eräänlainen “musta laatikko”; LuaTeX kuitenkin avaa TeX-pohjaiset sisuskalunsa tarjoten käyttäjille/kehittäjille paljon suuremman pääsyn moniin aikaisemmin piilossa olleisiin prosesseihin ja niiden hallintaan, jotka tapahtuvat syvällä TeX-moottorin sisällä. LuaTeX lisää myös monia uusia primitiivikomentoja, jotka mahdollistavat uusien ominaisuuksien hallinnan.

### LuaTeX: johdettu pdfTeXistä, mutta ei käytä pdfTeXin koodia

Tarkkuuden vuoksi on tärkeää huomata, että vaikka kuvasimme LuaTeXin pdfTeXistä johdetuksi, LuaTeX ei suoraan käytä pdfTeXin alkuperäistä ohjelmakoodia. Yksi LuaTeXin kehittäjistä (Taco Hoekwater) teki todella *Herkuleen* urakan kirjoittaa LuaTeXin ydin-TeX-moottori uudelleen puhtaalla, modernilla C-koodilla (CWEB).

#### Historiallinen huomautus

Osittain johtuen Knuthin alkuperäisen TeX-lähdekoodin iästä — josta sen nykyaikaiset jälkeläiset ovat peräisin — sen muokkaaminen uusien TeX-pohjaisten ladontaohjelmien mukauttamiseksi tai luomiseksi on monimutkainen ja mutkikas prosessi. Osa tuosta prosessista vaatii Pascal-koodin muuntamista C-koodiksi — eikä siihen sisälly vain [tiettyä monimutkaisuutta](http://www.readytext.co.uk/?p=2529). Tuloksena syntyvä koneellisesti generoitu C-koodi on äärimmäisen monisanaista ja erittäin vaikeaa lukea tai ymmärtää. On selvää, että LuaTeXin koodin täydellinen uudelleenkirjoittaminen kiertää koko Pascalista C:hen -muunnosprosessin.

## LuaTeXin rakennuspalikat

Johdannossa viittasimme siihen, että LuaTeX on “työkalupakki” ja kuvasimme sitä “asiakirjojen rakentamis- ja suunnittelujärjestelmäksi”. Olemme nähneet, että LuaTeX 1.0 -julkistuksessa sen kehittäjät totesivat:

> “Päätavoitteenamme on tarjota TeXin muunnelma, joka sallii käyttäjien laajennukset ilman tarvetta mukauttaa sisäistä toimintaa.”

Nyt on aika punoa nämä langat yhteen ja keskittää ajatukset siihen, mitä tämä kaikki *oikeastaan tarkoittaa* käytännössä.

### LuaTeXin palapeli

Jos kurkistaisit “pellin alle”, näkisit, että LuaTeX-ohjelmisto, eli varsinainen suoritettava ohjelma, koostuu kokoelmasta ohjelmistokomponentteja, jotka on yhdistetty tuottamaan LuaTeXin kokonaistoiminnallisuus. Tämä ei tietenkään ole mitään uutta, ja suurin osa ohjelmistoista rakennetaan näin. Se, mikä kuitenkin erottaa LuaTeXin muista TeX-moottoreista, on se, että nämä komponentit on yhdistetty siten, että käyttäjille annetaan paljon laajempi pääsy moniin TeXin sisäisen toiminnallisuuden osa-alueisiin: TeXin ladonta-algoritmit, päätöksentekoprosessit, data ja tietorakenteet. Tämä TeXin sisuskalujen avaaminen mahdollistaa käyttäjille uusien ladontaratkaisujen rakentamisen ilman tarvetta muokata itse TeX-moottoria.

### Lua LuaTeXissä: avain “mustaan laatikkoon”

Lua on erittäin tehokas mutta helposti opittava skriptikieli, joka [on peräisin Brasiliasta](https://www.lua.org/about.html)— se luotiin vuonna 1993 ja sitä kehitetään yhä aktiivisesti. Yksi Luan vahvuuksista on sen käyttö ohjelmointikielenä, jolla voidaan “liimata yhteen” erillisiä ohjelmistokomponentteja, jolloin niitä voi käyttää yksinkertaisen mutta monipuolisen skriptikielen kautta. Lua on keskeisessä roolissa LuaTeX-TeX-moottorin sisäisen toiminnan avaamisessa, mutta jotta ymmärtäisimme paremmin, miten tämä saavutetaan, kannattaa tehdä pieni sivupolku ja käsitellä hyvin lyhyesti kahta ohjelmointikäsitettä:

* Sovellusohjelmointirajapinta (API);
* ohjelmointikielen sidonta.

Voit huoletta ohittaa tämän osion, jos nämä käsitteet ovat sinulle tuttuja. Mitään näistä aiheista ei käsitellä yksityiskohtaisesti — emme pyri tiukkaan tekniseen täsmällisyyteen, vaan tarjoamaan juuri sen verran taustaa, että näiden käsitteiden merkitys ja relevanssi LuaTeXille tulee selväksi.

### Sovellusohjelmointirajapinta (API)

Kuvittele, että olet ohjelmoija, joka on kirjoittanut koodia, josta käyttäjät (muut ohjelmoijat) saattaisivat pitää hyödyllisenä, mutta koodisi on monimutkaista etkä halua käyttäjien joutuvan huolehtimaan niistä matalan tason yksityiskohdista. Huomaa, että nuo ohjelmoijat/kehittäjät käyttävät samaa ohjelmointikieltä, jolla kirjoitit koodisi. Lisäksi oletetaan, että suunnittelet kirjoittavasi joitakin osia koodistasi uudelleen — esimerkiksi nopeammaksi, vähemmän muistia vieväksi ja niin edelleen. Nykyisten käyttäjien ei pitäisi joutua huolehtimaan siitä: minkään suunnittelemasi muutoksen ei pitäisi rikkoa heidän ohjelmiaan. Mikä siis on ratkaisu?

Vastaus löytyy API:sta: eli *sovellusohjelmointirajapinnasta*. Sen sijaan, että vaatisit käyttäjiä (muita ohjelmoijia) pääsemään käsiksi koodisi matalan tason yksityiskohtiin — jotka saattavat muuttua — tarjoat tietyn joukon *funktioita* joita muut ohjelmoijat voivat käyttää. Nuo funktiot ovat *rajapinta* koodillesi, jonka kautta muut kehittäjät voivat rakentaa *sovelluksia* ilman että heidän tarvitsee tuntea ohjelmasi sisäistä toimintaa perusteellisesti. Tavallaan tämän voi ajatella ylimääräisenä kerroksena, joka ympäröi koodisi ja “eristää” käyttäjät sotkuisista matalan tason yksityiskohdista.

Kunhan et muuta noita funktioita (rajapintaa), voit vapaasti muokata ja päivittää ohjelmistosi alemman tason yksityiskohtia vaikuttamatta (rikkomatta) niiden työtä, jotka luottavat koodiisi rakentaakseen sovelluksensa: tästä tulee nimi Application Programming Interface.

#### API:t: LaTeX-paketin analogia

Kun käytät LaTeX-paketin tarjoamia komentoja, voit ajatella paketin komentoja eräänlaisena API:na. Käyttäjänä sinun ei välttämättä tarvitse välittää näiden komentojen taustalla olevasta TeX- ja LaTeX-taikuudesta (eli paketin koodissa): haluat vain hyödyntää niiden tarjoamaa toiminnallisuutta.

### Ohjelmointikielen sidonta

Olemme nähneet, että ohjelmoijat, jotka kirjoittavat/julkaisevat hyödyllisen koodikokonaisuuden (jota kutsutaan *kirjastoksi*), voivat tarjota niin sanotun sovellusohjelmointirajapinnan (joukon funktioita), jonka kautta muut ohjelmoijat, käyttäen *samaa* ohjelmointikieltä, voivat käyttää kyseistä kirjastoa (koodikokoelmaa). Tämä on aivan hyvin silloin, kun molemmat osapuolet (kirjaston kehittäjä ja sen käyttäjät) käyttävät *samaa* ohjelmointikieltä, mutta mitä tapahtuu, jos ohjelmoijat, jotka käyttävät *eri* ohjelmointikieltä haluavat myös käyttää kyseistä kirjastoa? Voit esimerkiksi kirjoittaa skriptejä Lua-kielellä, mutta haluat hyödyntää kirjastoa, joka on kirjoitettu esimerkiksi C/C++-kielillä. Jollakin tavalla näiden kahden eri ohjelmointikielen (Lua ja C/C++) täytyy pystyä “kommunikoimaan” keskenään. Yksi ratkaisu tähän ongelmaan on niin sanottu [kielisidonta](https://en.wikipedia.org/wiki/Language_binding).

Kielisidonnan teknisten yksityiskohtien tarkastelu on tämän artikkelin ulkopuolella, joten annamme tiiviin yhteenvedon yleisistä periaatteista. Pohjimmiltaan, lisäämällä alkuperäiseen kirjastoon sopiva ylimääräinen koodin “kerros” se voi “kommunikoida” toisen ohjelmointikielen (kuten Luan) kanssa: tuota koodikerrosta kutsutaan *sidonnaksi*. Se mahdollistaa kahden kielen yhteistoiminnan API:n kautta, jonka välityksellä toisen kielen (kuten Luan) ohjelmoijat voivat käyttää kirjaston tarjoamia ominaisuuksia/palveluja.

![Kaaviokuva, joka havainnollistaa kielisidonnan käsitettä.](/files/0e5c4f4a31d89a859399bbad7e19b857eb92788f)

**Kuva 1**: Kaaviokuva, joka havainnollistaa kielisidonnan käsitettä: mahdollistaa Lua-kielellä kirjoitetun ohjelman käyttää toisella ohjelmointikielellä kirjoitettua ulkoista kirjastoa. Lua-sidontojen avulla LuaTeXin sisäiset komponentit ja siten suuri osa LuaTeXin sisäisestä ladontatoiminnallisuudesta tehdään käyttäjille saataville, jotta he voivat kehittää ratkaisuja monimutkaisiin ladontaongelmiin.

## LuaTeX: kaksi ohjelmointivaihtoehtoa — TeX ja Lua

Pohjimmiltaan LuaTeX on TeX-moottori, joka tukee kahta ohjelmointikieltä: perinteistä TeX-pohjaista kieltä ja Lua-skriptikieltä. Voit tietenkin käyttää molempia kieliä samassa TeX-asiakirjassa tai, jos haluat, jatkaa ladontaa pelkästään TeX-reittiä pitkin: esimerkiksi LaTeX-makropaketin (LuaLaTeX) kautta. TeX (tai LaTeX) ei ole helppo ohjelmointikieli käyttää tai oppia, ja suhteellisen harvat ovat todella hallinneet TeXin monia erikoisuuksia — TeXin käsitteet [tokenit](https://www.overleaf.com/blog/522-what-is-a-tex-token) ja laajennus ovat melko vieraita useimpien ihmisten odotuksille ja kokemuksille ohjelmointikielestä.

Luan lisääminen avaa mahdollisuuden käyttää TeX-pohjaista ladontaa paljon helpommin lähestyttävän ja tavanomaisemman ohjelmointikielen kautta — kuten tämän artikkelin alussa todettiin, käyttämällä Lua-APIa voit tehdä [kehittynyttä ladontaa käytännössä ilman TeX-koodia](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX lisää monia uusia primitiivejä

Jokainen TeX-moottori tarjoaa satoja niin sanottuja primitiivikomentoja: TeX-pohjaisen kielen perusrakennuspalikoita, joita kukin ladontaohjelma tukee. Donald Knuthin julkaisema TeXin alkuperäinen versio tarjosi noin 320 komentoa, mutta uudemmat TeX-moottorit (pdfTeX, XeTeX ja LuaTeX) ovat kukin lisänneet monia uusia primitiivejä tarjotakseen käyttäjille pääsyn kunkin moottorin lisäominaisuuksiin ja toiminnallisuuteen. LuaTeXin huomattava määrä uusia primitiivejä on dokumentoitu sen [viitemanuaalissa](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

LuaTeXin esittelemien monien uusien primitiivien joukossa on kerran nimeltä `\directlua{...}` joka on portti Lua-koodin käyttöön: sen kautta pääsee käsiksi LuaTeX-moottorin sisuksiin kehittyneiden ladontatyökalujen ja -ratkaisujen rakentamiseksi.

### \directlua{...}: portti Lua-ohjelmointiin

Kuten todettiin, Lua-skriptikieltä voidaan pitää “kerroksena”, jonka kautta on mahdollista päästä käsiksi LuaTeXin TeX-pohjaiseen ladontamoottoriin ja monien niiden komponenttien tarjoamaan toiminnallisuuteen, joista LuaTeX koostuu. Lua-kieli on myös mekanismi, joka mahdollistaa LuaTeXin laajennettavuuden — Luan kyvyn kautta ladata erikoistuneita ulkoisia ohjelmisto-/koodikirjastoja.

Yhdessä LuaTeXin tarjoamaa Lua-rajapintaa (Lua-pohjaisten funktioiden joukkoa) kutsutaan sen *Lua APIksi*: se on “viestintäyhteys” LuaTeXin sisäisen moottorin/komponenttien ja käyttäjän asiakirjan välillä.

### Yksinkertainen esimerkki \directlua{...}:sta

Seuraavat *äärimmäisen yksinkertainen* esimerkki ei edes raapaise pintaa mahdollisuuksien jäävuoren huipusta. Se kuitenkin havainnollistaa perusajatuksen TeXin parametrien käyttämisen “TeX-tavan” ja “Lua-tavan” vuorovaikutuksesta.

Huomaa, että:

* `\hsize` on TeXin primitiivi (komento), joka asettaa sisäisen parametrin arvon, joka määrittää ladattujen rivien leveyden — esimerkiksi asetat sen yleensä sopivaan arvoon `\vbox{...}`. `\hsize` on vain yksi *monien* TeX-parametreista, joita voit käyttää ja/tai muokata Lua-koodilla.
* TeX-parametrien käyttäminen on vain yksi *pieni* LuaTeXin Lua API:n osa-alueista: paljon muutakin on!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %määritä \\:n merkitys uudelleen laajenemisongelmien välttämiseksi
Tässä on {\ttfamily\string\hsize}:n nykyinen arvo (LaTeXin kautta):
\the\hsize\par
\directlua{
%Hae \hsize:n nykyinen arvo Lua API:n avulla
local hs=tex.hsize
% Käytä Lua API -funktiota tulostaaksesi joitakin
% LaTeX-koodia ja \hsize:n arvon
tex.print("Tässä on {\\ttfamily\\string\\hsize}:n arvo
Lua-koodista ilmoitettuna (skaalattuina pisteinä): ")
tex.print(hs+"\\par")
% Aseta uusi arvo \hsize:lle Lua APIa käyttäen
tex.hsize="400pt" % tai käytä tex.hsize=400*65536 (skaalattuina pisteinä)
}%
% Kun \directlua on päättynyt, pyydä LaTeXia
% kertomaan meille \hsize:n uusi arvo
Tässä on {\ttfamily\string\hsize}:n arvo, joka on ilmoitettu
\LaTeX{}:lta sen jälkeen, kun {\tt\string\directlua} on päättynyt:
\the\hsize\par
\end{document}
```

Tässä on kuva, joka näyttää LuaTeXin tuottaman tuloksen yllä olevalle LaTeX-koodille:

![LuaTeXin ajon tulokset](/files/32a7478df91764c30a6d672a6d04e9a976df28b0)

Huomaa, että TeXin “kikailu” `\let\\\relax` on tarkoitettu välttämään ongelmia, joita LuaTeXin tekemä Lua-koodin “laajennus” aiheuttaa: aiheeseen viittaamme lyhyesti alla.

### Lua-koodin käyttäminen

Lua-koodin käyttämiseen TeX-/LaTeX-asiakirjoissasi on kaksi päävaihtoehtoa:

1. **Sisäisesti**: Lua-koodin kirjoittaminen suoraan `.tex` asiakirjaasi (kuten yllä olevassa esimerkissä);
2. **Ulkoinen**: Lua-koodin tallentaminen ulkoisiin `.lua` kooditiedostoihin ja Luan tarjoamien toimintojen käyttämiseen niiden lataamiseen ja suorittamiseen.

Vaihtoehto (1) sopii parhaiten lyhyille Lua-koodin fragmenteille. Vaihtoehtoa (2) käytetään suurempiin ohjelmiin tai Lua-koodikirjastoihin. Sen selvä etu on, että voit välttää hankalia ongelmia, jotka liittyvät TeXin niin sanottuihin `\catcode` arvoihin (mikä voi olla “varsin turhauttavaa”). Syy näihin `\catcode` ongelmiin on Lua-koodin “laajentuminen” ennen sen syöttämistä LuaTeXin sisäänrakennettuun Lua-tulkkiin. Tätä laajentumista voi olla hankala ymmärtää, joten tutkimme sitä tarkemmin myöhemmässä artikkelissa.

Tietenkin on olemassa LaTeX-paketteja, jotka auttavat Lua-koodin käyttämisessä .tex-tiedostoissasi — esimerkiksi voit käyttää [luacode-pakettia](https://ctan.org/pkg/luacode?lang=en).

## Yhteenveto ja tämän artikkelin osan 2 esittely

LuaTeXin muodostavat ohjelmistokomponentit yhdessä upotetun Lua-skriptauskielen kanssa tarjoavat tehokkaan yhdistelmän ratkaisujen rakentamiseen, jotka pystyvät ratkaisemaan laajan joukon monimutkaisia ladontaongelmia — sekä suunnittelemaan asiakirjatuotannon työnkulkuja, jotka voivat hyötyä tiiviistä integraatiosta TeX-pohjaisen ladontaohjelman kanssa. Tässä [Tämän artikkelin osa 2](/latex/fi/syvalliset-artikkelit/09-an-introduction-to-luatex-part-2-understanding-directlua.md) tutustumme perusteellisesti LuaTeXin tarjoamaan tehokkaimpaan komentoon: `\directlua`.

Siihen asti, hauskaa LuaTeXailua!

## Kiitokset

Kirjoittaja on erittäin kiitollinen [Luigi Scarso](https://twitter.com/luigi_scarso), joka on yksi LuaTeXin kehittäjistä, siitä että hän käytti aikaa tämän artikkelin luonnoksen lukemiseen ja teki useita erittäin hyödyllisiä kommentteja ja ehdotuksia. Mahdolliset jäljellä olevat asiavirheet tai puutteet ovat tietenkin kirjoittajan. Lisäksi haluaisin kiittää [Patrick Gundlach](https://twitter.com/patrickgundlach), kehittäjä [speedata publisher](https://speedata.github.io/publisher/), siitä että hän käytti aikaa vastatakseen kysymyksiini.


---

# 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/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.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.
