> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# Pandoran \hbox: LuaTeXin käyttö TeX-laatikoiden kannen avaamiseen

## Johdanto

Laatikot ja liima ovat kaksi keskeistä käsitettä, jotka muodostavat TeX:n ladontamallin ja ominaisuuksien perustan. Edeten aiemmassa kirjoituksessa esitetystä johdantomateriaalista, [Laatikot ja liima: lyhyt, mutta visuaalinen, johdanto LuaTeXillä](/latex/fi/syvalliset-artikkelit/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), tässä runsaasti kuvitettu artikkeli tarkastelee laatikoita ja liimaa tarkemmin. Esittelemme myös uuden LuaTeX-pohjaisen [Overleaf-projektin](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) joka antaa sinun tutkia TeX-laatikoiden syvää sisäistä rakennetta — tarjoten oivalluksia, jotka auttavat sinua todella ymmärtämään niiden käyttäytymistä. Overleaf-projektin luomista helpotti suuresti Patrick Gundlachin työ, joten esitämme [hänelle kiitoksemme](#credits-thanks-patrick).

## Miksi valita LuaTeX?

Ensinnäkin on syytä toistaa ero LuaTeXin ja LuaLaTeXin välillä:

* LuaTeX on TeX-pohjaisen ladontaohjelman suoritettavan tiedoston nimi;
* LuaLaTeX viittaa LaTeX-makropaketin käyttöön LuaTeX-moottorin kanssa.

Tämä ero on erittäin tärkeä, koska tässä artikkelissa hyödynnämme itse LuaTeX-moottorin sisäänrakennettuja ominaisuuksia emmekä vain LaTeX-makropaketin tarjoamien komentojen ominaisuuksia/toiminnallisuutta.

Lukijat, jotka ovat epävarmoja erosta TeX-moottorin ja LaTeX-makropaketin välillä, saattavat haluta lukea yhden aiemmin julkaisemistamme artikkeleista, [Mitä nimessä on: opas TeXin moniin muunnoksiin](/latex/fi/syvalliset-artikkelit/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), jossa näitä eroja selitetään melko yksityiskohtaisesti. Samassa artikkelissa käsitellään myös “TeX”:iä ohjelmointikielenä sekä sitä, että TeX-pohjaiset ladontaohjelmat (esim. pdfTeX, XeTeX ja LuaTeX) eivät ainoastaan poikkea ominaisuuksiltaan ja toiminnallisuudeltaan, vaan niillä on myös vaihtelua tukemansa TeX-kielen “murteessa”. Tämä tuo meidät valintaamme LuaTeXin suhteen. TeX-pohjaisen ohjelmointikielen tukemisen lisäksi LuaTeX sisältää myös Lua-komentokielen — tarjoten pääsyn yksinkertaiseen, mutta erittäin tehokkaaseen perinteiseen ohjelmointikieleen. Luan ja LuaTeXin sisäänrakennetun toiminnallisuuden avulla voit tutkia ja ohjata LuaTeXin ladontatoimintoja tavoilla, joihin mikään muu TeX-moottori ei pysty — ja tämä sisältää mahdollisuuden tutkia TeX-laatikoiden sisäisiä rakenteita; siksi LuaTeX on tämän artikkelin ja siihen liittyvän Overleaf-projektin ihanteellinen (ja ainoa) valinta.

### pdfTeX/XeTeX vs LuaTeX: kuvina

Seuraavat *kaaviot* on tarkoitettu korostamaan tärkeää vertailua pdfTeX/XeTeXin ja LuaTeXin suunnittelun välillä. Sekä pdfTeX että XeTeX tietenkin antavat käyttäjien kirjoittaa TeX-koodia, joka voi vaikuttaa ladonnan käyttäytymiseen; kuitenkin näiden TeX-moottoreiden syvemmät sisäiset rakenteet sekä ladontaprosessin aikana muodostuva matalan tason data ovat enimmäkseen käyttäjäkomentojen ja -makrojen tavoittamattomissa. Tässä mielessä ne ovat *suhteellisen* suljettuja järjestelmiä verrattuna LuaTeXiin.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/ff37aff7bb807e0128afc07ffc1d5d2e543c35ac)

#### LuaTeX

LuaTeX esittelee uuden primitiivikomennon nimeltä `\directlua{...}` jonka kautta voit kirjoittaa koodia, joka ei ainoastaan anna täyttä pääsyä Lua-kieleen vaan myös mahdollistaa LuaTeXin ominaisuuksien laajentamisen kirjoittamalla lisäosia käyttäen kieliä kuten C ja C++. Windowsissa tällaisia lisäosia kutsutaan *Dynamic Link Libraries* (.DLL); Linuxissa ne tunnetaan nimellä *Shared Object Libraries* (.so). LuaTeXin todellinen voima perustuu kuitenkin valtavaan joukkoon sisäänrakennettuja Lua-funktioita, jotka tarjoavat pääsyn LuaTeXin sisäosiin — mahdollistaen erittäin kehittyneen TeX-pohjaisen ladonnan hallinnan ja ohjelmoinnin. Tällaisista funktioista käytetään nimeä API (Application Programming Interface), ja juuri LuaTeXin API:n kautta käytät Lua-ohjelmia kommunikoidaksesi sen TeX-pohjaisen ladontaohjelman ja datarakenteiden kanssa.

![{{{alt}}}](/files/9edf2230226a2dabe2f167687320f0d9f79c2ddb)

LuaTeXin `\directlua{...}` komennolla voit esimerkiksi päästä käsiksi muiden TeX-moottoreiden näkymättömissä oleviin matalan tason sisäisiin TeX-datarakenteisiin. Lisäksi voit käyttää Lua-skriptejä kaikenlaisten ohjelmointilaskujen, merkkijonojen käsittelyn jne. suorittamiseen ja välittää tulokset takaisin TeX:lle: mahdollisuuksia on lähes rajattomasti. Tämä artikkeli ei kuitenkaan ole tarkoitettu yksityiskohtaiseksi esitykseksi tai opastukseksi LuaTeXiin — vaikka onkin houkuttelevaa antaa esimerkkejä, jotka välittävät tämän hämmästyttävän tehokkaan TeX-moottorin uskomattoman monipuolisuuden.

## Laatikot ja liima: lyhyt muistutus

Kuten artikkelissa esiteltiin [Laatikot ja liima: lyhyt, mutta visuaalinen, johdanto LuaTeXillä](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) laatikot ja liima ovat kaksi keskeistä käsitettä, jotka tukevat TeX:n ladontaominaisuuksia. Seuraava kaavio on tarjolla hyvin lyhyenä muistilappuna TeX:n vaaka- ja pystysuuntaisten laatikkotyyppien käyttäytymisestä. Huomaa: vaakasuuntaiset laatikot voivat tietenkin sisältää oikealta vasemmalle ladottua tekstiä, kuten arabiaa tai hepreaa, mikä tarkoittaa että laatikon kasvusuunta voi olla vastakkainen kuin alla olevassa kaaviossa vaakalaatikolle näytetty.

![{{{alt}}}](/files/70381b0a140c8eb245658c34ca6be0925238da39)

### TeX:n primitiivit laatikoiden rakentamiseen

Nykyään useimmat ihmiset valmistelevat TeX-dokumenttinsa LaTeX-makropaketilla, joka on suunniteltu tarjoamaan komentoja, jotka eristävät käyttäjät suurelta osin TeX:n matalan tason kielestä — sen niin sanotuista *primitiiveistä*—TeX-moottoreihin sisäänrakennetuista ydinkomennoista (katso artikkeli [Mitä nimessä on: opas TeXin moniin muunnoksiin](/latex/fi/syvalliset-artikkelit/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) TeX-primitiivien käsittelystä). LaTeX-makrokokoelma tarjoaa monenlaisia makroja laatikoiden luomiseen ja tallentamiseen (säästämiseen), mutta jos poistat kaiken makrokoodin, huomaat että on vain 4 matalan tason primitiivikomentoa laatikoiden rakentamiseen:

Vaakalistojen luomiseen:

* \hbox{...}

Pystylistojen luomiseen ja pinoamiseen:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

Emme selitä, miten näitä kaikkia laatikkokomentoja käytetään, koska verkossa tai TeX/LaTeX-kirjoissa on runsaasti esimerkkejä ja oppaita — mutta tarkastelemme sitä, miten laatikot esitetään ja tallennetaan TeX:n datastruktuureissa.

### Liima: joustava väli

Liima on käytännössä TeX:n käyttämä välistysmuoto, jolla sijoitetaan esineitä vaakasuunnassa tai pystysuunnassa. TeX:n käyttäjänä voimme käskeä TeXiä lisäämään tietynkokoista liimaa tai voimme käyttää joustavaa liimaa — jolla on juuri niin paljon joustoa kuin tarvitsemme, joko venyttämiseen tai kutistamiseen tarpeidemme mukaan. Yksi TeX:n vaakaväliä luova komento on nimeltään `\hskip` jolla on muoto

`**\hskip** <luonnollinen leveys> **plus** <venytettävä määrä> **minus** <kutistettava määrä>`

`**plus**` ja `**minus**` ovat TeX-avainsanoja, mutta sinun ei tarvitse käyttää niitä jokaiseen liimaan. Jos `**plus**` tai `**minus**` puuttuvat, vastaavan `<venytettävä määrä>` tai `<kutistettava määrä>` oletetaan olevan nolla. Esimerkiksi, `\hskip 3pt` lisää kiinteän levyisen liiman, jolla ei ole venytys- tai kutistumisosaa.

Ajattele toistaiseksi `<venytettävä määrä>` ja `<kutistettava määrä>` meidän *suosituksinamme* TeX:lle, koska venytyksen tai kutistumisen tarkka määrä lasketaan TeXissä.

Näiden ajatusten hahmottamiseksi tässä on kaavio, joka esittää liiman jousena.  `<luonnollinen leveys>` on jousen pituus silloin, kun siinä ei ole jännitystä (venymistä) eikä puristusta (kutistumista).  `<venytettävä määrä>` ja `<kutistettava määrä>` näytetään suhteessa jousen luonnolliseen pituuteen.

![{{{alt}}}](/files/bab26c7eb5322d16ad5d8bc25460d2e18fa16d6f)

#### Esimerkki \hboxista

Oletetaan, että haluamme luoda `\hbox{...}` joka sisältää vain kirjaimet A, B, C ja D, ja tämän laatikon on oltava 100pt (100 TeX-pistettä) leveä. Lisäksi on turvallista olettaa, että näiden neljän merkin yhteenlaskettu leveys on paljon alle 100pt:n, mikä osoittaa että TeX tarvitsee jonkin tavan täyttää laatikon jäljellä oleva tila: käytämme siihen liimaa. Koska emme kuitenkaan tiedä tarkkaa laatikon täyttämiseen tarvittavaa liiman määrää, on suositeltavaa lisätä joitakin joustavia liimoja ja antaa TeXin huolehtia siitä, kuinka paljon tilaa niiden tulee viedä. Huomaa seuraavassa koodinpätkässä “%”-merkin käyttö sanojen välisten välien estämiseksi rivin lopun merkeistä johtuen.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

Tuloksena saatu laatikko näyttää tältä (suurennettuna selkeyden vuoksi):

![{{{alt}}}](/files/74114f2adb7038c9078c79ddb39418f72279e6ee)

Tämä `\hbox` on päällekkäin asetettu katkoviivalaatikoilla (punaisella) merkkien leveyden osoittamiseksi (sellaisina kuin TeX ne näkee). Ladonnan kannalta merkit katsotaan pieniksi laatikoiksi, ja tämän `\hbox`täyttämiseen tarvittavan liiman määrä määritetään (lasketaan) ottamalla huomioon kunkin merkin leveydet.

Kävi ilmi, että TeX ei venyttänyt eikä kutistanut A:n ja B:n välistä liimaa (asetettu arvoon 4pt), eikä B:n ja C:n välillä ole liimaa (asetettu arvoon 0pt). C:n ja D:n välinen liima sekä D:n ja laatikon lopun välinen liima ovat kuitenkin venyneet huomattavasti, koska näillä liimoilla on joustavin venytyskomponentti — käytännössä ne absorboivat kaiken laatikon täyttämiseen tarvittavan venytyksen.

## Takaisin LuateXiin

Tähän asti olemme tutkineet laatikoita ja liimaa ja nähneet, että LuaTeX antaa pääsyn sisäisiin TeX-rakenteisiin, jotka ovat pdfTeXin ja XeTeXin näkymättömissä. On aika esimerkin, joka tekee tämän selvemmäksi, mutta ensin meidän on lyhyesti tutustuttava siihen, miten TeX tallentaa laatikoita muistiinsa — aloitetaan analogialla.

### Miten TeX tallentaa laatikot muistiin: analogia

Oletetaan, että jostain syystä sinun täytyisi luoda tietomalli, joka kuvaa fyysistä laatikkoa. Millaisia tietoja voisit valita tällaisen kuvauksen tekemiseen? Yksi lähestymistapa olisi jakaa tiedot kahteen osaan: tiedot itse fyysisestä laatikosta ja tiedot, jotka tarjoavat luettelon laatikon sisällöstä. Joten yksinkertainen mallimme voisi näyttää tältä:

1. Tietoja fyysisestä laatikosta (“metatiedot”):

* width
* korkeus
* syvyys
* paino
* väri
* tyyppi (puinen, muovinen, pahvinen)

3. Tietoja laatikon sisällöstä: jonkinlainen luettelo, joka kuvaa sen sisältämät esineet — todennäköisesti ilman erityistä järjestystä.

Ja tähän liittyy hyvin läheinen analogia siihen tapaan, jolla TeX tallentaa laatikot.

### Miten TeX tallentaa laatikot muistiin: hlistit ja vlistit

Sisäisesti TeX luo “säiliöitä”, joita kutsutaan *hlisteiksi* (vaakalistoiksi) ja *vlisteiksi* (pystylistoiksi), jotka vastaavat hboxeja ja vboxeja. Nämä hlist/vlist-oliot tarjoavat kokoelman “metatietoja” laatikosta sekä pääsyn niiden objektien luetteloon, jotka laatikko todella sisältää — tätä luetteloa kutsutaan *nodelistaksi*. Toisin kuin fyysisessä laatikossa, johon voit laittaa esineitä sisään missä järjestyksessä tahansa, TeX:lle laatikon sisällön järjestys on erittäin tärkeä — ne ovat ladottavia kohteita. Jos sinulla on ohjelmointi- tai tietojenkäsittelytausta, sinua ei yllätä kuulla, että TeX-laatikon sisällä olevat objektit tallennetaan ja niiden luontijärjestys säilytetään käyttämällä niin sanottua [kaksisuuntaisesti linkitettyä listaa](https://en.wikipedia.org/wiki/Doubly_linked_list). Emme käsittele linkitettyjä listoja tämän enempää, koska verkossa on runsaasti oppaita, esimerkkejä ja selityksiä.

Solmujen ja nodelistojen käsite on TeX:n toiminnan perusosa, mutta tämän artikkelin tarkoituksia varten annamme vain lyhyen yleiskuvan. Solmut ovat pohjimmiltaan eräänlaisia “minisäiliöitä”, ja (LuaTeX 1.04:stä lähtien) solmutyyppejä on noin 50 erilaista: ne heijastavat sisäisiä tietotyyppejä ja komponentteja, joita LuaTeX käyttää ladontaan. Esimerkiksi on olemassa solmuja, jotka edustavat: glyfejä (jotka syntyvät “merkeistä”), liimaa, vaaka-/pystyviivoja, rangaistuksia, “whatsit”-solmuja, kerniä ja niin edelleen. Kaikki ladottu materiaali muuttuu lopulta osaksi valtavaa nodelistaa, ja LuaTeX antaa sinulle suoran pääsyn näihin sisäisiin datastruktuureihin. LuaTeX antaa myös lisätä, muokata, korjata tai luoda nodelistoja, joten voit esimerkiksi luoda laatikoita suoraan Lua-koodissa ilman että sinun tarvitsee käyttää lainkaan TeX-koodia. Tästä kirjoittaminen on kuitenkin toisen päivän asia.

### Yksinkertainen esimerkki \directlua{...}:n toiminnasta

Seuraava esimerkki luo `\hbox` ja tallentaa sen laatikkorekisteriin 0. Tämän jälkeen ilmoitamme laatikon leveyden perinteisellä TeX-koodilla ja saamme saman tiedon toisella menetelmällä käyttäen `\directlua{}`. Tässä suoritamme pienen Lua-skriptin, joka käyttää TeX:n sisäistä laatikkotallennusaluetta laatikon leveyden saamiseksi — luonnollisesti nämä kaksi arvoa ovat identtisiä: 2412092sp (sp=scaled point: 65536sp = 1 TeX-piste). Viime kädessä tässä äärimmäisen yksinkertaisessa esimerkissä sekä TeX-koodi että Lua-koodi tutkivat samoja sisäisiä datastruktuureja saadakseen laatikon leveyden, mutta juuri suoran pääsyn kautta LuaTeX avaa oven runsaalle tiedolle ja hallinnalle, joka ei ole saatavilla muilla moottoreilla.

![{{{alt}}}](/files/83edf444e4d04b8386eac74bd6d3ebced9c3608b)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent TeX-koodilla laatikon 0 leveys on \number\wd0\relax \space sp\par
\noindent Voimme myös käyttää Luaa ja kutsua yhtä Lua\TeXin funktioista saadaksemme saman
tiedon.\vskip10mm
\noindent Lua-koodista käsin laatikon 0 leveys on
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} joka on tietenkin identtinen \TeX{}-koodilla saadun arvon kanssa.
\end{document}
```

## Kaiken yhdistäminen: Overleaf-projekti

Olemme todenneet, että TeX esittää sisäisesti laatikot “säiliöinä”, joita kutsutaan hlist/vlisteiksi ja jotka tallentavat “metatietoja” laatikosta sekä tarjoavat pääsyn laatikon muodostavien komponenttien luetteloon. LuaTeXin avulla voit käyttää laatikon “metatietoja” ja luetteloa kohteista, jotka TeX-laatikko sisältää: glyfejä, liimaa, rangaistuksia, muita laatikoita ja niin edelleen. Lua-skriptien avulla on mahdollista tarkastella TeX:n muistissa olevaa laatikkoa ja piirtää yksityiskohtainen esitys siitä, mitä laatikko sisältää. Sopiva esitys TeX-laatikosta ja sen sisällöstä saadaan käyttämällä *nodekaavioita* ja olemme valmistelleet [Overleaf-projektin](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) joka tekee sen hyödyntämällä Patrick Gundlachin kirjoittamaa erinomaista Lua-skriptiä (katso tekijät). Emme kuvaile yksityiskohtaisia prosesseja, joita laatikoiden tutkiminen ja nodekaavioiden tuottaminen edellyttää — paitsi huomautamme, että minkä tahansa TeX-laatikoita käsittelevän ohjelman/skriptin on oltava *rekursiivista* rekursiivinen, koska laatikot voivat olla sisäkkäisiä: eli sinulla voi olla hboxeja vboxien sisällä, hboxien sisällä… yhdistäen kaikki laatikkotyypit hyvin syvälle sisäkkäisyyden tasolle.

![{{{alt}}}](/files/912ff7e7552360c3a2c271f8bd559918bd10e361)

### Mitä projekti tarjoaa?

Se toteuttaa vain yhden komennon nimeltä `\dobox{box command}`, esimerkiksi:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Se `\dobox{...}` komento suorittaa useita tehtäviä:

1. asiakirjassasi se ladottaa laatikostasi sananmukaisen TeX-koodin;
2. se luo SVG-grafiikan TeX-laatikosta — voit upottaa sen verkkosivulle (kuten olemme tehneet tässä blogikirjoituksessa);
3. se luo SVG-grafiikan nodelistasta — jonka voit myös upottaa verkkosivuille (kuten olemme tehneet tässä blogikirjoituksessa);
4. se tuottaa PDF-grafiikan nodelistasta, joka sitten tuodaan mukaan projektin tuottamaan pää-PDF-dokumenttiin.

Nodekaavioista voi hyvin nopeasti tulla erittäin suuria, koska LuaTeXin täytyy tallentaa valtava määrä dataa esittääkseen monimutkaisia TeX-laatikoita — kuten parhaillaan rakentuvaa sivua tai ladottua matematiikkaa. Suurempien nodelistojen kohdalla tuotuun PDF-grafiikkaan voi kohdistua asiakirjasi sivun reunan aiheuttama leikkaus — jos haluat tarkastella suurta nodekaaviota, voit ladata projektin ZIP-tiedoston ja poimia siitä kiinnostavan PDF-grafiikan. Kun lataat projektin ZIP-tiedoston, varmista, että valitset pudotusvalikosta “Syöte- ja tulostustiedostot”:

![{{{alt}}}](/files/7947ceb02e2454f679485347000131a37e7a6882)

### Overleaf-projektin grafiikat: lyhyt kuvaus

Ennen kuin näytämme joitakin esimerkkejä, on syytä tehdä muutama huomio Overleaf-projektin tuottamasta grafiikasta — käytämme samaa `\hbox` aiemmin artikkelissa mainittua esimerkkiä. Tässä se on kääritetty projektin `\dobox{...}` komento:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Tässä on `\hbox` TeXin tuottama — selkeyden vuoksi laatikko on suurennettu, mutta reunus sisältyy Overleaf-projektin tuottamiin grafiikoihin.

![{{{alt}}}](/files/9353f273dae88851220d07239372ed23d130cdb5)

Tässä on *selitteillä varustettu* yllä olevaa laatikkoa esittävä nodelistasta tehty SVG-kaavio — selitteet lisättiin korostamaan laatikon “metatietoja” ja sen sisältämien objektien luetteloa: näitä selitteitä ei ole Overleaf-projektin tuottamissa grafiikoissa.

[![{{{alt}}}](/files/a4991e98a9feb4c00db879f7b8121cb87eb9a0c9)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Jos katsot “metatiedot”-osiota, saatat huomata joitakin vieraita parametreja:

* `glue_set`
* `glue_sign`
* `glue_order`

Nämä parametrit ovat TeXin käyttämiä asetuksia sen laskemiseksi, kuinka paljon liiman täytyy venyä tai kutistua tässä laatikossa, ja ne ovat vain yksi esimerkki datasta, jonka voit helposti saada LuaTeXin kautta mutta et muiden TeX-moottoreiden avulla. Huomaa, että laatikon osien sisällä olevat liimasolmut *säilyttävät* alkuperäiset liima-arvot, jotka kirjoitimme laatikon luomiseksi. Tämä on olennaista, koska TeX tarjoaa komennot `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` jotka “purkavat” laatikon sisällön ja vapauttavat sen takaisin syötevirtaan osallistuakseen jälleen ladontatoimintoihin. Vasta kun TeX lopulta tulostaa (ships out) laatikon PDF- tai DVI-tiedostoon, että `glue_set`, `glue_sign` ja `glue_order` laatikossa oleviin liimoihin sovelletaan venytys- tai kutistumislaskelmat — joiden avulla lasketaan todellinen venytyksen tai kutistumisen määrä, joka tarvitaan komponenttien sijoittamiseen laatikossa, ja sen jälkeen luodaan asianmukaiset PDF-data- tai DVI-opkoodit.

Toinen “metatiedot”-osiossa lueteltu parametri on `shift`: tämä on laatikon siirtymän arvo, joka syntyy sovellettaessa TeX-komentoja:

* `\raise`, `\lower` (sovellettuna `\hbox`);
* `\moveleft`, `\moveright` (sovellettuna `\vbox`).

Esimerkissämme `shift` on 0pt, koska emme siirtäneet `\hbox` sen luonnollisesta sijainnista.

Se [Overleaf-projektin](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) tuottaa myös nodekaaviot PDF-muodossa: tässä on linkki, josta voit ladata [PDF-tiedostoversion](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) edellä olevasta nodekaaviosta.

### Miten Overleaf-projekti luo nuo grafiikat?

Overleaf-projekti hyödyntää mahdollisuutta ajaa Overleafin palvelimille asennettuja ohjelmistoja ja apuohjelmia — katso [tämä blogikirjoitus](/latex/fi/syvalliset-artikkelit/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) lisätietoja ja esimerkkiprojektia varten. Tuottaakseen TeX-laatikkoa esittävän SVG-grafiikan laatikon TeX-koodi kirjoitetaan pieneen tiedostoon, joka sitten ladotaan pdfTeXillä DVI-tiedoston luomiseksi — huomaa, että pdfTeX-ohjelman suorittaa LuaTeX muutaman Lua-skriptirivin avulla. Tuo DVI-tiedosto muunnetaan lennossa SVG:ksi käyttäen `dvisvgm` apuohjelmaa — joka toimitetaan Overleafin palvelimille asennetun TeX Live -jakelun mukana. `dvisvgm` suoritetaan komentorivivalitsimella `-n` varmistamaan, että kaikki ladottu teksti muunnetaan viivoiksi/kaariksi, jotta SVG-tiedoston oikea renderöinti ei riipu TeX-fonttien asentamisesta.

Nodekaavioiden luomiseen käytämme Lua-skriptiä nimeltä `hiviznodelist.lua` joka perustuu Patrick Gundlachin työhön. Tuo skripti kirjoittaa niin sanotun `.gv` (Graphviz)-tiedoston, joka on tekstitiedosto, joka sisältää nodekaavion kuvattuna `dot` kielellä.  `.gv` tiedosto käsitellään apuohjelmalla nimeltä `dot` joka tuottaa nodikaavion sekä PDF- että SVG-tiedostomuodoissa.

### Projektiesimerkkejä

Tässä on joitakin lisäesimerkkejä Overleaf-projektilla tuotetuista SVG-grafiikoista. Paljon tekstiä sisältävät laatikot (esim. \vboxissa) tai monimutkainen matematiikka tuottavat valtavia nodekaavioita — jos tutkit Overleaf-projektia, on suositeltavaa olla käyttämättä tarpeettoman monimutkaisia laatikoita sinua kiinnostavien ominaisuuksien esittelemiseen.

#### \vbox to 25pt{A}

Tämä esimerkki osoittaa, millainen vaikutus on sillä, että teksti sijoitetaan suoraan `\vbox`: huomaa, että noderakenne on melko monimutkainen, jopa näin yksinkertaiselle laatikolle. Tämän monimutkaisuuden syy on se, että teksti, joka on sijoitettu suoraan `\vbox` pakottaa TeXin tekemään rivinvaihtoja. Näet, että `\vbox` on 345pt leveä: tämän arvo on `\hsize` sillä hetkellä, kun tämä laatikko luotiin. Huomaa myös, että merkki “A” sisältyy `hlistiin` joka on myös 345 pistettä leveä, ja huomaa suuri penalty-arvo (10000) yhdessä `\parfillskip` ja `\rightskip` liimojen kanssa laatikon sisällön lopussa. Tuo penalty ja kaksi liima-alkiota lisätään TeXin rivinvaihtotoiminnoissa. Jos katsot `glue_set` kappalerivin arvoa (`hlistiin`) joka sisältää kirjaimen “A”, huomaat että se on erittäin suuri (322.500000): miksi niin? Siksi, että kappalerivi on 345pt leveä mutta sisältää vain `\parindent` ja kirjaimen “A”: jäljellä oleva tila on täytettävä `\parfillskip` liimalla, jonka täytyy venyä huomattavan paljon täyttääkseen rivillä jäljellä olevan tilan.

![{{{alt}}}](/files/fc407d294c7b52af5cf7541aa0a53f6403c8d375)

[![{{{alt}}}](/files/a279f9c647ccc9b8859524d5953a13175cb2fe42)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Lataa PDF-tiedosto](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

Tätä esimerkkiä on erittäin opettavaista verrata edelliseen. Tässä nodekaavio ei ole ainoastaan huomattavasti pienempi, vaan myös `\vbox` on vain 7.50002pt: sama leveys kuin kirjaimella “A”. Syy on se, että “A” on kääritty `\hbox` joka estää `\vbox` laukaisemasta TeXiä suorittamaan rivinvaihtoa — tärkeä ominaisuus laatikoille, jotka luodaan käyttäen `\vbox`.

![{{{alt}}}](/files/dc3e195f762cefaa69735918f5c8819ea1091619)

[![{{{alt}}}](/files/04ae1dc4b23ad5453c26ceea104295195f470c28)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Lataa PDF-tiedosto](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Yksinkertaista matematiikkaa: \hbox{$$\displaystyle \int f(x) dx$$}, monimutkainen laatikko!

Tämä esimerkki osoittaa, että jopa hyvin yksinkertainen ladottu matematiikka luo yksityiskohtaisen laatikkorakenteen: matematiikan ladonta tuottaa *erittäin* monimutkaisia datastruktuureja TeXin sisällä!

![{{{alt}}}](/files/5ea0200ea7a2bb5c6c4638096195392eec7cb3be)

[![{{{alt}}}](/files/05335023575cde7f18d104098383831f647bc26a)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Lataa PDF-tiedosto](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Tekijät: kiitos Patrick!

Kiitoksemme [Patrick Gundlach](https://twitter.com/patrickgundlach) joka on myöntänyt Overleafille luvan käyttää ja jakaa muokattua versiota Lua-skriptistään, `viznodelist.lua`, joka käsittelee TeX-laatikoita ja tuottaa tiedoston ( `dot` kielellä), jota voidaan käsitellä nodekaavion piirtämiseksi. Overleaf-projekti sisältää Lua-skriptin nimeltä `hiviznodelist.lua`— uudelleennimetyn ja muokatun version Patrickin alkuperäisestä koodista, joka on saatavilla [GitHubissa](http://gist.github.com/556247). Patrick on luonut avoimen lähdekoodin LuaTeX-pohjaisen ladontajärjestelmän nimeltä [speedata Publisher](https://speedata.github.io/publisher/index.html) jonka voit ladata ja käyttää ilmaiseksi — myös kaupallisen tuen vaihtoehtoja on saatavilla.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
