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

# Hoe zetten TeX-engines tabellen op 2

## Hoe zetten TeX-engines tabellen op 2

## TeX-engines noemen tabellen alignments

Binnen de [documentatie van de broncode van TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth bespreekt niet TeX’ vermogen om “tabellen op te zetten”, maar beschrijft in plaats daarvan TeX’ algoritmen voor het construeren van zogenoemde *alignments*. Het opzetten van tabellen door TeX is in feite een geautomatiseerd proces van box-uitlijning: dozen (tabelcellen, rijen en kolommen) rangschikken om een prettig rechthoekig raster of array te bereiken—hoewel er natuurlijk, als het om TeX gaat, *veel* nuances in dat proces zijn.

De term “alignment” komt ook terug in de namen van de twee tabelopmaakcommando’s die in alle TeX-engines zijn ingebouwd:

* `\halign` (horizontale uitlijning), en
* `\valign` (verticale uitlijning).

We zullen beide commando’s in deze artikelreeks verkennen, te beginnen met een formeler overzicht van de vorm/structuur van de `\halign` en `\valign` commando’s als basis voor latere, diepgaande artikelen in deze reeks.

### TeX’ tabellen zijn dozen en spatiëring

Afzonderlijke tabelcellen bevatten doorgaans verschillende inhoud, zoals tekstregels, wiskunde of grafische elementen, wat resulteert in een set tabelcellen met verschillende breedtes, hoogtes of dieptes van opgemaakt materiaal. Op de een of andere manier moet TeX met die cellen, met variërende inhoudsafmetingen, werken om de uiteindelijke tabel te construeren waarin elke rij een bepaalde hoogte en elke kolom een bepaalde breedte heeft. TeX moet uit de verzameling tabelcellen van variabele grootte geschikte waarden afleiden voor de hoogtes van elke rij en de breedtes van elke kolom.

TeX kan de werkelijke grootte van de inhoud van elke cel echter pas kennen nadat die inhoud is opgemaakt; daarom werkt TeX door de hele tabel heen, waarbij elke cel wordt opgemaakt, om de benodigde groottegegevens te verkrijgen om de tabelindeling te voltooien. Uit die groottegegevens kan TeX de juiste hoogte voor elke rij en breedte voor elke kolom bepalen. TeX kan ook lege cellen tegenkomen of cellen die de gebruiker over meerdere kolommen of meerdere rijen wil laten doorlopen, en TeX moet dat alles zorgvuldig meenemen in zijn berekeningen. Pas na het “filteren” van deze uiteenlopende verzameling cel- (box-)groottegegevens kan TeX de uiteindelijke waarden voor kolombreedtes in een `\halign`, of rijhoogtes voor `\valign` en gebruikt die waarden in de laatste fasen van zijn algoritmen voor tabelopmaak.

In de praktijk, en “onder de motorkap”, bestaat het opmaken van tabellen door TeX uit verschillende stappen. Globaal gezien zet TeX eerst een “klad”- of “onvolledige” versie van de tabel op terwijl het de groottegegevens van de cellen — en gegevens over eventuele `\span` commando’s die in de tabel worden gebruikt — vastlegt en verwerkt. In de laatste stappen verwerkt TeX die “onvolledige” versie van de tabel opnieuw om `\halign` kolombreedtes of `\valign` rijhoogtes te finaliseren en de voltooide lay-out te bereiken—alles wat we in deze artikelreeks zullen verkennen.

## \halign en \valign: twee manieren om tabellen te construeren

Alle TeX-engines bieden twee *ingebouwde* commando’s (primitieven) aan die bedoeld zijn voor het opmaken van tabellen (alignments): `\halign` en `\valign`, die veel kernfuncties delen maar ook op enkele fundamentele punten verschillen. Het belangrijkste verschil tussen `\halign` en `\valign` is hoe ze hun respectieve tabellen construeren: rij voor rij of kolom voor kolom:

* `\halign`: zet tabellen op rij-voor-rij-basis op om afzonderlijke rijen te maken die verticaal worden gestapeld om de kolommen van de tabel te vormen
* `\valign`: zet tabellen op kolom-voor-kolom-basis op om afzonderlijke kolommen te maken die horizontaal worden gestapeld om de rijen van de tabel te vormen

### \halign

De volgende diagram toont de opbouw van een tabel die door `\halign`is gemaakt. De tabel wordt rij voor rij opgemaakt met afzonderlijke rijen die verticaal worden gestapeld. Enkele gevolgen hiervan zijn:

* de kolommen van de tabel ontstaan door verticale stapeling van tabelrijen
* pagina-einden kunnen tussen de tabelrijen plaatsvinden
* niet-tabelmateriaal kan tussen rijen worden ingevoegd (via `\nolign`, waar we later op terugkomen)

![](/files/fddd380668badfa38ed02acefec74118dee893c9)

### \valign

De volgende diagram toont de opbouw van een tabel die door `\valign`. De tabel wordt kolom voor kolom opgemaakt met afzonderlijke kolommen die horizontaal (naast elkaar) worden gestapeld. Enkele gevolgen hiervan zijn:

* de rijen van de tabel ontstaan door horizontale stapeling van tabelkolommen
* regelafbrekingen kunnen tussen de tabelkolommen plaatsvinden
* niet-tabelmateriaal kan tussen kolommen worden ingevoegd (via `\noalign`, waar we later op terugkomen)

![](/files/863b9190fd2dd4dc9d7a2de7154712e594d2f498)

### Voorbeelden

Het volgende voorbeeld is bedoeld om de rij *versus*kolombenadering van \halign en \valign te benadrukken.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Strakke boxranden
\setlength{\fboxsep}{0pt}

Hier is een \verb|\valign|-tabel:
\begingroup
% \hsize bepaalt de \valign
% kolombreedtes. We stellen ook
% \parindent in op een kleinere waarde
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % De preambule: later behandeld (zeer gedetailleerd!)
A&B&C\cr % De eerste KOLOM van deze \valign-tabel
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Opmerking: om redenen die later worden uitgelegd
% moet de \halign in een \vbox worden gezet
Hier is een \verb|\halign|-tabel: \fbox{%
\vbox{\halign{
#&#&#\cr % De preambule: later behandeld (zeer gedetailleerd!)
A&B&C\cr % De eerste RIJ van deze \halign-tabel
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op: ![](/files/2a5e49aa07d2f43dc4753c2fa4f3ad143340269b)

De volgende afbeelding toont een geannoteerde versie van de tabellen die door de bovenstaande code zijn geproduceerd. Later in deze artikelreeks behandelen we onderwerpen zoals:

* wat zijn tabelpreambules?
* waarom zetten we `\hsize` en `\parindent` voor `\valign` tabellen op?

Voor nu volstaat het om de rij versus kolombenadering van `\halign` *versus*. `\valign` tabelconstructie op te merken:

![](/files/c85596bbb4c6cb26fe6b2c2200c4634b9dfebb91)

## Algemene vorm van \halign en \valign

We beginnen met het doornemen van de basiskenmerken en algemene vorm van `\halign` en `\valign` maar zonder (nog) in details te treden. [Zoals opgemerkt](#intro), nemen we een iets formeler overzicht van de vorm/structuur van de `\halign` en `\valign` commando’s als basis voor vervolgartikelen in deze reeks.

De meest algemene vorm van de `\halign` en `\valign` commando’s kan als volgt worden geschreven:

`\halign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`inhoud`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`inhoud`⁠$$\rangle$$ }

Zoals je kunt zien, bestaan beide `\halign` en `\valign` uit drie hoofdonderdelen:

* [$$\langle$$⁠`optionele specificatie`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`preambule`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`inhoud`⁠$$\rangle$$](#body)

## De $$\langle$$⁠optionele specificatie⁠$$\rangle$$

De standaardgrootte/-uitgestrektheid van een tabel, de zogenoemde ‘natuurlijke grootte’, wordt bepaald door de inhoud—om het duidelijk te maken: met grootte/-uitgestrektheid bedoelen we

* het *breedte* van een tabel geproduceerd door `\halign`, of
* het *hoogte* van een tabel geproduceerd door `\valign`

Een $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ kan worden gebruikt om de natuurlijke grootte van de tabel te “overschrijven” en heeft een van twee vormen:

* **`om`** $$\langle$$**⁠`afmeting`⁠**$$\rangle$$
* **`uitbreiden`** $$\langle$$**⁠`afmeting`⁠**$$\rangle$$

waar

* $$\langle$$**⁠`afmeting`⁠**$$\rangle$$ is een lengte opgegeven in eenheden die TeX begrijpt, zoals pt, mm of cm—de lengte kan ook worden gespecificeerd als een commando dat uitvouwt tot een waarde in geschikte eenheden;
* **`om`** en **`uitbreiden`** zijn TeX-sleutelwoorden die het type “overschrijving” van de natuurlijke grootte specificeren:
  * **`om`**: stelt de grootte van de tabel in op de opgegeven $$\langle$$⁠`afmeting`⁠$$\rangle$$ waarde
  * **`uitbreiden`**: voegt de opgegeven $$\langle$$⁠`afmeting`⁠$$\rangle$$ waarde toe aan de natuurlijke grootte van de tabel

Het effect van een $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ hangt af van het type tabel dat wordt opgemaakt: het zal de natuurlijke `\halign` van een tabel aanpassen, *breedte*of een `\valign` van een tabel aanpassen, *hoogte*.

Hier zijn enkele voorbeelden:

* `\halign **to 100pt**{...}`: stelt de `\halign` tabelbreedte in op `100pt`
* `\valign **to 50pt**{...}`: stelt de `\valign` tabelhoogte in op `30pt`
* `\halign **spread 30pt**{...}`: voegt 30pt toe aan de `\halign` natuurlijke breedte van de tabel. Omgekeerd zou schrijven **spread -30pt** de breedte van de tabel met 30pt verkleinen.
* `\valign **spread 20pt**{...}`: voegt 20pt toe aan de `\valign` natuurlijke hoogte van de tabel. Omgekeerd zou schrijven **spread -20pt** de hoogte van de tabel met 20pt verkleinen.

De volgende code hergebruikt de bovenstaande tabelvoorbeelden maar past een $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ toe op een `\valign` en `\halign` tabel:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Strakke boxranden
\setlength{\fboxsep}{0pt}

Hier is een \verb|\valign|-tabel:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Hier is een \verb|\halign|-tabel:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de onderstaande uitvoer op:

![](/files/3b217d03760c6eb75878706e7541f13344e31441)

—maar merk op hoe de inhoud van beide tabellen “opeengepakt” is. De reden daarvoor is dat er geen flexibele spatiëring (lijm) beschikbaar is die TeX kan gebruiken om de inhoud uit te rekken en de extra ruimte op te vullen die wordt geboden door **`om`** $$\langle$$**⁠`afmeting`⁠**$$\rangle$$. Hier springen we alvast vooruit om het `\tabskip` commando.

#### Een eerste introductie tot het commando \tabskip

De esthetiek van de lay-out van een tabel kan aanpassing van de spatiëring tussen de rijen of kolommen vereisen, dus het is niet verrassend dat TeX-engines een commando bieden met de naam `\tabskip` waarmee je dat kunt doen. `\tabskip` wordt gebruikt om de hoeveelheid flexibele ruimte (“lijm”) in te stellen (en te variëren) die TeX tussen de kolommen van een `\halign` of de rijen van een `\valign`. Latere artikelen zullen `\tabskip` veel gedetailleerder verkennen.

Als inleidend voorbeeld gebruikt de volgende code een instelling voor `\tabskip` waardoor TeX wat (zeer) flexibele ruimte tussen de rijen van een `\valign` tabel invoegt. Die flexibele ruimte stelt de tabelrijen in staat zich uit te spreiden en de extra ruimte te vullen die wordt gecreëerd door de $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ van **`to 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optionele specificatie} \rangle\)}
\begin{document}
\pagestyle{empty}
Hier is een \verb|\valign|-tabel:
\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}

Hier is dezelfde \verb|\valign|-tabel maar met een \optspec{} van ``\texttt{to 50pt}''. Merk op hoe de rijen “opeengepakt” zijn omdat er geen beschikbare “rekbare lijm” tussen de rijen is:

\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}

We gebruiken de \verb|\valign|-tabel met een \optspec{} van ``\texttt{to 50pt}'', maar voorzien in “flexibele spatiëring” via het commando \tabskip. Hier zorgt \tabskip voor voldoende “lijm” om de \verb|\valign|-rijen te laten “uitrekken” en eventuele beschikbare extra ruimte te vullen. Hier is de “uitgerekte” \verb|\valign|-tabel:

\tabskip=0pt plus1fil % Dit zet \tabskip op een zeer flexibele lijm
\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}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/053829eae8f63fe8202422679d5d9430c895a0c8)

## Introductie van de tabel $$\langle$$⁠preambule⁠$$\rangle$$ en $$\langle$$⁠inhoud⁠$$\rangle$$

Dit deel biedt een introductie tot de tabel $$\langle$$⁠`preambule`⁠$$\rangle$$ en *kort* gaat in op de tabel $$\langle$$⁠`inhoud`⁠$$\rangle$$ die vervolgens [meer gedetailleerd wordt onderzocht](#bodydetails).

Latere artikelen in deze reeks zullen de $$\langle$$⁠`preambule`⁠$$\rangle$$ en $$\langle$$⁠`inhoud`⁠$$\rangle$$ meer gedetailleerd verkennen, met name TeX’ gebruik en verwerking van de tabel $$\langle$$⁠`preambule`⁠$$\rangle$$.

Zoals hierboven opgemerkt, kan de meest algemene vorm van `\halign` of `\valign` tabellen als volgt worden geschreven:

`\halign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`inhoud`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`inhoud`⁠$$\rangle$$ }

### De $$\langle$$⁠preambule⁠$$\rangle$$

De $$\langle$$⁠`preambule`⁠$$\rangle$$ sectie bevat een enkele $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ dat is *beëindigd* door het `\cr` commando; bijgevolg kan de $$\langle$$⁠`preambule`⁠$$\rangle$$ opnieuw worden geschreven als:

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`preambule-regel`⁠$$\rangle$$**`\cr`**

### De $$\langle$$⁠inhoud⁠$$\rangle$$

Evenzo gebruikt het $$\langle$$⁠inhoud⁠$$\rangle$$ sectie kan verder worden opgesplitst in een of meer samenstellende “regels”, maar hier zijn er twee opties voor elke regel:

* een regel die bestaat uit een set cellen die samen een `\halign` rij of `\valign` kolom vormen; of
* een `\noalign` commando waarmee materiaal tussen de rijen van een `\halign`'s of kolommen van een `\valign`wordt “geïnjecteerd”.

Voor nu negeren we het `\noalign` commando (zie [later in het artikel](#noalign)) en nemen we aan dat elke regel van de $$\langle$$⁠inhoud⁠$$\rangle$$ gegevens is voor een set cellen en *beëindigd* door `\cr` commando.

Negeer `\noalign`, de $$\langle$$⁠`inhoud`⁠$$\rangle$$ sectie, die de inhoud van de gebruiker vertegenwoordigt, bevat een reeks regels, waarvan we er elke zullen aanduiden als een $$\langle$$⁠`inhoudsregel`⁠$$\rangle$$ die wordt *beëindigd* door zijn bijbehorende `\cr` commando.

De $$\langle$$⁠`inhoud`⁠$$\rangle$$ opnieuw worden geschreven als:

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

Als we dit samenvoegen, kunnen we de algemene vorm van `\halign` en `\valign` als:

`\halign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule-regel`⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠inhoudsregel⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`optionele specificatie`⁠$$\rangle$$ { $$\langle$$⁠`preambule-regel`⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠inhoudsregel⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Om redenen die in latere artikelen zullen worden behandeld, heeft de $$\langle$$⁠`preambule`⁠$$\rangle$$, slechts een enkele $$\langle$$⁠`preambule-regel`⁠$$\rangle$$, een andere opmaak dan alle regels in de tabel $$\langle$$⁠`inhoud`⁠$$\rangle$$. We zullen ook [opnieuw ingaan op de `\noalign` commando](#noalign) die ook binnen de tabel kan worden gebruikt $$\langle$$⁠`inhoud`⁠$$\rangle$$.

### De $$\langle$$⁠preambule-regel⁠$$\rangle$$

De $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ speelt een *cruciale* rol bij het opmaken van tabellen, omdat deze een soort “blauwdruk” biedt die wordt gebruikt om de inhoud op te maken—`\halign` rijen of `\valign` kolommen—die in de tabel zijn opgenomen $$\langle$$⁠`inhoud`⁠$$\rangle$$zijn gegenereerd. Het $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ kan ook cel-“sjablonen” bevatten die worden gebruikt om de rijen van een `\halign` of kolommen van een `\valign`—een onderwerp dat gedetailleerd zal worden onderzocht.

Het doel van de $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ is tweeledig:

* het bepaalt de *maximale* aantal cellen per rij van een `\halign` of per kolom van een `\valign`.
* het slaat *celsjablonen* op die kunnen worden gebruikt om opmaak of inhoudsopname binnen cellen in de tabel te automatiseren $$\langle$$⁠`inhoud`⁠$$\rangle$$. Celsjablonen zijn optioneel en kunnen “leeg” zijn, of je kunt tekens of commando’s opnemen die TeX automatisch vóór en/of na de eigenlijke inhoud van specifieke cellen in je tabel invoegt. Daarmee hoef je die tekens of commando’s niet handmatig in elke cel te typen/op te nemen waarop ze moeten worden toegepast.

**Opmerking**: een `\halign` rij of `\valign` kolom kan minder cellen bevatten dan het maximum dat door de $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ is gespecificeerd, maar kan niet meer dan dat maximum bevatten, anders genereert TeX een fout. Voor nu laten we details van *cyclische* preambules weg.

Voortbordurend op onze structuurdiagrammen, de $$\langle$$⁠`preambule-regel`⁠$$\rangle$$ voor

* een `\halign` tabel met een maximum van $$\mathrm{K}$$ cellen per *rij*, of
* een `\valign` tabel met een maximum van $$\mathrm{K}$$ cellen per *kolom*

kan als volgt worden geschreven:

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

waar `&` is de *uitlijningstabteken* dat het einde van de ene cel en het begin van de volgende aangeeft. Traditioneel wordt het ampersandteken (`&`) gebruikt als het uitlijningstabteken, maar elk teken met [categoriecode](/latex/nl/meer-onderwerpen/43-table-of-tex-category-codes.md) 4 zou ook gebruikt kunnen worden.

Ter herinnering: de $$\langle$$⁠`preambule`⁠$$\rangle$$ kan worden geschreven $$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`preambule-regel`⁠$$\rangle$$**`\cr`**, of gelijkwaardig

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

#### Structuur van elke cel $$\langle$$⁠sjabloon⁠$$\rangle$$

Elke cel $$\langle$$⁠sjabloon$${}\_i$$⁠$$\rangle$$ kan als volgt worden geschreven:

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

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ is een set tekens of commando’s (tokens) die TeX automatisch zal invoegen *voordat* door de gebruiker aangeleverde inhoud voor cel $$i$$;
* $$\texttt{#}$$ is een plaatsaanduiding, die laat zien waar door de gebruiker aangeleverde inhoud in cel moet verschijnen $$i$$. Ook hier is het `#` teken slechts een *traditie*, elk teken met [categoriecode](/latex/nl/meer-onderwerpen/43-table-of-tex-category-codes.md) 6 zou ook gebruikt kunnen worden. Merk op dat categoriecode 6 wordt gebruikt voor macroparameters;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ is een set tekens of commando’s (tokens) die TeX automatisch zal invoegen *na* door de gebruiker aangeleverde inhoud voor cel $$i$$.

Merk op dat alle $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ en $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ bent *optioneel*: je hoeft geen tekens of commando’s vóór of na de inhoud van de cel te gebruiken.

**De** $$\langle$$**⁠preambule⁠**$$\rangle$$

Tenslotte, met de bovenstaande notatie, kan de $$\langle$$⁠`preambule`⁠$$\rangle$$ voor

* een `\halign` tabel met een maximum van $$\mathrm{K}$$ cellen per *rij*, of
* een `\valign` tabel met een maximum van $$\mathrm{K}$$ cellen per *kolom*

kan als volgt worden geschreven:

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`preambule-regel`⁠$$\rangle$$`**\cr**`

of

$$\langle$$⁠`preambule`⁠$$\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**`

**De** $$\langle$$**⁠preambule⁠**$$\rangle$$ **en telling van rijen en kolommen**

Een **`\halign`** tabel met een $$\langle$$⁠`preambule`⁠$$\rangle$$ waarbij wordt gespecificeerd $$\mathrm{K}$$ cellen en een $$\langle$$⁠`inhoud`⁠$$\rangle$$ met daarin $$\mathrm{N}$$ $$\langle$$⁠`inhoudsregels`⁠$$\rangle$$ zal een tabel produceren met $$\mathrm{K}$$ *kolommen* en $$\mathrm{N}$$ *rijen*, zoals getoond in het volgende diagram:

![](/files/0de215d69440e95eb52f16c8114cca7ce1e00c21)

A **`\valign`** tabel met een $$\langle$$⁠`preambule`⁠$$\rangle$$ waarbij wordt gespecificeerd $$\mathrm{K}$$ cellen en een $$\langle$$⁠`inhoud`⁠$$\rangle$$ met daarin $$\mathrm{N}$$ $$\langle$$⁠`inhoudsregels`⁠$$\rangle$$ zal een tabel produceren met $$\mathrm{K}$$ *rijen* en $$\mathrm{N}$$ *kolommen*, zoals getoond in het volgende diagram:

![](/files/a631072db322a8f901ba23863556ef1667a84112)

### Genoeg theorie, nu wat voorbeelden!

Zoals we later in detail zullen zien, wanneer TeX de inhoud van een tabel verwerkt—de tabelcellen in de [$$\langle$$⁠`inhoud`⁠$$\rangle$$](#body)—controleert het op de aanwezigheid van celsjablonen, die in de $$\langle$$⁠`preambule`⁠$$\rangle$$zijn gedefinieerd, omdat TeX zoekt naar eventuele sjabloontokens die vóór en/of na de inhoud van de gebruiker moeten worden ingevoegd. De volgende minimale voorbeelden tonen het gebruik van celsjablonen $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ in een `\halign` en `\valign` tabel te genereren.

#### Een \halign-tabel met celsjablonen

Het volgende voorbeeld toont een `\halign` tabel die een celsjabloon gebruikt om automatisch dubbele aanhalingstekens rond de inhoud van de eerste cel in elke rij in te voegen: d.w\.z. een sjabloon dat elke cel in de eerste kolom beïnvloedt:

```latex
\documentclass{article}
\usepackage{parskip} % Zet \parindent op 0pt
% Kies een handig kleine paginagrootte
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Spreid de \halign-kolommen uit
\begin{document}
\pagestyle{empty}

Hier is een \verb|\halign|-tabel \textit{zonder} celsjablonen:

\halign{
% Niets vóór of na elke '#' in de <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Hier is dezelfde \verb|\halign|-tabel maar met dubbele aanhalingstekens die automatisch aan de eerste cel in elke rij worden toegevoegd; d.w.z. het beïnvloedt elke cel in de eerste kolom:

\halign{
% Aanhalingstekensjablonen in de preambule:
``#''&#&#\cr % Dubbele aanhalingstekens vóór en na de eerste #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/8338e401bc2dba924159ef1f0ce9276a4dd2f7b9)

De volgende afbeelding is een geannoteerde versie van de `\halign` tabel die door het bovenstaande voorbeeld is geproduceerd; hier vergelijken we de “formele” structuur van een $$\langle$$⁠`preambule`⁠$$\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**`

met de eigenlijke $$\langle$$⁠`preambule`⁠$$\rangle$$ van ` ``#''&#&#**\cr** `, waarbij de aanwezigheid of afwezigheid van celsjablonen wordt benadrukt:

![](/files/b2946e27e0f02be6f3d2fef8d2a2d91cf0a62d4e)

#### Een \valign-tabel met celsjablonen

Het volgende voorbeeld toont een `\valign` tabel die voor elke cel een sjabloon gebruikt om automatisch cijfers rond de inhoud van de gebruiker in te voegen.

```latex
\documentclass{article}
\usepackage{parskip} % Zet \parindent op 0pt
% Kies een handig kleine paginagrootte
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Spreid de \valign-rijen uit
\begin{document}
\pagestyle{empty}

Hier is een \verb|\valign|-tabel \textit{zonder} celsjablonen:

\begingroup
\hsize=25pt
\valign{
% Niets vóór of na elke '#' in
% de <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Hier is dezelfde \verb|\valign|-tabel maar met celsjablonen om automatisch cijfers in elke cel in te voegen:

\begingroup
\hsize=25pt
\valign{
% Cijfers vóór en na elke '#' ingevoegd in
% de <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/b3effb1e4dc05578caa865d855d5f007df0aa594)

De volgende afbeelding is een geannoteerde versie van de `\valign` tabel die door het bovenstaande voorbeeld is geproduceerd; hier vergelijken we de “formele” structuur van een $$\langle$$⁠`preambule`⁠$$\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**`

met de eigenlijke $$\langle$$⁠`preambule`⁠$$\rangle$$ van `1#2&3#4&5#6**\cr**`, waarbij het gebruik van celsjablonen wordt benadrukt $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/de2577ac4cfb2ff12336e39b556f6382f0ea03ad)

Merk op hoe het sjabloon voor cel $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) wordt toegepast op de $$i$$th cel in elke `\valign` kolom, waardoor alle cellen van de $$i$$th *rij* worden beïnvloed.

#### Tekst opmaken met celsjablonen

Het volgende voorbeeld gebruikt de volgende $$\langle$$⁠`preambule`⁠$$\rangle$$ (celsjablonen) om de tekst in elke rij of kolom op te maken:

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

Als we dit $$\langle$$⁠`preambule`⁠$$\rangle$$ vergelijken met onze “formele” structuur van een drie-cellige $$\langle$$⁠`preambule`⁠$$\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**`

we kunnen zien dat:

$$\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$$=`}`

Let op hoe deze celsjablonen, zoals `\textbf{#}` lijken op macro's met één parameter (de celinhoud).

```latex
Een \verb|\valign|-tabel met tekst opgemaakt met celsjablonen:

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

Een \verb|\halign|-tabel met tekst opgemaakt met celsjablonen:

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

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/c6df3cc05c7e404a13c0e45138d104c702eeb663)

## Meer details over de tabel $$\langle$$⁠inhoud⁠$$\rangle$$

In de sectie [Introductie van de tabel $$\langle$$⁠`preambule`⁠$$\rangle$$ en $$\langle$$⁠`inhoud`⁠$$\rangle$$](#preamble) hebben we gezien hoe, als we tijdelijk negeren `\noalign`, de $$\langle$$⁠`inhoud`⁠$$\rangle$$ van een `\halign` of `\valign` tabel uit meerdere regels bestaat, elk aangeduid $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$, waarbij:

* elke $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ wordt beëindigd door de `\cr` commando
* elke $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ van een `\halign` is een tabelrij
* elke $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ van een `\valign` is een tabelkolom

De reeks regels, $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$, waarbij $$j=1\ldots\mathrm{N}$$, produceert $$\mathrm{N}$$ rijen van een `\halign` of $$\mathrm{N}$$ kolommen voor een `\valign`. Zoals samengevat in het volgende diagram, een algemene $$\langle$$⁠`preambule`⁠$$\rangle$$ zoals

$$\langle$$⁠`preambule`⁠$$\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**`

specificeert celsjablonen voor maximaal $$\mathrm{K}$$ cellen in elk van de $$\mathrm{N}$$ $$\langle$$⁠`inhoudsregel`⁠$$\rangle$$ ingangen in de $$\langle$$⁠`inhoud`⁠$$\rangle$$:

![](/files/6e0a9ea2d3377fd4a022c6956c92d1121c380b85)

### De structuur van elke $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$

Elke regel $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ van de tabel $$\langle$$⁠inhoud⁠$$\rangle$$ bevat inhoud voor maximaal $$\mathrm{K}$$ cellen—zoals bepaald door de tabel $$\langle$$⁠preambule⁠$$\rangle$$—en heeft de algemene vorm:

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

waarbij:

* $$\langle$$⁠Cel$${}\_i$$⁠$$\rangle$$ vertegenwoordigt de inhoud van de gebruiker voor de $$i$$de cel in een bepaalde $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$
* het **`&`** teken wordt de *uitlijnings-tab* (hetzelfde als gebruikt in de $$\langle$$⁠preambule⁠$$\rangle$$) wat het einde van de ene cel en het begin van de volgende aangeeft. Ook hier is het gebruik van **`&`**  is slechts een traditie (conventie), omdat elk teken met [categoriecode](/latex/nl/meer-onderwerpen/43-table-of-tex-category-codes.md) 4 zou ook gebruikt kunnen worden.

Hoewel elke $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ maximaal kan bevatten $$\mathrm{K}$$ cellen (bepaald door de $$\langle$$⁠preambule⁠$$\rangle$$) kunnen ze *minder* dan $$\mathrm{K}$$ cellen en elke $$\langle$$⁠Cel$${}\_i$$⁠$$\rangle$$ in $$\langle$$⁠inhoudsregel⁠$${}\_j$$⁠$$\rangle$$ kan leeg zijn.

Het volgende voorbeeld toont een $$\langle$$⁠preambule⁠$$\rangle$$ van `#&#&#&#&#\cr` wat voorziet in maximaal 5 cellen per $$\langle$$⁠bodyregel⁠$$\rangle$$; de opgemaakte tabellen bevatten echter regels met minder dan 5 cellen:

```latex
Een \verb|\valign|-tabel met 1 tot 5 cellen per \textit{kolom}:

\begingroup
% \hsize bepaalt de \valign-kolombreedtes (grootte van opgemaakte regels).
\hsize=40pt
\fbox{\valign{
% Gebruik een preamble die 5 cellen per kolom toestaat
% De meeste kolommen bevatten geen inhoud voor 5 cellen
#&#&#&#&#\cr% 5 cells per column
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Opmerking: om redenen die later worden uitgelegd
% moet de \halign in een \vbox worden gezet
Een \verb|\halign|-tabel met 1 tot 5 cellen per \textit{rij}:

\fbox{%
\vbox{\halign{
% Gebruik een preamble die 5 cellen per rij toestaat
% De meeste rijen bevatten geen inhoud voor 5 cellen
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Open dit voorbeeld in Overleaf](/latex/nl/diepgaande-artikelen/15-how-do-tex-engines-typeset-tables-2.md)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/902adc36eea8c523a5ca6059a78bb349888a18b7)

Het volgende `\halign` voorbeeld laat een wisselend aantal cellen per rij zien en de mogelijkheid dat cellen leeg zijn—let op hoe lege cellen worden geproduceerd door opeenvolgende **`&`** tekens in de tabel:

```latex
Een \verb|\halign|-tabel met enkele lege cellen---let op dat er opeenvolgende \texttt{\&}-tekens in de tabel \(\langle\texttt{body}\rangle\) staan:

\fbox{%
\vbox{\halign{
% Gebruik een preamble die 5 cellen per rij toestaat
% De meeste rijen bevatten geen inhoud voor 5 cellen
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/8fd3fdf0d174fb2544afe3a1f5aad119b0dc7883)

### Er is niets bijzonders aan & en # bij het opmaken van tabellen

TeX’s gebruik van de tekens `&` en `#` binnen het opmaken van `\halign`- of `\valign`-gebaseerde tabellen is een traditie die zijn oorsprong vindt in Knuths oorspronkelijke plain TeX-macro's. Het is heel goed mogelijk om andere tekens dan `&` en `#` te gebruiken door de juiste categoriecoden aan je gewenste vervangingen toe te kennen, zoals het volgende voorbeeld laat zien:

* vervangt `&` meestal `@` door toe te kennen `@` aan categoricode 4
* vervangt `#` meestal `|` door toe te kennen `|` aan categoricode 6 (die wordt gebruikt voor macroparameters)

Categoriewijzigingen blijven lokaal door gebruik te maken van `\begingroup` en `\endgroup`:

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

[Open dit voorbeeld in Overleaf](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)

## De \noalign-opdracht opnieuw introduceren

TeX-engines bieden de ingebouwde (primitieve) `\noalign` commando:

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

waar $$\langle$$⁠`tokens`⁠$$\rangle$$ zijn tekens en/of TeX/LaTeX-opdrachten. De `\noalign` opdracht is uitsluitend bedoeld voor gebruik binnen een `\halign` of `\valign` tabel: gebruik ervan daarbuiten zal een fout veroorzaken.

Het doel van `\noalign` is het toestaan van het "invoegen" van tekst en TeX/LaTeX-opdrachten *tussen* de rijen van een `\halign` tabel of de kolommen van een `\valign` tabel. Het meest voorkomende gebruik van `\noalign` is het maken van tabelregels (lijnen):

* *horizontale* regels tussen `\halign` tabelrijen
* *verticale* regels tussen `\valign` tabelkolommen

Let op het volgende:

* het `\noalign` commando is ***niet beëindigd door de\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*opdracht***
* de set opdrachten die binnen `\noalign{...}` is toegestaan, hangt af van of het wordt gebruikt in de $$\langle$$⁠`inhoud`⁠$$\rangle$$ van een `\halign` of `\valign` tabel (d.w\.z. in een verticale of horizontale modus).

We kunnen nu zeggen dat de tabel $$\langle$$⁠`inhoud`⁠$$\rangle$$ van `\halign` of `\valign` kan bestaan uit afzonderlijke regels $$\langle$$⁠inhoudsregel⁠$${}\_i$$⁠$$\rangle$$`\cr` afgewisseld met `\noalign` opdrachten; een van de vele mogelijkheden/combinaties kan zijn:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}` $$\langle$$⁠inhoudsregel⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠inhoudsregel⁠$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`meer tokens`⁠$$\rangle$$`}` $$\langle$$⁠inhoudsregel⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠inhoudsregel⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`andere tokens`⁠$$\rangle$$`}`

### Voorbeeld met \noalign

We zullen later in deze artikelenreeks naar andere gebruikssituaties kijken, maar hier is een basisvoorbeeld om te laten zien hoe je tabelregels maakt via `\noalign`:

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

Gebruik van \verb|\noalign| om horizontale lijnen tussen rijen van een \verb|\halign|-tabel te plaatsen:
\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}
}

Gebruik van \verb|\noalign| om verticale lijnen tussen kolommen van een \verb|\valign|-tabel te plaatsen:
\vspace{6pt}

\begingroup % houd wijzigingen aan \parindent en \hsize lokaal
\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
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/caa6f54ae47d51e5d7425b544438502975858e31)

## tabskip opnieuw bekeken

We zullen nader kijken naar de `\tabskip` opdracht, voortbouwend op de [introductie in een vorige sectie](#tabskip).

De `\tabskip` opdracht stelt de waarde in van een speciale vorm van "spatiëring" (glue) die wordt gebruikt *uitsluitend* bij het opmaken van tabellen: het doel is om ruimte tussen tabelrijen of -kolommen te voorzien:

* voor `\halign` tabellen: `\tabskip` glue wordt voor en na de tabel (d.w\.z. links en rechts) en tussen de tabelkolommen ingevoegd
* voor `\valign` tabellen: `\tabskip` glue wordt voor en na de tabel (d.w\.z. boven en onder) en tussen de tabelrijen ingevoegd

De waarde van `\tabskip` kan worden ingesteld met de LaTeX `\setlength` commando:

`\setlength{\tabskip}{`$$\langle$$⁠`gluewaarde`⁠$$\rangle$$`}`

waar $$\langle$$⁠`gluewaarde`⁠$$\rangle$$ kan zijn:

* een vaste lengte zoals `5pt`, `3mm`, of
* een eindig flexibele glue zoals `3pt plus 2pt minus 1pt`, of
* een oneindig flexibele glue zoals `0pt plus1fill`.

Je kunt ook rechtstreeks instellen `\tabskip` (buiten `\setlength`) door te schrijven

`\tabskip`=$$\langle$$⁠`gluewaarde`⁠$$\rangle$$

Elke wijziging in de waarde van `\tabskip` glue heeft echter alleen invloed op de tabelspatiëring wanneer die wijziging:

* gemaakt is *voordat* het `\halign` of `\valign` opdracht wordt verwerkt, of
* binnen de tabel wordt gemaakt $$\langle$$⁠`preambule`⁠$$\rangle$$

Pogingen om `\tabskip` waarden binnen de tabelinhoud in te stellen (cellen in de tabel $$\langle$$⁠`inhoud`⁠$$\rangle$$) *niet* veranderen de spatiëring van `\halign` tabelkolommen of `\valign` tabelrijen. De reden voor dit gedrag van `\tabskip` kan worden herleid tot de rol die de $$\langle$$⁠`preambule`⁠$$\rangle$$ tijdens het opmaken van tabellen speelt—processen die we later in meer detail zullen verkennen.

### Zien is geloven

Om de aanwezigheid van verschillende soorten spatiëring/glue die worden gebruikt bij het opmaken van tabellen te visualiseren, vooral

* `\tabskip` glue
* `\baselineskip` glue
* handmatige spatiëring (`\kern`)

heeft Overleaf een op LuaTeX gebaseerd project voorbereid om de onderdelen van een tabel van kleur te voorzien. LuaTeX is gekozen omdat het laag-niveau herverwerking van de interne data/structuren van opgemaakte tabellen mogelijk maakt, maar we gaan hier niet op die details in.

Hier zijn enkele voorbeelden die verschillende toepassingen van `\tabskip`. Voor elk voorbeeld tonen we de daadwerkelijke uitvoer en de gekleurde versie die door LuaTeX is geproduceerd.

### tabskip-voorbeeld 1

Laten we het gebruik van `\tabskip` in een `\halign` en `\valign` tabel bekijken. We tonen de daadwerkelijke opgemaakte tabellen, met een rand om hun grootte en spatiëring te visualiseren, samen met geannoteerde afbeeldingen met gekleurde versies die duidelijk de grootte van verschillende glue/spatiëringen in elke tabel laten zien.

Allereerst de `\halign`:

```latex
% Om de omvang van de tabel te visualiseren plaatsen we er een rand omheen
\setlength{\fboxsep}{0pt} % Gebruik nauw aansluitende randen

% Hier stellen we \tabskip "rechtstreeks" in
\tabskip5pt % Stel de initiële \tabskip-waarde buiten de tabel in

% Om een rand rond de tabel te plaatsen, moet deze worden opgeslagen in een TeX-box.
% Een \halign moet in een \vbox worden geplaatst omdat \halign moet worden
% verwerkt in een "verticale modus": een \hbox werkt niet omdat
% die wordt verwerkt in een "horizontale modus"

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

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/590582c2cbf7252c2be05dee2069d62144c24aa9)

De volgende afbeelding is een grotere, gekleurde en geannoteerde versie van de tabel die door het vorige voorbeeld is geproduceerd:

![](/files/23785fe31e1425c2d94932bcca26c8527a323c9f)

Er zijn 4 exemplaren van de `\tabskip` opdracht, elk exemplaar komt overeen met een specifieke locatie van spatiëring binnen de tabel:

1. `\tabskip5pt` wordt buiten de tabel gebruikt en stelt de `\tabskip` waarde in die vóór (links van) de eerste cel in elke rij wordt toegepast.
2. `\tabskip10pt` wordt ingesteld in het eerste celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de ruimte tussen $$\langle$$⁠Cel$${}\_1$$⁠$$\rangle$$ en $$\langle$$⁠Cel$${}\_2$$⁠$$\rangle$$ van elke rij beïnvloedt.
3. `\tabskip15pt` wordt ingesteld in het tweede celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de ruimte tussen $$\langle$$⁠Cel$${}\_2$$⁠$$\rangle$$ en $$\langle$$⁠Cel$${}\_3$$⁠$$\rangle$$ van elke rij beïnvloedt.
4. `\tabskip20pt` wordt ingesteld in het derde en laatste celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de toegevoegde ruimte na $$\langle$$⁠Cel$${}\_3$$⁠$$\rangle$$, de laatste cel van elke rij, beïnvloedt.

Vervolgens de `\valign`

```latex
\setlength{\fboxsep}{0pt} % Gebruik nauw aansluitende randen
\tabskip5pt % Stel de initiële \tabskip-waarde buiten de tabel in

% Houd wijzigingen aan \hsize lokaal (in een groep)
\begingroup
% \hsize bepaalt de \valign-kolombreedtes
\setlength{\hsize}{50pt}
% Omdat \valign in een \vbox of \hbox kan worden geplaatst, kunnen we
% \fbox rechtstreeks gebruiken
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

![](/files/30053ca22d5c5702559ccbe37b49176ea491eae8)

Opnieuw is de volgende afbeelding een grotere, gekleurde en geannoteerde versie van de tabel die door het vorige voorbeeld is geproduceerd:

![](/files/a5298eabaac1a1ee30281d08c20e14b99ab96587)

Net als bij het `\halign` voorbeeld zijn er 4 exemplaren van de `\tabskip` opdracht. Echter, met een `\valign` tabel wordt de `\tabskip` tussen de tabelrijen ingevoegd:

1. `\tabskip5pt` wordt buiten de tabel gebruikt en stelt de `\tabskip` waarde die vóór (boven) de eerste cel in elke kolom wordt toegepast.
2. `\tabskip10pt` wordt ingesteld in het eerste celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de ruimte tussen $$\langle$$⁠Cel$${}\_1$$⁠$$\rangle$$ en $$\langle$$⁠Cel$${}\_2$$⁠$$\rangle$$ van elke kolom.
3. `\tabskip15pt` wordt ingesteld in het tweede celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de ruimte tussen $$\langle$$⁠Cel$${}\_2$$⁠$$\rangle$$ en $$\langle$$⁠Cel$${}\_3$$⁠$$\rangle$$ van elke kolom.
4. `\tabskip20pt` wordt ingesteld in het derde en laatste celsjabloon van de $$\langle$$⁠`preambule`⁠$$\rangle$$ wat de toegevoegde ruimte na $$\langle$$⁠Cel$${}\_3$$⁠$$\rangle$$, de laatste cel van elke kolom.

**Samenvatting/conclusies**

* In een `\halign` tabel wordt de `\tabskip` wordt glue links en rechts van elke cel in een rij geplaatst, waardoor de tabelkolommen uit elkaar worden gezet.
* In een `\valign` tabel wordt de `\tabskip` wordt glue boven en onder elke cel in een kolom geplaatst, waardoor de tabelrijen uit elkaar worden gezet.

### \tabskip and \noalign

#### Gebruik van een \halign

Het volgende `\halign` voorbeeld gebruikt `\tabskip` glues en demonstreert ook de `\noalign` opdracht, waarbij deze wordt gebruikt om lijnen met ruimte erboven en eronder te plaatsen boven en onder de rijen van een `\halign` tabel. Die lijnen worden opgemaakt met de `\hrule` (primitieve) opdracht samen met de ruimte die wordt gecreëerd door `\kern`:

```latex
\setlength{\tabskip}{5pt} % Set \tabskip outside of the table

\halign{
#&#&#&#&#\cr % De <preamble>
\noalign{\hrule\kern2pt} % Lijn met ruimte vóór rij 1
1&2&3&4&5\cr % Rij 1
\noalign{\kern2pt\hrule\kern2pt} % Lijn met ruimte tussen rijen 1/2
6&7&8&9&10\cr % Rij 2
\noalign{\kern2pt\hrule\kern2pt} % Lijn met ruimte tussen rijen 2/3
11&12&13&14&15\cr % Rij 3
16&17&18&19&20\cr % Rij 4---no rules between rows 3/4
\noalign{\kern2pt\hrule} % Lijn met ruimte aan het einde van de tabel
}
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld produceert de onderstaande tabel, die verder is geannoteerd om de (La)TeX-code en de cijfers (1) tot en met (4) weer te geven om de `\noalign` opdrachten, met lijnen en kerns, samen met hun overeenkomstige opgemaakte uitvoer:

![](/files/d912dbe492a67c321775903b39d582535eac7a73)

De volgende afbeelding toont een gekleurde versie van de tabel, gelabeld om de verschillende spatiëringen/glues in de tabel weer te geven:

![](/files/7f943c1df6d2b162d009ec4a714f3e484ac13b5f)

Let op het volgende:

* het gebruik van `\noalign` om lijnen tussen bepaalde rijen in te voegen en het handmatige gebruik van `\kern` waarden om wat ruimte vóór/na de lijnen te plaatsen. TeX-engines voegen geen `\baselineskip` glue toe na een opgemaakte lijn, daarom wordt ruimte handmatig ingevoegd met `\kern` (andere spatiëringsopdrachten zouden gebruikt kunnen worden);
* `\baselineskip` glue werd automatisch ingevoegd tussen rijen 3 en 4.

#### Gebruik van een \valign

Het volgende `\valign` voorbeeld gebruikt dezelfde gegevens als het vorige `\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
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld produceert de onderstaande tabel, die verder is geannoteerd om de (La)TeX-code en de cijfers (1) tot en met (4) weer te geven om de `\noalign` opdrachten, met lijnen en kerns, samen met hun overeenkomstige opgemaakte uitvoer:

![](/files/4c45e0741dd84dff6a5dbe0845db61181f842f5d)

![](/files/a1dedc4655528920d269b87dc82a70e3d321e56b)

### Een \valign-tabel met tekstregels

Het volgende voorbeeld

```latex
\setlength{\tabskip}{5pt}
\begingroup % Houd wijzigingen aan \parindent en \hsize lokaal
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} kan zeer complexe
tabellen.&Hier is wat extra
tekst.&En tot slot een extra regel
in deze kolom.\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
```

[Open dit voorbeeld in Overleaf](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)

Dit voorbeeld levert de volgende uitvoer op:

## Rijbreedtes en kolomhoogtes instellen

## Meer over de tabel $$\langle$$⁠preambule⁠$$\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/nl/diepgaande-artikelen/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.
