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

# Hoe zetten TeX-engines tabellen op

## Hoe zetten TeX-engines tabellen op

## Inleiding: Wat behandelt deze serie?

Het produceren van esthetisch aantrekkelijke tabellen kan tijdrovend zijn — of je nu een visuele opmaaktool, LaTeX of een opmaaktaal zoals HTML of Markdown gebruikt. Voor LaTeX-gebruikers in het bijzonder staat het opmaken van tabellen hoog op veel mensen hun lijst van “pijnpunten”, wat misschien blijkt uit het feit dat “tables” een van de meest [vaak getagde onderwerpen op tex.stackexchange](https://tex.stackexchange.com/tags).

Naast de antwoorden en voorbeelden op tex.stackexchange laat zelfs een oppervlakkige beoordeling van de beschikbare ondersteuning voor het opmaken van tabellen met LaTeX een aantal tabelgerelateerde informatiebronnen zien:

* van Overleaf [hulppagina’s](https://www.overleaf.com/learn/latex/tables) en andere sites zoals [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, het Comprehensive TeX Network, vermeldt meer dan [70 TeX/LaTeX-pakketten](https://ctan.org/topic/table) gerelateerd aan het maken van tabellen
* een heel [boek over het opmaken van tabellen met LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* een uitstekende [online LaTeX-tabellengenerator](https://www.tablesgenerator.com/latex_tables)

Een eenvoudige Google-zoekopdracht naar [LaTeX-tabellen](https://www.google.com/search?q=latex+tables) levert een enorm aantal resultaten op, met veel sites die hulp, advies, voorbeelden en uitleg bieden.

### TeX, niet LaTeX

Gezien de rijkdom aan literatuur over het opmaken van tabellen met LaTeX, is er dan nog iets meer over te schrijven — nog meer tabelvoorbeelden en een opsomming/demonstratie van pakketcommando’s? Is er een manier om het onderwerp van het opmaken van tabellen te benaderen die de fundamentele principes en concepten van tabelopmaak naar voren haalt of daarop focust? Die is er, maar daarvoor moet je de LaTeX-ui afpellen…

We hebben besloten een artikelreeks te maken die lezers achtergrondinformatie en uitleg wil bieden over de onderliggende *mechanica* van tabelopmaak op basis van TeX. In plaats van ons te richten op het opmaken van tabellen met specifieke LaTeX-macro’s/pakketten, zullen we het *onderliggende gedrag* van TeX-engines verkennen: de laag-niveau zetmachinerie verkennen die de fundamenten biedt waarop LaTeX-macrocommando’s zijn opgebouwd. Het uiteindelijke doel is de kernmethoden en algoritmen van op TeX gebaseerde tabelopmaak naar voren te halen en uit te leggen — hopelijk helpt dit lezers/gebruikers beter te begrijpen waarom tabellen zich gedragen zoals ze doen. Een onvermijdelijk gevolg van deze aanpak, waarbij de beschermende lagen van LaTeX-macro-isolatie worden afgepeld, is blootstelling aan rommelige laag-niveau details waar gebruikers normaal gesproken (en met genoegen) van worden afgeschermd via lagen LaTeX-macrocode.

Het heeft veel tijd gekost om deze artikelen te onderzoeken, te schrijven en te illustreren, dus hopen we dat ze een waardevolle aanvulling op de literatuur zijn, met materiaal dat lezers informeert en hen helpt dit complexe gebied van TeX-opmaak beter te begrijpen. We moeten benadrukken dat deze artikelreeks zal *niet* ook ingaan op *de esthetiek* van tabelontwerp — dat is een onderwerp vol subjectieve voorkeuren en een onderwerp waarvan de discussies elders moeten worden uitgevochten…

### De mechanica van TeX-tabellen verkennen: hoe kun je dat doen?

Om de laag-niveau mechanismen en processen in TeX-engines, zoals het opmaken van tabellen, te verkennen en er vervolgens over te schrijven, bouwde Overleaf (gecompileerde) “debug”-versies van Knuths TeX-engine met behulp van Martin Ruckerts [Web2W-proces](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Traditioneel omvat het bouwen van TeX een proces genaamd Web2C, gebruikt binnen TeX Live, dat C-code genereert door TeX’ oorspronkelijke Pascal-broncode om te zetten naar de C-tegenhanger. Dat proces genereert C-code die nooit bedoeld was om door mensen te worden gelezen, alleen door C-compilers. De mechanisch gegenereerde C-code is *uitzonderlijk* moeilijk te lezen of te wijzigen voor experimentele doeleinden.

Daarentegen produceert Web2W C-broncode (beschikbaar [hier](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) die *ordes van grootte* beter leesbaar is dan code die door Web2C wordt geproduceerd. Daardoor is de C-broncode van Web2W veel geschikter om aan te passen voor leer-/experimenteerdoeleinden.

Web2W produceert een versie van TeX (“CTeX”) die *extreem* dicht bij Knuths oorspronkelijke programma staat: “CTeX” bevat niet de vele wijzigingen en verbeteringen die door het Web2C-proces zijn geïntroduceerd — zoals SyncTeX, verwerking van de opdrachtregel en het zoeken naar bestanden via Kpathsea. Hoewel je die waardevolle verbeteringen opgeeft, is de resulterende (Web2W) C-code relatief gemakkelijk te doorzoeken met behulp van Knuths gepubliceerde TeX-broncode, ook al is TeX in Pascal geschreven.

* **Een opmerking over namen:** Strikt genomen mag de naam “TeX” alleen verwijzen naar de oorspronkelijke software die door Donald Knuth is geschreven en gepubliceerd. Elke wijziging aan zijn software moet een andere naam gebruiken voor de resulterende op TeX gebaseerde zetsoftware. Hier hebben we het Web2W-proces gebruikt om een engine te bouwen die in feite nog steeds Knuths oorspronkelijke software is. Om twijfel te vermijden gebruiken we echter de term “CTeX” voor de specifieke versie die met Web2W is gebouwd, maar we zullen ook “TeX” gebruiken om óf Knuths oorspronkelijke engine óf een algemene term voor de opmaaktaal op basis van de principes van Knuths TeX aan te duiden. We hopen dat lezers eventuele incidentele afwijkingen van de strikt correcte terminologie zullen vergeven: we hopen dat betekenis/bedoeling uit de context blijkt.

De debugversie van CTeX werd uitgevoerd met behulp van de [Eclipse IDE](https://www.eclipse.org/downloads/packages/), waardoor het mogelijk was de verwerking in real time te observeren van de C-code die de laag-niveau primitieve (ingebouwde) TeX-commando’s en algoritmen implementeert, ontworpen door Knuth ter ondersteuning van tabelopmaak.

De volgende korte (ca. 90 seconden) video demonstreert de CTeX-engine die draait binnen de [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

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

Naast CTeX hebben we ook e-TeX gecompileerd om toegang te krijgen tot enkele extra primitieve commando’s die niet aanwezig zijn in Knuths oorspronkelijke software. Hoewel CTeX en e-TeX inmiddels oude op TeX gebaseerde engines zijn, zijn ze nog steeds geschikt als basis om de mechanica van tabelopmaak te verkennen omdat die onderliggende principes nog steeds gelden voor alle op TeX gebaseerde zetengines.

### Waarom een oudere TeX-engine gebruiken om tabellen te verkennen?

Ten eerste is het gedrukte boek, [TeX: Het programma](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), waarin TeX’ broncode wordt opgesomd en uitgelegd, nog steeds een uiterst handige gids voor de duistere wateren van TeX’ innerlijke werking, ondanks dat het meer dan 30 jaar geleden (1986) is gepubliceerd. Natuurlijk kun je de documentatie van TeX’ broncode zelf opmaken; zie bijvoorbeeld het Overleaf-project [Maak de broncodedocumentatie van TeX, e-TeX of pdfTeX op](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Sinds de publicatie van TeX: Het programma in 1986 zijn nieuwe TeX-engines ontwikkeld, waaronder pdfTeX, XeTeX en LuaTeX, die allemaal functies en commando’s introduceren die niet in TeX: Het programma zijn gedocumenteerd, simpelweg omdat ze niet aanwezig waren in Knuths oorspronkelijke software.

Voor veel kernprocessen, zoals TeX’ tabelopmaak, blijft de code die in TeX: Het programma is gedocumenteerd relevant als basis voor studie — ook al is TeX’ broncode in Pascal geschreven. Bovendien is Knuths TeX relatief eenvoudig en snel te compileren — vooral via het uiterst nuttige [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) proces, ontwikkeld door Martin Ruckert. Het gemak/de snelheid van compilatie maken het veel handiger om TeX op eenvoudige manieren aan te passen — zoals het maken van SVG-afbeeldingen die later in deze artikelreeks worden gebruikt.

### Het verschil tussen TeX en LaTeX begrijpen

Veel lezers zullen al weten dat LaTeX eigenlijk geen *uitvoerbaar* zetprogramma is, maar een grote verzameling commando’s (*macro’s*) die uiteindelijk zijn geschreven in een lager-niveau opmaak-/programmeertaal genaamd TeX. Je LaTeX-code produceert pas opgemaakte uitvoer nadat deze is verwerkt door een uitvoerbaar programma genaamd een *TeX-engine*—de software die zich bevindt tussen je LaTeX-code (document) en de opgemaakte pdf. Tegenwoordig kunnen gebruikers kiezen uit verschillende TeX-engines om hun LaTeX-code op te maken, waaronder pdfTeX, XeTeX en varianten van LuaTeX.

Wie nieuw is in het TeX/LaTeX-ecosysteem raakt vaak, en begrijpelijk, in verwarring door de overvloed aan cryptisch klinkende namen die worden gebruikt voor de hulpmiddelen die ze tegenkomen: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX en LuaLaTeX. Als jij hetzelfde voelt, is er hulp in het Overleaf-artikel [Wat zit er in een naam: een gids voor de vele smaken van TeX](/latex/nl/diepgaande-artikelen/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) waarin de oorsprong en betekenis van al die termen wordt uitgelegd.

#### Dialecten en TeX-primitieven

Elke TeX-engine heeft een set ingebouwde commando’s die worden genoemd *primitieven* die gezamenlijk het “dialect” van die engine van de TeX-opmaaktaal vormen en de mogelijkheden weerspiegelen die in elke engine zijn ingebouwd. Hier betekent de term “primitief” die wordt gebruikt om de ingebouwde commando’s van TeX-engines te beschrijven niet *niet* dat die commando’s basic of simpel zijn, maar dat ze fundamenteel en ondeelbaar zijn: niet opgebouwd uit andere commando’s (in tegenstelling tot macro’s). Alle TeX-engines delen een grote kernset primitieve commando’s, maar sommige bevatten ook aan die engine specifieke primitieve commando’s — wat leidt tot het begrip van een “dialect” van TeX.

Ongeacht welke TeX-engine wordt gebruikt om je LaTeX-document op te maken, is het zijn taak de verzameling LaTeX-commando’s (d.w\.z. macro’s) te verwerken (“uit te voeren”) die worden gebruikt om je document te schrijven en op te bouwen. In feite “zet” de TeX-engine je LaTeX-code (macro’s) *terug in* hun samenstellende primitieve commando’s van de TeX-engine, die de engine kan uitvoeren om de daadwerkelijke opmaak te verrichten. Je hoeft niet *te* LaTeX-commando’s te gebruiken om documenten op te maken met TeX-engines — je zou *kunnen* ervoor kunnen kiezen je documenten volledig met TeX-primitieven op te bouwen, d.w\.z. rechtstreeks in de laag-niveau *TeX-programmeertaal* die in TeX-engines is ingebouwd. De TeX-taal is echter naar hedendaagse maatstaven nogal arcaan en wordt over het algemeen beschouwd als lastig om in te programmeren — het kan ook een groot aantal ingebouwde primitieve commando’s vereisen om je opmaakdoel te bereiken, wat het een foutgevoelige en mogelijk repetitieve programmeertaak maakt.

Om te voorkomen dat je rechtstreeks in de TeX-taal moet schrijven, of voortdurend dezelfde reeks commando’s opnieuw moet typen, laten TeX-engines je “snelkoppelingen” maken die worden genoemd *macro’s*. Door macro’s te maken definieer je je eigen commando’s die mogelijk lange en complexe reeksen van TeX-taalprimitieven (of andere macro’s) samenpakken in één enkel “hogerniveau”-commando. TeX-programmeurs kunnen zeer verfijnde macro’s schrijven die een grote hoeveelheid functionaliteit in één commando encapsuleren — zoals de commando’s die LaTeX biedt. Door macropakketten te gebruiken, zoals LaTeX (of [ConTeXt](https://wiki.contextgarden.net/Main_Page)), worden auteurs van documenten (grotendeels) afgeschermd van veel vervelende details, waardoor ze zich kunnen richten op schrijven en opmaken in plaats van voortdurend te worstelen met de complexiteit en nuances van de TeX-taal.

## In het begin...

Naast het ontwerpen van algoritmen voor het opmaken van wiskunde en geavanceerde afbreking van regels, stond Knuth voor de uitdaging om zijn TeX-software te programmeren om tabellen op te maken. Duidelijk is dat elk(e) tabelconstructie-algoritme(n) niet onnodig restrictief mag/mogen zijn, omdat dat gebruikers zou frustreren die de vrijheid nodig hebben om een bijna oneindige reeks tabelopmaken te creëren. Bovendien kunnen tabelcellen een breed scala aan inhoud bevatten, waaronder wiskunde, afbeeldingen en stukken tekst die in mooi opgemaakte regels zijn opgebroken — in feite alles wat TeX kan opmaken. Om deze flexibiliteit te leveren, moeten TeX’ algoritmen voor het bouwen van tabellen hand in hand werken met andere delen van TeX’ opmaakmachinerie.

TeX-engines betalen echter een prijs voor de flexibiliteit van hun mogelijkheden voor tabelconstructie: talrijke subtiliteiten en nuances in het laag-niveau gedrag van ingebouwde (primitieve) commando’s voor tabelopmaak, waarvan er 9 zijn:

* **`\halign`**, **`\valign`**: kerncommando’s voor tabelconstructie
* **`\tabskip`**: lijm die tussen \halign-kolommen of \valign-rijen wordt geplaatst
* **`\cr`**: verplichte terminator “carriage return” voor alle regels in een tabel
* **`\noalign`**: materiaal invoegen tussen \halign-rijen of \valign-kolommen
* **`\everycr`**: commando’s (tokenregister) die worden gelezen na het detecteren van \cr
* **`\span`**: een commando met twee functies: \span creëert cellen die kolommen of rijen overspannen, of breidt commando’s in de tabelpreambule uit (dat zullen we in detail bekijken)
* **`\omit`**: sla de sjablonen voor een specifieke cel over
* **`\crcr`**: gebruikt in macro’s om fouten te voorkomen als gebruikers een vereiste \cr vergeten

We zullen deze commando’s tegenkomen tijdens onze reis door de tabelconstructie.

### Verre echo’s van de uitdagingen

Verborgen in [de broncode van TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) staat een enigszins ontmoedigende inleiding op het onderwerp van het implementeren van de laag-niveau commando’s \halign en \valign, ontworpen om tabellen op te maken:

> “Het is eigenlijk een soort wonder wanneer \halign en \valign werken, omdat ze dwars door zoveel van de besturingsstructuren van TeX heen snijden. Daarom is deze pagina waarschijnlijk niet de beste plek voor een beginner om met dit programma te beginnen; het is beter om eerst al het andere onder de knie te krijgen.”

Knuth vervolgt met te zeggen

> “Merk op dat terwijl \halign wordt verwerkt, we zonder aarzelen de controle overgeven aan de rest van TeX. Op kritieke momenten wordt een uitlijnroutine ingeschakeld om even een kleine handeling uit te voeren, maar meestal blijven deze routines gewoon op de achtergrond. Het is iets als posthypnotische suggestie.”

Uit deze opmerkingen lijkt het redelijk om te concluderen dat, zelfs voor Knuth, het implementeren van TeX’ tabelopmaak “een behoorlijke uitdaging” was — enerzijds om controle en flexibiliteit voor de gebruiker te bieden, maar anderzijds ervoor te zorgen dat TeX’ geautomatiseerde algoritmen voor tabelconstructie goed werden afgestemd op TeX’ kernopmaakprocessen.

De auteur bevestigt zonder meer de complexiteit van de code en algoritmen achter TeX’ mogelijkheden voor tabelopmaak, maar ook de bewondering voor de enorme hoeveelheid functionaliteit die besloten ligt in een relatief kleine hoeveelheid, zij het dichte, Pascal- (of C-)code.


---

# 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/14-how-do-tex-engines-typeset-tables.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
