> 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/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.md).

# Hoe TeX-macro's echt werken: Deel 1

[Deel 1](/latex/nl/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.md) [Deel 2](/latex/nl/meer-onderwerpen/20-how-tex-macros-actually-work-part-2.md) [Deel 3](/latex/nl/meer-onderwerpen/21-how-tex-macros-actually-work-part-3.md) [Deel 4](/latex/nl/meer-onderwerpen/22-how-tex-macros-actually-work-part-4.md) [Deel 5](/latex/nl/meer-onderwerpen/23-how-tex-macros-actually-work-part-5.md) [Deel 6](/latex/nl/meer-onderwerpen/24-how-tex-macros-actually-work-part-6.md)

## Inleiding: Doelstellingen van deze serie

Deze artikelenreeks heeft een ambitieus doel: uitleggen *hoe* hoe TeX-macro's (zoals LaTeX-opdrachten) daadwerkelijk werken—op het meest fundamentele niveau, binnen de eigenlijke TeX-engine-software. In plaats van te vertrouwen *uitsluitend* op een reeks voorbeeldmacro's die zijn ontworpen om verschillende functies, randgevallen en gedragingen van TeX te demonstreren, kijken we in TeX zelf om te zien *hoe* en *waarom* waarom de methoden voor macroprogrammering werken zoals ze doen.

Om ons doel te bereiken moeten we beginnen met het bespreken van onderwerpen die vrij laag-niveau zijn en die aanvankelijk misschien wat ver af lijken te staan van het opmaken van je documenten. Hopelijk kom je na een diepere verkenning weg met een basis om een beter begrip op te bouwen dat je uiteindelijk veel tijd zal besparen en misschien ook de frustratie zal verminderen.

### De TeX-programmeertaal: Herken je dat gevoel?

Het is niet overdreven streng om de TeX-programmeertaal als enigszins arcane te beschrijven, want dat is ze—althans naar de maatstaven van de meeste gangbare programmeertalen die vandaag de dag in gebruik zijn. Wanneer je begint aan je reis om meer te leren over TeX/LaTeX, vooral als je niet-triviale macro's wilt schrijven, kom je al snel begrippen tegen zoals categoriecodes, tokens/tokenisering en het 'uitbreiden' van opdrachten of macro's. Die stortvloed aan concepten is waarschijnlijk behoorlijk vreemd, waardoor je je wellicht verbijsterd voelt en soms misschien licht gefrustreerd, omdat je pad naar succes niet altijd wordt geholpen door de bijna ondoorgrondelijke foutmeldingen van TeX/LaTeX.

## Dus, waar beginnen we? Met categoriecodes.

TeX-engines vallen onder een categorie software die wordt genoemd [compilers](https://en.wikipedia.org/wiki/Compiler): programma's die een bestand inlezen dat is geschreven in een *bron-* taal en *compileren* (omzetten) naar een uitvoerbestand geschreven in een *doel-* taal. Meer specifiek is TeX een *documentcompiler*. Voor TeX-engines (compilers) is het invoerbestand geschreven in de TeX-opmaaktaal en is het doel een uitvoerbestand geschreven in een andere 'taal', zoals [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) of PDF—hoewel we hier onze opvatting van 'taal' wat losjes nemen.

Laten we de bron- of invoer-'taal' waarmee je TeX-bestand wordt geschreven eens van dichterbij bekijken. Een `.tex` bestand is uiteindelijk één lange reeks tekens (inclusief regeleindetekens): bestaande uit tekst die bedoeld is om gezet te worden, afgewisseld met `\`, `}`, `$`, `[` en allerlei soorten tekens die kunnen verschijnen in ogenschijnlijk bijna eindeloos veel combinaties. Iemand die TeX/LaTeX niet gebruikt, zou naar een typisch `.tex` bestand kunnen kijken en het vergeven worden dat die het ziet als een nogal verwarrende warboel van tekens met weinig, of zelfs helemaal geen, zichtbare bestandsstructuur. Het LaTeX-macropakket draagt zeker in zekere mate bij aan het 'opleggen' van een basisstructuur aan een .tex-invoerbestand. Toch, tussen de `\begin{document}` en `\end{document}` is het aan de auteur van het document wat daarin komt te staan. Als je kijkt naar `.tex` bestanden die zijn geschreven met Knuths oorspronkelijke Plain TeX-macropakket, zie je dat documentstructuur vrijwel volledig ontbreekt.

Dus in het algemeen kan een TeX-invoerbestand nogal ongestructureerd lijken, een ogenschijnlijk willekeurige mengeling van te zetten inhoud afgewisseld met instructies (opdrachten) die de zetting van die inhoud sturen. Hoe kan TeX überhaupt zin geven aan een typisch `.tex` invoerbestand: hoe kan het die binnenkomende wirwar van tekens filteren tot uitvoerbare instructies voor de zetengine en inhoud die gezet moet worden?

### De wirwar filteren: maak kennis met categoriecodes

Elke menselijke waarnemer die niets van TeX weet, zou naar een `.tex` bestand kunnen kijken en bepaalde tekens herkennen zoals `$` en weten dat dat het symbool voor een valuta is, of een `&` zien en het identificeren als een ampersand. Die waarnemer leidt een *betekenis* af voor elk teken dat ze zien—een betekenis op basis van de rol die dat teken speelt binnen menselijke communicatie. Daarnaast kunnen ze tekens zien zoals `een`, `e`, `of` en weten dat ze als klinkers worden geclassificeerd, terwijl andere zoals `b`, `c` of `d` als medeklinkers worden geclassificeerd. Als mensen hebben we een soort ingebouwde opzoektabel (in ons geheugen) waarmee we aan elk teken dat we zien een betekenis toekennen—een betekenis gebaseerd op de rol die dat teken vervult in de talen waarin we kunnen communiceren.

Om een `.tex` bestand te verwerken, moet de TeX-software ook naar elk teken in je invoer kijken en moet ook die software een *betekenis* aan elk teken dat het 'ziet' toekennen. TeX is echter slechts een softwarematige machine die tekst verwerkt—opgeslagen als een reeks gehele getallen (tekencodes) in een invoerbestand. Als machine moet TeX geprogrammeerd zijn met de relevante gegevens die het vertellen hoe het de betekenis van een teken waar het naar 'kijkt' moet bepalen en vervolgens wat het ermee moet doen. Hoe bereikt TeX dit?

Het antwoord is een van die typisch TeX-concepten: *categoriecodes,* waarvan er 16 zijn, van 0 tot 15. Voor TeX heeft elk teken dat het ooit verwacht binnen een `.tex` bestand te zien een zogenoemde *categoriecode* van tevoren toegewezen. In de TeX-software zit een soort 'opzoektabel' waarin de categoriecodel *momenteel* aan elk teken is toegewezen dat TeX mogelijk in een .tex-invoerbestand ziet. Je moet TeX's categoriecodes zien als een *betekenis* toekenning aan elk afzonderlijk teken in de invoerstroom die TeX moet onderzoeken (scannen).

Om je document te zetten, moet een TeX-engine elk afzonderlijk teken lezen (scannen), maar TeX's directe interesse gaat niet uit naar de daadwerkelijke tekens (tekencodes): de *categoriecode* is van groter belang bij het scannen van de invoer. De *huidige* categorcode bepaalt de *huidige betekenis* van dat teken *op het moment dat TeX het inleest*: die categoricode bepaalt hoe TeX elk teken zal behandelen/verwerken—we zullen uitleggen waarom we zeggen 'huidige categoricode' en 'huidige betekenis'. Door middel van categoriecodes kan TeX de binnenkomende wirwar van tekens filteren om onderscheid te maken tussen tekens (inhoud) die bedoeld zijn om te worden gezet en tekens die instructies vormen die verwerkt moeten worden—*commando's* die TeX moet uitvoeren.

De volgende tabel geeft die 16 categoriecodes weer: wat ze elk betekenen, samen met voorbeelden van tekens die doorgaans aan elke categorie worden toegewezen.

| **Categoriecode** | **Beschrijving**                                                     | **Standaard LATEX/TEX**                                                    |
| ----------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| 0                 | Escape-teken—vertelt TEX om te beginnen met zoeken naar een commando | `\`                                                                        |
| 1                 | Begin een groep                                                      | {                                                                          |
| 2                 | Sluit een groep af                                                   | }                                                                          |
| 3                 | Wiskundeschakel—schakelt in/uit de wiskundemodus                     | $                                                                          |
| 4                 | Uitlijningstab                                                       | &                                                                          |
| 5                 | Einde van de regel                                                   | ASCII-code 13 (`\r`)                                                       |
| 6                 | Macroparameter                                                       | #                                                                          |
| 7                 | Superscript—voor het opmaken van wiskunde: `$y=x^2$` $$y=x^2$$       | ˆ                                                                          |
| 8                 | Subscript—voor het opmaken van wiskunde: `$y=x_2$` $$y=x\_2$$        | \_                                                                         |
| 9                 | Genegeerd teken                                                      | ASCII 0 `<null>`                                                           |
| 10                | Spatie                                                               | ASCII-codes 32 (spatie) en 9 (tabteken)                                    |
| 11                | Letter                                                               | A...Z, a...z, (en duizenden Unicode-tekens)                                |
| 12                | Overig                                                               | 0...9 plus ,.;?" en vele andere                                            |
| 13                | Actief teken                                                         | Speciale categoriewaarde voor het maken van macro's met één teken, zoals ˜ |
| 14                | Commentaarteken—negeer alles wat volgt tot het einde van de regel    | %                                                                          |
| 15                | Ongeldig teken, mag niet voorkomen in het .tex-invoerbestand         | ASCII-code 127 (`DEL`)                                                     |

Het gebruik van categoriecodes is het essentiële mechanisme van TeX om de binnenkomende stroom tekens te filteren en je invoer te begrijpen om te bepalen:

* tekens die de tekst vormen die gezet moet worden;
* inhoud afbakenen die als wiskunde gezet moet worden;
* tekenreeksen die namen zijn van opdrachten die verwerkt of uitgevoerd moeten worden;
* … en vele andere zetbewerkingen.

In eerste instantie zou je kunnen denken dat de categoricode (betekenis) van elk teken een soort vaste toewijzing is: onveranderlijk en permanent ingebakken in de innerlijke fundamenten van de TeX-software, maar dat is niet zo. Zoals vermeld onderhoudt TeX een interne opzoektabel om gegevens op te slaan van welke categoricode *momenteel* aan elk teken is toegewezen—we zeggen heel bewust *momenteel toegewezen* omdat de categoricode voor elk teken (dat nog niet is ingelezen) kan worden gewijzigd met behulp van een primitieve (ingebouwde) opdracht genaamd `\catcode`. Dit biedt aanzienlijke flexibiliteit omdat je, als je wilt, de manier waarop TeX de betekenis van elk teken dat later uit de invoer wordt gelezen behandelt of interpreteert volledig kunt veranderen, wat enorme mogelijkheden biedt voor geavanceerde zettoepassingen.

Als je vooral geïnteresseerd bent in het gebruik van LaTeX om 'de klus te klaren', is de kans groot dat je categoriecodes niet rechtstreeks bent tegengekomen, behalve misschien via foutmeldingen die je mogelijk hebt gezien. Maar wees gerust, categoriecodes zijn een kernonderdeel van de werking van een TeX-engine: ze stellen LaTeX (en LaTeX-pakketten) in staat om daadwerkelijk het zetwerk van je document uit te voeren.

Wanneer je TeX-engine opstart (“[bootstrapt](https://en.wikipedia.org/wiki/Bootstrapping)”) gebruikt hij een set standaardtoewijzingen van tekens aan categoriecodes, maar via het `\catcode` commando kunnen die standaardinstellingen worden gewijzigd door de kern-LaTeX-code (macro's) en/of door LaTeX-pakketten die je hebt geladen—of zelfs door je eigen TeX-code of macro's. In de loop der tijd en door traditie/gebruik zijn bepaalde tekens die aan specifieke categoriecodes zijn toegewezen geaccepteerd als 'standaarden', en naleving van die standaarden is zeker wenselijk als je wilt dat je documenten overdraagbaar zijn en gemakkelijk met collega's of andere gebruikers kunnen worden gedeeld. Bijvoorbeeld, het `\` teken krijgt categoricode 0 toegewezen om het begin van een TeX/LaTeX-opdracht aan te geven—zie de [bovenstaande tabel](#tbl-0).

### De invoer lezen (scannen)

Wanneer TeX het volgende teken uit je invoerbestand leest (scant), kijkt het allereerst naar de categoricode ervan, dus laten we eens nader bekijken wat er gebeurt wanneer TeX een typische regel invoer leest.

Stel dat we een .tex-bestand hebben dat de tekst bevat `Hello World \jobname` ergens binnen een alinea. Als we in het `.tex` bestand kijken met een [hex-editor](https://en.wikipedia.org/wiki/Hex_editor), zien we dat de reeks tekens `Hello World \jobname` in ons `.tex` bestand slechts een reeks gehele getallen is, of *tekencodes*, weergegeven in de onderstaande screenshot als de hexadecimale reeks:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Hexadecimale tekencodes in een TeX-bestand](/files/3f14ca498527f5176e28294b57112896a65501c8)

Als we van hexadecimaal (basis 16) naar decimaal (basis 10) omzetten, is de reeks tekencodes:

![Decimale tekencodes in een TeX-bestand](/files/6279cf594cfdf1ab7211113cea395b01de408a13)

We weten ook dat elk teken voor TeX een overeenkomstige categoricode heeft; dus op basis van de [bovenstaande tabel](#tbl-0) weten we dat de volgende standaardtoewijzingen van categoriecodes (waarschijnlijk) ook worden gebruikt:

![TeX-categoriecodes](/files/19aaac8a07adced9c6337aa2f8c7d8d12d8043d7)

Dus wordt elk teken in het invoerbestand voor TeX weergegeven door *twee* numerieke waarden—de tekencode en de categoricode:

![Tekencodes en overeenkomstige TeX-categoriecodes](/files/a95a3b0feaca4b6bfaf49fd0cfb8f5dbd3bcd268)

Op dit moment bekijken we alleen de allereerste fase in de verwerking van je bestand door TeX: het scannen van de afzonderlijke tekens. Wat doet TeX eigenlijk met deze paren van tekencodes en categoriecodes? Zodra TeX een afzonderlijk teken heeft gescand en de overeenkomstige categoricode heeft opgezocht, hoe gebruikt TeX deze informatie precies om de binnenkomende tekens te 'filteren'?

## Deel 2

In deel 2 kijken we nader naar hoe TeX je invoer leest: we doen alsof we de 'ogen' van TeX zijn terwijl het naar je invoer kijkt, teken voor teken.

[Deel 1](/latex/nl/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.md) [Deel 2](/latex/nl/meer-onderwerpen/20-how-tex-macros-actually-work-part-2.md) [Deel 3](/latex/nl/meer-onderwerpen/21-how-tex-macros-actually-work-part-3.md) [Deel 4](/latex/nl/meer-onderwerpen/22-how-tex-macros-actually-work-part-4.md) [Deel 5](/latex/nl/meer-onderwerpen/23-how-tex-macros-actually-work-part-5.md) [Deel 6](/latex/nl/meer-onderwerpen/24-how-tex-macros-actually-work-part-6.md)


---

# 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/meer-onderwerpen/19-how-tex-macros-actually-work-part-1.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.
