> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Hoe zet LaTeX kop- en voetteksten op?

## Hoe zet LaTeX koppen en voetteksten op?

### Inleiding

Als u op zoek bent naar een handleiding voor het wijzigen van koppen en voetteksten, bezoek dan alstublieft [onze help-pagina](/latex/nl/opmaak/02-headers-and-footers.md) omdat dit artikel zich richt op het uitleggen van de mechanismen op laag niveau die door TeX-engines en LaTeX worden gebruikt om koppen en voetteksten te maken.

* **Opmerking (update)**: Dit artikel onderzoekt het kernmechanisme voor marks van LaTeX dat in gebruik was vóór juni 2022, op welk moment een nieuwe en veelzijdigere implementatie van LaTeX’s markverwerking werd geïntroduceerd. Zie [Overzicht van LaTeX’s nieuwe markmechanisme](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) voor meer details. Omwille van achterwaartse compatibiliteit blijft LaTeX zijn legacy markmechanisme ondersteunen. Het artikelmateriaal dat het gedrag van TeX-engines bespreekt, wordt door deze veranderingen in LaTeX niet beïnvloed.
* **Opmerking**: de termen “LaTeX”, “TeX” en “TeX-engine” worden in deze besprekingen overal gebruikt, dus het is nuttig hun betekenis te begrijpen—zie 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) voor meer informatie.

Om nuttige achtergrond/context te bieden beginnen we met een overzicht van enkele relevante gebieden op laag niveau van TeX-gebaseerd zetwerk—waaronder tijdelijke (interne) inhoudsopslag, pagina-afbreking en opbouw. De bespreking is gestroomlijnd/vereenvoudigd door een gezette pagina te beschouwen die bestaat uit een “body” van tekst plus enkele koppen en voetteksten. Paginamateriaal zoals figuren (zwevende objecten) en voetnoten worden niet behandeld omdat zij een complex TeX-mechanisme gebruiken dat *invoegingen*, wat ver buiten de reikwijdte van dit artikel valt.

We beginnen met het basisbegrip van *knooppunten*: de fundamentele bouwstenen die door TeX-engines worden gebruikt voor tijdelijke (interne) inhoudsopslag.

### Enkele opmerkingen over inhoud opslaan: TeX-nodes

Terwijl de onderliggende TeX-engine uw LaTeX-code verwerkt om gezet materiaal te produceren—zoals alinea’s, tabellen en wiskunde—moet zij die inhoud tijdelijk opslaan in het geheugen van welke TeX-engine ook wordt gebruikt om uw LaTeX-code te verwerken. Om gezette inhoud op te slaan gebruiken TeX-engines een reeks zogenaamde *knooppunten*, die u kunt zien als variabel grote “brokken” computermemory (apparaatgeheugen), aan elkaar gekoppeld om een lijst te vormen (zie dit [Wikipedia-artikel over gekoppelde datastructuren](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Schematische weergave van hoe TeX-engines inhoud opslaan met gekoppelde nodes](/files/85cbb4a86cfce3bb4efa6d08bdc7e79fe57bd08e)

Om de fundamentele elementen van TeX-gebaseerd zetwerk weer te geven—zoals tekens, glue, boxes, penalties, kerns en [*marks*](#why-were-here-understanding-mark-nodes) (om er slechts enkele te noemen)—gebruiken TeX-engines verschillende *typen* typen node. Sommige nodes, zoals die voor boxes, moeten meer gegevens opslaan dan eenvoudigere nodetypen zoals tekennodes; bijgevolg zijn sommige nodes groter dan andere—en vereisen meer bytes om ze in het geheugen op te slaan. Wanneer u over TeX leest kunt u termen tegenkomen zoals *tekennodes*, *gluenodes*, [*marknodes*](#why-were-here-understanding-mark-nodes) en dergelijke: u weet nu dat dit slechts namen zijn voor stukjes geheugen die zijn toegewezen om gegevens op te slaan die een element van TeX’s zetwerk vertegenwoordigen.

#### Waarom we hier zijn: marknodes begrijpen

Van de vele nodetypen is de ene waarover we moeten praten een *marknode* die wordt gemaakt door het `\mark` commando:

```latex
\mark{stuff to store}
```

De `\mark` commando produceert niet rechtstreeks enige gezette inhoud: het argument `*stuff to store*` wordt opgeslagen in het geheugen voor later gebruik en er wordt een *marknode* gemaakt om de geheugenlocatie van *stuff to store*te bevatten. Zoals we zullen zien, werd het `\mark` commando gemaakt *specifiek* om te helpen bij het maken van koppen en voetteksten.

Marknodes die door `\mark` commando’s worden gemaakt, worden “ingebed” in de pagina-inhoud, klaar voor gebruik tijdens de laatste fasen van de pagina-opmaak wanneer de TeX-engine klaar is om koppen en voetteksten toe te voegen aan de gezette pagina (body). Typisch zal `*stuff to store*` materiaal bevatten zoals paginanummers en hoofdstuk- of sectietitels/-nummers—de bouwstenen van koppen en voetteksten.

#### ε-TeX voegt het \marks-commando toe

[Versie 2](https://texdoc.org/serve/e-TeX/0)van ε-TeX, een uitbreiding op Knuths oorspronkelijke TeX, werd gepubliceerd in 1998 en biedt nieuwe mogelijkheden samen met verbeteringen aan bestaande functies. Tegenwoordig zijn de meeste verbeteringen van ε-TeX opgenomen in de gangbare TeX-engines: pdfTeX, LuaTeX en XeTeX—zie de [**`-etex`** commandoregeloptie van TeX-engines](/latex/nl/meer-onderwerpen/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) die het gebruik van ε-TeX-uitbreidingen mogelijk maakt.

Knuths oorspronkelijke TeX-software biedt het \mark-commando, dat slechts 1 “klasse”, of “type”, marknode creëert. Uw document kan veel \mark-commando’s bevatten maar ze creëren allemaal marknodes van hetzelfde “type” of dezelfde “klasse”—er is geen ingebouwd mechanisme om ze te groeperen of te classificeren. Deze beperking werd verwijderd door een ε-TeX-verbetering: het \marks-commando dat wordt ondersteund door pdfTeX, LuaTeX en XeTeX:

```latex
\marks n {stuff to store}
```

waar `n` is een geheel getal (`0` <= `n` < `32768`) dat de marknode *klasse*.

Opmerkingen:

* het schrijven van `\marks 0` (d.w\.z., `n`=`0`) is synoniem aan het gebruik van TeX’s oorspronkelijke `\mark` commando
* ε-TeX introduceerde ook markvariabelen ([zie later](#pre-output-checks-looking-for-mark-nodes)) voor elke klasse (`n`) van mark: `\firstmarks n`, `\topmarks n` en `\botmarks n`. Geselecteerde klassen van markvariabelen konden worden gebruikt om markgegevens te leveren voor specifieke zetopdrachten.
* LuaTeX verhoogde de maximale waarde van `n` om `65535`, waardoor $$2^{16}$$ markklassen

### Redenen voor TeX’s gebruik van marks

Om *waarom* (en hoe) TeX-engines het `\mark` (of `\marks`) commando gebruiken om koppen en voetteksten te maken, moeten we enkele “eigenaardigheden” van TeX-enginemechanismen voor het samenstellen van pagina’s waarderen—het vinden van pagina-einden en het verzenden van voltooide pagina’s naar een PDF-bestand. In werkelijkheid zijn die processen voor het opbouwen van pagina’s complex, maar de kernprincipes/-concepten kunnen worden vereenvoudigd om voldoende achtergrondverklaring te bieden die ons begrip van marks helpt.

Terwijl een TeX-engine het zetwerk van afzonderlijke inhoudsitems zoals alinea’s, tabellen of wiskunde voltooit, roept hij een interne routine aan (een functie genaamd `build_page(...)`) die probeert die nieuw gezette items toe te voegen aan de pagina die momenteel in het geheugen wordt opgebouwd. Wanneer dat nieuwe materiaal aan de op te bouwen pagina is toegevoegd, controleert TeX ook of die nieuw toegevoegde inhoud de huidige pagina “voldoende vol” heeft gemaakt. Als de pagina vol is, kan TeX een *pagina-einde*maken—en de inhoud van die pagina verzenden voor verdere verwerking (“verpakking”) en vervolgens uitvoer naar het PDF-bestand.

Een belangrijk kenmerk van de laatste fase van het verpakken van de pagina (compositie) is iets dat een *outputroutine* wordt genoemd, wat in feite een door de gebruiker gedefinieerde reeks commando’s is die wordt gebruikt om de pagina-inhoud te verpakken zodat deze klaar is om naar het PDF-bestand te worden verzonden. Een voorbeeld van een “verpak”-handeling is het toevoegen van kop- en voetteksten, maar er zijn tal van manieren om outputroutines te gebruiken—zie bijvoorbeeld [dit artikel in TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Outputroutines zijn een vrij complex gebied van TeX, dus we gaan hier niet in detail op in: onthoud voor nu alleen dat de laatste fase van pagina-opmaak het gebruik van een door de gebruiker gedefinieerde reeks commando’s omvat (gezamenlijk een *outputroutine*).

Maar laten we eens kijken wat er kan gebeuren wanneer TeX klaar is met het zetten van een lange alinea tekst, en deze in een reeks afzonderlijke gezette regels opbreekt. TeX zal die pas gezette alinea—regel voor regel—willen toevoegen aan de pagina die momenteel wordt opgebouwd, maar misschien passen slechts *enkele* van die regels op de huidige pagina. Let op: met “pagina” bedoelen we het hoofdtekstgebied (pagina-body) dat *doet niet* andere pagina-elementen zoals koppen en voetteksten kan omvatten, die later worden toegevoegd (door de outputroutine).

Nadat meerdere aliniarijen aan de huidige pagina zijn toegevoegd, kan deze “voldoende vol” worden en is het tijd voor TeX om een pagina-einde te maken. We hebben echter wat “restmateriaal” omdat slechts *part* van de alinea op de huidige pagina terecht is gekomen: de “overtollige aliniacontent” wordt voor later opgeslagen, klaar voor het maken van de *volgende* pagina. De volgende afbeelding illustreert dit idee: een deel van de alinea staat op de *huidige* pagina en een deel wordt vastgehouden voor de *volgende* pagina.

![Schematische weergave van een alinea die een pagina-einde overspant](/files/c128d5d6736121bafef7634e8593d39d45582aca)

Dit alinea-voorbeeld laat zien dat een TeX-engine vaak stukken inhoud verwerkt (zet) die *in hun geheel*niet op de huidige pagina passen—omdat die inhoud voorbij het punt reikt waarop een pagina-einde noodzakelijk wordt. Bedenk dat TeX-engines regeleinden vinden door hele alinea’s in te voeren en vervolgens te zetten, en niet, zoals sommige toepassingen, een regel-voor-regel-benadering voor het zetten van alinea’s hanteren. Met andere woorden: TeX zet de *hele* alinea, in tegenstelling tot sommige toepassingen, niet regel voor regel. Met andere woorden: TeX zet de *hele* alinea, of deze nu op de huidige pagina past of niet (dat wordt later uitgezocht). Tussen haakjes: het principe “volledig zetten en dan toevoegen aan de huidige pagina” geldt ook voor andere typen TeX-inhoud, waaronder tabellen die volledig uit het .tex-bestand worden ingelezen en in hun geheel worden gezet voordat wordt geprobeerd ze toe te voegen aan de huidige pagina.

Voor ons alinea-voorbeeld is de volledige tekst van die alinea, *inclusief eventuele commando’s binnen die tekst*, volledig verwerkt—wat betekent dat het zetwerk van TeX een bepaalde locatie in uw `.tex` bestand heeft bereikt. De “huidige interne toestand” van de TeX-engine, zoals de waarde van variabelen of opgeslagen parameterinstellingen, weerspiegelt het materiaal, inclusief eventuele commando’s, dat tot aan de huidige locatie is verwerkt—namelijk het einde van de alinea.

Hoewel de volledige alinea is gezet, kan een deel ervan niet worden ondergebracht op de huidige pagina, wat ertoe leidt dat “overtollige aliniacontent” wordt opgeslagen voor de *volgende* pagina. Binnen de LaTeX-code (tekst plus commando’s) die de “overtollige aliniacontent” heeft geproduceerd, *zou* een willekeurig aantal commando’s en macro’s kunnen hebben aangeroepen die waarden en variabelen veranderden die intern door de TeX-engine werden opgeslagen—d.w\.z. veranderingen aanbracht in TeX’s “huidige toestand”.

Het volgende diagram illustreert een uiterst belangrijke TeX-“eigenaardigheid”, een die invloed heeft op verschillende aspecten van TeX-gebaseerd zetwerk. Aan de rechterkant van het diagram ziet u een weergave van nodes die alle inhoud omvatten die momenteel in het geheugen is opgeslagen: het lichtgrijze gebied bevat nodes die de *huidige* pagina vormen en het donkergrijze gebied is gezette inhoud bestemd voor de *volgende* pagina. Dit scenario weerspiegelt ons alinea-voorbeeld: het donkergrijze gebied vertegenwoordigt de “overtollige aliniacontent”: tekstregels die worden vastgehouden omdat ze niet op de huidige pagina passen.

![Schematische weergave van de node-locatie waar TeX een pagina-einde vindt, met ook de inhoud die wordt vastgehouden voor de volgende pagina](/files/ff0ae08addd00d9ed19d4afa70a29c10d1ef0025)

Bedenk dat zodra TeX een “voldoende volle” pagina (body) heeft, hij die inhoud doorgeeft aan iets dat een *outputroutine* wordt genoemd, wat een door de gebruiker gedefinieerde reeks commando’s is. Naast andere dingen voegt de outputroutine koppen en voetteksten toe aan de pagina-body, waarmee de pagina wordt afgerond en gereed gemaakt om naar het PDF-bestand te worden verzonden.

Onze afbeelding (hierboven) stelt de situatie voor waarin TeX heeft besloten een pagina-einde te maken bij een bepaalde node, zoals `\baselineskip` glue tussen gezette regels, en gereed is om de huidige pagina te beginnen verpakken met behulp van de outputroutine—een reeks ingebouwde commando’s en door de gebruiker gedefinieerde macro’s. *Echter*, naast inhoud die de huidige pagina (opgeslagen in het geheugen) vormt, heeft TeX al *aanvullend materiaal*, uit uw `.tex` bestand. Dat extra materiaal strekt zich uit *voorbij het pagina-einde* en *zou* kunnen commando’s hebben opgenomen die belangrijke pagina-gerelateerde waarden of variabelen veranderden, waardoor TeX’s “huidige interne toestand” werd beïnvloed—wat waarden van interne parameters of gegevens die door macro’s zijn opgeslagen omvat.

Wanneer TeX begint met het verpakken van de huidige pagina, wordt zijn “huidige interne toestand” *niet* bepaald door alles wat tot aan de pagina-eindlocatie is gezet, omdat TeX dat punt al *gepasseerd is* in uw bestand en aanvullend materiaal heeft verwerkt. Als u de locatie in uw bestand beschouwt die overeenkomt met waar het pagina-einde plaatsvindt, en de locatie die TeX daadwerkelijk heeft bereikt in uw `.tex` bestand, dan kunnen de twee overeenkomstige interne toestanden van TeX, inclusief opgeslagen gegevens en de waarde van variabelen, heel verschillend zijn. De huidige toestand van TeX’s zetwerk loopt meestal voor op waar het pagina-einde plaatsvindt; d.w\.z. TeX’s zetactiviteiten *zijn niet gesynchroniseerd* met het proces van het uitvoeren van gezette pagina’s via de outputroutine.

#### Hypothetisch voorbeeld: hoe u de verkeerde koppen krijgt

Het volgende diagram illustreert hypothetische commando’s `\myheader` en `\myfooter` gebruikt om de gewenste tekst van koppen en voetteksten op te slaan; bijvoorbeeld met eenvoudige definities zoals

```latex
\newtoks\headertoks% een nieuwe tokenlijstvariabele voor de koptekst
\newtoks\footertoks% een nieuwe tokenlijstvariabele voor de voettekst
% Gebruik \global om ervoor te zorgen dat opgeslagen kop- of voettekstgegevens
% overal toegankelijk zijn, inclusief commando’s in de
% outputroutine
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

waarin `\headertoks` en `\footertoks` tokenlijsten zijn die worden gebruikt om de tekst van koppen en voetteksten op te slaan.

Daarnaast heeft ons hypothetische voorbeeld ook een outputroutine die de kop- en voettekst ophaalt uit de huidige waarden van `\myheader` en `\myfooter`. Zoals in het diagram te zien is, binnen de inhoud bestemd voor de huidige pagina, `\myheader` en `\myfooter` de juiste (correcte) waarden instellen. Het zou echter mogelijk zijn om `\myheader` en/of `\myfooter` te laten aanroepen binnen een alinea die een pagina-einde overspant. Omdat TeX de gehele alinea moet verwerken, `\myheader` en `\myfooter` zou opnieuw worden aangeroepen om de in “TeX’s interne toestand” opgeslagen kop-/voetteksttekst opnieuw in te stellen, waardoor waarden ontstaan die niet correct zijn voor de huidige pagina. Wanneer de outputroutine de kop en voettekst produceert, zullen zij tekst bevatten die bestemd is voor de volgende pagina.

![Afbeelding die onjuiste koppen en voetteksten toont die worden geproduceerd als de outputroutine TeX-macro’s alleen gebruikt om kop- en voetteksttekst op te halen](/files/bd60bffb1c43ee079a66ff8310337185407eedb9)

#### TeX’s asynchrone gedrag: \mark-commando ter redding

De zetactiviteiten (inhoudsopbouw) van TeX zijn *niet gesynchroniseerd* met het uiteindelijke proces van het uitvoeren van een gezette pagina via commando’s in de outputroutine. Wanneer het tijd is om een pagina uit te voeren, loopt de feitelijke interne toestand van TeX voor op elke toestand die het mogelijk zou hebben gehad op de locatie van het pagina-einde—waar het het laatste stuk inhoud op de huidige uit te voeren pagina heeft gezet.

In [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), beschrijft Donald Knuth, de maker van TeX, deze situatie als

> ... TeX’s outputroutine loopt achter op zijn activiteiten voor het opbouwen van pagina’s

Vanwege deze niet-gesynchroniseerde relatie zijn “speciale voorzieningen” in de vorm van het *marksmechanisme*, toegepast via het `\mark` (of `\marks n`) commando, nodig om ervoor te zorgen dat koppen en voetteksten materiaal bevatten dat relevant is voor de daadwerkelijke pagina die wordt uitgevoerd. Het `\mark` commando embedt marknodes in de pagina-inhoud, waarbij de geheugenlocatie van inhoud wordt opgeslagen die kan worden gebruikt voor de kop en voettekst van de hostpagina.

De auteur van het bekende en gerespecteerde boek [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) beschrijft het `\mark` mechanisme als

> ... het belangrijkste mechanisme waardoor de outputroutine informatie kan verkrijgen over de inhoud van de momenteel afgebroken pagina, in het bijzonder de boven- en onderkant ervan.

De `\mark` commando is een mechanisme ontworpen om de asynchrone aard van TeX’s algoritme voor pagina-afbreking en outputroutine te omzeilen.

![Schematische weergave van markgegevens (nodes) ingebed in de inhoud van de paginabody](/files/d792cb2e7eff1a22043f0c033d8c8fce896b7fe0)

### Pre-outputcontroles: op zoek naar marknodes

Nadat de TeX-engine de locatie van een pagina-einde heeft bepaald, roept hij een interne routine aan (genoemd `fire_up()`) die veel voorverwerking doet vóór de outputroutine de pagina-opmaak voltooit en de afgewerkte pagina naar het PDF-bestand schrijft. Een belangrijk onderdeel van die voorverwerkingsstappen is het instellen van de waarde van drie *globale markvariabelen*: `\botmark`, `\topmark` en `\firstmark` , die worden gebruikt om gegevens te leveren voor het samenstellen van koppen en voetteksten. Natuurlijk kan een pagina meerdere marknodes bevatten, maar deze worden gefilterd om de drie markvariabelen te produceren die als volgt werken:

* **`\botmark`** is de mark die van kracht is bij het huidige pagina-einde; d.w\.z. de laatste mark gezien op de *huidige* page
* **`\topmark`** is de waarde van `\botmark` uit de *vorige* page
* **`\firstmark`** is de eerste mark op de *huidige* pagina—de eerste mark tussen `\topmark` en `\botmark`

Het volgende schema toont de basisprincipes van het voorbewerken van de gezette pagina-inhoud om waarden voor de drie globale markvariabelen te bepalen `\botmark`, `\topmark` en `\firstmark`:

![Schematische weergave van de basisprincipes gebruikt om waarden voor de drie globale markvariabelen \botmark, \topmark en \firstmark te bepalen](/files/713d51fde1f20af6b37c77e74c765aee01c9b916)

De volgende sectie gebruikt enkele van de hierboven gegeven verklaringen om in grote lijnen uit te leggen hoe LaTeX koppen en voetteksten zet.

### LaTeX’s klassen: paginastijlen en koppen/voetteksten

Wanneer u schrijft `\documentclass{*class*}` waar `*class*` kan `article`, `boek`, `rapport` of `letter`, LaTeX laadt een bestand met de naam `*class*.cls`; bijvoorbeeld, `book.cls`, `article.cls` enzovoort. Die `.cls` bestanden bevatten LaTeX-code om klassespecifieke varianten te implementeren van verschillende commando’s en functies die verwacht worden aanwezig te zijn in, en geleverd te worden door, alle documentklassen—het gedrag dat door alle documentklassen wordt gedeeld. Voorbeelden kunnen klassespecifieke paginalay-outmarges omvatten samen met klassespecifieke versies van commando’s, zoals `\section`, `\subsection` enzovoort.

Een ander belangrijk element van `.cls` bestanden is de klassespecifieke implementatie van standaard paginastijlen die de koppen en voetteksten definiëren van documenten die met een bepaalde klasse en paginastijl worden geproduceerd. Bijvoorbeeld:

* **`book.cls`** en **`article.cls`** bevatten elk implementaties van de paginastijlen `headings` en `myheadings`
* **`letter.cls`** bevat definities voor de paginastijlen `headings`, `empty`, `plain` en een genaamd `firstpage`
* **`report.cls`** bevat definities voor de paginastijlen `headings` en `myheadings`

Implementaties van paginastijlen zijn vaak afhankelijk van de `twoside` optie van `\documentclass`—of het document enkel- of dubbelzijdig is—zodat koppen en voetteksten passend worden gedefinieerd voor linkerkantige (even) pagina’s en rechterkantige (oneven) pagina’s.

Documentklassen kunnen vertrouwen op standaarddefinities van de `plain` of `empty` paginastijlen die elders in LaTeX worden aangeboden—buiten het `.cls` bestand dat wordt gebruikt.

#### Meer over paginastijlen

Wanneer u de stijl van een pagina wijzigt met behulp van `\pagestyle{*somestyle*}` of `\thispagestyle{*somestyle*}` verwacht LaTeX een interne opdracht met de naam `ps@*somestyle*`—meestal geleverd door het documentklasse- `.cls` bestand of misschien een pakket zoals `fancyhdr`. Tussen haakjes: met “interne opdracht” bedoelen we een commando dat deel uitmaakt van de LaTeX-broncode en waarvan de naam een `@` @-symbool bevat, wat normaal gesproken normaal gebruik verhindert (vanwege zijn [categoriecode](/latex/nl/meer-onderwerpen/43-table-of-tex-category-codes.md)).

De definitie van `\ps@*somestyle*` is verantwoordelijk voor het implementeren van de functies/het gedrag van die paginastijl, wat onder meer inhoudt het verschaffen van definities van:

* commando’s die worden gebruikt tijdens de laatste fasen van de pagina-opmaak (om koppen en voetteksten toe te voegen, zie [later in het artikel](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* commando’s om sectiegerelateerde markgegevens in te voegen voor gebruik bij het genereren van documentkoppen en voetteksten die sectietitels, nummers en dergelijke bevatten. Bijvoorbeeld de `headings` paginastijl (binnen `book.cls`) definieert de volgende markproducerende commando’s:
  * `\chaptermark`
  * `\sectionmark`

We zullen [markgenererende commando’s verder verkennen](#mark-commands-and-mark-data), zoals `\chaptermark`, maar slechts als voorbeeld: wanneer u schrijft `\chapter{chapter title}` het `\chaptermark` wordt het commando ook uitgevoerd om markgegevens met betrekking tot het hoofdstuk in te voegen voor latere productie van paginakoppen.

#### Een anatomie van kop- en voettekstcommando’s op basis van paginastijl

Deze sectie onderzoekt enkele kerncommando’s/processen van LaTeX die worden gebruikt om koppen en voetteksten te maken—voortbouwend op verklaringen of concepten die eerder in dit artikel zijn gepresenteerd.

**LaTeX’s “model” van koppen en voetteksten**

De inhoud van LaTeX’s (standaard) koppen en voetteksten is gebaseerd op een tweelaagse hiërarchie van documentsecties: een sectie op “hoger niveau” die meerdere secties op “lager niveau” bevat. Voor de book- en article-klassen vertaalt dit zich in:

* `**book**` **klasse**: secties op “hoger niveau” worden geproduceerd door `\chapter` commando’s en secties op “lager niveau” via `\section`, wat hoofdstukken weerspiegelt die veel secties bevatten.
* `**article**` **klasse** (ervan uitgaande dat documenten dubbelzijdig zijn): secties op “hoger niveau” worden geproduceerd met `\section` commando’s en de secties op “lager niveau” via `\subsection`, wat meerdere subsecties weerspiegelt die binnen dezelfde sectie voorkomen.

LaTeX past zijn “model” van koppen en voetteksten toe via zijn sectiecommando’s die marknodes “injecteren” (via het `\mark` commando) om gegevens op te slaan die relevant zijn voor de documentsectie die wordt gemaakt. Bijvoorbeeld, telkens wanneer u schrijft `\section{*some section title*}` zal er een marknode worden gemaakt, met gegevens die weerspiegelen `*some section title*` en het sectienummer.

LaTeX gebruikt een systeem van marks dat gegevens bevat in de vorm `{left}{right}`, uiteindelijk gegenereerd via `\mark` commando's

```latex
\mark{{left}{right}}
```

omgeven door lagen van macro’s die ontworpen zijn om gebruikers af te schermen van de details op lager niveau—die in latere secties van dit artikel worden onderzocht.

#### De boekklasse verkennen

Wanneer het `book.cls` bestand wordt geladen, is een van de laatste handelingen het uitvoeren van `\pagestyle{headings}` wat de standaard paginastijl instelt op `headings`, dus we bekijken die paginastijl in meer detail.

Zoals [hierboven vermeld](#more-on-page-styles), zullen de functies/eigenschappen van de `headings` paginastijl, zoals geïmplementeerd door de `boek` klasse, worden gedefinieerd door het (interne) commando `\ps@headings` dat in het bestand `book.cls`staat. De precieze definitie van `\ps@headings` hangt af van of het document enkel- of dubbelzijdig is (standaard voor de `boek` klasse).

**“Mark-commando’s” en “markgegevens”**

Voor dubbelzijdige documenten die door de `boek` klasse worden geproduceerd, creëert de definitie van `\ps@headings` (definieert) twee “mark-commando’s”: `\chaptermark` en `\sectionmark` die “markgegevens” produceren, in de vorm `{left}{right}`, voor gebruik in koppen en voetteksten. Die markcommando’s weerspiegelen LaTeX’s model van koppen en voetteksten—gebaseerd op de hiërarchie van documentsecties:

* het commando voor de sectie op “hoger niveau” (hier, `\chapter`) wordt gebruikt om “markgegevens” te leveren voor koppen van linkerkantige (even genummerde) pagina’s. Wanneer u een nieuw hoofdstuk begint, door te schrijven `\chapter{*chapter title*}`, `\chaptermark` wordt ook het commando aangeroepen om markgegevens in te voegen die dat nieuwe hoofdstuk weerspiegelen—met zijn `*hoofdstuktitel*` en nummer.
* het sectiecommando van het “lagere niveau” (hier, `\section`) wordt gebruikt om “markeergegevens” te leveren voor rechterpagina's (oneven genummerde pagina's). Wanneer u schrijft `\section{*section title*}` het `\sectionmark` commando wordt aangeroepen om “markeergegevens” te maken die de nieuwe sectie weerspiegelen—met zijn `*section title*` en nummer. Alle markeergegevens die door de vorige `\chapter` wordt niet beïnvloed door latere \section-commando's.

**\markboth en \markright**

LaTeX's sectiespecifieke markeercommando's, zoals `\chaptermark` en `\sectionmark`, gebruiken twee verdere commando's genaamd `\markboth` en `\markright` die de daadwerkelijke markeergegevens voor kopteksten en voetteksten leveren. `\markboth` en/of `\markright` kunnen commando's bevatten om kop- of voettekst op te maken, bijvoorbeeld door deze in hoofdletters te zetten.

Voor documenten geproduceerd met `boek` klasstandaarden (dubbelzijdig, `headings` paginastijl), werken de markeer-genererende commando's als volgt:

* `\chaptermark` genereert markeergegevens met behulp van `\markboth`
* `\sectionmark` genereert markeergegevens `\markright`

`\markboth` en `\markright` zijn macro's die uiteindelijk het primitieve (ingebouwde, laag-niveau) `\mark` commando om daadwerkelijk markeringen in te voegen die vanuit sectiecommando's zijn gegenereerd.

`\markboth` heeft de vorm

* **`\markboth{left}{right}`**: voegt een markering (node) in met behulp van `\mark{{left}{right}}` wat resulteert in een markeerknoop met een paar tussen accoladen geplaatste waarden `{left}{right}`.

`\markright` heeft de vorm

* **`\markright{newright}`**: voegt een markering (node) in met behulp van `\mark{{currentleft}{newright}}`; d.w\.z. het wijzigt de huidige waarde van `right` om `newright` maar de huidige waarde van `left` (d.w\.z., `currentleft`) blijft ongewijzigd, wat resulteert in een markeerknoop met een paar tussen accoladen geplaatste waarden `{currentleft}{newright}`.

Het gedrag van `\markboth` en `\markright` ondersteunen de tweelaagse sectiehiërarchie, zoals een document met meerdere secties binnen elk hoofdstuk.

Als voorbeeld van de (dubbelzijdige) `boek` documentklasse (met de paginastijl headings):

* `\chaptermark` gebruikt `\markboth` om in te stellen:
  * een `{links}` veld dat CHAPTER . in hoofdletters zet.
  * een {rechts}-veld dat leeg is (`{}`)
* `\sectionmark` gebruikt `\markright` om het `{rechts}` markerveld te zetten voor opmaak, eveneens in hoofdletters.

Om te begrijpen waarom `\sectionmark` gebruikt `\markright` kunnen we zien dat elke nieuwe `\section` commando zou moeten:

* een nieuwe markering invoegen met gegevens voor deze `\section` (zoals de titel en het nummer).
* maar *niet* markeergegevenswaarden beïnvloeden voor de huidige `\chapter` waarin dat specifieke `\section` commando voorkomt

Om deze redenen `\section` roept het commando `\sectionmark` aan, dat gebruikmaakt van `\markright` om een `\section`-gerelateerde markering te maken: het werkt het `{rechts}` markeergegevensveld bij maar beïnvloedt de huidige `{links}` markeergegevensveld die is ingesteld door de huidige `\chapter`.

Opmerking: de LaTeX-broncode bevat de waarschuwing:

> De markeercommando's werken redelijk goed voor rechtermarkeringen die ‘genummerd zijn binnen’ linker markeringen—bijv. de linker markering wordt gewijzigd door een \chapter-commando en de rechter markering door een \section-commando. Het levert echter enigszins afwijkende resultaten op als 2 \markboth's op dezelfde pagina voorkomen.

**Commando's voor de uitvoerroutine**

De `\ps@headings` commando implementeert definities van de volgende commando's

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

die door de uitvoerroutine worden gebruikt om kop- en voetteksten toe te voegen tijdens de laatste fase van de pagina-opmaak. Bijvoorbeeld, `book.cls` zet `\@oddfoot` en `\@evenfoot` op de waarde `\@empty`, die is gedefinieerd als `\def\@empty{}`, en dus `\ps@headings` produceert lege voetteksten op linker- en rechterpagina's:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

De kopteksten zijn als volgt gedefinieerd:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

waar

* `\leftmark` haalt de `{links}` waarde uit een `{left}{right}` markeerpaar
* `\rightmark` haalt de `{rechts}` waarde uit een `{left}{right}` markeerpaar
* \thepage geeft het huidige paginanummer weer

In wezen zorgen deze implementaties van `\@evenhead` en `\@oddhead` voor de volgende resultaten:

* `\@evenhead`: het paginanummer verschijnt links in de koptekst en de inhoud van `\leftmark`, opgemaakt met het lettertypecommando `\slshape`, wordt rechts in de koptekst weergegeven—de tussenliggende witruimte wordt geleverd door de zeer flexibele `\hfil` glue.
* `\@oddhead`: de inhoud van `\rightmark`, opgemaakt met het lettertypecommando `\slshape`, verschijnt links in de koptekst en het huidige paginanummer wordt rechts in de koptekst weergegeven—opnieuw wordt de tussenliggende witruimte geleverd door `\hfil` glue.

Er blijft echter een belangrijke vraag over: *welke* `{left}{right}` markeerpaar worden gebruikt door `\leftmark` en `\rightmark`: met andere woorden, waar halen zij hun markeergegevenswaarden vandaan?

Zoals [hierboven vermeld](#filtering) maar [hieronder uitgelegd](#explainfiltering), tijdens de laatste pagina-opmaakstadia worden alle markeringen in de documentpagina's “gefilterd” en gebruikt om de waarde van drie globale markvariabelen in te stellen: `\botmark`, `\topmark` en `\firstmark`. Door de [structuur van LaTeX's markeringen](#latexs-model-of-headers-and-footers), zal elk van die 3 markvariabelen uiteindelijk een waarde bevatten van `{left}{right}` voor een bepaald paar waarden `{links}` en `{rechts}` en het zijn deze die de daadwerkelijke `{left}{right}` markeerpaar (velden) voor `\leftmark` en `\rightmark`:

* `\leftmark` haalt de `left` waarde uit het `{left}{right}` markeerpaar (velden) geleverd door `\botmark`
* `\rightmark` haalt de `right` waarde uit het `{left}{right}` markeerpaar geleverd door `\firstmark`

Opmerking `\markboth` en `\markright` kunnen commando's bevatten om de kop- en voettekst op te maken—zoals omzetting naar hoofdletters.

### Voorbeelden met LaTeX-commando's op lager niveau

De volgende voorbeelden demonstreren het aanbrengen van wijzigingen aan paginastijlen of kop- en voetteksten door enkele van de LaTeX-commando's op laag niveau (intern) die in dit artikel worden besproken opnieuw te definiëren (commando's die het @-symbool bevatten). We bevelen deze methode voor het wijzigen van kop- en voetteksten niet aan, maar ze is beschikbaar voor wie die nodig heeft (bijv. pakketontwikkelaars). De voorkeursoplossing voor het wijzigen van kop- en voetteksten is het gebruik van de [`fancyhdr` pakket](https://ctan.org/pkg/fancyhdr?lang=en), die wordt besproken in een [Overleaf-hulpartikel](/latex/nl/opmaak/02-headers-and-footers.md).

#### Een minimale paginastijl definiëren

Het volgende voorbeeld definieert een nieuwe, uiterst minimale paginastijl genaamd `demostyle` die statische tekst gebruikt om de kop- en voetteksten te definiëren en niet vertrouwt op sectiecommando's (`\chapter`, `\section` enz.) om de inhoud van kop- en voetteksten in te stellen.

Het voorbeeld begint met het wijzigen van de categoricode van het `@` teken naar 11 zodat het binnen macronamen kan worden gebruikt. Het `\ps@demostyle` commando implementeert onze minimale paginastijl door de gebruikte commando's (in de uitvoerroutine) voor het produceren van de kop- en voetteksten opnieuw te definiëren: `\@oddhead`, `\@oddfoot`, `\@evenhead` en `\@evenfoot`. Merk de `twoside` optie in onze `\documentclass` declaratie—die de `article` klasse gebruikt.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil De voettekst van de oneven pagina\hfil}%
\renewcommand\@evenfoot{\hfil De voettekst van de even pagina\hfil}%
\renewcommand\@evenhead{\thepage\hfil De koptekst van de even pagina}%
\renewcommand\@oddhead{De koptekst van de oneven pagina\hfil\thepage}}
\catcode`@=12
\title{Een paginastijl demonstreren}
\author{Overleaf}
\date{Augustus 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduction}
\newpage
\section{Meer materiaal}
\end{document}
```

[Open dit voorbeeld in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Kopteksten wijzigen voor de book-klasse

Het volgende voorbeeld wijzigt de kopteksten voor de book-klasse door opnieuw te definiëren `\@oddhead` en `\@evenhead` zodat kopteksten op linker- en rechterpagina's het huidige paginanummer en de hoofdstuktitel bevatten. Let op hoe het tweede `\chapter` commando de optionele korte hoofdstuktitel gebruikt `[De korte titel]` die nu de koptekst levert, in plaats van de lange titel.

`\section` commando's hebben geen invloed op de inhoud van de koptekst omdat onze herdefinities van de koptekst alleen `\leftmark` dat details van het huidige hoofdstuk ophaalt. Om details van de huidige sectie op te vragen zouden we `\rightmark` in de definitie van `\@oddhead` en/of `\evenhead`.

```latex
\documentclass{book}
% NB: categoricode van '@' tijdelijk gewijzigd naar 11
% om het gebruik in commandonamen mogelijk te maken
\catcode `@=11
% Laat \@oddfoot en \evenfoot gelijk zijn aan \@empty
% om ze leeg te maken
\let\@oddfoot\empty\let\evenfoot\empty
% Definieer \@oddhead en \@evenhead opnieuw
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Gebruik een handig klein paginaformaat
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Herinneringen van een \TeX{}-gebruiker}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Dit is frontmatter die Romeinse cijfers gebruikt.
\mainmatter
\chapter{Waar begin ik?}
Hoofdstuk 1: Een kort hoofdstuk.
\newpage
\section{In het begin...}
Een sectie.
\chapter[De korte titel]{Een hoofdstuk met een zeer lange titel, waardoor het ongeschikt is voor kopteksten}
\newpage
\section{Nog een sectie}
Met weinig inhoud.
\newpage
\section{Wat, nog een sectie?}
Ook met weinig inhoud.
\end{document}
```

[Open dit voorbeeld in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Gebruik van de uitgebreide markeercommando's van ε-TeX

De `boek` klasse gebruikt de volgende definities van `\@evenhead` en `\@oddhead` om kopteksten te produceren:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

waarbij de commando's `\leftmark` en `\rightmark` zijn gedefinieerd als

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

Door de uitgebreide commando's van ε-TeX te gebruiken, en de equivalentie tussen markeerklasse 0 van ε-TeX en de oorspronkelijke TeX-commando's, kunnen we:

* herschrijven `\leftmark` om `\botmark` met ε-TeX's `\botmarks0` equivalent, en
* herschrijven `\rightmark` om `\firstmark` met ε-TeX's `\firstmarks0` equivalent

Deze herdefinities leveren

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Let op het gebruik van `\relax` om TeX's zoektocht naar verdere cijfers te beëindigen—je kunt ook `\relax` vervangen door een spatie die als terminator fungeert.

Het volgende voorbeeld produceert uitvoer die identiek is aan de oorspronkelijke definities van `\leftmark` en `\rightmark`.

```latex
\documentclass{book}
% Definieer \leftmark en \rightmark opnieuw om
% \botmarks0 en \firstmarks0 respectievelijk te gebruiken
% NB: categoricode van '@' tijdelijk gewijzigd naar 11
% om het gebruik in commandonamen mogelijk te maken
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Gebruik een handig klein paginaformaat
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Herinneringen van een \TeX{}-gebruiker}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Dit is frontmatter die Romeinse cijfers gebruikt.
\mainmatter
\chapter{Waar begin ik?}
Hoofdstuk 1: Een kort hoofdstuk.
\newpage
\section{In het begin...}
Een sectie.
\newpage
Nog een sectie.
\end{document}
```

[Open dit voorbeeld in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Opmerkingen over ε-TeX**

Zoals [we hierboven opmerkten](#etex), introduceert ε-TeX de `\marks` commando:

```latex
\marks n {stuff to store}
```

die de oorspronkelijke `\mark` functie van Knuths TeX-engine uitbreidt en beschikbaar is in alle drie de gangbare TeX-engines: pdfTeX, LuaTeX en XeTeX.

De implementatie van ε-TeX introduceert ook nieuwe globale markvariabelen `\firstmarks n`, `\botmarks n` en `\topmarks n`: één voor elke klasse `n`. Deze op klassen gebaseerde markvariabelen worden bepaald [met de hierboven beschreven mechanismen](#pre-output-checks-looking-for-mark-nodes), en kunnen allemaal worden gebruikt bij het produceren van kop- en voetteksten.

U kunt elk van de $$2^{15}$$ = 32768 markeerklassen, variërend van 0 tot 32767, gebruiken binnen herdefinities van `\leftmark` of `\rightmark`. Dat veronderstelt dat u geschikte markeergegevens hebt geleverd (ingevoegd) voor uw gekozen markeerklasse, `n`, via `\marks n{{left}{right}}`.

Merk op dat LuaTeX $$2^{16}$$ = 65536 markeerklassen biedt, met `n` variërend van 0 tot 65535.

**Voorbeeld met markeerklasse 10**

Dit voorbeeld demonstreert het gebruik van markeerklasse 10 (willekeurig gekozen) om documentkopteksten te maken. Het voorbeeld zet 6 pagina's op die de reeks markeringen bevatten die wordt gepresenteerd in het [uitgewerkte voorbeeld aan het einde van dit artikel](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Bestudering van dat voorbeeld laat zien waarom de TeX-engine een bepaalde markering heeft geselecteerd, $$\alpha$$, $$\beta$$, $$\gamma$$ en $$\delta$$, voor gebruik in elk van de kopteksten.

We beginnen met het definiëren van een handige macro, `\domark`, die gebruikmaakt van `\marks 10` om markeergegevens in te voegen die de LaTeX `{left}{right}` conventie volgen:

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

Markeringen van klasse 10 worden toegankelijk gemaakt voor het mechanisme voor kop- en voetteksten van LaTeX door opnieuw te definiëren `\leftmark` en `\rightmark`—met wat extra informatie toegevoegd:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

Nadat een aantal (klasse 10-)markeringen is ingevoegd, maakt de TeX-engine (hier pdfTeX) gewillig globale markvariabelen voor klasse 10 aan—`\botmarks10`, `\topmarks10` en `\firstsmarks10` welke `\leftmark` en `\rightmark` die worden gebruikt om de kopteksten te produceren.

```latex
\documentclass{book}
% Een kort commando om markeringen met klasse 10 te gebruiken
% en volgens LaTeX's markeerstructuur {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Definieer \leftmark en \rightmark opnieuw om
% \botmarks10 en \firstmarks10 respectievelijk
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Demonstratie van de verbeterde markeringen van \(\varepsilon\)-\TeX}
\author{Overleaf}
\date{Augustus 2022}
\begin{document}

Pagina 1: Er zijn geen markeringen toegevoegd, dus alle markvariabelen blijven in hun geïnitialiseerde toestand: leeg (NULL).

\newpage
Pagina 2: $\alpha$-markering toegevoegd aan deze pagina via

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Pagina 3: Er zijn geen nieuwe markeringen aan deze pagina toegevoegd.

\newpage
Pagina 4: $\beta$-markering gevolgd door $\gamma$-markering toegevoegd aan deze pagina via

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Pagina 5: $\delta$-markering toegevoegd aan deze pagina via

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Pagina 6: Er zijn geen markeringen aan deze pagina toegevoegd.
\end{document}
```

[Open dit voorbeeld in Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

De volgende afbeelding toont de kopteksten die door dit voorbeeld worden geproduceerd:

![Afbeelding die de uitvoer toont van LaTeX-code met Gebruik van de uitgebreide markeercommando's van ε-TeX](/files/0ae7d1a71e2a6b4b6e7f41d7f239b68068c6163d)

* **Opmerking**: De koptekst op pagina 1 wordt gemaakt op een moment waarop alle drie de markvariabelen voor klasse 10—`\botmarks10`, `\topmarks10` en `\firstsmarks10`—leeg zijn. Het eindresultaat is dat `\rightmark` (voor pagina 1) alleen het laatste koptekstfragment invoegt: `(via \texttt{\string\firstmarks10})`, zoals weergegeven in de afbeelding hierboven.

## Een uitgewerkt voorbeeld om te laten zien hoe TeX-engines waarden voor \botmark, \topmark en \firstmark bepalen

![Db.gif](/files/69bc0934084b18a6407c24a0af31dce3d6ede119)![Db.gif](/files/69bc0934084b18a6407c24a0af31dce3d6ede119) Het lijkt passend om Knuths gebruik van dubbele gevaarlijke bocht-symbolen te reproduceren (afbeelding met dank aan [deze website](http://www.truetex.com/db.htm)) omdat het materiaal enigszins laag-niveau is en “onder de motorkap kijkt”—hoewel we hopen dat het interessant kan zijn voor dappere lezers die nog wat meer details willen begrijpen.

De volgende bespreking is sterk gebaseerd op het laatste voorbeeld op pagina 258 van [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Hier hebben we dat voorbeeld bewerkt en opnieuw gezet voor degenen zonder toegang tot The TeXbook:

![Een bewerkte en opnieuw gezette versie van een voorbeeld van pagina 258 van The TeXbook](/files/60d7ffc4ad94c717e749dd3958115f6a8da4e7fb)

De tabel in deze afbeelding is overgenomen van een tabel die door Knuth is verstrekt, maar zoals in het origineel wordt niet uitgelegd hoe deze is afgeleid. Hier zullen we dat behandelen om aanvullende details te geven die laten zien hoe die waarden van `\botmark`, `\topmark` en `\firstmark` werden bepaald—het verkrijgen van deze details vereiste het verkennen van de broncode van een TeX-engine!

Het proces van het instellen van waarden voor `\botmark`, `\topmark` en `\firstmark` kan worden samengevat in 3 korte pseudocodefragmenten zoals getoond in het volgende diagram en de daaropvolgende uitleg:

1. Controle vóór inhoud
2. Inhoudslus
3. Controle na inhoud

Opmerking:

* De tests in stap 1 “Controle vóór inhoud” en stap 3 “Controle na inhoud” worden eenmaal per pagina uitgevoerd.
* Stap 2 “Inhoudslus” houdt in dat TeX door de paginainhoud scant op zoek naar markeernodes en deze gebruikt om de waarden van de markvariabelen in te stellen zoals getoond.

![Afbeelding die pseudocodeversies toont van code die wordt gebruikt om waarden in te stellen voor de drie globale markvariabelen die door TeX-engines worden gebruikt](/files/69e9d723df93812663172986c1aea3158b58f085)

Elke keer dat TeX een geschikte pagina-afbreking vindt, stuurt het de inhoud van die pagina naar de eindverwerking, waarbij deze (drie) markverwerkingsstappen voor elke pagina in uw document worden uitgevoerd. De verwerkingsstappen met labels 1, 2 en 3 worden in het slotdiagram binnen deze sectie genoemd.

Merk op dat:

* voordat de eerste pagina is verwerkt, zijn alle drie globale markvariabelen `\botmark`, `\topmark` en `\firstmark` geïnitialiseerd als leeg (NULL).
* de uiteindelijke waarden van `\botmark`, `\topmark` en `\firstmark` bepaald aan het einde van de *vorige* pagina worden de (invoer)waarden voor de verwerking van de *huidige* pagina—de pagina die wordt verwerkt.

De volgende codefragmenten zijn ***pseudocode*** afgeleid (samengevat) van daadwerkelijke broncode van een TeX-engine. Het doel is een beknopte codesamenvatting te geven die helpt de betrokken kernprincipes te demonstreren.

**Stap 1: Controle vóór inhoud** Voordat TeX door de daadwerkelijke inhoud van de huidige pagina kijkt, controleert het of de huidige `\botmark` waarde—d.w\.z. als resultaat van de *vorige* pagina—leeg is (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

In deze test, als `\botmark` (van de *vorige* pagina) is *niet* leeg:

* `\topmark` voor de *huidige* pagina wordt ingesteld op de *vorige* pagina's `\botmark` waarde
* `\firstmark`, voor de *huidige* pagina (die wordt verwerkt), wordt ingesteld op leeg (NULL): begin deze pagina in de veronderstelling dat er geen `\mark` knooppunten.

Merk op dat deze test wordt uitgevoerd *één keer* voor elke pagina die wordt verwerkt.

**Stap 2: Inhoudslus** Vervolgens loopt TeX door de paginainhoud; een deel van die lus bestaat uit het zoeken naar `\mark` knooppunten:

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

Deze test wordt toegepast op elk mark-knooppunt dat zich binnen (in) de huidige pagina bevindt. De vorige test (Stap 1, hierboven) had `\firstmark` op leeg kunnen zetten, zodat de allereerste markering die in de huidige pagina wordt gevonden de waarde van `\firstmark` en `\botmark`. Elke *volgende* `\mark` knoop die tijdens het uitvoeren van deze lus wordt gedetecteerd, verandert de waarde van `\firstmark`, omdat die niet langer leeg (NULL) is, maar `\botmark` wordt bijgewerkt—omdat dat het doel is van `\botmark`: om de laatst geziene `\mark` knoop voor deze pagina op te slaan.

**Stap 3: Controle na de inhoud** Nadat TeX door de paginainhoud is gelopen, past het de volgende, definitieve test toe, die ook één keer per pagina wordt uitgevoerd:

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* Als `\topmark` niet leeg (NULL) is, weten we uit Stap 1 dat `\botmark` voor de vorige pagina niet leeg (NULL) was.
* Als `\firstmark` nog steeds leeg is, dan hebben we geen `\mark` knooppunten gezien omdat de test in Stap 2 niet werd geactiveerd; bijgevolg, `\firstmark` wordt ingesteld op de waarde van `\topmark` wat ook de waarde is van `\botmark` van de vorige pagina.

Na opeenvolgende toepassing van deze drie stappen voor alle 6 pagina's van ons voorbeeld worden de waarden van `\botmark`, `\topmark` en `\firstmark` afgeleid met behulp van overgangen die in het onderstaande diagram worden getoond, waarbij:

* lichtblauwe afgeronde rechthoeken de uiteindelijke waarden van de markvariabelen voor elke pagina zijn
* lichtgrijze afgeronde vierkanten tussentijdse waarden voorstellen die tijdens de verwerking ontstaan
* gelabelde pijlen veranderingen in de waarden van markervariabelen voorstellen volgens stappen 1, 2 of 3 in het bovenstaande diagram—of een waarde is door geen van de stappen gewijzigd; gelabeld 'geen verandering'.

Het volgende diagram laat zien hoe de drie fragmenten pseudocode de uiteindelijke waarden van `\botmark`, `\topmark` en `\firstmark` opsomd in de tabel op pagina 258 van The TeXbook.

![Een overgangsdiagram ter illustratie van het voorbeeld op pagina 258 van The TeXbook, dat interne overgangen laat zien terwijl de globale markvariabelen hun waarden krijgen toegewezen](/files/069ef9b2b262c4f8c3c971cb2c19d1d0f4f2e13c)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
