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

# Hur sätter LaTeX sidhuvuden och sidfötter?

## Hur sätter LaTeX sidhuvuden och sidfötter?

### Introduktion

Om du letar efter en praktisk guide om hur man ändrar sidhuvuden och sidfötter, vänligen [besök vår hjälpsida](/latex/sv/formatering/02-headers-and-footers.md) eftersom denna artikel fokuserar på att förklara lågnivåmekanismer som används av TeX-motorer och LaTeX för att skapa sidhuvuden och sidfötter.

* **Obs (uppdatering)**: Den här artikeln utforskar den centrala LaTeX-markmekanism som användes före juni 2022, då en ny och mer mångsidig implementation av LaTeX:s markhantering infördes. Se [Översikt över LaTeX:s nya markmekanism](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) för mer information. Av bakåtkompatibilitetsskäl fortsätter LaTeX att stödja sin äldre markmekanism. Artikelfragment som diskuterar TeX-motorers beteende påverkas inte av dessa ändringar i LaTeX.
* **Obs**: termerna “LaTeX”, “TeX” och “TeX-motor” används genomgående i dessa diskussioner så det är bra att förstå deras betydelse—se Overleaf-artikeln [Vad ligger i ett namn: En guide till de många smakerna av TeX](/latex/sv/fordjupade-artiklar/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) för mer information.

För att ge användbar bakgrund/kontext börjar vi med en översikt över några relevanta lågnivåområden inom TeX-baserad sättning—inklusive tillfällig (intern) innehållslagring, sidbrytning och uppbyggnad. Diskussionerna har strömlinjeformats/förenklats genom att betrakta en satt sida som innehåller ett ”brödtext”-block plus några sidhuvuden och sidfötter. Sidobjekt såsom figurer (flytande objekt) och fotnoter behandlas inte eftersom de involverar en komplex TeX-mekanism kallad *infogningar*, vilket ligger långt utanför denna artikels omfattning.

Vi börjar med det grundläggande begreppet *noder*: de grundläggande byggstenar som TeX-motorer använder för tillfällig (intern) innehållslagring.

### Några anmärkningar om hur innehåll lagras: TeX-noder

När den underliggande TeX-motorn bearbetar din LaTeX-kod för att skapa satt material—såsom stycken, tabeller och matematik—måste den tillfälligt lagra det innehållet i minnet hos den TeX-motor som används för att bearbeta din LaTeX-kod. För att lagra satt innehåll använder TeX-motorer en följd av så kallade *noder*, som du kan tänka dig som variabelt stora ”bitar” av datorns (enhetens) minne, länkade tillsammans för att bilda en lista (se denna [Wikipedia-artikel om länkade datastrukturer](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Schematiskt exempel på hur TeX-motorer lagrar innehåll med länkade noder](/files/6c81c73a7718798660229aae0a5f0e503e33e0ed)

För att representera de grundläggande elementen i TeX-baserad sättning—såsom tecken, lim, boxar, straff och [*markeringar*](#why-were-here-understanding-mark-nodes) (för att nämna några)—använder TeX-motorer olika *typerna* av nodtyp. Vissa noder, såsom dem för boxar, behöver lagra mer data jämfört med enklare nodtyper som teckennoder; därför är vissa noder större än andra—och kräver fler byte för att lagras i minnet. När du läser om TeX kan du stöta på termer som *teckennoder*, *limnoder*, [*marknoder*](#why-were-here-understanding-mark-nodes) och så vidare: nu vet du att dessa bara är namn på bitar av minne som allokerats för att lagra data som representerar ett element i TeX:s sättning.

#### Varför vi är här: förstå marknoder

Av de många nodtyperna är den vi behöver diskutera en som kallas en *marknod* som skapas av kommandot `\mark` kommandot:

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

Den `\mark` kommandot producerar inte direkt något satt innehåll: dess argument `*stuff to store*` sparas i minnet för senare användning och en *marknod* skapas för att innehålla minnesplatsen för *stuff to store*. Som vi ska se skapades kommandot `\mark` särskilt *för att hjälpa till att skapa sidhuvuden och sidfötter.* Marknoder som skapas av

kommandon ”bäddas in” i sidinnehållet och är redo att användas under de sista stegen av sidkompositionen när TeX-motorn är redo att lägga till sidhuvuden och sidfötter till den satta sidan (brödtexten). Vanligtvis kommer `\mark` att innehålla material såsom sidnummer och kapitel- eller avdelningstitlar/-nummer—byggstenarna i sidhuvuden och sidfötter. `*stuff to store*` ε-TeX lägger till kommandot \marks

#### Version 2 av ε-TeX

[, en utvidgning av Knuths ursprungliga TeX, publicerades 1998 och tillhandahåller nya möjligheter tillsammans med förbättringar av befintliga funktioner. I dag har de flesta av ε-TeX:s förbättringar införlivats i de vanliga TeX-motorerna: pdfTeX, LuaTeX och XeTeX—se](https://texdoc.org/serve/e-TeX/0)-etex [**`kommandoradsalternativet för TeX-motorer`** som möjliggör användning av ε-TeX-utvidgningar.](/latex/sv/fler-amnen/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) Knuths ursprungliga TeX-programvara tillhandahåller kommandot \mark som bara skapar 1 ”klass”, eller ”typ”, av marknod. Ditt dokument kan innehålla många \mark-kommandon men de skapar alla marknoder av samma ”typ” eller ”klass”—det finns ingen inbyggd mekanism för att gruppera eller klassificera dem. Denna begränsning togs bort av en förbättring i ε-TeX: kommandot \marks som stöds av pdfTeX, LuaTeX och XeTeX:

\marks n {stuff to store}

```latex
är ett heltal (
```

där `n` ) som bestämmer marknodens`0` <= `n` < `32768`klass *klass*.

Anmärkningar:

* att skriva `\marks 0` (dvs. `n`=`0`) är synonymt med att använda TeX:s ursprungliga `\mark` kommandot
* ε-TeX införde också markvariabler ([se senare](#pre-output-checks-looking-for-mark-nodes)) för varje klass (`n`) av markering: `\firstmarks n`, `\topmarks n` och `\botmarks n`. Valda klasser av markvariabler kunde användas för att tillhandahålla markdata för specifika sättningsuppgifter.
* LuaTeX ökade det maximala värdet för `n` till `65535`, vilket möjliggör $$2^{16}$$ markklasser

### Anledningar till TeX:s användning av markeringar

För att förstå *varför* (och hur) TeX-motorer använder kommandot `\mark` (eller `\marks`) för att skapa sidhuvuden och sidfötter behöver vi förstå några ”egenheter” hos TeX-motorernas mekanismer för att konstruera sidor—att hitta sidbrytningar och skicka ut färdiga sidor till en PDF-fil. I verkligheten är dessa sidbyggnadsprocesser komplexa, men kärnprinciperna/begreppen kan förenklas för att ge tillräcklig bakgrund som hjälper oss att förstå markeringar.

När en TeX-motor slutför sättningen av enskilda innehållsdelar som stycken, tabeller eller matematik anropar den en intern rutin (en funktion kallad `build_page(...)`) som försöker lägga till dessa nyligen satta delar på den sida som för närvarande byggs i minnet. När det nya materialet läggs till på sidan som byggs kontrollerar TeX också om det nyligen tillagda innehållet har gjort den aktuella sidan ”tillräckligt full”. Om sidan är full kan TeX skapa en *sidbrytning*—och skicka innehållet för den sidan för slutlig bearbetning (”packning”) och efterföljande utmatning till PDF-filen.

En nyckelfunktion i det sista steget av sidpackning (komposition) är något som kallas en *utmatningsrutin* som i praktiken är en användardefinierad följd av kommandon som används för att paketera sidan med innehåll så att den är redo att skickas till PDF-filen. Ett exempel på en sådan ”packning” är att lägga till sidhuvuden och sidfötter, men det finns många sätt att använda utmatningsrutiner—se till exempel [denna artikel i TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Utmatningsrutiner är ett ganska komplext område inom TeX så vi går inte in på detaljer här: för nuvarande syfte räcker det att komma ihåg att det sista steget i sidkompositionen innebär att man använder en användardefinierad följd av kommandon (gemensamt kallad en *utmatningsrutin*).

Men låt oss överväga vad som kan hända när TeX avslutar sättningen av ett långt stycke text och bryter det till en följd av enskilda satta rader. TeX kommer att vilja lägga till det nysatta stycket—rad för rad—på den sida som för närvarande byggs men kanske bara *några* av dessa rader får plats på den aktuella sidan. Observera att med ”sida” avser vi det huvudsakliga textområdet (sidans brödtext), som *gör inte* kan inkludera andra sidelement såsom sidhuvuden och sidfötter som läggs till senare (av utmatningsrutinen).

Efter att flera rader av stycket har lagts till på den aktuella sidan kan den bli ”tillräckligt full” och det är dags för TeX att skapa en sidbrytning. Men vi har en del ”överblivet” material eftersom endast *part* av stycket kom med på den aktuella sidan: det ”överskjutande styckesinnehållet” sparas för *nästa* sida. Följande grafik illustrerar denna idé: en del av stycket finns på *aktuella* sidan och en del hålls tillbaka för *nästa* sida.

![Schematiskt exempel på ett stycke som sträcker sig över en sidbrytning](/files/b1773323d124d10bbad561b588964f96749677d6)

Detta styckes exempel visar att en TeX-motor ofta bearbetar (sätter) delar av innehåll som inte *i sin helhet*, får plats på den aktuella sidan—eftersom innehållet sträcker sig bortom den punkt där en sidbrytning blir nödvändig. Kom ihåg att TeX-motorer hittar radbrytningar genom att läsa in och sedan sätta *hela stycken* och, till skillnad från vissa applikationer, inte använder ett rad-för-rad-sättningssätt för stycken. Med andra ord sätter TeX *hela* stycket oavsett om det får plats på den aktuella sidan eller inte (det avgörs senare). För övrigt gäller principen ”sätt i sin helhet och lägg sedan till på den aktuella sidan” även för andra typer av TeX-innehåll, inklusive tabeller som läses in helt från .tex-filen och sätts i sin helhet innan något försök görs att lägga till dem på den aktuella sidan.

För vårt styckes exempel har hela texten i det stycket, *inklusive eventuella kommandon i den texten*, bearbetats fullt ut—vilket betyder att TeX:s sättning har nått en viss plats i din `.tex` fil. Det ”aktuella interna tillståndet” hos TeX-motorn, såsom värdet på variabler eller lagrade parameterinställningar, kommer att återspegla det material, inklusive eventuella kommandon, som bearbetats fram till den aktuella platsen—slutet av stycket.

Även om hela stycket har satts kan en del av det inte få plats på den aktuella sidan, vilket resulterar i att ”överskjutande styckesinnehåll” sparas för *nästa* sidan. Inom den LaTeX-kod (text plus kommandon) som skapade det ”överskjutande styckesinnehållet” har TeX-motorn *kunnat* ha anropat vilket antal kommandon och makron som helst som ändrade värden och variabler som lagras internt av TeX-motorn—dvs. gjort ändringar i TeX:s ”aktuella tillstånd”.

Följande diagram illustrerar en extremt viktig TeX-”egenhet”, en som påverkar flera aspekter av TeX-baserad sättning. Om du tittar på högra sidan av diagrammet ser du en representation av noder som utgör allt innehåll som för närvarande lagras i minnet: det ljusgrå området innehåller noder som bildar *aktuella* sidan och det mörkgrå området är satt innehåll som är avsett för *nästa* sidan. Detta scenario återspeglar vårt styckes exempel: det mörkgrå området representerar det ”överskjutande styckesinnehållet”: textrader som hålls tillbaka eftersom de inte får plats på den aktuella sidan.

![Schematiskt exempel på nodplatsen där TeX hittar en sidbrytning, med innehåll som hålls tillbaka för nästa sida](/files/4d69d876fb60d2223cc5e0e9711177d9cf663e83)

Kom ihåg att när TeX har en ”tillräckligt full” sida (brödtext) skickar den det innehållet till något som kallas en *utmatningsrutin* som är en användardefinierad följd av kommandon. Bland annat lägger utmatningsrutinen till sidhuvuden och sidfötter till sidans brödtext och färdigställer sidan inför utsändning till PDF-filen.

Vår grafik (ovan) representerar det tillfälle då TeX har valt att göra en sidbrytning vid någon särskild nod, såsom `\baselineskip` lim mellan satta rader, och är redo att börja paketera den aktuella sidan med hjälp av utmatningsrutinen—en följd av inbyggda kommandon och användardefinierade makron. *Men*, utöver innehållet som utgör den aktuella sidan (lagrat i minnet) har TeX redan bearbetat och lagrat (i minnet) *ytterligare material*, från din `.tex` fil. Det extra materialet sträcker sig *bortom sidbrytningen* och *kunnat* kan ha inkluderat kommandon som ändrade viktiga sidrelaterade värden eller variabler och därmed påverkat TeX:s ”aktuella interna tillstånd”—vilket inkluderar värden på interna parametrar eller data lagrade av makron.

När TeX börjar paketera den aktuella sidan är dess ”aktuella interna tillstånd” *inte* bestämt av allt som satts fram till sidbrytningsläget eftersom TeX redan har *kommit förbi den punkten* i din fil och bearbetat ytterligare material. Om du betraktar platsen i din fil som motsvarar där sidbrytningen sker, och den plats TeX faktiskt har nått i din `.tex` fil, kan TeX:s två motsvarande interna tillstånd, inklusive lagrade data och variabelvärden, vara mycket olika. TeX:s aktuella sättningstillstånd ligger vanligtvis före där sidbrytningen sker; dvs. TeX:s sättningsaktiviteter *är inte synkroniserade* med processen att mata ut satta sidor via utmatningsrutinen.

#### Hypotetiskt exempel: hur man får fel sidhuvuden

Följande diagram illustrerar hypotetiska kommandon `\myheader` och `\myfooter` som används för att lagra önskad text för sidhuvuden och sidfötter; till exempel genom att använda grundläggande definitioner såsom

```latex
\newtoks\headertoks% en ny tokenlistvariabel för sidhuvudstexten
\newtoks\footertoks% en ny tokenlistvariabel för sidfotstexten
% Använd \global för att säkerställa att lagrade sidhuvuds- eller sidfotsdata är
% åtkomliga överallt, inklusive kommandon i
% utmatningsrutinen
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

i vilket `\headertoks` och `\footertoks` är tokenlistor som används för att lagra texten för sidhuvuden och sidfötter.

Dessutom har vårt hypotetiska exempel också en utmatningsrutin som hämtar sidhuvuds- och sidfotstexten från de aktuella värdena av `\myheader` och `\myfooter`. Som visas i diagrammet, inom det innehåll som är avsett för den aktuella sidan, `\myheader` och `\myfooter` ställa in de lämpliga (korrekta) värdena. Men det skulle vara möjligt för `\myheader` och/eller `\myfooter` att anropas inom ett stycke som sträcker sig över en sidbrytning. Eftersom TeX måste bearbeta hela stycket, `\myheader` och `\myfooter` skulle anropas igen för att återställa den sidhuvuds-/sidfotstext som sparats i ”TeX:s interna tillstånd”, vilket ger värden som inte är korrekta för den aktuella sidan. När utmatningsrutinen producerar sidhuvudet och sidfoten kommer de att innehålla text avsedd för nästa sida.

![Grafik som visar felaktiga sidhuvuden och sidfötter som produceras om utmatningsrutinen endast använder TeX-makron för att hämta sidhuvuds- och sidfotstext](/files/6f4b32a25ae611740886f4502a18cd838398574f)

#### TeX:s asynkrona beteende: \mark-kommandot till räddning

TeX:s sättnings- (innehållsbyggnads-) aktiviteter är *inte synkroniserade* med den slutliga processen att mata ut en satt sida via kommandon i utmatningsrutinen. När det är dags att mata ut en sida ligger TeX:s faktiska interna tillstånd före eventuellt tillstånd som det kan ha haft vid platsen för sidbrytningen—där det satte den sista delen av innehållet på den aktuella sidan som matas ut.

I [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), beskriver Donald Knuth, TeX:s skapare, denna situation som

> ... TeX:s utmatningsrutin ligger efter dess sidbyggnadsaktiviteter

På grund av detta osynkroniserade förhållande krävs ”särskilda anordningar” i form av *markmekanismen*, tillämpad genom `\mark` (eller `\marks n`) kommandot, för att säkerställa att sidhuvuden och sidfötter innehåller material som är relevant för den faktiska sidan som matas ut.  `\mark` kommandot bäddar in marknoder i sidinnehållet och lagrar minnesplatsen för innehåll som kan användas för värdsidans sidhuvud och sidfot.

Författaren till den välkända och respekterade boken [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) beskriver `\mark` mekanismen som

> ... den huvudsakliga mekanism genom vilken utmatningsrutinen kan få information om innehållet på den för tillfället avbrutna sidan, särskilt dess topp och botten.

Den `\mark` kommandot är en mekanism utformad för att kringgå TeX:s asynkrona natur hos algoritmen för sidbrytning och utmatningsrutin.

![Schematiskt exempel på markdata (noder) inbäddade i sidans brödtextinnehåll](/files/a75eb9f4cd69437c4cb8f6304c5aa83dd22c8c32)

### Kontroller före utmatning: leta efter marknoder

Efter att TeX-motorn har bestämt platsen för en sidbrytning anropar den en intern rutin (kallad `fire_up()`) som gör mycket förbearbetning innan utmatningsrutinen slutför sidkompositionen och skriver den färdiga sidan till PDF-filen. En viktig del av dessa förbearbetningssteg är att ställa in värdet på tre *globala markvariabler*: `\botmark`, `\topmark` och `\firstmark` som används för att tillhandahålla data för att konstruera sidhuvuden och sidfötter. Naturligtvis kan en sida innehålla flera marknoder men dessa filtreras för att producera de tre markvariablerna som fungerar enligt följande:

* **`\botmark`** är den mark som gäller vid den aktuella sidbrytningen; dvs. den sista mark som setts på *aktuella* page
* **`\topmark`** är värdet på `\botmark` från *föregående* page
* **`\firstmark`** är den första marken på *aktuella* sidan—den första marken mellan `\topmark` och `\botmark`

Följande schema visar de grundläggande principerna för förbearbetning av det satta sidinnehållet för att bestämma värdena för de tre globala markvariablerna `\botmark`, `\topmark` och `\firstmark`:

![Schematiskt exempel på grundläggande principer som används för att bestämma värdena för de tre globala markvariablerna \botmark, \topmark och \firstmark](/files/03b45f02148610aaf8df1ad2994dd202f7d6dc4d)

Nästa avsnitt använder några av förklaringarna ovan för att skissera hur LaTeX sätter sidhuvuden och sidfötter.

### LaTeX:s klasser: sidstilar och sidhuvuden/sidfötter

När du skriver `\documentclass{*class*}` där `*class*` kan vara `article`, `book`, `rapport` eller `brev`, laddar LaTeX en fil med namnet `*class*.cls`; till exempel, `book.cls`, `article.cls` och så vidare. Dessa `.cls` filer innehåller LaTeX-kod för att implementera klasspecifika varianter av olika kommandon och funktioner som förväntas finnas i, och tillhandahållas av, alla dokumentklasser—beteenden som delas av alla dokumentklasser. Exempel kan vara klasspecifika sidlayoutmarginaler tillsammans med klasspecifika versioner av kommandon, såsom `\section`, `\subsection` och så vidare.

Ett annat viktigt element i `.cls` filer är klasspecifik implementation av standardsidestilar som definierar sidhuvuden och sidfötter i dokument som produceras med en viss klass och sidstil. Till exempel:

* **`book.cls`** och **`article.cls`** innehåller implementationer av sidstilarna `headings` och `myheadings`
* **`letter.cls`** innehåller definitioner för sidstilarna `headings`, `empty`, `plain` och en som kallas `firstpage`
* **`report.cls`** innehåller definitioner för sidstilarna `headings` och `myheadings`

Implementationer av sidstilar beror ofta på `twoside` alternativet för `\documentclass`—om dokumentet är enkelsidigt eller dubbelsidigt—så att sidhuvuden och sidfötter definieras på lämpligt sätt för vänstersidor (jämna) och högersidor (udda).

Dokumentklasser kan förlita sig på standarddefinitioner av `plain` eller `empty` sidstilar som tillhandahålls någon annanstans i LaTeX—utanför `.cls` filen som används.

#### Mer om sidstilar

När du ändrar en sidas stil med `\pagestyle{*somestyle*}` eller `\thispagestyle{*somestyle*}` förväntar sig LaTeX att hitta ett internt kommando med namnet `ps@*somestyle*`—vanligtvis tillhandahållet av dokumentklassens `.cls` fil, eller kanske av ett paket såsom `fancyhdr`. För övrigt menar vi med ”internt kommando” ett kommando som är en del av LaTeX-källkoden och vars namn innehåller ett `@` symbol, vilket normalt förhindrar slentrianmässig användning (på grund av dess [kategorikod](/latex/sv/fler-amnen/43-table-of-tex-category-codes.md)).

Definitionen av `\ps@*somestyle*` ansvarar för att implementera funktionerna/beteendena hos den sidstilen, vilket inkluderar att tillhandahålla definitioner av:

* kommandon som används under de sista stegen av sidkompositionen (för att lägga till sidhuvuden och sidfötter, se [senare i artikeln](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* kommandon för att infoga avsnittsrelaterad markdata som används för att generera dokumenthuvuden och sidfötter som innehåller avdelningstitlar, nummer och liknande. Till exempel, `headings` sidstilen (i `book.cls`) definierar följande markproducerande kommandon:
  * `\chaptermark`
  * `\sectionmark`

Vi kommer att [utforska markgenererande kommandon närmare](#mark-commands-and-mark-data), såsom `\chaptermark`, men bara som exempel: när du skriver `\chapter{chapter title}` den `\chaptermark` kommandot körs också för att infoga kapitelrelaterad markdata för senare produktion av sidhuvuden.

#### En genomgång av sidhuvuds- och sidfotskommandon baserade på sidstil

Detta avsnitt utforskar några av de centrala LaTeX-kommandon/processer som används för att skapa sidhuvuden och sidfötter—med utgångspunkt i förklaringar eller begrepp som presenterats tidigare i artikeln.

**LaTeX:s ”modell” för sidhuvuden och sidfötter**

Innehållet i LaTeX:s (standard) sidhuvuden och sidfötter bygger på en tvånivåhierarki av dokumentavsnitt: ett avsnitt på ”högre nivå” som innehåller flera avsnitt på ”lägre nivå”. För klasserna book och article innebär detta:

* `**book**` **klass**: avsnitt på ”högre nivå” skapas av `\chapter` kommandon och avsnitt på ”lägre nivå” via `\section`, vilket återspeglar kapitel som innehåller många avsnitt.
* `**article**` **klass** (förutsatt dubbelsidiga dokument): avsnitt på ”högre nivå” skapas med `\section` kommandon och de på ”lägre nivå” via `\subsection`, vilket återspeglar flera underavsnitt inom samma avsnitt.

LaTeX tillämpar sin ”modell” för sidhuvuden och sidfötter genom sina avsnitts-kommandon som ”injicerar” marknoder (via `\mark` kommandot) för att lagra data som är relevant för det dokumentavsnitt som skapas. Till exempel, varje gång du skriver `\section{*some section title*}` kommer en marknod att skapas som innehåller data som återspeglar `*some section title*` och avsnittsnumret.

LaTeX använder ett system av markeringar som innehåller data av formen `{left}{right}`, som i slutändan genereras via `\mark` kommandon

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

inneslutet i lager av makron som är utformade för att skydda användare från de lägre detaljnivåerna—vilka utforskas i senare avsnitt av denna artikel.

#### Utforskar book-klassen

När `book.cls` filen laddas är en av dess sista åtgärder att köra `\pagestyle{headings}` som ställer in standardsidstilen till `headings`, så vi ska titta närmare på den sidstilen.

Som [nämnt ovan](#more-on-page-styles), definieras funktionerna/egenskaperna hos `headings` sidstilen, såsom den implementeras av `book` klassen, av det (interna) kommandot `\ps@headings` som finns i filen `book.cls`. Den exakta definitionen av `\ps@headings` beror på om dokumentet är enkelsidigt eller dubbelsidigt (standard för `book` klassen).

**”Markkommandon” och ”markdata”**

För dubbelsidiga dokument som produceras av `book` klassen definierar `\ps@headings` (definierar) två ”markkommandon”: `\chaptermark` och `\sectionmark` som producerar ”markdata” av formen `{left}{right}`, för användning i sidhuvuden och sidfötter. Dessa markkommandon återspeglar LaTeX:s modell för sidhuvuden och sidfötter—baserad på hierarkin av dokumentavsnitt:

* avsnittskommandot på ”högre nivå” (här, `\chapter`) används för att tillhandahålla ”markdata” för vänstersidors (jämnt numrerade) sidhuvuden. När du börjar ett nytt kapitel, genom att skriva `\chapter{*chapter title*}`, `\chaptermark` anropas för att skapa ”markdata” som återspeglar det nya kapitlet—och innehåller dess `*chapter title*` och nummer.
* avsnittskommandot på ”lägre nivå” (här, `\section`) används för att tillhandahålla “markdata” för högersidor (udda sidor). När du skriver `\section{*section title*}` den `\sectionmark` kommer kommandot att anropas för att skapa “markdata” som återspeglar den nya sektionen—och innehåller dess `*section title*` och nummer. All markdata som tillhandahölls av den föregående `\chapter` påverkas inte av några efterföljande \section-kommandon.

**\markboth och \markright**

LaTeX:s sektionsspecifika markkommandon, såsom `\chaptermark` och `\sectionmark`, använder ytterligare två kommandon som kallas `\markboth` och `\markright` som tillhandahåller den faktiska markdatan för sidhuvuden och sidfötter. `\markboth` och/eller `\markright` kan innehålla kommandon för att formatera text i sidhuvud eller sidfot, till exempel göra den versal.

För dokument som produceras med hjälp av `book` klassens standardinställningar (dubbelsidigt, `headings` sidstil), fungerar markgenererande kommandon enligt följande:

* `\chaptermark` genererar markdata med hjälp av `\markboth`
* `\sectionmark` genererar markdata `\markright`

`\markboth` och `\markright` är makron som i slutändan använder det primitiva (inbyggda, lågnivå-) `\mark` kommandot för att faktiskt infoga markeringar som genererats inifrån sektionskommandon.

`\markboth` har formen

* **`\markboth{vänster}{höger}`**: infogar en markering (nod) med hjälp av `\mark{{left}{right}}` vilket resulterar i en marknod som innehåller ett par värden inom klamrar `{left}{right}`.

`\markright` har formen

* **`\markright{nyhöger}`**: infogar en markering (nod) med hjälp av `\mark{{currentleft}{newright}}`; dvs. det ändrar det aktuella värdet av `höger` till `nyhöger` men det aktuella värdet av `vänster` (dvs. `currentleft`) är oförändrat, vilket resulterar i en marknod som innehåller ett par värden inom klamrar `{currentleft}{newright}`.

Beteendet hos `\markboth` och `\markright` stöder den tvånivåiga sektionshierarkin, såsom ett dokument som innehåller flera sektioner inom varje kapitel.

Som exempel för den (dubbelsidiga) `book` dokumentklassen (med sidstilen headings):

* `\chaptermark` använder `\markboth` för att ställa in:
  * a `{vänster}` fält som sätter CHAPTER . i versaler.
  * ett {right}-fält som är tomt (`{}`)
* `\sectionmark` använder `\markright` för att ställa in `{höger}` markfältet att sättas. också i versaler.

För att förstå varför `\sectionmark` använder `\markright` kan vi observera att varje nytt `\section` kommando bör:

* infoga en ny markering som innehåller data för denna `\section` (såsom dess titel och nummer).
* men *inte* påverka markdatavärden för den aktuella `\chapter` i vilket just det här `\section` kommandot förekommer

Av dessa skäl `\section` kommandot anropar `\sectionmark` som använder `\markright` för att skapa en `\section`-relaterad markering: den uppdaterar `{höger}` markdatafältet men påverkar inte den aktuella `{vänster}` markdatafältvärdet som sattes av den aktuella `\chapter`.

Obs: LaTeX-källkoden innehåller varningen:

> Markeringskommandona fungerar ganska bra för högermarkeringar som är ‘numrerade inom’ vänstermarkeringar—t.ex. ändras vänstermarkeringen av ett \chapter-kommando och högermarkeringen ändras av ett \section-kommando. Det ger dock något avvikande resultat om 2 \markboth förekommer på samma sida.

**Kommandon för utmatningsrutinen**

Den `\ps@headings` kommandot implementerar definitionerna av följande kommandon

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

som används av utmatningsrutinen för att lägga till sidhuvuden och sidfötter under det sista steget i sidkompositionen. Till exempel, `book.cls` sätter `\@oddfoot` och `\@evenfoot` till värdet `\@empty`, som är definierad som `\def\@empty{}`, alltså `\ps@headings` ger tomma sidfötter på vänster- och högersidor:

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

Sidhuvudena definieras som:

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

där

* `\leftmark` extraherar `{vänster}` värdet från ett `{left}{right}` markpar
* `\rightmark` extraherar `{höger}` värdet från ett `{left}{right}` markpar
* \thepage skriver ut det aktuella sidnumret

I huvudsak ger dessa implementationer av `\@evenhead` och `\@oddhead` följande resultat:

* `\@evenhead`: sidnumret visas till vänster i sidhuvudet och innehållet i `\leftmark`, formaterat med fontkommandot `\slshape`, skrivs ut till höger i sidhuvudet—det mellanliggande vita utrymmet tillhandahålls av det mycket flexibla `\hfil` glue.
* `\@oddhead`: innehållet i `\rightmark`, formaterat med fontkommandot `\slshape`, visas till vänster i sidhuvudet och det aktuella sidnumret skrivs ut till höger i sidhuvudet—återigen tillhandahålls det mellanliggande vita utrymmet av `\hfil` glue.

Men en viktig fråga kvarstår: *vilket* `{left}{right}` markpar används av `\leftmark` och `\rightmark`: med andra ord, varifrån får de sina markdatavärden?

Som [nämnt ovan](#filtering) men [förklaras nedan](#explainfiltering), under de sista stadierna av sidkompositionen filtreras alla markeringar som finns i dokumentsidorna och används för att ställa in värdet på tre globala markvariabler: `\botmark`, `\topmark` och `\firstmark`. På grund av [LaTeX:s marks struktur](#latexs-model-of-headers-and-footers), kommer var och en av dessa 3 markvariabler så småningom att innehålla ett värde av `{left}{right}` för något par av värden `{vänster}` och `{höger}` och det är dessa som tillhandahåller den faktiska `{left}{right}` markpar (fält) för `\leftmark` och `\rightmark`:

* `\leftmark` extraherar `vänster` värdet från `{left}{right}` markpar (fält) som tillhandahålls av `\botmark`
* `\rightmark` extraherar `höger` värdet från `{left}{right}` markpar som tillhandahålls av `\firstmark`

Obs `\markboth` och `\markright` kan innehålla kommandon för att formatera texten i sidhuvud och sidfot—till exempel omvandling till versaler.

### Exempel som använder lägre nivåns LaTeX-kommandon

Följande exempel visar hur man gör ändringar i sidstilar eller sidhuvuden och sidfötter genom att omdefiniera några av de lågnivå-LaTeX-kommandon (interna) som diskuteras i denna artikel (de som innehåller @-symbolen). Vi förespråkar inte denna metod för att ändra sidhuvuden och sidfötter, men den finns tillgänglig för dem som behöver den (t.ex. paketförfattare). Den föredragna lösningen för att ändra sidhuvuden och sidfötter är att använda [`fancyhdr` paketet](https://ctan.org/pkg/fancyhdr?lang=en), vilket diskuteras i en [Overleaf-hjälpartikel](/latex/sv/formatering/02-headers-and-footers.md).

#### Definiera en minimal sidstil

Följande exempel definierar en ny, extremt minimal, sidstil som kallas `demostyle` som använder statisk text för att definiera sidhuvuden och sidfötter och inte förlitar sig på sektionskommandon (`\chapter`, `\section` etc) för att ställa in innehållet i sidhuvud och sidfot.

Exemplet börjar med att ändra kategori-koden för `@` tecknet till 11 så att det kan användas i makronamn.  `\ps@demostyle` kommandot implementerar vår minimala sidstil genom att omdefiniera de kommandon som används (i utmatningsrutinen) för att skapa sidhuvudena och sidfötterna: `\@oddhead`, `\@oddfoot`, `\@evenhead` och `\@evenfoot`. Lägg märke till `twoside` alternativet i vår `\documentclass` deklaration—som använder `article` klassen.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Sidfoten för udda sidor\hfil}%
\renewcommand\@evenfoot{\hfil Sidfoten för jämna sidor\hfil}%
\renewcommand\@evenhead{\thepage\hfil Sidhuvudet för jämna sidor}%
\renewcommand\@oddhead{Sidhuvudet för udda sidor\hfil\thepage}}
\catcode`@=12
\title{Demonstrera en sidstil}
\author{Overleaf}
\date{Augusti 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduktion}
\newpage
\section{Mer material}
\end{document}
```

[Öppna detta exempel 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)

#### Ändra sidhuvuden för book-klassen

Följande exempel ändrar sidhuvudena för book-klassen genom att omdefiniera `\@oddhead` och `\@evenhead` så att sidhuvuden på vänster- och högersidor innehåller det aktuella sidnumret och kapiteltiteln. Lägg märke till hur den andra `\chapter` kommandot använder den valfria kortformen av kapiteltiteln `[Den korta titeln]` som nu ger sidhuvudstexten, i stället för den långa titeln.

`\section` kommandon har ingen effekt på innehållet i sidhuvudet eftersom våra omdefinitioner av sidhuvudet endast använder `\leftmark` som hämtar detaljer om det aktuella kapitlet. För att få tillgång till detaljer om den aktuella sektionen skulle vi behöva använda `\rightmark` i definitionen av `\@oddhead` och/eller `\evenhead`.

```latex
\documentclass{book}
% Obs: kategori-koden för '@' ändras tillfälligt till 11
% för att möjliggöra dess användning i kommandonamn
\catcode `@=11
% Låt \@oddfoot och \evenfoot vara ekvivalenta med \@empty
% för att göra dem tomma
\let\@oddfoot\empty\let\evenfoot\empty
% Omdefiniera \@oddhead och \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Använd en lagom liten sidstorlek
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Minnen av en \TeX{}-användare}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Detta är förmaterial som använder romerska siffror.
\mainmatter
\chapter{Var ska jag börja?}
Kapitel 1: Ett kort kapitel.
\newpage
\section{I början...}
En sektion.
\chapter[Den korta titeln]{Ett kapitel med en mycket lång titel, vilket gör det olämpligt för sidhuvuden}
\newpage
\section{Ett annat avsnitt}
Med lite innehåll.
\newpage
\section{Vad, ännu en sektion?}
Också med lite innehåll.
\end{document}
```

[Öppna detta exempel 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)

#### Använda ε-TeX:s utökade markkommandon

Den `book` klassen använder följande definitioner av `\@evenhead` och `\@oddhead` för att skapa sidhuvuden:

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

där kommandona `\leftmark` och `\rightmark` är definierade som

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

Med hjälp av ε-TeX:s utökade kommandon, och ekvivalensen mellan ε-TeX:s markklass 0 och de ursprungliga TeX-kommandona, kan vi:

* skriva om `\leftmark` för att ersätta `\botmark` med ε-TeX:s `\botmarks0` motsvarande, och
* skriva om `\rightmark` för att ersätta `\firstmark` med ε-TeX:s `\firstmarks0` motsvarande

Dessa omdefinitioner ger

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

Lägg märke till användningen av `\relax` för att avsluta TeX:s sökande efter fler siffror—du kan också ersätta `\relax` med ett mellanslag som avslutare.

Följande exempel ger utdata som är identiska med de ursprungliga definitionerna av `\leftmark` och `\rightmark`.

```latex
\documentclass{book}
% Omdefiniera \leftmark och \rightmark för att använda
% \botmarks0 respektive \firstmarks0
% Obs: kategori-koden för '@' ändras tillfälligt till 11
% för att möjliggöra dess användning i kommandonamn
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Använd en lagom liten sidstorlek
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Minnen av en \TeX{}-användare}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Detta är förmaterial som använder romerska siffror.
\mainmatter
\chapter{Var ska jag börja?}
Kapitel 1: Ett kort kapitel.
\newpage
\section{I början...}
En sektion.
\newpage
En annan sektion.
\end{document}
```

[Öppna detta exempel 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)

**Anteckningar om ε-TeX**

Som [som vi noterade ovan](#etex), introducerar ε-TeX `\marks` kommandot:

```latex
är ett heltal (
```

som utökar den ursprungliga `\mark` funktionen i Knuths TeX-motor och finns i alla tre vanliga TeX-motorer: pdfTeX, LuaTeX och XeTeX.

ε-TeX:s implementation introducerar också nya globala markvariabler `\firstmarks n`, `\botmarks n` och `\topmarks n`: en för varje klass `n`. Dessa klassbaserade markvariabler bestäms [med hjälp av mekanismerna som beskrivs ovan](#pre-output-checks-looking-for-mark-nodes), och de kan alla användas för att skapa sidhuvuden och sidfötter.

Du kan använda vilken som helst av de $$2^{15}$$ = 32768 markklasserna, från 0 till 32767, inom omdefinitioner av `\leftmark` eller `\rightmark`. Det förutsätter att du har tillhandahållit (infogat) lämpliga markdata för den markklass du har valt, `n`, via `\marks n{{vänster}{höger}}`.

Observera att LuaTeX tillhandahåller $$2^{16}$$ = 65536 markklasser, med `n` som sträcker sig från 0 till 65535.

**Exempel som använder markklass 10**

Detta exempel visar hur man använder markklass 10 (slumpmässigt vald) för att skapa dokumenthuvuden. Exempeldokumentet sätter 6 sidor som innehåller sekvensen av markeringar som presenteras i den [genomarbetade exempel längst slutet av denna artikel](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). En genomgång av det exemplet visar varför TeX-motorn har valt en viss markering, $$\alpha$$, $$\beta$$, $$\gamma$$ och $$\delta$$, för användning i vart och ett av sidhuvudena.

Vi börjar med att definiera ett hjälpmakro, `\domark`, som använder `\marks 10` för att infoga markdata som följer LaTeX:s `{left}{right}` konvention:

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

Markeringar av klass 10 görs tillgängliga för LaTeX:s mekanism för sidhuvuden och sidfötter genom att omdefiniera `\leftmark` och `\rightmark`—med lite extra information tillagt:

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

Efter att ha infogat ett antal (klass 10)-markeringar skapar TeX-motorn (här pdfTeX) hjälpsamt globala markvariabler för klass 10—`\botmarks10`, `\topmarks10` och `\firstsmarks10` vilket `\leftmark` och `\rightmark` som används för att skapa sidhuvudena.

```latex
\documentclass{book}
% Ett kort kommando för att använda markeringar med klass 10
% och som följer LaTeX:s markstruktur {vänster}{höger}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Omdefiniera \leftmark och \rightmark för att använda
% \botmarks10 respektive \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{Demonstrera \(\varepsilon\)-\TeX:s förbättrade markeringar}
\author{Overleaf}
\date{Augusti 2022}
\begin{document}

Sida 1: Inga markeringar har lagts till, så alla markvariabler förblir i sitt initierade tillstånd: tomma (NULL).

\newpage
Sida 2: $\alpha$-markering lagd till denna sida via

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

\newpage
Sida 3: Inga nya markeringar lagda till denna sida.

\newpage
Sida 4: $\beta$-markering följd av $\gamma$-markering lagd till denna sida via

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

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

\newpage
Sida 5: $\delta$-markering lagd till denna sida via

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

\newpage
Sida 6: Inga markeringar lagda till denna sida.
\end{document}
```

[Öppna detta exempel 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öljande bild visar de sidhuvuden som produceras av detta exempel:

![Grafik som visar utdata från LaTeX-kod som använder ε-TeX:s utökade markkommandon](/files/011ca83ec1740b63794956601123c7bd6ec7eac3)

* **Obs**: Sidhuvudet på sida 1 skapas vid en tidpunkt då alla tre markvariablerna för klass 10—`\botmarks10`, `\topmarks10` och `\firstsmarks10`—är tomma. Slutresultatet är att `\rightmark` (för sida 1) infogar bara det sista sidhuvudfragmentet: `(via \texttt{\string\firstmarks10})`, som visas i bilden ovan.

## Ett genomarbetat exempel som visar hur TeX-motorer bestämmer värden för \botmark, \topmark och \firstmark

![Db.gif](/files/0b2fe999657a8bcbbb26b406ab3dcc61b1da189e)![Db.gif](/files/0b2fe999657a8bcbbb26b406ab3dcc61b1da189e) Det känns passande att efterlikna Knuths användning av dubbla farosymboler (bild med tillstånd av [denna webbplats](http://www.truetex.com/db.htm)) eftersom materialet är något lågnivåaktigt och “tittar under huven”—även om vi hoppas att det kan vara av intresse för djärva läsare som vill förstå några fler detaljer.

Följande diskussion är nära baserad på det sista exemplet på sida 258 i [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Här har vi redigerat och nysatt det exemplet för dem som saknar tillgång till The TeXbook:

![En redigerad och nysatt version av ett exempel från sida 258 i TeXbook](/files/36015671d86bfaac3693fbdabf9c7af1fad393e7)

Tabellen som presenteras i denna bild är återgiven från en som tillhandahölls av Knuth men, liksom originalet, finns ingen förklaring till hur den härleddes. Här ska vi ta upp det för att ge ytterligare detaljer som visar hur dessa värden av `\botmark`, `\topmark` och `\firstmark` bestämdes—att få fram dessa detaljer krävde att man utforskade källkoden till en TeX-motor!

Processen att sätta värden för `\botmark`, `\topmark` och `\firstmark` kan sammanfattas i 3 korta pseudokodsfragment som visas i följande diagram och efterföljande förklaringar:

1. Förhandskontroll av innehåll
2. Innehållsloop
3. Efterkontroll av innehåll

Obs:

* Kontrollerna i steg 1 “Förhandskontroll av innehåll” och steg 3 “Efterkontroll av innehåll” utförs en gång per sida.
* Steg 2 “Innehållsloop” innebär att TeX genomsöker sidinnehållet och letar efter marknoder, och använder dem för att sätta markvariabelvärdena som visas.

![Bild som visar pseudokodversioner av kod som används för att sätta värden för de tre globala markvariabler som används av TeX-motorer](/files/969391a285671790686194137d984dddc949f76c)

Varje gång TeX hittar ett lämpligt sidbryt skickar den sidans innehåll för slutlig bearbetning och utför dessa (tre) markbearbetningssteg för varje sida i ditt dokument. Bearbetningsstegen märkta 1, 2 och 3 hänvisas till i det slutliga diagrammet i detta avsnitt.

Observera att:

* innan den första sidan har bearbetats har alla tre globala markvariabler `\botmark`, `\topmark` och `\firstmark` initialiserats till tomma (NULL).
* de slutliga värdena för `\botmark`, `\topmark` och `\firstmark` som bestäms i slutet av *föregående* sida blir indata-värdena för bearbetning av *aktuella* sidan—den som bearbetas.

Följande kodfragment är ***pseudokod*** härledda (sammanfattade) från faktisk källkod för TeX-motorer. Målet är att ge en kortfattad kodsammanfattning som hjälper till att demonstrera de centrala principerna som ingår.

**Steg 1: Förhandskontroll av innehåll** Innan TeX går igenom det faktiska innehållet på den aktuella sidan kontrollerar den om det aktuella `\botmark` värdet—dvs. som härrör från *föregående* sidan—är tomt (NULL):

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

I detta test, om `\botmark` (från *föregående* sidan) är *inte* tomt:

* `\topmark` för *aktuella* sidan sätts till sidans *föregående* sidans `\botmark` värde
* `\firstmark`, för *aktuella* sidan (som bearbetas) sätts till tomt (NULL): börja denna sida med antagandet att det inte finns några `\mark` noder.

Observera att detta test utförs *en gång* för varje sida som bearbetas.

**Steg 2: Innehållsloop** Därefter loopar TeX igenom sidinnehållet; en del av den loopen inkluderar att leta efter `\mark` noder:

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

Detta test tillämpas på varje marknod som finns inom (ingår i) den aktuella sidan. Det föregående testet (steg 1 ovan) kunde ha satt `\firstmark` till tomt, så att den allra första markeringen som hittas på den aktuella sidan blir värdet för `\firstmark` och `\botmark`. Alla *efterföljande* `\mark` nod som upptäcks medan denna slinga körs kommer inte att ändra värdet för `\firstmark`, eftersom den inte längre är tom (NULL), utan `\botmark` uppdateras — eftersom det är syftet med `\botmark`: att lagra den senast sedda `\mark` noden för denna sida.

**Steg 3: Kontroll efter innehållet** När TeX har loopat igenom sidans innehåll tillämpar TeX följande, slutliga test, som också utförs en gång per sida:

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

* Om `\topmark` är inte tomt (NULL) vet vi, från steg 1, att `\botmark` för den föregående sidan inte var tomt (NULL).
* Om `\firstmark` fortfarande är tomt har vi inte sett några `\mark` noder eftersom testet i steg 2 inte utlöstes; följaktligen, `\firstmark` sätts till värdet av `\topmark` som också är värdet av `\botmark` från den föregående sidan.

Efter sekventiell tillämpning av dessa tre steg för alla 6 sidor i vårt exempel härleds värdena för `\botmark`, `\topmark` och `\firstmark` med hjälp av övergångar som visas i diagrammet nedan, där:

* ljusblå rundade rektanglar är de slutliga värdena för markvariablerna för varje sida
* ljusgrå rundade kvadrater representerar mellanliggande värden som uppstår under bearbetningen
* märkta pilar representerar ändringar i markörvariablernas värden enligt steg 1, 2 eller 3 i diagrammet ovan — eller att ett värde inte har ändrats av något av stegen; märkt ”ingen ändring”.

Följande diagram visar hur de tre pseudokodfragmenten genererar de slutliga värdena för `\botmark`, `\topmark` och `\firstmark` som listas i tabellen på sida 258 i The TeXbook.

![Ett övergångsdiagram som hör till exemplet på sida 258 i The TeXbook och visar interna övergångar när de globala markvariablerna tilldelas sina värden](/files/8142af2f31192293289b86ddb20dc765463aeb0d)


---

# 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/sv/fordjupade-artiklar/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.
