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

# Miten TeX-moottorit taittavat taulukoita 2

## Miten TeX-moottorit latoavat taulukoita 2

## TeX-moottorit viittaavat taulukoihin tasauksina

Sisällä [TeX:n lähdekoodin dokumentaatio](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth ei käsittele TeX:n kykyä “latoa taulukoita”, vaan sen sijaan hän kuvailee TeX:n algoritmeja niin sanottujen *tasausten*. TeX:n taulukoiden ladonta on käytännössä automaattinen laatikoiden tasausprosessi: laatikoiden (taulukon solujen, rivien ja sarakkeiden) järjestämistä miellyttävän suorakulmaisen ruudukon tai matriisin aikaansaamiseksi — vaikka, kuten TeX:lle on ominaista, siinä on *monien* vivahteita tuossa prosessissa.

Termi “alignment” näkyy myös niiden kahden taulukon ladontakomennon nimissä, jotka ovat sisäänrakennettuina kaikkiin TeX-moottoreihin:

* `\halign` (vaakasuuntainen tasaus), ja
* `\valign` (pystysuuntainen tasaus).

Tarkastelemme molempia komentoja koko tämän artikkelisarjan ajan, aloittaen muodollisemmalla katsauksella `\halign` ja `\valign` näiden komentojen muotoon/rakenteeseen, jotta luodaan pohja sarjan myöhemmille perusteellisille artikkeleille.

### TeX:n taulukot ovat laatikoita ja välistystä

Yksittäiset taulukon solut sisältävät tyypillisesti monenlaista sisältöä, kuten tekstirivejä, matematiikkaa tai grafiikkaa, mikä tuottaa joukon taulukon soluja, joilla on eri leveydet, korkeudet tai ladotun materiaalin syvyydet. Jollain tavalla TeX:n on työskenneltävä näiden solujen kanssa, joiden sisältömitat vaihtelevat, jotta voidaan rakentaa lopullinen taulukko, jossa jokaisella rivillä on tietty korkeus ja jokaisella sarakkeella tietty leveys. TeX:n on pääteltävä kunkin rivin korkeudelle ja kunkin sarakkeen leveydelle sopivat arvot vaihtelevan kokoisten taulukon solujen kokoelmasta.

TeX ei kuitenkaan voi tietää kunkin solun sisällön todellista kokoa ennen kuin sisältö on ladottu; siksi TeX käy läpi koko taulukon, latomalla jokaisen solun, saadakseen taulukon asettelun viimeistelyyn tarvittavat mitoitustiedot. Näiden mitoitustietojen perusteella TeX voi määrittää kunkin rivin oikean korkeuden ja kunkin sarakkeen leveyden. TeX voi kohdata myös tyhjiä soluja tai soluja, joiden käyttäjä haluaa ulottuvan usean sarakkeen tai usean rivin yli, ja kaikki tämä TeX:n on otettava huolellisesti huomioon laskelmissaan. Kun tämä erilaisten solu- (laatikko-) mitoitustietojen kokoelma on “suodatettu”, vasta sitten TeX pystyy määrittämään lopulliset arvot sarakeleveyksille taulukossa `\halign`, tai rivien korkeuksille `\valign` ja käyttää näitä arvoja taulukon asettelualgoritmiensa loppuvaiheissa.

Käytännössä ja “kulissien takana” TeX:n taulukkoladonta koostuu useista vaiheista. Pääpiirteissään TeX latoo ensin taulukosta “luonnos”- tai “epätäydellisen” version samalla kun se kerää ja käsittelee solujen kokotietoja — sekä tietoja mahdollisista `\span` komentoja, joita taulukossa käytetään. Viimeisissä vaiheissa TeX käsittelee tuon “epätäydellisen” taulukon version uudelleen viimeistelläkseen `\halign` sarakkeiden leveydet tai `\valign` rivien korkeudet ja saavuttaakseen valmiin asettelun — joita kaikkia tarkastelemme tässä artikkelisarjassa.

## \halign and \valign: kaksi tapaa rakentaa taulukoita

Kaikki TeX-moottorit tarjoavat kaksi *sisäänrakennetussa* taulukoiden ladontaan suunniteltua komentoa (primitiiviä): `\halign` ja `\valign`, joilla on monia yhteisiä perusominaisuuksia, mutta jotka eroavat myös joillakin keskeisillä tavoilla. Keskeinen ero `\halign` ja `\valign` on tapa, jolla ne rakentavat omat taulukkonsa: rivi riviltä tai sarake sarakkeelta:

* `\halign`: lataa taulukot rivi riviltä muodostaen yksittäisiä rivejä, jotka pinotaan pystysuunnassa taulukon sarakkeiden aikaansaamiseksi
* `\valign`: lataa taulukot sarake sarakkeelta muodostaen yksittäisiä sarakkeita, jotka pinotaan vaakasuunnassa taulukon rivien aikaansaamiseksi

### \halign

Seuraava kaavio kuvaa taulukon rakentamista, joka on luotu komennolla `\halign`. Taulukko ladataan rivi riviltä, ja yksittäiset rivit pinotaan pystysuunnassa. Tästä aiheutuu muun muassa seuraavaa:

* taulukon sarakkeet syntyvät taulukkorivien pystysuuntaisesta pinoamisesta
* sivunvaihdot voivat tapahtua taulukkorivien välissä
* taulukon ulkopuolista aineistoa voidaan lisätä rivien väliin (komennolla `\nolign`, johon palaamme myöhemmin)

![](/files/f69411c3104ef671c628f80226711d9999c67d8a)

### \valign

Seuraava kaavio kuvaa taulukon rakentamista, joka on luotu komennolla `\valign`. Taulukko ladataan sarake sarakkeelta, ja yksittäiset sarakkeet pinotaan vaakasuunnassa (vierekkäin). Tästä aiheutuu muun muassa seuraavaa:

* taulukon rivit syntyvät taulukkosarakkeiden vaakasuuntaisesta pinoamisesta
* rivinvaihdot voivat tapahtua taulukkosarakkeiden välissä
* taulukon ulkopuolista aineistoa voidaan lisätä sarakkeiden väliin (komennolla `\noalign`, johon palaamme myöhemmin)

![](/files/f45b8ef5bed2b9deeaac9a0a729c2c7d5edf3222)

### Esimerkkejä

Seuraavan esimerkin tarkoituksena on korostaa rivi- *vs*-sarakkeista lähestymistapaa \halign- ja \valign-komentoihin.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Tiiviisti istuvat laatikon reunat
\setlength{\fboxsep}{0pt}

Tässä on \verb|\valign|-taulukko:
\begingroup
% \hsize ohjaa \valignin
% sarakeleveyksiä. Asetamme myös
% \parindentin pienempään arvoon
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Esimäärittely: käsitellään myöhemmin (hyvin yksityiskohtaisesti!)
A&B&C\cr % Tämän \valign-taulukon ensimmäinen SARAKE
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Huom.: myöhemmin selitettävistä syistä
% \halign on sijoitettava \vboxiin
Tässä on \verb|\halign|-taulukko: \fbox{%
\vbox{\halign{
#&#&#\cr % Esimäärittely: käsitellään myöhemmin (hyvin yksityiskohtaisesti!)
A&B&C\cr % Tämän \halign-taulukon ensimmäinen RIVI
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen: ![](/files/9e78bedb77de83bfd1618f3b92ac42b7ccb0c050)

Seuraava kuva esittää yläselitteillä varustetun version yllä olevan koodin tuottamista taulukoista. Myöhemmin tässä artikkelisarjassa käsittelemme aiheita kuten:

* mitä taulukon esimäärittelyt ovat?
* miksi asetamme `\hsize` ja `\parindent` kohtaan `\valign` taulukoita?

Tässä vaiheessa riittää, että huomioit rivi- vs. sarakekohtaisen lähestymistavan `\halign` *vs*. `\valign` taulukon rakentamisessa:

![](/files/de6e95dffe59e1ba6df8a06c7614b3e9b431dd30)

## \halign- ja \valign-komentojen yleinen muoto

Aloitamme tarkastelemalla `\halign` ja `\valign` niiden perusominaisuuksia ja yleistä muotoa, mutta emme (vielä) mene juuri yksityiskohtiin. [Kuten mainittiin](#intro), omaksumme hieman muodollisen katsauksen `\halign` ja `\valign` näiden komentojen muotoon/rakenteeseen sarjan myöhempiä artikkeleita varten.

Yleisin `\halign` ja `\valign` komentojen muoto voidaan kirjoittaa seuraavasti:

`\halign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ $$\langle$$⁠`runko`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ $$\langle$$⁠`runko`⁠$$\rangle$$ }

Kuten näet, molemmat `\halign` ja `\valign` koostuvat kolmesta pääosasta:

* [$$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`esipuheessa`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`runko`⁠$$\rangle$$](#body)

## Se $$\langle$$⁠valinnainen määritys⁠$$\rangle$$

Taulukon oletuskoko/-laajuus, sen niin sanottu "luonnollinen koko", määräytyy sen sisällön mukaan — täsmennykseksi: koolla/laajuudella tarkoitamme

* sivustolta *leveyttä* taulukossa, joka on tuotettu komennolla `\halign`, tai
* sivustolta *korkeutta* taulukossa, joka on tuotettu komennolla `\valign`

Yksi $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ voidaan käyttää taulukon luonnollisen koon "ylikirjoittamiseen", ja se esiintyy kahdessa muodossa:

* **`kohteeseen`** $$\langle$$**⁠`mitta`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`mitta`⁠**$$\rangle$$

jossa

* $$\langle$$**⁠`mitta`⁠**$$\rangle$$ on pituus, joka annetaan TeX:n ymmärtämissä yksiköissä, kuten pt, mm tai cm — pituus voidaan myös määrittää komentona, joka laajenee arvoksi, joka on annettu sopivissa yksiköissä;
* **`kohteeseen`** ja **`spread`** ovat TeX:n avainsanoja, jotka määrittävät luonnollisen koon "ylikirjoituksen" tyypin:
  * **`kohteeseen`**: asettaa taulukon kooksi määritetyn $$\langle$$⁠`mitta`⁠$$\rangle$$ arvo
  * **`spread`**: lisää määritetyn $$\langle$$⁠`mitta`⁠$$\rangle$$ arvon taulukon luonnolliseen kokoon

Valinnan vaikutus $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ riippuu ladottavan taulukon tyypistä: se säätää `\halign` taulukon luonnollista *leveyttä*, tai `\valign` taulukon luonnollista *korkeutta*.

Tässä on joitakin esimerkkejä:

* `\halign **to 100pt**{...}`: asettaa `\halign` taulukon leveydeksi `100pt`
* `\valign **to 50pt**{...}`: asettaa `\valign` taulukon korkeudeksi `30pt`
* `\halign **spread 30pt**{...}`: lisää 30pt:n `\halign` taulukon luonnolliseen leveyteen. Vastaavasti kirjoittamalla **spread -30pt** taulukon leveys vähenisi 30pt:llä.
* `\valign **spread 20pt**{...}`: lisää 20pt:n `\valign` taulukon luonnolliseen korkeuteen. Vastaavasti kirjoittamalla **spread -20pt** taulukon korkeus vähenisi 20pt:llä.

Seuraava koodi käyttää uudelleen yllä olevia taulukkiesimerkkejä, mutta soveltaa yhtä $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ taulukkoon `\valign` ja `\halign` taulukkoon:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Tiiviisti istuvat laatikon reunat
\setlength{\fboxsep}{0pt}

Tässä on \verb|\valign|-taulukko:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Tässä on \verb|\halign|-taulukko:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa alla näkyvän tuloksen:

![](/files/0f23660bf562a19709ac89766323ea42f9c81f64)

—mutta huomaa, kuinka molempien taulukoiden sisältö on “ahtautunut yhteen”. Syy tähän on se, että joustavaa välistystä (glue) ei ole, jota TeX voisi käyttää venyttääkseen sisältöä täyttämään lisätilan, jonka tarjoaa **`kohteeseen`** $$\langle$$**⁠`mitta`⁠**$$\rangle$$. Tässä hyppäämme eteenpäin mainitsemaan `\tabskip` komento.

#### Alustava johdanto \tabskip-komentoon

Taulukon asettelun esteettisyys saattaa vaatia säätämistä sen rivien tai sarakkeiden väliseen välistykseen, joten ei ole yllättävää, että TeX-moottorit tarjoavat komennon nimeltä `\tabskip` jolla voit tehdä niin. `\tabskip` käytetään määrittämään (ja vaihtelemaan) sen joustavan välin (“gluen”) määrä, jonka TeX sijoittaa `\halign` tai `\valign`sarakkeiden tai rivien `\tabskip` paljon yksityiskohtaisemmin.

Johdantoesimerkkinä seuraava koodi käyttää asetusta `\tabskip` joka saa TeX:n lisäämään jonkin verran (erittäin) joustavaa tilaa `\valign` taulukon rivien väliin. Tuo joustava tila antaa taulukon riveille mahdollisuuden levittäytyä ja täyttää lisätilan, jonka on luonut $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ kohteelle **`50pt:iin`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
Tässä on \verb|\valign|-taulukko:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Tässä on sama \verb|\valign|-taulukko, mutta sen \optspec{} on ``\texttt{to 50pt}''. Huomaa, kuinka rivit ovat ``kasautuneet'', koska rivien välissä ei ole käytettävissä ``venyvää liimaa'':

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Käytämme \verb|\valign|-taulukkoa, jonka \optspec{} on ``\texttt{to 50pt}'', mutta annamme ``joustavaa välistystä'' \verb|\tabskip|-komennon avulla. Tässä \verb|\tabskip| tarjoaa riittävästi ``liimaa'', jotta \verb|\valign|-rivit voivat ``venyä'' ja täyttää kaiken käytettävissä olevan lisätilan. Tässä on ``venytetty'' \verb|\valign|-taulukko:

\tabskip=0pt plus1fil % Tämä asettaa \tabskipin erittäin joustavaksi liimaksi
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/e404ca7c230ecfea2f5a835d41db6d3487db2c47)

## Taulukon esittely $$\langle$$⁠esimäärittely⁠$$\rangle$$ ja $$\langle$$⁠runko⁠$$\rangle$$

Tämä osa tarjoaa johdannon taulukon $$\langle$$⁠`esipuheessa`⁠$$\rangle$$, ja *lyhyesti* käsittelee taulukon $$\langle$$⁠`runko`⁠$$\rangle$$ jota käsitellään myöhemmin [yksityiskohtaisemmin](#bodydetails).

Tämän sarjan myöhemmissä artikkeleissa tarkastellaan $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ ja $$\langle$$⁠`runko`⁠$$\rangle$$ yksityiskohtaisemmin, erityisesti TeX:n taulukon $$\langle$$⁠`esipuheessa`⁠$$\rangle$$.

Kuten edellä mainittiin, `\halign` tai `\valign` taulukoiden yleisin muoto voidaan kirjoittaa seuraavasti:

`\halign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ $$\langle$$⁠`runko`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ $$\langle$$⁠`runko`⁠$$\rangle$$ }

### Se $$\langle$$⁠esimäärittely⁠$$\rangle$$

Se $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ osio sisältää yhden $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ joka on *joka päättyy* komentoon `\cr` ; näin ollen, $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ voidaan kirjoittaa uudelleen seuraavasti:

$$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$**`\cr`**

### Se $$\langle$$⁠runko⁠$$\rangle$$

Samoin $$\langle$$⁠runko⁠$$\rangle$$ osio voidaan edelleen jakaa yhdeksi tai useammaksi koostevaksi "riviksi", mutta tässä jokaiselle riville on kaksi vaihtoehtoa:

* rivi, joka koostuu soluryhmästä ja muodostaa `\halign` rivin tai `\valign` sarakkeen; tai
* a `\noalign` komento, joka "injektoi" aineistoa `\halign`'n rivien tai `\valign`'n sarakkeiden väliin.

Tässä yhteydessä jätämme huomiotta `\noalign` komennon (katso [myöhemmin artikkelissa](#noalign)) ja oletamme, että jokainen rivin $$\langle$$⁠runko⁠$$\rangle$$ on tiedot soluryhmälle ja *joka päättyy* jonka `\cr` komento.

Ohittaen `\noalign`, $$\langle$$⁠`runko`⁠$$\rangle$$ osio, joka edustaa käyttäjän sisältöä, sisältää joukon rivejä, joista kutakin kutsumme $$\langle$$⁠`runkoriviksi`⁠$$\rangle$$ joka on *joka päättyy* sen mukana olevalla `\cr` komento.

Se $$\langle$$⁠`runko`⁠$$\rangle$$ voidaan kirjoittaa uudelleen seuraavasti:

$$\langle$$⁠runkorivi$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠runkorivi$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Kun yhdistämme tämän, voimme kirjoittaa `\halign` ja `\valign` näin:

`\halign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠runkorivi$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`valinnainen määritys`⁠$$\rangle$$ { $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠runkorivi$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Syistä, joihin palataan myöhemmissä artikkeleissa, $$\langle$$⁠`esipuheessa`⁠$$\rangle$$, aivan yksittäinen $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$, on muodoltaan erilainen kuin kaikki muut taulukon rivit $$\langle$$⁠`runko`⁠$$\rangle$$. Palaamme myös [uudelleen `\noalign` komento](#noalign) jota voidaan käyttää myös taulukon $$\langle$$⁠`runko`⁠$$\rangle$$.

### Se $$\langle$$⁠esimäärittelyrivi⁠$$\rangle$$

Se $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ näyttelee *keskeistä* roolia taulukoiden ladonnassa, koska se tarjoaa eräänlaisen “piirustuksen”, jonka avulla sisältö ladataan —`\halign` rivit tai `\valign` sarakkeet — jotka sisältyvät taulukkoon $$\langle$$⁠`runko`⁠$$\rangle$$. Se $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ voi sisältää myös solujen “mallipohjia”, joita käytetään muodostamaan `\halign` tai sarakkeita `\valign`—aihe, jota tarkastellaan yksityiskohtaisesti.

Tämän $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ tarkoitus on kaksijakoinen:

* se määrittää *maksimin* solujen lukumäärän rivillä `\halign` tai sarakkeessa `\valign`.
* se tallentaa *solumallipohjat* joita voidaan käyttää solujen muotoilun tai sisällön lisäämisen automatisointiin taulukossa olevissa soluissa $$\langle$$⁠`runko`⁠$$\rangle$$. Solumallipohjat ovat valinnaisia ja voivat olla "tyhjiä", tai voit sisällyttää merkkejä tai komentoja, jotka TeX lisää automaattisesti ennen tiettyjen solujen varsinaista sisältöä ja/tai sen jälkeen taulukossasi. Tämä säästää sinut siltä vaivalta, että joutuisit kirjoittamaan/sisällyttämään nämä merkit tai komennot käsin jokaiseen soluun, johon haluat niiden kohdistuvan.

**Huomaa**: `\halign` rivin tai `\valign` sarakkeessa voi olla vähemmän soluja kuin maximum specified by the $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ mutta siinä ei voi olla enempää kuin tuo enimmäismäärä, muuten TeX antaa virheen. Tässä yhteydessä jätämme yksityiskohdat *syklisistä* esimäärittelyistä.

Jatkaen rakennekaavioitamme, $$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$ kohtaan

* jokin `\halign` taulukko, jossa on enintään $$\mathrm{K}$$ solua per *rivillä*, tai
* a `\valign` taulukko, jossa on enintään $$\mathrm{K}$$ solua per *sarakkeessa*

voidaan kirjoittaa seuraavasti:

$$\langle$$⁠mallipohja$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠mallipohja$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠mallipohja$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠mallipohja$${}*\mathrm{K}$$⁠$$\rangle$$

jossa `&` on *kohdistustabulointimerkki* joka osoittaa yhden solun loppumisen ja seuraavan alkamisen. Perinteisesti et-merkkiä (`&`) käytetään kohdistustabulointina, mutta mitä tahansa merkkiä, jolla on [kategoriakoodi](/latex/fi/lisaa-aiheita/43-table-of-tex-category-codes.md) arvo 4, voitaisiin käyttää sen sijaan.

Varmistuksena vielä, $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ voidaan kirjoittaa $$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$**`\cr`**, tai vastaavasti

$$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠mallipohja$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠mallipohja$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠mallipohja$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠mallipohja$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Kunkin solun rakenne $$\langle$$⁠mallipohja⁠$$\rangle$$

Jokainen solu $$\langle$$⁠mallipohja$${}\_i$$⁠$$\rangle$$ voidaan kirjoittaa seuraavasti:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ jossa:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ on merkki- tai komentojoukko (tokenit), jonka TeX lisää automaattisesti *ennen kuin* käyttäjän syöttämä sisältö solua varten $$i$$;
* $$\texttt{#}$$ on paikkamerkki, joka näyttää, mihin käyttäjän syöttämän sisällön on tarkoitus ilmestyä solussa $$i$$. Jälleen, `#` merkki on vain *perinne*, mitä tahansa merkkiä, jolla on [kategoriakoodi](/latex/fi/lisaa-aiheita/43-table-of-tex-category-codes.md) arvo 6 voitaisiin käyttää sen sijaan. Huomaa, että luokkakoodi 6 käytetään makroparametreille;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ on merkki- tai komentojoukko (tokenit), jonka TeX lisää automaattisesti *jälkeen* käyttäjän syöttämä sisältö solua varten $$i$$.

Huomaa, että kaikki $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ ja $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ olet *valinnainen*: sinun ei tarvitse käyttää mitään merkkejä tai komentoja solun sisällön ennen tai jälkeen.

**Täydentäen** $$\langle$$**⁠esimäärittely⁠**$$\rangle$$

Lopuksi, käyttämällä yllä olevaa merkintätapaa, $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ kohtaan

* jokin `\halign` taulukko, jossa on enintään $$\mathrm{K}$$ solua per *rivillä*, tai
* a `\valign` taulukko, jossa on enintään $$\mathrm{K}$$ solua per *sarakkeessa*

voidaan kirjoittaa seuraavasti:

$$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠`esimäärittelyrivin`⁠$$\rangle$$`**\cr**`

tai

$$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Se** $$\langle$$**⁠esimäärittely⁠**$$\rangle$$ **ja rivien ja sarakkeiden laskenta**

Yksi **`\halign`** taulukko, jossa on $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ jossa määritellään $$\mathrm{K}$$ solut ja $$\langle$$⁠`runko`⁠$$\rangle$$ sisältävä $$\mathrm{N}$$ $$\langle$$⁠`runkorivit`⁠$$\rangle$$ tuottaa taulukon, jossa on $$\mathrm{K}$$ *saraketta* ja $$\mathrm{N}$$ *riviä*, kuten seuraavassa kaaviossa esitetään:

![](/files/14bc6e54e17a46cd33ea4ba071bbde4a50eabbfe)

Yksi **`\valign`** taulukko, jossa on $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ jossa määritellään $$\mathrm{K}$$ solut ja $$\langle$$⁠`runko`⁠$$\rangle$$ sisältävä $$\mathrm{N}$$ $$\langle$$⁠`runkorivit`⁠$$\rangle$$ tuottaa taulukon, jossa on $$\mathrm{K}$$ *riviä* ja $$\mathrm{N}$$ *saraketta*, kuten seuraavassa kaaviossa esitetään:

![](/files/01826200b0a43ef7deffd1fbe2990a9242a09438)

### Riittävästi teoriaa, nyt esimerkkejä!

Kuten myöhemmin näemme yksityiskohtaisemmin, kun TeX käsittelee taulukon sisältöä — eli taulukon soluja, jotka sijaitsevat [$$\langle$$⁠`runko`⁠$$\rangle$$](#body)—se tarkistaa solumallipohjien olemassaolon; ne määriteltiin $$\langle$$⁠`esipuheessa`⁠$$\rangle$$, koska TeX etsii mallipohjien tokeneita, jotka se lisää ennen käyttäjän sisältöä ja/tai sen jälkeen. Seuraavat, minimaaliset esimerkit osoittavat solumallipohjien käytön $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ yhdessä `\halign` ja `\valign` taulukon SVG-grafiikan luomiseksi.

#### \halign-taulukko, jossa käytetään solumallipohjia

Seuraava esimerkki osoittaa `\halign` taulukon, joka käyttää solumallipohjaa lisätäkseen automaattisesti lainausmerkit jokaisen rivin ensimmäisen solun sisällön ympärille: eli mallipohjaa, joka vaikuttaa jokaiseen ensimmäisen sarakkeen soluun:

```latex
\documentclass{article}
\usepackage{parskip} % Aseta \parindent arvoon 0pt
% Valitse sopivan pieni sivukoko
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Välitä \halignin sarakkeet
\begin{document}
\pagestyle{empty}

Tässä on \verb|\halign|-taulukko \textit{ilman} solumallipohjia:

\halign{
% Ei mitään ennen tai jälkeen jokaista '#' merkkiä <preamble>-osassa
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Tässä on sama \verb|\halign|-taulukko, mutta lainausmerkit lisätään automaattisesti jokaisen rivin ensimmäiseen soluun; eli se vaikuttaa jokaiseen ensimmäisen sarakkeen soluun:

\halign{
% Lainausmerkkimallipohjat esimäärittelyssä:
``#''&#&#\cr % Lainausmerkit ennen ja jälkeen ensimmäisen #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/28fc006b49158c4a4c5a2a234c481c4a0aed9e0c)

Seuraava kuva on selitteillä varustettu versio `\halign` yllä olevan esimerkin tuottamasta taulukosta; tässä vertaamme kolmisoluisen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

virallista rakennetta todelliseen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ kohteelle ` ``#''&#&#**\cr** `, korostaen solumallipohjien olemassaoloa tai puuttumista:

![](/files/b912ba7668b6fec72a5e695b1b1a7cbfd4ce36b9)

#### \valign-taulukko, jossa käytetään solumallipohjia

Seuraava esimerkki osoittaa `\valign` taulukon, joka käyttää jokaista solua varten mallipohjaa lisätäkseen automaattisesti numerot käyttäjän sisällön ympärille.

```latex
\documentclass{article}
\usepackage{parskip} % Aseta \parindent arvoon 0pt
% Valitse sopivan pieni sivukoko
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Välitä \valign-rivit
\begin{document}
\pagestyle{empty}

Tässä on \verb|\valign|-taulukko \textit{ilman} solumallipohjia:

\begingroup
\hsize=25pt
\valign{
% Ei mitään ennen tai jälkeen jokaista '#' merkkiä
% <preamble>-osassa
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Tässä on sama \verb|\valign|-taulukko, mutta siinä käytetään solumallipohjia, jotka lisäävät automaattisesti numeroita jokaiseen soluun:

\begingroup
\hsize=25pt
\valign{
% Numerot lisätään ennen ja jälkeen jokaista '#' merkkiä
% <preamble>-osassa
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/b83fca6db21401632751055300fc7eeb56ca39a9)

Seuraava kuva on selitteillä varustettu versio `\valign` yllä olevan esimerkin tuottamasta taulukosta; tässä vertaamme kolmisoluisen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

virallista rakennetta todelliseen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ kohteelle `1#2&3#4&5#6**\cr**`, korostaen solumallipohjien käyttöä $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/105d76b58d08bd0a2bbf186e75f4e7ac4d3febf6)

Huomaa, kuinka solun $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) mallipohja kohdistetaan $$i$$jokaiseen `\valign` sarakkeen $$i$$s *rivillä* soluihin, jolloin kaikki

#### Tekstin muotoilu solumallipohjilla

Seuraava esimerkki käyttää seuraavia $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ (solumallipohjia) muotoilemaan kunkin rivin tai sarakkeen sisältämän tekstin:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Jos vertaamme tätä $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ kolmisoluisen "muodolliseen" rakenteeseen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

näemme, että:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Huomaa, kuinka nämä solumallit, kuten `\textbf{#}` muistuttavat makroja, joilla on yksi parametri (solun sisältö).

```latex
Tekstiä solumalleilla tyylitelty \verb|\valign|-taulukko:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Tekstiä solumalleilla tyylitelty \verb|\halign|-taulukko:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/f4689d2c6f6d5795b07eeab838e9714e5d2db7e0)

## Lisätietoja taulukosta $$\langle$$⁠runko⁠$$\rangle$$

Osiossa [Taulukon esittely $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ ja $$\langle$$⁠`runko`⁠$$\rangle$$](#preamble) näimme, miten, jos jätämme tilapäisesti huomiotta `\noalign`, $$\langle$$⁠`runko`⁠$$\rangle$$ jonkin `\halign` tai `\valign` taulukko koostuu useista riveistä, joista kukin on merkitty $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$, missä:

* jokainen $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ päättyy `\cr` komento
* jokainen $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ jonkin `\halign` on taulukon rivi
* jokainen $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ jonkin `\valign` on taulukon sarake

Rivien jono, $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$, jossa $$j=1\ldots\mathrm{N}$$, tuottaa $$\mathrm{N}$$ rivejä `\halign` tai $$\mathrm{N}$$ sarakkeita `\valign`. Kuten seuraavassa kaaviossa tiivistetään, yleinen $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ kuten

$$\langle$$⁠`esipuheessa`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

määrittää solumallit enintään $$\mathrm{K}$$ solulle kussakin $$\mathrm{N}$$ $$\langle$$⁠`runkoriviksi`⁠$$\rangle$$ merkinnässä $$\langle$$⁠`runko`⁠$$\rangle$$:

![](/files/b4f3b68e7ad78f5ff60043fd6b6cc4e52060c5a2)

### Kunkin $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$

Jokainen rivi $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ taulukon $$\langle$$⁠runko⁠$$\rangle$$ sisältää sisältöä enintään $$\mathrm{K}$$ soluun — kuten taulukon $$\langle$$⁠esimäärittely⁠$$\rangle$$—ja sillä on yleinen muoto:

$$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Solu$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Solu$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Solu$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Solu$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

jossa:

* $$\langle$$⁠Solu$${}\_i$$⁠$$\rangle$$ edustaa käyttäjän sisältöä $$i$$s. solulle jossakin $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$
* sivustolta **`&`** merkkiä kutsutaan *tasausmerkiksi* (sama kuin käytetään $$\langle$$⁠esimäärittely⁠$$\rangle$$) joka osoittaa yhden solun päättymisen ja seuraavan alkamisen. Jälleen kerran, käyttö **`&`** on pelkkä perinne (käytäntö), koska mikä tahansa merkki jolla on [kategoriakoodi](/latex/fi/lisaa-aiheita/43-table-of-tex-category-codes.md) arvo 4, voitaisiin käyttää sen sijaan.

Vaikka kukin $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ voi sisältää enintään $$\mathrm{K}$$ solua (kuten $$\langle$$⁠esimäärittely⁠$$\rangle$$) ne voivat sisältää *vähemmän* kuin $$\mathrm{K}$$ solua, ja mikä tahansa $$\langle$$⁠Solu$${}\_i$$⁠$$\rangle$$ tiedostoihin $$\langle$$⁠runkorivi$${}\_j$$⁠$$\rangle$$ voi olla tyhjä.

Seuraava esimerkki osoittaa $$\langle$$⁠esimäärittely⁠$$\rangle$$ kohteelle `#&#&#&#&#\cr` mikä tarjoaa enintään 5 solua per $$\langle$$runkorivi$$\rangle$$; kuitenkin ladotut taulukot sisältävät rivejä, joissa on alle 5 solua:

```latex
1–5 solua per \textit{sarake} sisältävä \verb|\valign|-taulukko:

\begingroup
% \hsize ohjaa \valign-sarakkeiden leveyksiä (ladottujen rivien koko).
\hsize=40pt
\fbox{\valign{
% Käytä johdantoa, joka sallii 5 solua per sarake
% Useimmat sarakkeet eivät tarjoa sisältöä 5 solulle
#&#&#&#&#\cr% 5 cells per column
\(\mathrm{Solu}{}_1\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)&\(\mathrm{Solu}{}_4\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)&\(\mathrm{Solu}{}_4\)&\(\mathrm{Solu}{}_5\)\cr
}}
\endgroup

% Huom.: myöhemmin selitettävistä syistä
% \halign on sijoitettava \vboxiin
1–5 solua per \textit{rivi} sisältävä \verb|\halign|-taulukko:

\fbox{%
\vbox{\halign{
% Käytä johdantoa, joka sallii 5 solua per rivi
% Useimmat rivit eivät tarjoa sisältöä 5 solulle
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Solu}{}_1\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)&\(\mathrm{Solu}{}_4\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)&\(\mathrm{Solu}{}_4\)&\(\mathrm{Solu}{}_5\)\cr
}}}
```

[Avaa tämä esimerkki Overleafissa](/latex/fi/syvalliset-artikkelit/15-how-do-tex-engines-typeset-tables-2.md)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/0b26ef5a8b74a4cb11e106696fac52a8af208d00)

Seuraava `\halign` esimerkki osoittaa vaihtelevan solumäärän per rivi ja sen, että solut voivat olla tyhjiä — huomaa, miten tyhjät solut syntyvät peräkkäisistä **`&`** merkeistä taulukossa:

```latex
Joitakin tyhjiä soluja sisältävä \verb|\halign|-taulukko --- huomaa, että taulukossa \(\langle\texttt{body}\rangle\) on peräkkäisiä \texttt{\&}-merkkejä:

\fbox{%
\vbox{\halign{
% Käytä johdantoa, joka sallii 5 solua per rivi
% Useimmat rivit eivät tarjoa sisältöä 5 solulle
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Solu}{}_1\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)\cr
\(\mathrm{Solu}{}_1\)&&\(\mathrm{Solu}{}_3\)\cr
&\(\mathrm{Solu}{}_2\)&\(\mathrm{Solu}{}_3\)&\(\mathrm{Solu}{}_4\)\cr
\(\mathrm{Solu}{}_1\)&\(\mathrm{Solu}{}_2\)&&&\(\mathrm{Solu}{}_5\)\cr
}}}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/188e4bd5fa0235defac16ee483d0abd3a226de9f)

### Taulukon ladonnassa &- ja #-merkeissä ei ole mitään erityistä

TeXin käyttö merkkien `&` ja `#` käytössä ladonnassa `\halign`- tai `\valign`-pohjaisissa taulukoissa on perinne, joka juontaa Knuthin alkuperäisistä plain TeX -makroista. On täysin mahdollista käyttää muitakin merkkejä kuin `&` ja `#` antamalla sopivat kategorialuokat haluamillesi korvaaville merkeille, kuten seuraava esimerkki osoittaa:

* korvaamista `&` verrattuna `@` antamalla `@` kategorialuokaksi 4
* korvaamista `#` verrattuna `|` antamalla `|` kategorialuokaksi 6 (jota käytetään makroparametreille)

Kategoriamuutokset pidetään paikallisina käyttämällä `\begingroup` ja `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## \noalign-komennon uudelleenesittely

TeX-moottorit tarjoavat sisäänrakennetun (primitiivisen) `\noalign` komento:

`\noalign{`$$\langle$$⁠`tokenit`⁠$$\rangle$$`}`

jossa $$\langle$$⁠`tokenit`⁠$$\rangle$$ ovat merkkejä ja/tai TeX/LaTeX-komentoja.  `\noalign` komentoa käytetään yksinomaan `\halign` tai `\valign` taulukossa: sen käyttäminen niiden ulkopuolella aiheuttaa virheen.

Komennon tarkoitus on `\noalign` mahdollistaa tekstin ja TeX/LaTeX-komentojen 'lisääminen' *väliin* rivit `\halign` taulukon tai `\valign` taulukon sarakkeiden väliin. Yleisin `\noalign` käyttötapa on taulurivien (viivojen) luominen:

* *vaaka* viivoja `\halign` taulurivien
* *pysty* viivoja `\valign` taulukkosarakkeiden

Huomaa seuraavat asiat:

* sivustolta `\noalign` on ***ei päätetä\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*komennolla***
* joukko komentoja, jotka sallitaan `\\noalign{...}` riippuu siitä, käytetäänkö sitä $$\langle$$⁠`runko`⁠$$\rangle$$ jonkin `\halign` tai `\valign` taulukossa (ts. pystysuorassa tai vaakasuuntaisessa tilassa).

Voimme nyt sanoa, että taulukko $$\langle$$⁠`runko`⁠$$\rangle$$ kohteelle `\halign` tai `\valign` voi koostua yksittäisistä riveistä $$\langle$$⁠runkorivi$${}\_i$$⁠$$\rangle$$`\cr` joiden välissä on `\noalign` komentoja; yksi monista mahdollisuuksista/yhdistelmistä voisi olla:

`\noalign{`$$\langle$$⁠`tokenit`⁠$$\rangle$$`}` $$\langle$$⁠runkorivi$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠runkorivi$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`lisätunnuksia`⁠$$\rangle$$`}` $$\langle$$⁠runkorivi$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠runkorivi$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`muita tunnuksia`⁠$$\rangle$$`}`

### \noalignia käyttävä esimerkki

Tarkastelemme muita käyttötapoja myöhemmin tässä artikkelisarjassa, mutta tässä on perusesimerkki, joka osoittaa taulurivien luomisen `\noalign`:

```latex
\setlength{\tabskip}{5pt}

\verb|\noalign|-komennon käyttäminen vaakaviivojen sijoittamiseen \verb|\halign|-taulukon rivien väliin:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

\verb|\noalign|-komennon käyttäminen pystyviivojen sijoittamiseen \verb|\valign|-taulukon sarakkeiden väliin:
\vspace{6pt}

\begingroup % pidä muutokset \parindent- ja \hsize-arvoihin paikallisina
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/fc6e544fb94f61a0f2312b39e28ccbd09223831a)

## \tabskip uudelleen tarkasteltuna

Tarkastelemme tarkemmin `\tabskip` komentoa, jatkaen [edellisessä osiossa esitetystä johdannosta](#tabskip).

Se `\tabskip` komento asettaa erityisen 'välin' (gluen) arvon, jota käytetään *yksinomaan* taulukoiden ladonnassa: sen tarkoitus on tarjota väliä taulurivien tai taulukkosarakkeiden väliin:

* kohtaan `\halign` taulukot: `\tabskip` liima lisätään taulukon ennen ja jälkeen (eli vasemmalle ja oikealle) sekä taulukkosarakkeiden väliin
* kohtaan `\valign` taulukot: `\tabskip` liima lisätään taulukon ennen ja jälkeen (eli ylä- ja alapuolelle) sekä taulurivien väliin

Arvo `\tabskip` voidaan asettaa LaTeXin `\setlength` komento:

`\setlength{\tabskip}{`$$\langle$$⁠`liima-arvo`⁠$$\rangle$$`}`

jossa $$\langle$$⁠`liima-arvo`⁠$$\rangle$$ voi olla:

* kiinteä pituus, kuten `5pt`, `3mm`, tai
* äärellinen joustava liima, kuten `3pt plus 2pt minus 1pt`, tai
* äärettömän joustava liima, kuten `0pt plus1fill`.

Voit myös asettaa suoraan `\tabskip` (ohittaen `\setlength`) kirjoittamalla

`\tabskip`=$$\langle$$⁠`liima-arvo`⁠$$\rangle$$

Kuitenkin mikä tahansa muutos `\tabskip` liiman arvoon vaikuttaa taulukon väliin vain, kun muutos on:

* tehty *ennen kuin* sivustolta `\halign` tai `\valign` komennon käsiteltäväksi, tai
* tehty taulukon sisällä $$\langle$$⁠`esipuheessa`⁠$$\rangle$$

Yritykset asettaa `\tabskip` arvoja taulukon sisällössä (taulukon soluissa $$\langle$$⁠`runko`⁠$$\rangle$$) *ei* eivät muuta väliä `\halign` taulukkosarakkeiden tai `\valign` taulurivien väliä. Tämän käyttäytymisen syy `\tabskip` voidaan jäljittää rooliin, joka on $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ taulukon ladonnan aikana — prosesseihin, joita tarkastelemme myöhemmin yksityiskohtaisemmin.

### Näkeminen on uskomista

Jotta eri tyyppisten taulukoiden ladonnassa käytettyjen väli-/liimatyyppien olemassaolo olisi helpompi visualisoida, erityisesti

* `\tabskip` liima
* `\baselineskip` liima
* manuaalinen kernaus (`\kern`)

Overleaf valmisti LuaTeX-pohjaisen projektin taulukon osien värittämiseksi. LuaTeX valittiin, koska se mahdollistaa ladottujen taulukoiden sisäisten tietojen/rakenteiden matalan tason uudelleenkäsittelyn, mutta emme perehdy näihin yksityiskohtiin tässä.

Tässä on joitakin esimerkkejä, jotka osoittavat erilaisia `\tabskip`. Kunkin esimerkin kohdalla näytämme varsinaisen tulosteen ja LuaTeXin tuottaman väritetyn version.

### \tabskip-esimerkki 1

Tarkastellaan `\tabskip` yhdessä `\halign` ja `\valign` taulukon käyttöä. Näytämme varsinaiset ladotut taulukot reunuksella, joka havainnollistaa niiden kokoa ja välistystä, sekä merkityt kuvat, joissa on väritetyt versiot ja jotka näyttävät selvästi eri liimojen/välysten koon kussakin taulukossa.

Ensiksi, `\halign`:

```latex
% Havainnollistaaksemme taulukon laajuutta lisäämme sen ympärille reunuksen
\setlength{\fboxsep}{0pt} % Käytä tiiviisti istuvia reunuksia

% Tässä asetamme \tabskip-arvon 'suoraan'
\tabskip5pt % Aseta alkuperäinen \tabskip-arvo taulukon ulkopuolella

% Jotta taulukon ympärille voidaan lisätä reunus, se on tallennettava TeX-laatikkoon.
% \halign on sijoitettava \vboxiin, koska \halignin on oltava
% käsiteltävä 'pystysuorassa tilassa': \hbox ei toimi, koska
% sitä käsitellään 'vaakasuorassa tilassa'

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/06bc5e9da4cf4b2b2289da6e0129e11da6c14fbf)

Seuraava kuva on suurempi, väritetty ja merkitty versio edellisen esimerkin tuottamasta taulukosta:

![](/files/9c837ec8128e258d8f433f6150a560e9317eb158)

Taulukossa on 4 esiintymää `\tabskip` komentoa, joista kukin vastaa tiettyä välistyksen sijaintia taulukossa:

1. `\tabskip5pt` käytetään taulukon ulkopuolella ja asetetaan `\tabskip` arvo, joka lisätään ennen (vasemmalle puolelle) kunkin rivin ensimmäistä solua.
2. `\tabskip10pt` asetetaan $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa väliin $$\langle$$⁠Solu$${}\_1$$⁠$$\rangle$$ ja $$\langle$$⁠Solu$${}\_2$$⁠$$\rangle$$ jokaisen rivin
3. `\tabskip15pt` asetetaan taulukon toiseen solumalliin $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa väliin $$\langle$$⁠Solu$${}\_2$$⁠$$\rangle$$ ja $$\langle$$⁠Solu$${}\_3$$⁠$$\rangle$$ jokaisen rivin
4. `\tabskip20pt` asetetaan kolmanteen ja viimeiseen solumalliin $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa jälkeen lisättävään väliin $$\langle$$⁠Solu$${}\_3$$⁠$$\rangle$$, jokaisen rivin viimeisen solun jälkeen.

Seuraavaksi, `\valign`

```latex
\setlength{\fboxsep}{0pt} % Käytä tiiviisti istuvia reunuksia
\tabskip5pt % Aseta alkuperäinen \tabskip-arvo taulukon ulkopuolella

% Pidä \hsize-muutokset paikallisina (ryhmässä)
\begingroup
% \hsize määrää \valign-sarakkeiden leveydet
\setlength{\hsize}{50pt}
% Koska \valign voidaan sijoittaa \vboxiin tai \hboxiin, voimme käyttää
% \fboxia suoraan
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

![](/files/bf3cc5affe89c0eb32a0c9275a0562af434be240)

Jälleen seuraava kuva on suurempi, väritetty ja merkitty versio edellisen esimerkin tuottamasta taulukosta:

![](/files/bf1c40294f289091da1cd1c8a667604c5ebccc60)

Kuten `\halign` esimerkissä, taulukossa on 4 esiintymää `\tabskip` komentoa. Kuitenkin `\valign` taulukossa `\tabskip` lisätään taulurivien väliin:

1. `\tabskip5pt` käytetään taulukon ulkopuolella ja asetetaan `\tabskip` arvo, joka lisätään ennen (yläpuolelle) kunkin sarakkeen ensimmäistä solua.
2. `\tabskip10pt` asetetaan $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa väliin $$\langle$$⁠Solu$${}\_1$$⁠$$\rangle$$ ja $$\langle$$⁠Solu$${}\_2$$⁠$$\rangle$$ jokaisen sarakkeen
3. `\tabskip15pt` asetetaan taulukon toiseen solumalliin $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa väliin $$\langle$$⁠Solu$${}\_2$$⁠$$\rangle$$ ja $$\langle$$⁠Solu$${}\_3$$⁠$$\rangle$$ jokaisen sarakkeen
4. `\tabskip20pt` asetetaan kolmanteen ja viimeiseen solumalliin $$\langle$$⁠`esipuheessa`⁠$$\rangle$$ joka vaikuttaa jälkeen lisättävään väliin $$\langle$$⁠Solu$${}\_3$$⁠$$\rangle$$, jokaisen sarakkeen viimeisen solun jälkeen.

**Yhteenveto/johtopäätökset**

* Kun on kyse `\halign` taulukossa `\tabskip` liimaa sijoitetaan kunkin rivin solun vasemmalle ja oikealle puolelle, jolloin taulukkosarakkeiden väli kasvaa.
* Tiedosto `\valign` taulukossa `\tabskip` liimaa sijoitetaan kunkin sarakkeen solun ylä- ja alapuolelle, jolloin taulurivien väli kasvaa.

### \tabskip ja \noalign

#### \halignin käyttäminen

Seuraava `\halign` esimerkki käyttää `\tabskip` liimoja ja osoittaa myös `\noalign` komennon, käyttäen sitä sijoittamaan väliä sisältäviä viivoja ylä- ja alapuolelle `\halign` taulukon rivien. Nämä viivat ladotaan käyttäen `\hrule` (primitiivistä) komentoa yhdessä välin kanssa, jonka luo `\kern`:

```latex
\setlength{\tabskip}{5pt} % Aseta \tabskip taulukon ulkopuolella

\halign{
#&#&#&#&#\cr % The <preamble>
\noalign{\hrule\kern2pt} % Spaced rule before row 1
1&2&3&4&5\cr % Row 1
\noalign{\kern2pt\hrule\kern2pt} % Spaced rule between rows 1/2
6&7&8&9&10\cr % Row 2
\noalign{\kern2pt\hrule\kern2pt} % Spaced rule between rows 2/3
11&12&13&14&15\cr % Row 3
16&17&18&19&20\cr % Row 4---no rules between rows 3/4
\noalign{\kern2pt\hrule} % Space rule at table end
}
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa alla näkyvän taulukon, jota on edelleen merkitty niin, että se toistaa (La)TeX-koodin ja numerot (1)–(4) luettelemiseksi `\noalign` komennot, jotka sisältävät viivoja ja kernejä, yhdessä niitä vastaavan ladotun tulosteen kanssa:

![](/files/c3583f3e58285f43a9f71769f96a715c4a9d31b0)

Seuraava kuva näyttää taulukon väritetyn version, johon on lisätty merkinnät näyttämään taulukon erilaiset välit/liimat:

![](/files/f9c2ea39405394d1fb24cf89dfdb4a736c1b8b8a)

Huomaa seuraavat asiat:

* käyttö `\noalign` jonka avulla lisätään viivoja tiettyjen rivien väliin, sekä manuaalinen käyttö `\kern` arvoja, joilla lisätään hieman tilaa viivojen ennen/jälkeen. TeX-moottorit eivät lisää `\baselineskip` liimaa ladotun viivan jälkeen, minkä vuoksi väli lisätään manuaalisesti käyttämällä `\kern` (muitakin välikomentoja voitaisiin käyttää);
* `\baselineskip` liima lisättiin automaattisesti rivien 3 ja 4 väliin.

#### \valignin käyttäminen

Seuraava `\valign` esimerkki käyttää samaa dataa kuin edellinen `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa alla näkyvän taulukon, jota on edelleen merkitty niin, että se toistaa (La)TeX-koodin ja numerot (1)–(4) luettelemiseksi `\noalign` komennot, jotka sisältävät viivoja ja kernejä, yhdessä niitä vastaavan ladotun tulosteen kanssa:

![](/files/e0c53c17d3751298b62ab0a2e3f274f25a42ee8d)

![](/files/058510f320b12d8e1cda9701dc3e36a18ae1151a)

### Tekstirivejä sisältävä \valign-taulukko

Seuraava esimerkki

```latex
\setlength{\tabskip}{5pt}
\begingroup % Pidä muutokset \parindent- ja \hsize-arvoihin paikallisina
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} voi latoa erittäin monimutkaisia
taulukoita.&Tässä on hieman lisä
tekstiä.&Ja lopuksi ylimääräinen rivi
tässä sarakkeessa.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Avaa tämä esimerkki Overleafissa](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Tämä esimerkki tuottaa seuraavan tulosteen:

## Rivien leveyksien ja sarakkeiden korkeuksien asettaminen

## Lisää taulukosta $$\langle$$⁠esimäärittely⁠$$\rangle$$


---

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