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

# Hvordan setter LaTeX opp topptekster og bunntekster?

## Hvordan setter LaTeX opp topptekster og bunntekster?

### Innledning

Hvis du er på jakt etter en praktisk veiledning for å endre topptekster og bunntekster, vennligst [besøk hjelpesiden vår](/latex/no/formatering/02-headers-and-footers.md) fordi denne artikkelen fokuserer på å forklare lavnivåmekanismene som brukes av TeX-motorer og LaTeX for å lage topptekster og bunntekster.

* **Merk (oppdatering)**: Denne artikkelen utforsker den sentrale LaTeX-markmekanismen som var i bruk før juni 2022, da en ny og mer allsidig implementering av LaTeXs markhåndtering ble introdusert. Se [Oversikt over LaTeXs nye markmekanisme](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) for mer detaljer. Av hensyn til bakoverkompatibilitet støtter LaTeX fortsatt sin eldre markmekanisme. Artikkelinnholdet som diskuterer oppførselen til TeX-motorer, påvirkes ikke av disse endringene i LaTeX.
* **Merk**: begrepene «LaTeX», «TeX» og «TeX-motor» brukes gjennom hele denne diskusjonen, så det er nyttig å forstå hva de betyr—se Overleaf-artikkelen [Hva er i et navn: En guide til de mange variantene av TeX](/latex/no/dybdeartikler/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) for mer informasjon.

For å gi nyttig bakgrunn/kontekst starter vi med en oversikt over noen relevante lavnivåområder innen TeX-basert sats—inkludert midlertidig (intern) lagring av innhold, sideskift og oppbygning. Diskusjonene er strømlinjeformet/forenklet ved å betrakte en satt side som inneholder en «kropp» av tekst pluss noen topptekster og bunntekster. Sideelementer som figurer (flytende elementer) og fotnoter behandles ikke fordi de innebærer en kompleks TeX-mekanisme kalt *innsettinger*, som ligger langt utenfor denne artikkelens omfang.

Vi begynner med det grunnleggende begrepet *noder*: de fundamentale byggesteinene som TeX-motorer bruker til midlertidig (intern) lagring av innhold.

### Noen notater om lagring av innhold: TeX-noder

Når den underliggende TeX-motoren behandler LaTeX-koden din for å produsere satt materiale—som avsnitt, tabeller og matematikk—må den midlertidig lagre dette innholdet i minnet til den TeX-motoren som brukes til å behandle LaTeX-koden din. For å lagre satt innhold bruker TeX-motorer en sekvens av såkalte *noder*, som du kan tenke på som variabelt store «biter» av computer-/enhetsminne, koblet sammen for å danne en liste (se denne [Wikipedia-artikkelen om lenkede datastrukturer](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Skjematisk framstilling av hvordan TeX-motorer lagrer innhold ved hjelp av lenkede noder](/files/352529742e0621df8f77113dd47efaf8cd4b0d84)

For å representere de grunnleggende elementene i TeX-basert sats—som tegn, glue, bokser, straffer, kerns og [*markører*](#why-were-here-understanding-mark-nodes) for å nevne bare noen få—bruker TeX-motorer ulike *typene* typer noder. Noen noder, som for bokser, må lagre mer data sammenlignet med enklere nodetyper som tegnnoder; følgelig er noen noder større enn andre—og krever flere byte for å lagres i minnet. Når du leser om TeX kan du støte på begreper som *tegnnoder*, *gluenoder*, [*marknoder*](#why-were-here-understanding-mark-nodes) og så videre: nå vet du at dette bare er navn gitt til biter av minne som er tildelt for å lagre data som representerer et element i TeXs sats.

#### Hvorfor vi er her: forstå marknoder

Av de mange nodetypene er den vi trenger å diskutere kalt en *marknode* som opprettes av `\mark` kommandoen:

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

Den `\mark` kommandoen produserer ikke direkte noe satt innhold: argumentet `*stuff to store*` lagres i minnet for senere bruk, og en *marknode* opprettes for å inneholde minneplasseringen til *stuff to store*. Som vi skal se, ble `\mark` kommandoen opprettet *spesielt* for å hjelpe til med å lage topptekster og bunntekster.

Marknoder opprettet av `\mark` kommandoer er «innebygd» i sideinnholdet og klare til bruk i sluttfasene av sidekomponeringen når TeX-motoren er klar til å legge til topptekster og bunntekster på den satte siden (kroppen). Vanligvis vil `*stuff to store*` inneholde materiale som sidetall og kapittel- eller seksjonstitler/-numre—byggesteinene i topptekster og bunntekster.

#### ε-TeX legger til kommandoen \marks

[Versjon 2 av ε-TeX](https://texdoc.org/serve/e-TeX/0), en utvidelse av Knuths opprinnelige TeX, ble publisert i 1998 og gir nye muligheter sammen med forbedringer av eksisterende funksjoner. I dag er de fleste forbedringene i ε-TeX innarbeidet i de vanlige TeX-motorene: pdfTeX, LuaTeX og XeTeX—se [**`-etex`** kommandolinjevalget til TeX-motorer](/latex/no/flere-emner/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) som muliggjør bruk av ε-TeX-utvidelser.

Knuths opprinnelige TeX-programvare gir kommandoen \mark som bare oppretter 1 «klasse», eller «type», marknode. Dokumentet ditt kan inneholde mange \mark-kommandoer, men de oppretter alle marknoder av samme «type» eller «klasse»—det finnes ingen innebygd mekanisme for å gruppere eller klassifisere dem. Denne begrensningen ble fjernet av en ε-TeX-forbedring: kommandoen \marks, som støttes av pdfTeX, LuaTeX og XeTeX:

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

der `n` er et heltall (`0` <= `n` < `32768`) som bestemmer marknode *klassen*.

Merknader:

* å skrive `\marks 0` (dvs., `n`=`0`) er synonymt med å bruke TeXs opprinnelige `\mark` kommandoen
* ε-TeX introduserte også markvariabler ([se senere](#pre-output-checks-looking-for-mark-nodes)) for hver klasse (`n`) av mark: `\firstmarks n`, `\topmarks n` og `\botmarks n`. Utvalgte klasser av markvariabler kunne brukes til å gi markdata for spesifikke satsoppgaver.
* LuaTeX økte maksimalverdien av `n` til `65535`, noe som muliggjør $$2^{16}$$ markklasser

### Hvorfor TeX bruker markører

For å forstå *hvorfor* (og hvordan) TeX-motorer bruker `\mark` (eller `\marks`)-kommandoen for å lage topptekster og bunntekster, må vi forstå noen «særheter» ved TeX-motorers mekanismer for å konstruere sider—finne sideskift og sende ferdige sider til en PDF-fil. I virkeligheten er disse sidekonstrueringsprosessene komplekse, men kjerneprinsippene/begrepene kan forenkles for å gi tilstrekkelige bakgrunnsforklaringer som hjelper oss å forstå markører.

Når en TeX-motor fullfører satsingen av enkelte innholdselementer som avsnitt, tabeller eller matematikk, kaller den en intern rutine (en funksjon kalt `build_page(...)`) som prøver å legge disse nylig satte elementene til siden som for øyeblikket bygges i minnet. Når det nye materialet er lagt til siden som bygges, sjekker TeX også om dette nylig tilførte innholdet har gjort den aktuelle siden «passende full». Hvis siden er full kan TeX lage et *sideskift*—og sende innholdet på den siden videre til sluttbehandling («pakking») og deretter utdata til PDF-filen.

Et nøkkeltrekk ved sluttfasen av sidepakking (komponering) er noe som kalles en *utskriftsrutine* som i praksis er en brukerdefinert sekvens av kommandoer som brukes til å pakke sammen siden med innhold slik at den er klar til å sendes til PDF-filen. Ett eksempel på en «pakke sammen»-aktivitet er å legge til topptekster og bunntekster, men det finnes mange måter å bruke utskriftsrutiner på—for eksempel, se [denne artikkelen i TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Utskriftsrutiner er et ganske komplekst område i TeX, så vi går ikke inn i detalj her: for øyeblikket er det bare viktig å huske at sluttfasen av sidekomponering innebærer bruk av en brukerdefinert sekvens av kommandoer (samlet kalt en *utskriftsrutine*).

Men la oss se på hva som kan skje når TeX fullfører satsingen av et langt avsnitt, og bryter det inn i en sekvens av enkeltstående satte linjer. TeX vil ønske å legge dette nylig satte avsnittet—linje for linje—til siden som for tiden bygges, men kanskje bare *noen* av disse linjene får plass på den gjeldende siden. Merk at med «side» mener vi det viktigste tekstområdet (sidekroppen) som *ikke* kan omfatte andre sideelementer som topptekster og bunntekster, som legges til senere (av utskriftsrutinen).

Etter at flere avsnittslinjer har blitt lagt til den aktuelle siden, kan den bli «passende full» og det blir tid for TeX å lage et sideskift. Men vi har noe «restmateriale» fordi bare *part* av avsnittet kom med på den aktuelle siden: det «overflødige avsnittinnholdet» lagres til senere, klart for opprettelsen av den *neste* siden. Følgende grafikk illustrerer denne ideen: en del av avsnittet er på *nåværende* siden og en del holdes tilbake for den *neste* siden din.

![Skjematisk framstilling av et avsnitt som strekker seg over et sideskift](/files/35f5c9beaaa66bf3b19ce6b331da9edd77216a71)

Dette avsnittseksemplet viser at en TeX-motor ofte vil behandle (sette) deler av innhold som ikke *i sin helhet*, får plass på den aktuelle siden—fordi innholdet går forbi punktet der et sideskift blir nødvendig. Husk at TeX-motorer finner linjeskift ved å lese inn og deretter sette *hele avsnitt* og, i motsetning til noen applikasjoner, ikke bruker en linje-for-linje-tilnærming til sats av avsnitt. Med andre ord setter TeX *hele* avsnittet enten det får plass på den aktuelle siden eller ikke (det avgjøres senere). For øvrig gjelder prinsippet om «sett i full lengde og legg deretter til på den aktuelle siden» også for andre typer TeX-innhold, inkludert tabeller som leses helt inn fra .tex-filen og settes i sin helhet før noen forsøker å legge dem til på den aktuelle siden.

For avsnittseksemplet vårt er hele teksten i det avsnittet, *inkludert eventuelle kommandoer i den teksten*, blitt fullstendig behandlet—noe som betyr at TeXs satsing har nådd en bestemt posisjon i `.tex` filen din. TeX-motorens «nåværende interne tilstand», som verdien av variabler eller lagrede parameterinnstillinger, vil gjenspeile materialet, inkludert eventuelle kommandoer, som er behandlet fram til den aktuelle plasseringen—slutten av avsnittet.

Selv om hele avsnittet er satt, kan noe av det ikke få plass på den aktuelle siden, noe som resulterer i at «overflødig avsnittinnhold» lagres for *neste* siden. Innenfor LaTeX-koden (tekst pluss kommandoer) som produserte «overflødig avsnittinnhold», kunne TeX-motoren *ha* utført et vilkårlig antall kommandoer og makroer som endret verdier og variabler lagret internt av TeX-motoren—dvs. gjorde endringer i TeXs «nåværende tilstand».

Følgende diagram illustrerer en ekstremt viktig TeX-«særhet», en som påvirker flere aspekter ved TeX-basert sats. Ser du på høyre side av diagrammet ser du en framstilling av noder som utgjør alt innholdet som for øyeblikket er lagret i minnet: det lysegrå området inneholder noder som danner *nåværende* siden og det mørkegrå området er satt innhold som er bestemt for *neste* siden. Dette scenariet gjenspeiler avsnittseksemplet vårt: det mørkegrå området representerer «overflødig avsnittinnhold»: tekstlinjer som holdes tilbake fordi de ikke får plass på den aktuelle siden.

![Skjematisk framstilling av nodestedet der TeX finner et sideskift, og som også viser innhold som holdes tilbake til neste side](/files/814546175011bc32087e6676340958e044937a34)

Husk at når TeX har en «passende full» side (kropp), sender den dette innholdet til noe som kalles en *utskriftsrutine* som er en brukerdefinert sekvens av kommandoer. Blant annet legger utskriftsrutinen til topptekster og bunntekster på sidekroppen, og ferdigstiller siden i påvente av å sende den til PDF-filen.

Grafikken vår (ovenfor) representerer tilfelle der TeX har valgt å gjøre et sideskift ved en bestemt node, som for eksempel `\baselineskip` glue mellom satte linjer, og er klar til å begynne pakkingen av den aktuelle siden ved hjelp av utskriftsrutinen—en sekvens av innebygde kommandoer og brukerdefinerte makroer. *Men*, i tillegg til innholdet som utgjør den aktuelle siden (lagret i minnet), har TeX allerede behandlet og lagret (i minnet) *ytterligere materiale*, fra `.tex` filen din. Det ekstra materialet strekker seg *forbi sideskiftet* og *ha* kan ha inkludert kommandoer som endret viktige side-relaterte verdier eller variabler, og dermed påvirket TeXs «nåværende interne tilstand»—som inkluderer verdier av interne parametere eller data lagret av makroer.

Når TeX begynner å pakke den aktuelle siden, er den «nåværende interne tilstanden» *inneholder* bestemt av alt som er satt fram til sideskiftets plassering fordi TeX allerede har *kommet forbi det punktet* i filen din og behandlet ytterligere materiale. Hvis du betrakter plasseringen i filen din som tilsvarer der sideskiftet skjer, og plasseringen TeX faktisk har nådd i `.tex` filen din, kan de to tilsvarende interne tilstandene til TeX, inkludert lagrede data og verdien av variabler, være svært forskjellige. Den nåværende tilstanden til TeXs sats ligger vanligvis foran der sideskiftet skjer; dvs. TeXs satsaktiviteter *er ikke synkronisert* med prosessen med å sende satte sider ut via utskriftsrutinen.

#### Hypotetisk eksempel: hvordan få feil topptekster

Følgende diagram illustrerer hypotetiske kommandoer `\myheader` og `\myfooter` som brukes til å lagre ønsket tekst for topptekster og bunntekster; for eksempel ved å bruke enkle definisjoner som

```latex
\newtoks\headertoks% en ny tokenlistevariabel for topptekst-teksten
\newtoks\footertoks% en ny tokenlistevariabel for bunntekst-teksten
% Bruk \global for å sikre at lagrede data for topp- eller bunntekst er
% tilgjengelige overalt, inkludert kommandoer i
% utskriftsrutinen
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

der `\headertoks` og `\footertoks` er tokenlister som brukes til å lagre teksten til topptekster og bunntekster.

I tillegg har vårt hypotetiske eksempel også en utskriftsrutine som henter topp- og bunntekst fra gjeldende verdier av `\myheader` og `\myfooter`. Som vist i diagrammet, innenfor innholdet som er bestemt for den aktuelle siden, `\myheader` og `\myfooter` angir de riktige (korrekte) verdiene. Det er imidlertid mulig at `\myheader` og/eller `\myfooter` blir kalt innenfor et avsnitt som strekker seg over et sideskift. Fordi TeX må behandle hele avsnittet, `\myheader` og `\myfooter` vil bli kalt igjen for å tilbakestille topp-/bunntekstteksten som er lagret i «TeXs interne tilstand», noe som produserer verdier som ikke er riktige for den aktuelle siden. Når utskriftsrutinen produserer topp- og bunnteksten, vil de inneholde tekst som er ment for neste side.

![Grafikk som viser feil topp- og bunntekster som produseres hvis utskriftsrutinen bare bruker TeX-makroer til å hente topp- og bunntekst](/files/9f569823c625a905fa1f2fa5d290c9ca881dba95)

#### TeXs asynkrone oppførsel: \mark-kommandoen til unnsetning

TeXs sats- (innholdsbyggings-) aktiviteter er *ikke synkronisert* med den endelige prosessen med å sende en satt side ut via kommandoer i utskriftsrutinen. Når det er tid for å sende ut en side, ligger den faktiske interne tilstanden til TeX foran enhver tilstand den måtte ha hatt på stedet for sideskiftet—der den satte den siste delen av innholdet på den aktuelle siden som sendes ut.

I [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), beskriver Donald Knuth, TeXs skaper, denne situasjonen som

> ... TeXs utskriftsrutine ligger bak sidekonstruksjonsaktivitetene sine

På grunn av dette usynkroniserte forholdet er «særlige fasiliteter» i form av *markmekanismen*, brukt gjennom `\mark` (eller `\marks n`)-kommandoen, nødvendig for å sikre at topp- og bunntekster inneholder materiale som er relevant for den faktiske siden som sendes ut.  `\mark` kommandoen bygger inn marknoder i sideinnholdet og lagrer minneplasseringen til innhold som kan brukes til vertsiden sin topp- og bunntekst.

Forfatteren av den velkjente og respekterte boken [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) beskriver `\mark` mekanismen som

> ... den viktigste mekanismen som utskriftsrutinen kan bruke til å få informasjon om innholdet på den siden som nylig ble brutt av, særlig toppen og bunnen av den.

Den `\mark` kommandoen er en mekanisme utformet for å omgå den asynkrone naturen til TeXs algoritme for sideskift og utskriftsrutine.

![Skjematisk framstilling av markdata (noder) innebygd i sidekroppens innhold](/files/f100eca3b3aa3988678b2049e6fb04d25c1e587d)

### Kontroller før utskrift: ser etter marknoder

Etter at TeX-motoren har bestemt plasseringen av et sideskift, kaller den en intern rutine (kalt `fire_up()`) som gjør mye forbehandling før utskriftsrutinen fullfører sidekomponeringen og skriver den ferdige siden til PDF-filen. En viktig del av disse forbehandlingsstegene er å sette verdien av tre *globale markvariabler*: `\botmark`, `\topmark` og `\firstmark` som brukes til å gi data for å bygge topp- og bunntekster. Selvfølgelig kan en side inneholde flere marknoder, men disse filtreres for å produsere de tre markvariablene som fungerer slik:

* **`\botmark`** er marken som gjelder ved det aktuelle sideskiftet; dvs. den siste marken sett på *nåværende* page
* **`\topmark`** er verdien av `\botmark` fra *forrige* page
* **`\firstmark`** er den første marken på *nåværende* siden—den første marken mellom `\topmark` og `\botmark`

Følgende skisse viser de grunnleggende prinsippene for forbehandling av det satte sideinnholdet for å fastslå verdiene til de tre globale markvariablene `\botmark`, `\topmark` og `\firstmark`:

![Skjematisk framstilling av de grunnleggende prinsippene som brukes for å bestemme verdiene til de tre globale markvariablene \botmark, \topmark og \firstmark](/files/1a15f54dd6bab353d5311ac3df2b534f39733cd9)

Neste seksjon bruker noen av forklaringene ovenfor til å skissere hvordan LaTeX setter opp topptekster og bunntekster.

### LaTeXs klasser: sidestiler og topp-/bunntekster

Når du skriver `\documentclass{*class*}` der `*class*` kan være `article`, `book`, `report` eller `bokstaven`, laster LaTeX inn en fil kalt `*class*.cls`; for eksempel, `book.cls`, `article.cls` og så videre. Disse `.cls` filene inneholder LaTeX-kode for å implementere klassespesifikke variasjoner av ulike kommandoer og funksjoner som forventes å være til stede i, og tilbys av, alle dokumentklasser—atferden som deles av alle dokumentklasser. Eksempler kan inkludere klassespesifikke sidelayoutmarginer sammen med klassespesifikke versjoner av kommandoer, som `\section`, `\subsection` og så videre.

Et annet viktig element i `.cls` filer er klassespesifikk implementering av standard sidestiler som definerer topptekstene og bunntekstene i dokumenter laget med en bestemt klasse og sidestil. For eksempel:

* **`book.cls`** og **`article.cls`** inneholder implementeringer av sidestilene `headings` og `myheadings`
* **`letter.cls`** inneholder definisjoner for sidestilene `headings`, `empty`, `plain` og en kalt `firstpage`
* **`report.cls`** inneholder definisjoner for sidestilene `headings` og `myheadings`

Implementeringer av sidestiler avhenger ofte av `twoside` -valget i `\documentclass`—om dokumentet er ensidig eller tosidig—slik at topp- og bunntekster defineres riktig for venstrevendte (partalls-) sider og høyrevendte (oddetalls-) sider.

Dokumentklasser kan bygge på standarddefinisjoner av `plain` eller `empty` sidestilene som tilbys andre steder i LaTeX—eksternt til `.cls` filen som brukes.

#### Mer om sidestiler

Når du endrer stilen på en side ved å bruke `\pagestyle{*somestyle*}` eller `\thispagestyle{*somestyle*}` forventer LaTeX å finne en intern kommando kalt `ps@*somestyle*`—vanligvis levert av dokumentklasse- `.cls` filen, eller kanskje en pakke som `fancyhdr`. For ordens skyld mener vi med «intern kommando» en kommando som er en del av LaTeX-kildekoden og som har et navn som inneholder et `@` symbol, noe som vanligvis hindrer tilfeldig bruk (på grunn av dens [kategorikode](/latex/no/flere-emner/43-table-of-tex-category-codes.md)).

Definisjonen av `\ps@*somestyle*` har ansvaret for å implementere funksjonene/atferden til den sidestilen, som inkluderer å gi definisjoner av:

* kommandoer brukt i sluttfasene av sidekomponering (for å legge til topptekster og bunntekster, se [senere i artikkelen](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* kommandoer for å sette inn seksjonsrelaterte markdata som brukes til å generere dokumentets topp- og bunntekster som inneholder seksjonstitler, numre og lignende. For eksempel definerer `headings` sidestilen (innen `book.cls`) følgende markproduserende kommandoer:
  * `\chaptermark`
  * `\sectionmark`

Vi vil [utforske markgenererende kommandoer videre](#mark-commands-and-mark-data), som for eksempel `\chaptermark`, men bare som et eksempel: når du skriver `\chapter{chapter title}` den `\chaptermark` kommandoen utføres også for å sette inn kapittelrelatert markdata for senere produksjon av sideoverskrifter.

#### En anatomi av kommandoer for topp- og bunntekst basert på sidestil

Denne delen utforsker noen av de sentrale LaTeX-kommandoene/prosessene som brukes til å lage topptekster og bunntekster—med utgangspunkt i forklaringer eller begreper presentert tidligere i denne artikkelen.

**LaTeXs «modell» for topptekster og bunntekster**

Innholdet i LaTeXs (standard) topp- og bunntekster er basert på et todelt hierarki av dokumentseksjoner: et «høyere nivå»-avsnitt som inneholder flere «lavere nivå»-avsnitt. For bok- og artikkelklassene betyr dette:

* `**book**` **klassen**: «høyere nivå»-seksjoner produseres av `\chapter` kommandoer og «lavere nivå»-seksjoner via `\section`, som gjenspeiler kapitler som inneholder mange seksjoner.
* `**article**` **klassen** (forutsatt tosidige dokumenter): «høyere nivå»-seksjoner produseres ved bruk av `\section` kommandoer og «lavere nivå»-seksjoner via `\subsection`, som gjenspeiler flere underseksjoner som opptrer innenfor samme seksjon.

LaTeX anvender sin «modell» for topptekster og bunntekster gjennom seksjonskommandoene sine, som «injiserer» marknoder (via `\mark` kommandoen) for å lagre data som er relevante for dokumentseksjonen som opprettes. For eksempel, hver gang du skriver `\section{*some section title*}` vil det bli opprettet en marknode som inneholder data som gjenspeiler `*some section title*` og seksjonsnummeret.

LaTeX bruker et system av markører som inneholder data i formen `{left}{right}`, til slutt generert via `\mark` kommandoer

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

innrammet av lag med makroer som er utformet for å skjerme brukerne fra lavnivådetaljene—som utforskes i de påfølgende delene av denne artikkelen.

#### Utforskning av book-klassen

Når `book.cls` filen lastes inn, er en av de siste handlingene å kjøre `\pagestyle{headings}` som setter standard sidestil til `headings`, så vi skal se nærmere på den sidestilen.

Som [nevnt ovenfor](#more-on-page-styles), funksjonene/egenskapene til `headings` sidestilen, slik den er implementert av `book` klassen, vil være definert av den (interne) kommandoen `\ps@headings` som finnes i filen `book.cls`. Den presise definisjonen av `\ps@headings` avhenger av om dokumentet er ensidig eller tosidig (standard for `book` -klassen).

**«Markkommandoer» og «markdata»**

For tosidige dokumenter produsert av `book` -klassen, oppretter definisjonen av `\ps@headings` (definerer) to «markkommandoer»: `\chaptermark` og `\sectionmark` som produserer «markdata», i formen `{left}{right}`, til bruk i topp- og bunntekster. Disse markkommandoene gjenspeiler LaTeXs modell for topptekster og bunntekster—basert på hierarkiet av dokumentseksjoner:

* kommandoen for «høyere nivå»-seksjonen (her, `\chapter`) brukes til å gi «markdata» for venstrevendte (partallsnummererte) sidetopptekster. Når du starter et nytt kapittel, ved å skrive `\chapter{*chapter title*}`, `\chaptermark` kalles for å opprette «markdata» som gjenspeiler det nye kapittelet—som inneholder dets `*chapter title*` og nummer.
* kommandoen for «lavere nivå»-seksjonen (her, `\section`) brukes til å gi «mark-data» for høyrevendte (oddetalls-)sider. Når du skriver `\section{*section title*}` den `\sectionmark` kommandoen vil bli kalt for å opprette «mark-data» som gjenspeiler den nye seksjonen—og inneholder dens `*section title*` og nummer. All merkedata som ble gitt av den forrige `\chapter` påvirkes ikke av noen påfølgende \section-kommandoer.

**\markboth og \markright**

LaTeXs seksjonsspesifikke mark-kommandoer, som `\chaptermark` og `\sectionmark`, bruker to andre kommandoer kalt `\markboth` og `\markright` som gir de faktiske mark-dataene for topp- og bunntekster. `\markboth` og/eller `\markright` kan inneholde kommandoer for å formatere topp- eller bunntekst, for eksempel ved å gjøre den til store bokstaver.

For dokumenter produsert med `book` klassedefaultene (tosidige, `headings` sidestil), fungerer mark-genererende kommandoer slik:

* `\chaptermark` genererer merkedata ved å bruke `\markboth`
* `\sectionmark` genererer merkedata `\markright`

`\markboth` og `\markright` er makroer som til slutt bruker den primitive (innebygde, lavnivå-) `\mark` kommandoen for faktisk å sette inn markeringer generert innenfra seksjonskommandoer.

`\markboth` har formen

* **`\markboth{left}{right}`**: setter inn en markering (node) ved å bruke `\mark{{left}{right}}` som resulterer i en mark-node som inneholder et par verdier i klammer `{left}{right}`.

`\markright` har formen

* **`\markright{newright}`**: setter inn en markering (node) ved å bruke `\mark{{currentleft}{newright}}`; dvs. den endrer gjeldende verdi av `right` til `newright` men gjeldende verdi av `left` (dvs., `currentleft`) forblir uendret, noe som resulterer i en mark-node som inneholder et par verdier i klammer `{currentleft}{newright}`.

Oppførselen til `\markboth` og `\markright` støtter seksjonshierarkiet med to nivåer, for eksempel et dokument som inneholder flere seksjoner innen hvert kapittel.

Som eksempler for den (tosidige) `book` dokumentklassen (med sidestilen headings):

* `\chaptermark` bruker `\markboth` for å sette:
  * a `{left}` felt som setter CHAPTER . i store bokstaver.
  * et {right}-felt som er tomt (`{}`)
* `\sectionmark` bruker `\markright` for å sette `{right}` mark-feltet til å settes opp., også i store bokstaver.

For å forstå hvorfor `\sectionmark` bruker `\markright` kan vi observere at hver nye `\section` kommando bør:

* sette inn en ny markering som inneholder data for denne `\section` (for eksempel tittel og nummer).
* men *inneholder* påvirke verdiene av mark-data for gjeldende `\chapter` der akkurat den aktuelle `\section` kommandoen forekommer

Av disse grunnene `\section` kaller kommandoen `\sectionmark` som bruker `\markright` for å opprette en `\section`-relatert markering: den oppdaterer `{right}` mark-datafeltet, men påvirker ikke det gjeldende `{left}` verdien i mark-datafeltet som ble satt av den gjeldende `\chapter`.

Merk: LaTeX-kildekoden inneholder advarselen:

> Mark-kommandoene fungerer ganske bra for høyremarkeringer «nummerert innenfor» venstremarkeringer—f.eks. endres venstremarkeringen av en \chapter-kommando og høyremarkeringen av en \section-kommando. Det gir imidlertid noe avvikende resultater hvis 2 \markboth-kommandoer forekommer på samme side.

**Kommandoer for utdata-rutinen**

Den `\ps@headings` kommandoen implementerer definisjonene av følgende kommandoer

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

som brukes av utdata-rutinen til å legge til topp- og bunntekster under den siste fasen av sidekomponeringen. For eksempel, `book.cls` setter `\@oddfoot` og `\@evenfoot` til verdien `\@empty`, som er definert som `\def\@empty{}`, og dermed `\ps@headings` gir tomme bunntekster på venstre- og høyrevendte sider:

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

Topptekstene er definert som:

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

der

* `\leftmark` henter `{left}` verdien fra et `{left}{right}` mark-par
* `\rightmark` henter `{right}` verdien fra et `{left}{right}` mark-par
* \thepage skriver ut det gjeldende sidenummeret

I hovedsak gir disse implementasjonene av `\@evenhead` og `\@oddhead` følgende resultater:

* `\@evenhead`: sidenummeret vises til venstre i toppteksten og innholdet i `\leftmark`, formatert med fontkommandoen `\slshape`, skrives ut til høyre i toppteksten—mellomrommet imellom gis av den svært fleksible `\hfil` lim.
* `\@oddhead`: innholdet i `\rightmark`, formatert med fontkommandoen `\slshape`, vises til venstre i toppteksten og det gjeldende sidenummeret skrives ut til høyre i toppteksten—igjen gis mellomrommet imellom av `\hfil` lim.

Men ett nøkkelspørsmål gjenstår: *hvilke* `{left}{right}` mark-par brukes av `\leftmark` og `\rightmark`: med andre ord, hvor får de verdiene for mark-data fra?

Som [nevnt ovenfor](#filtering) men [forklart nedenfor](#explainfiltering), blir alle markeringer som finnes i dokumentsidene “filtrert” og brukt til å sette verdien til tre globale mark-variabler: `\botmark`, `\topmark` og `\firstmark`. På grunn av [strukturen til LaTeXs markeringer](#latexs-model-of-headers-and-footers), vil hver av disse 3 mark-variablene til slutt inneholde en verdi av `{left}{right}` for et eller annet par av verdier `{left}` og `{right}` og det er disse som gir de faktiske `{left}{right}` mark-paret (feltene) for `\leftmark` og `\rightmark`:

* `\leftmark` henter `left` verdien fra `{left}{right}` mark-paret (feltene) som er gitt av `\botmark`
* `\rightmark` henter `right` verdien fra `{left}{right}` mark-paret som er gitt av `\firstmark`

Merk `\markboth` og `\markright` kan inneholde kommandoer for å formatere topp- og bunntekst-teksten—slik som å konvertere til store bokstaver.

### Eksempler som bruker lavnivå-LaTeX-kommandoer

De følgende eksemplene viser hvordan man kan gjøre endringer i sidestiler eller topp- og bunntekster ved å redefinere noen av de lavnivå (interne) LaTeX-kommandoene som er diskutert i denne artikkelen (de som inneholder @-symbolet). Vi anbefaler ikke denne metoden for å endre topp- og bunntekster, men den er tilgjengelig for dem som trenger det (f.eks. pakkeutviklere). Den foretrukne løsningen for å endre topp- og bunntekster er å bruke [`fancyhdr` pakken](https://ctan.org/pkg/fancyhdr?lang=en), som er omtalt i en [Overleaf-hjelpeartikkelen](/latex/no/formatering/02-headers-and-footers.md).

#### Definere en minimal sidestil

Det følgende eksemplet definerer en ny, ekstremt minimal sidestil kalt `demostyle` som bruker statisk tekst til å definere topp- og bunntekstene og ikke er avhengig av seksjonskommandoer (`\chapter`, `\section` osv.) for å sette innholdet i topp- og bunnteksten.

Eksemplet begynner med å endre kategorikoden til `@` tegnet til 11 slik at det kan brukes i makronavn.  `\ps@demostyle` kommandoen implementerer vår minimale sidestil ved å redefinere kommandoene som brukes (i utdata-rutinen) til å produsere topp- og bunntekstene: `\@oddhead`, `\@oddfoot`, `\@evenhead` og `\@evenfoot`. Merk `twoside` -alternativet i vår `\documentclass` deklarasjon—som bruker `article` klassen.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Bunnteksten for oddetallssider\hfil}%
\renewcommand\@evenfoot{\hfil Bunnteksten for partallssider\hfil}%
\renewcommand\@evenhead{\thepage\hfil Toppteksten for partallssider}%
\renewcommand\@oddhead{Toppteksten for oddetallssider\hfil\thepage}}
\catcode`@=12
\title{Demonstrasjon av en sidestil}
\author{Overleaf}
\date{august 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Innledning}
\newpage
\section{Mer materiale}
\end{document}
```

[Åpne dette eksemplet i 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)

#### Endre topptekster for book-klassen

Det følgende eksemplet endrer topptekstene for book-klassen ved å redefinere `\@oddhead` og `\@evenhead` slik at topptekstene på venstre- og høyrevendte sider inneholder det gjeldende sidenummeret og kapiteltittelen. Legg merke til hvordan den andre `\chapter` kommandoen bruker den valgfrie kortformen av kapiteltittelen `[Den korte tittelen]` som nå gir topptekst, i stedet for den lange tittelen.

`\section` kommandoer har ingen innvirkning på topptekstinnholdet fordi våre redefinisjoner av toppteksten bare bruker `\leftmark` som henter detaljer om det gjeldende kapitlet. For å få tilgang til detaljer om den gjeldende seksjonen måtte vi bruke `\rightmark` i definisjonen av `\@oddhead` og/eller `\evenhead`.

```latex
\documentclass{book}
% NB: kategorikoden til '@' endres midlertidig til 11
% for å muliggjøre bruk i kommandonavn
\catcode `@=11
% La \@oddfoot og \evenfoot være ekvivalente med \@empty
% for å gjøre dem blanke (tomme)
\let\@oddfoot\empty\let\evenfoot\empty
% Redefiner \@oddhead og \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Bruk en praktisk liten sidestørrelse
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoarer til en \TeX{}-bruker}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Dette er frontmatter som bruker romertall.
\mainmatter
\chapter{Hvor skal jeg begynne?}
Kapittel 1: Et kort kapittel.
\newpage
\section{I begynnelsen...}
En seksjon.
\chapter[Den korte tittelen]{Et kapittel med en svært lang tittel, som gjør det lite egnet for topptekster}
\newpage
\section{En annen seksjon}
Med lite innhold.
\newpage
\section{Hva, enda en seksjon?}
Også med lite innhold.
\end{document}
```

[Åpne dette eksemplet i 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)

#### Bruke ε-TeXs utvidede mark-kommandoer

Den `book` klassen bruker følgende definisjoner av `\@evenhead` og `\@oddhead` for å produsere topptekster:

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

der kommandoene `\leftmark` og `\rightmark` er definert som

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

Ved å bruke ε-TeXs utvidede kommandoer, og ekvivalensen mellom ε-TeXs mark-klasse 0 og de opprinnelige TeX-kommandoene, kan vi:

* skrive om `\leftmark` for å erstatte `\botmark` med ε-TeXs `\botmarks0` ekvivalent, og
* skrive om `\rightmark` for å erstatte `\firstmark` med ε-TeXs `\firstmarks0` ekvivalent

Disse redefinisjonene gir

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

Legg merke til bruken av `\relax` for å avslutte TeXs søk etter flere sifre—du kan også erstatte `\relax` med et mellomrom for å fungere som avslutter.

Det følgende eksemplet produserer utdata som er identiske med de opprinnelige definisjonene av `\leftmark` og `\rightmark`.

```latex
\documentclass{book}
% Redefiner \leftmark og \rightmark til å bruke
% henholdsvis \botmarks0 og \firstmarks0
% NB: kategorikoden til '@' endres midlertidig til 11
% for å muliggjøre bruk i kommandonavn
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Bruk en praktisk liten sidestørrelse
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoarer til en \TeX{}-bruker}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Dette er frontmatter som bruker romertall.
\mainmatter
\chapter{Hvor skal jeg begynne?}
Kapittel 1: Et kort kapittel.
\newpage
\section{I begynnelsen...}
En seksjon.
\newpage
En annen seksjon.
\end{document}
```

[Åpne dette eksemplet i 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)

**Noter om ε-TeX**

Som [som vi bemerket ovenfor](#etex), introduserer ε-TeX `\marks` kommandoen:

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

som utvider den opprinnelige `\mark` funksjonen i Knuths TeX-motor og er tilgjengelig i alle de tre hoved-TeX-motorene: pdfTeX, LuaTeX og XeTeX.

ε-TeXs implementering introduserer også nye globale mark-variabler `\firstmarks n`, `\botmarks n` og `\topmarks n`: én for hver klasse `n`. Disse klassebaserte mark-variablene bestemmes [ved hjelp av mekanismene beskrevet ovenfor](#pre-output-checks-looking-for-mark-nodes), og kan alle brukes til å produsere topp- og bunntekster.

Du kan bruke noen av de $$2^{15}$$ = 32768 mark-klassene, fra 0 til 32767, innen redefinisjoner av `\leftmark` eller `\rightmark`. Det forutsetter at du har gitt (satt inn) passende merkedata for den valgte mark-klassen, `n`, via `\marks n{{left}{right}}`.

Merk at LuaTeX tilbyr $$2^{16}$$ = 65536 mark-klasser, med `n` fra 0 til 65535.

**Eksempel som bruker mark-klasse 10**

Dette eksemplet viser bruk av mark-klasse 10 (valgt tilfeldig) for å lage topptekster i dokumentet. Eksempeldokumentet setter opp 6 sider som inneholder sekvensen av markeringer presentert i [det gjennomarbeidede eksemplet på slutten av denne artikkelen](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). En studie av det eksemplet vil vise hvorfor TeX-motoren har valgt en bestemt markering, $$\alpha$$, $$\beta$$, $$\gamma$$ og $$\delta$$, for bruk i hver av topptekstene.

Vi begynner med å definere en praktisk makro, `\domark`, som bruker `\marks 10` for å sette inn merkedata som følger LaTeXs `{left}{right}` konvensjon:

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

Markeringer av klasse 10 gjøres tilgjengelige for LaTeXs mekanisme for topp- og bunntekster ved å redefinere `\leftmark` og `\rightmark`—med litt ekstra informasjon lagt til:

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

Etter å ha satt inn en rekke (klasse 10-)markeringer oppretter TeX-motoren (her pdfTeX) høflig globale mark-variabler for klasse 10—`\botmarks10`, `\topmarks10` og `\firstsmarks10` hvilke `\leftmark` og `\rightmark` som brukes til å produsere topptekstene.

```latex
\documentclass{book}
% En kort kommando for å bruke markeringer med klasse 10
% og følger LaTeXs mark-struktur {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Redefiner \leftmark og \rightmark til å bruke
% henholdsvis \botmarks10 og \firstmarks10
\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{Demonstrasjon av \(\varepsilon\)-\TeXs utvidede markeringer}
\author{Overleaf}
\date{august 2022}
\begin{document}

Side 1: Ingen markeringer lagt til, så alle mark-variabler forblir i sin initialiserte tilstand: tomme (NULL).

\newpage
Side 2: $\alpha$-markering lagt til denne siden via

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

\newpage
Side 3: Ingen nye markeringer lagt til denne siden.

\newpage
Side 4: $\beta$-markering fulgt av $\gamma$-markering lagt til denne siden via

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

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

\newpage
Side 5: $\delta$-markering lagt til denne siden via

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

\newpage
Side 6: Ingen markeringer lagt til denne siden.
\end{document}
```

[Åpne dette eksemplet i 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)

Følgende grafikk viser topptekstene som er produsert av dette eksemplet:

![Grafikk som viser utdata fra LaTeX-kode som bruker ε-TeXs utvidede mark-kommandoer](/files/ac6d924f74aaa50da13d02f6ba877b4a5bb8e4a2)

* **Merk**: Toppteksten på side 1 opprettes på et tidspunkt da alle tre mark-variablene for klasse 10—`\botmarks10`, `\topmarks10` og `\firstsmarks10`—er tomme. Sluttresultatet er at `\rightmark` (for side 1) setter bare inn det siste topptekstfragmentet: `(via \texttt{\string\firstmarks10})`, som vist i grafikken over.

## Et gjennomarbeidet eksempel som viser hvordan TeX-motorer bestemmer verdier for \botmark, \topmark og \firstmark

![Db.gif](/files/6cc6645c0963d05882adf327d29ed93d8a12c838)![Db.gif](/files/6cc6645c0963d05882adf327d29ed93d8a12c838) Det føles passende å gjenskape Knuths bruk av doble faresving-tegn (bilde med tillatelse fra [dette nettstedet](http://www.truetex.com/db.htm)) fordi materialet er noe lavnivå og «titter under panseret»—selv om vi håper det kan være av interesse for modige lesere som ønsker å forstå noen flere detaljer.

Den følgende diskusjonen er tett basert på det siste eksemplet på side 258 i [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Her har vi redigert og satt opp det eksemplet på nytt for dem uten tilgang til The TeXbook:

![En redigert og satt opp på nytt versjon av et eksempel fra side 258 i TeXbook](/files/c4bb1bbd7655f41ba549184b0396a87d784618f6)

Tabellen som presenteres i denne grafikken er gjengitt fra en tabell som ble levert av Knuth, men som i originalen finnes det ingen forklaring på hvordan den ble utledet. Her skal vi ta for oss det for å gi flere detaljer som viser hvordan disse verdiene av `\botmark`, `\topmark` og `\firstmark` ble bestemt—for å få tak i disse detaljene måtte vi undersøke kildekoden til en TeX-motor!

Prosessen med å sette verdier for `\botmark`, `\topmark` og `\firstmark` kan oppsummeres i 3 korte pseudokodefragmenter som vist i følgende diagram og de påfølgende forklaringene:

1. Før-innholds-sjekk
2. Innholdsløkke
3. Etter-innholds-sjekk

Merk:

* Testene i trinn 1 «Før-innholds-sjekk» og trinn 3 «Etter-innholds-sjekk» utføres én gang per side.
* Trinn 2 «Innholdsløkke» innebærer at TeX skanner gjennom sideinnholdet på jakt etter mark-noder, og bruker dem til å sette verdiene for mark-variablene som vist.

![Bilde som viser pseudokodeversjoner av kode brukt til å sette verdier for de tre globale mark-variablene som brukes av TeX-motorer](/files/2617ac93e660606f97a67195b14e76ee409c7436)

Hver gang TeX finner et passende sideskift, sender det innholdet på den siden til sluttbehandling, og utfører disse (tre) mark-behandlingstrinnene for hver side i dokumentet ditt. Behandlingstrinnene merket 1, 2 og 3 er referert til i det avsluttende diagrammet i denne delen.

Merk at:

* før den første siden er behandlet, er alle tre globale mark-variablene `\botmark`, `\topmark` og `\firstmark` initialisert til å være tomme (NULL).
* de endelige verdiene av `\botmark`, `\topmark` og `\firstmark` bestemt på slutten av *forrige* siden blir (inngangs-)verdiene for behandling av *nåværende* siden—den som behandles.

De følgende kodefragmentene er ***pseudokode*** utledet (oppsummert) fra faktisk kildekode for TeX-motoren. Målet er å gi en kort kodeoppsummering som hjelper til med å demonstrere de sentrale prinsippene som er involvert.

**Trinn 1: Før-innholds-sjekk** Før TeX ser gjennom det faktiske innholdet på den gjeldende siden, sjekker den om den gjeldende `\botmark` verdien—dvs. som følge av *forrige* siden—er tom (NULL):

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

I denne testen, hvis `\botmark` (fra *forrige* siden) er *inneholder* tom:

* `\topmark` for *nåværende* siden settes til *forrige* sidens `\botmark` verdi
* `\firstmark`, for *nåværende* siden (som behandles), settes til tom (NULL): start denne siden med antakelsen om at det ikke finnes noen `\mark` noder.

Merk at denne testen utføres *én gang* for hver side som behandles.

**Trinn 2: Innholdsløkke** Deretter går TeX gjennom sideinnholdet i en løkke; en del av den løkken innebærer å lete etter `\mark` noder:

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

Denne testen brukes på hver mark-node som er plassert i (inngår i) den gjeldende siden. Den forrige testen (trinn 1 ovenfor) kunne ha satt `\firstmark` til tom, slik at det aller første mark funnet på den gjeldende siden blir verdien til `\firstmark` og `\botmark`. Enhver *etterfølgende* `\mark` node som oppdages mens denne løkken kjøres, vil ikke endre verdien til `\firstmark`, fordi den ikke lenger er tom (NULL), men `\botmark` oppdateres — fordi det er hensikten med `\botmark`: å lagre den sist observerte `\mark` nodeen for denne siden.

**Trinn 3: Sjekk etter innhold** Når den har gått gjennom sideinnholdet, bruker TeX den følgende, avsluttende testen, som også utføres én gang per side:

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

* Hvis `\topmark` ikke er tom (NULL), vet vi fra trinn 1 at `\botmark` for den forrige siden ikke var tom (NULL).
* Hvis `\firstmark` fortsatt er tom, så har vi ikke sett noen `\mark` noder fordi testen i trinn 2 ikke ble utløst; derfor, `\firstmark` settes til verdien av `\topmark` som også er verdien av `\botmark` fra den forrige siden.

Etter sekvensiell anvendelse av disse tre trinnene for alle de 6 sidene i eksemplet vårt, er verdiene til `\botmark`, `\topmark` og `\firstmark` utledet ved hjelp av overgangene som vises i diagrammet nedenfor, der:

* lyseblå avrundede rektangler er de endelige verdiene for mark-variablene for hver side
* lysegrå avrundede firkanter representerer mellomverdier som oppstår under behandlingen
* piler med etiketter representerer endringer i verdiene til markørvariablene i henhold til trinn 1, 2 eller 3 i diagrammet ovenfor — eller at en verdi ikke har blitt endret av noen av trinnene; merket «ingen endring».

Det følgende diagrammet viser hvordan de tre pseudokodefragmentene genererer de endelige verdiene til `\botmark`, `\topmark` og `\firstmark` oppført i tabellen på side 258 i The TeXbook.

![Et overgangsdiagram som følger eksemplet fra side 258 i The TeXbook, og viser interne overganger mens de globale markvariablene får tildelt verdiene sine](/files/a61ec1d7a9c2f19115523b005e06031e4937de74)


---

# 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/no/dybdeartikler/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.
