> 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/14-how-do-tex-engines-typeset-tables.md).

# Miten TeX-moottorit taittavat taulukoita

## Miten TeX-moottorit ladovat taulukoita

## Johdanto: Mitä tämä sarja käsittelee?

Esteettisesti miellyttävien taulukoiden tuottaminen voi olla aikaa vievää—käytitpä sitten visuaalista taittotyökalua, LaTeXia tai HTML:n tai markdownin kaltaista merkintäkieltä. Erityisesti LaTeXin käyttäjille taulukoiden ladonta kuuluu monien ”kipupisteiden” joukkoon, mistä ehkä kertoo se, että ”taulukot” on yksi eniten [tunnisteilla merkityistä aiheista tex.stackexchangeissa](https://tex.stackexchange.com/tags).

Overleafin vastausten ja esimerkkien lisäksi jo pelkkä katsaus LaTeXilla ladottuja taulukoita koskevaan tukeen paljastaa useita taulukkoihin liittyviä tietolähteitä:

* Overleafin [ohjesivut](https://www.overleaf.com/learn/latex/tables) ja muut sivustot, kuten [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, Comprehensive TeX Network, luettelee yli [70 TeX/LaTeX-pakettia](https://ctan.org/topic/table) taulukoiden luomiseen liittyen
* kokonaisen [kirjan taulukoiden ladonnasta LaTeXilla](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* erinomaisen [verkkopohjaisen LaTeX-taulukkoluontityökalun](https://www.tablesgenerator.com/latex_tables)

Yksinkertainen Google-haku sanoille [LaTeX-taulukot](https://www.google.com/search?q=latex+tables) tuottaa valtavan määrän osumia ja listaa monia sivustoja, jotka tarjoavat apua, neuvoja, esimerkkejä ja selityksiä.

### TeX, ei LaTeX

Kun käytettävissä on näin paljon kirjallisuutta taulukoiden ladonnasta LaTeXilla, onko niistä enää mitään lisättävää—vielä lisää taulukkoesimerkkejä sekä pakettikomentojen luettelointia ja esittelyä? Onko olemassa tapa lähestyä taulukoiden ladonnan aihetta niin, että se nostaa esiin tai keskittyy taulukkoladonnan perusperiaatteisiin ja käsitteisiin? On kyllä, mutta se vaatii LaTeX-sipulin kuorimista…

Päätimme julkaista artikkelisarjan, joka pyrkii tarjoamaan lukijoille taustatietoa ja selityksiä taustalla olevista *mekaniikasta* TeX-pohjaisesta taulukoiden ladonnasta. Sen sijaan, että keskittyisimme taulukoiden ladontaan käyttämällä tiettyjä LaTeX-makroja/-paketteja, tutkimme *taustalla olevaa toimintaa* TeX-moottoreissa: tutkimme alemman tason ladontakoneistoa, joka muodostaa perustan LaTeX-makrokomentojen rakentamiselle. Perimmäisenä tavoitteena on erottaa ja selittää TeX-pohjaisen taulukkoladonnan keskeiset menetelmät ja algoritmit—toiveena auttaa lukijoita/käyttäjiä ymmärtämään paremmin, miksi taulukot käyttäytyvät niin kuin ne käyttäytyvät. Tämän lähestymistavan väistämätön seuraus, jossa kuoritaan pois LaTeX-makroeristyksen suojaavat kerrokset, on altistuminen sotkuisille alemman tason yksityiskohdille, joilta käyttäjät yleensä (ja riemuiten) on peitetty LaTeX-makrokoodin kerroksilla.

Näiden artikkelien tutkiminen, kirjoittaminen ja kuvittaminen on vienyt paljon aikaa, joten toivomme niiden olevan kirjallisuuteen arvokas lisä, joka tarjoaa aineistoa, informoi lukijoita ja auttaa heitä ymmärtämään tätä TeXin ladonnan monimutkaista osa-aluetta paremmin. On syytä korostaa, että tämä artikkelisarja *sisällä* sivuaa keskustelua *estetiikasta* taulukkojen suunnittelussa—se on aihe, joka on täynnä subjektiivisia mieltymyksiä, ja sen väittelyt on käytävä muualla…

### TeX-taulukoiden mekaniikan tutkiminen: Miten sen voi tehdä?

Tutkiaksemme ja kirjoittaaksemme sitten TeX-moottoreissa, kuten taulukoiden ladonnassa, tapahtuvista alemman tason mekanismeista ja prosesseista, Overleaf rakensi (käänsi) Knuthin TeX-moottorista ”debug”-versiot käyttäen Martin Ruckertin [Web2W-prosessia](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Perinteisesti TeXin rakentaminen tapahtuu Web2C-nimisellä prosessilla, jota käytetään TeX Livessa. Se tuottaa C-koodia muuttamalla TeXin alkuperäisen Pascal-lähdekoodin sen C-vastineeksi. Tämä prosessi tuottaa C-koodia, jota ei koskaan ollut tarkoitettu ihmisten luettavaksi, vain C-kääntäjien. Mekaanisesti tuotettua C-koodia on *poikkeuksellisen* vaikea lukea tai muokata kokeilutarkoituksiin.

Sitä vastoin Web2W tuottaa C-lähdekoodia (saatavilla [täällä](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) joka on *kertaluokkaa* luettavampaa kuin Web2C:n tuottama koodi. Tämän vuoksi Web2W:n C-lähdekoodi soveltuu paljon paremmin muokattavaksi oppimis- ja kokeilutarkoituksiin.

Web2W tuottaa TeX:n version (”CTeX”), joka on *erittäin* lähellä Knuthin alkuperäistä ohjelmaa: ”CTeX” ei sisällä monia Web2C-prosessin tuomia muutoksia ja parannuksia—kuten SyncTeX, komentorivikäsittely ja tiedostojen haku Kpathsean kautta. Vaikka nämä arvokkaat parannukset jäävätkin pois, tuloksena oleva (Web2W:n) C-koodi on suhteellisen helppo hahmottaa Knuthin julkaistun TeX-lähdekoodin avulla, vaikka TeX kirjoitettiin Pascalilla.

* **Huomio nimistä:** Tarkkaan ottaen nimi ”TeX” saa viitata vain Donald Knuthin kirjoittamaan ja julkaisemaan alkuperäiseen ohjelmistoon. Kaikki hänen ohjelmistoonsa tehdyt muutokset on nimettävä toisin niiden tuloksena syntyvälle TeX-pohjaiselle ladontaohjelmistolle. Tässä käytimme Web2W-prosessia moottorin rakentamiseen, joka on käytännössä edelleen Knuthin alkuperäinen ohjelmisto. Epäselvyyksien välttämiseksi käytämme kuitenkin termiä ”CTeX” tarkoittamaan nimenomaan Web2W:llä rakennettua versiota, mutta käytämme myös sanaa ”TeX” tarkoittamaan joko Knuthin alkuperäistä moottoria tai yleistermiä ladontakielelle, joka perustuu Knuthin TeXin periaatteisiin. Toivomme, että lukijat antavat meille anteeksi ajoittaiset poikkeamat täysin oikean terminologian täsmällisestä käytöstä: toivomme, että merkitys ja tarkoitus välittyvät kontekstin kautta.

CTeXin debug-versiota ajettiin käyttäen [Eclipse IDE:tä](https://www.eclipse.org/downloads/packages/), mikä teki mahdolliseksi tarkkailla reaaliaikaista C-koodin käsittelyä, joka toteuttaa alemman tason primitiiviset (sisäänrakennetut) TeX-komennot ja algoritmit, jotka Knuth suunnitteli taulukoiden ladonnan tueksi.

Seuraava lyhyt (noin 90 sekunnin) video esittelee CTeX-moottorin käynnissä [Eclipse IDE:tä](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

CTeX:n lisäksi käänsimme myös e-TeX:n saadaksemme käyttöön muutamia lisäprimitiivejä, joita ei ole Knuthin alkuperäisessä ohjelmistossa. Vaikka CTeX ja e-TeX ovat nykyään jo vanhoja TeX-pohjaisia moottoreita, ne soveltuvat yhä hyvin taulukkoladonnan mekaniikan tutkimisen perustaksi, koska samat taustalla olevat periaatteet pätevät edelleen kaikkiin TeX-pohjaisiin ladontamoottoreihin.

### Miksi käyttää vanhempaa TeX-moottoria taulukoiden tutkimiseen?

Ensinnäkin painettu kirja, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), joka luettelee ja selittää TeXin lähdekoodin, on edelleen erittäin kätevä opas TeXin sisäisten toimintojen hämäriin vesiin, vaikka se julkaistiin yli 30 vuotta sitten (1986). Voit tietenkin latoa TeXin lähdekoodidokumentaation itse; katso esimerkiksi Overleaf-projekti [Lado TeX:n, e-TeX:n tai pdfTeX:n lähdekoodidokumentaatio](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). TeX:The Programin julkaisun jälkeen vuonna 1986 on kehittynyt uusia TeX-moottoreita, kuten pdfTeX, XeTeX ja LuaTeXin eri versiot, jotka kaikki tuovat mukanaan ominaisuuksia ja komentoja, joita ei ole dokumentoitu TeX:The Programissa yksinkertaisesti siksi, ettei niitä ollut Knuthin alkuperäisessä ohjelmistossa.

Monille keskeisille prosesseille, kuten TeXin taulukkoladonnalle, TeX:The Programissa dokumentoitu koodi on yhä relevantti tutkimuksen pohjaksi—vaikka TeXin lähdekoodi on kirjoitettu Pascalilla. Lisäksi Knuthin TeX on suhteellisen helppo ja nopea kääntää—erityisesti erittäin hyödyllisen [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) prosessin ansiosta, jonka Martin Ruckert on kehittänyt. Käännöksen helppous ja nopeus tekevät TeXin muokkaamisesta yksinkertaisin tavoin paljon kätevämpää—esimerkiksi tämän artikkelisarjan myöhemmin käytettävien SVG-grafiikoiden luomisessa.

### TeX:n ja LaTeXin eron ymmärtäminen

Monet lukijat tietävät jo, että LaTeX ei itse asiassa ole *suoritettava* ladontaohjelma vaan suuri kokoelma komentoja (*makroja*), jotka on viime kädessä kirjoitettu alemman tason ladonta- ja ohjelmointikielellä nimeltä TeX. LaTeX-koodisi tuottaa ladotun tuloksen vasta sen jälkeen, kun sitä on käsitellyt suoritettava ohjelma nimeltä *TeX-moottori*—ohjelmisto, joka sijaitsee LaTeX-koodisi (asiakirjan) ja ladotun PDF:n välissä. Nykyään käyttäjät voivat valita useiden TeX-moottorien välillä ladottaakseen LaTeX-koodiaan, mukaan lukien pdfTeX, XeTeX ja LuaTeXin versiot.

Ne, jotka ovat uusia TeX/LaTeX-ekosysteemissä, hämmentyvät usein, ja täysin ymmärrettävästi, kohtaamiensa työkalujen kryptisen kuuloisista nimistä: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX ja LuaLaTeX. Jos tunnet samoin, apu löytyy Overleafin artikkelista [Mitä nimi kertoo: opas TeXin moniin muotoihin](/latex/fi/syvalliset-artikkelit/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) joka selittää kaikkien näiden termien alkuperän ja merkityksen.

#### Dialektit ja TeX-primitiivit

Jokaisella TeX-moottorilla on joukko sisäänrakennettuja komentoja, joita kutsutaan *primitiiveistä* , jotka yhdessä muodostavat kyseisen moottorin TeX-ladontakielen ”murteen” ja heijastavat kunkin moottorin sisäänrakennettuja kykyjä. Tässä termiä ”primitiivi”, jolla kuvaillaan TeX-moottorien sisäänrakennettuja komentoja, ei *sisällä* tarkoiteta tarkoittavan, että nämä komennot olisivat alkeellisia tai yksinkertaisia, vaan että ne ovat perustavanlaatuisia ja jakamattomia: niitä ei ole rakennettu muista komennoista (toisin kuin makrot). Kaikilla TeX-moottoreilla on yhteinen laaja primitiivien perusjoukko, mutta joissakin on myös kyseiselle moottorille ominaisia primitiivejä—tästä syntyy ajatus TeXin ”murteesta”.

Riippumatta siitä, mitä TeX-moottoria käytetään LaTeX-asiakirjasi ladontaan, sen tehtävänä on käsitellä (”suorittaa”) LaTeX-komentojen kokoelma (eli makrot), joita käytetään asiakirjasi kirjoittamiseen ja rakentamiseen. Käytännössä TeX-moottori ”muuntaa” LaTeX-koodisi (makrot) *takaisin* niiden TeX-moottorin primitiivikomentoihin, joita moottori voi suorittaa varsinaisen ladonnan tekemiseksi. Sinun ei *on* tarvitse käyttää LaTeX-komentoja ladataksesi asiakirjoja TeX-moottoreilla — voit *voisit* valita rakentaa asiakirjasi kokonaan TeX-primitiiveillä, eli suoraan alemman tason *TeX-ohjelmointikielellä* joka on sisäänrakennettu TeX-moottoreihin. Nykykriteerein TeX-kieli on kuitenkin varsin arkaainen ja yleisesti ottaen hankalaksi ohjelmoitavaksi katsottu—se saattaa myös edellyttää suuren määrän sisäänrakennettuja primitiivejä ladontatavoitteen saavuttamiseksi, mikä tekee ohjelmointitehtävästä virhealtista ja mahdollisesti toisteista.

Välttääkseen tarpeen kirjoittaa suoraan TeX-kielellä tai jatkuvasti näpytellä samaa komentojoukkoa uudelleen, TeX-moottorit antavat sinun luoda ”pikavalintoja”, joita kutsutaan *makroja*. Luomalla makroja määrittelet omia komentoja, jotka paketoivat mahdollisesti pitkiä ja monimutkaisia TeX-kielen primitiivijonoja (tai muita makroja) yhdeksi ”korkeamman tason” komennoksi. TeX-ohjelmoijat voivat kirjoittaa hyvin kehittyneitä makroja, jotka kapseloivat paljon toiminnallisuutta yhteen komentoon—kuten LaTeXin tarjoamat komennot. Käyttämällä makropaketteja, kuten LaTeXia (tai [ConTeXtia](https://wiki.contextgarden.net/Main_Page)), asiakirjojen kirjoittajat ovat (enimmäkseen) suojassa monilta työläiltä yksityiskohdilta, mikä antaa heidän keskittyä kirjoittamiseen ja ladontaan sen sijaan, että heidän tarvitsisi jatkuvasti kamppailla TeX-kielen monimutkaisuuden ja vivahteiden kanssa.

## Alussa...

Matematiikan ladontaan ja kehittyneeseen rivinvaihtoon tarkoitettujen algoritmien suunnittelun ohella Knuth kohtasi haasteen ohjelmoida TeX-ohjelmistonsa latoaakseen taulukoita. On selvää, että minkään taulukonrakennusalgoritmin tai -algoritmien ei pidä olla kohtuuttoman rajoittavia, sillä se turhauttaisi käyttäjiä, jotka tarvitsevat vapautta luoda lähes loputtoman määrän erilaisia taulukkoasetteluja. Lisäksi taulukon solut voivat sisältää laajan kirjon sisältöä, mukaan lukien matematiikkaa, grafiikkaa ja tekstinpätkiä, jotka on katkaistu kauniisti ladotuiksi riveiksi—itse asiassa mitä tahansa, mitä TeX pystyy latoamaan. Tämän joustavuuden tarjoaminen edellyttää, että TeXin taulukonrakennusalgoritmit toimivat käsi kädessä TeXin muun ladontakoneiston kanssa.

TeX-moottorit kuitenkin perivät hinnan tarjoamastaan taulukonrakennuksen joustavuudesta: sisäänrakennettujen (primitiivisten) taulukkoladontakomentojen alemman tason toiminnassa on lukuisia hienovaraisuuksia ja vivahteita, ja niitä on 9:

* **`\halign`**, **`\valign`**: taulukoiden perustavanlaatuiset rakentamiskomennot
* **`\tabskip`**: liima, joka asetetaan \halign-sarakkeiden tai \valign-rivien väliin
* **`\cr`**: ”carriage return” -pakollinen päätettäjä kaikille taulukon riveille
* **`\noalign`**: lisää materiaalia \halign-rivien tai \valign-sarakkeiden väliin
* **`\everycr`**: komennot (token-rekisteri), jotka luetaan \cr:n havaitsemisen jälkeen
* **`\span`**: kaksitoiminen komento: \span luo soluja, jotka kattavat sarakkeita tai rivejä, tai laajentaa taulukon alkumääritelmän komentoja (tarkastelemme tätä yksityiskohtaisesti)
* **`\omit`**: ohittaa tietyn solun mallit
* **`\crcr`**: käytetään makroissa virheiden välttämiseksi, jos käyttäjät unohtavat vaaditun \cr:n

Kohtaamme nämä komennot matkallamme taulukoiden rakentamisen läpi.

### Haasteiden kaukaiset kaiku

Kätkettynä [TeXin lähdekoodiin](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) on melko pelottava johdanto aiheeseen, jossa toteutetaan taulukoiden ladontaan suunnitellut alemman tason komennot \halign ja \valign:

> “On tavallaan ihme, että \halign ja \valign ylipäätään toimivat, koska ne leikkaavat läpi niin monista TeXin ohjausrakenteista. Siksi nykyinen sivu ei todennäköisesti ole paras paikka aloittelijalle aloittaa tämän ohjelman lukeminen; on parempi hallita ensin kaikki muu.”

Knuth jatkaa sanomalla

> “Huomaa, että kun \halignia käsitellään, luovutamme pelottomasti ohjauksen TeXin muulle osalle. Kriittisissä kohdissa kutsutaan kohdistusrutiini tekemään jokin pieni toimenpide, mutta suurimman osan ajasta nämä rutiinit vain lymyävät taustalla. Se on vähän kuin jälkihypnoottinen ehdotus.”

Näistä kommenteista vaikuttaa järkevältä päätellä, että jopa Knuthille TeXin taulukkoladonnan toteuttaminen oli ”aikamoinen haaste”—tavoitteena tarjota käyttäjälle hallintaa ja joustavuutta mutta samalla varmistaa, että TeXin automatisoidut taulukonrakennusalgoritmit olivat hyvin orkestroidut TeXin ydinsisäisten ladontaprosessien kanssa.

Kirjoittaja myöntää readily koodin ja algoritmien monimutkaisuuden, jotka ovat TeXin taulukkoladontaominaisuuksien taustalla, mutta ihailee myös sitä valtavaa kyvykkyyden määrää, joka sisältyy suhteellisen pieneen määrään—vaikkakin tiivistä—Pascal- (tai C-)koodia.


---

# 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/14-how-do-tex-engines-typeset-tables.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.
