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

# Miten LaTeX taittaa ylätunnisteet ja alatunnisteet?

## Miten LaTeX ladottaa ylä- ja alatunnisteet?

### Johdanto

Jos etsit ohjetta ylä- ja alatunnisteiden muuttamiseen, ole hyvä ja [vieraile ohjesivullamme](/latex/fi/muotoilu/02-headers-and-footers.md) sillä tämä artikkeli keskittyy selittämään TeX-moottoreiden ja LaTeXin käyttämiä matalan tason mekanismeja ylä- ja alatunnisteiden tuottamiseen.

* **Huomautus (päivitys)**: Tämä artikkeli käsittelee LaTeXin perusmerkkimekanismia, joka oli käytössä ennen kesäkuuta 2022; tuolloin otettiin käyttöön uusi ja monipuolisempi toteutus LaTeXin merkkien käsittelyyn. Katso [Katsaus LaTeXin uuteen merkkimekanismiin](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) lisätietoja varten. Taaksepäin yhteensopivuuden vuoksi LaTeX tukee edelleen vanhaa merkkimekanismiaan. Näihin LaTeXin muutoksiin ei ole vaikutusta artikkelin TeX-moottoreiden käyttäytymistä käsittelevään sisältöön.
* **Huomaa**: termejä “LaTeX”, “TeX” ja “TeX-moottori” käytetään kautta näiden keskustelujen, joten on hyödyllistä ymmärtää niiden merkitys — katso Overleafin artikkeli [Mitä nimi kertoo: opas TeXin moniin muotoihin](/latex/fi/syvalliset-artikkelit/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) saadakseen lisätietoja.

Hyödyllisen taustan/kontekstin tarjoamiseksi aloitamme katsauksella eräisiin TeX-pohjaisen ladonnan olennaisiin matalan tason osa-alueisiin — mukaan lukien väliaikainen (sisäinen) sisällön tallennus, sivun katkaisu ja rakentaminen. Tarkastelua on virtaviivaistettu/yksinkertaistettu tarkastelemalla ladottua sivua, joka sisältää tekstin “pääosan” sekä joitakin ylä- ja alatunnisteita. Sivun elementtejä, kuten kuvia (kelluvia elementtejä) ja alaviitteitä, ei käsitellä, koska niihin liittyy monimutkainen TeX-mekanismi nimeltä *sisällön lisäykset*, joka on kaukana tämän artikkelin aihepiirin ulkopuolella.

Aloitamme peruskäsitteestä *solmuista*: TeX-moottoreiden käyttämät perustavanlaatuiset rakennuspalikat väliaikaiseen (sisäiseen) sisällön tallennukseen.

### Muutamia huomioita sisällön tallentamisesta: TeX-solmut

Kun taustalla toimiva TeX-moottori käsittelee LaTeX-koodiasi tuottaakseen ladottua aineistoa — kuten kappaleita, taulukoita ja matematiikkaa — sen on tallennettava tuo sisältö väliaikaisesti käytössä olevan TeX-moottorin muistiin. Ladotun sisällön tallentamiseen TeX-moottorit käyttävät niin sanottujen *solmuista*, joita voi ajatella erikokoisina tietokoneen (laitteen) muistin “paloina”, jotka on linkitetty toisiinsa listaksi (katso tämä [Wikipedian artikkeli linkitetyistä tietorakenteista](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Kaaviomainen esitys siitä, miten TeX-moottorit tallentavat sisältöä linkitetyillä solmuilla](/files/33873703360ec804cba1bcefb7c2ce48ed77fc52)

Esittämään TeX-pohjaisen ladonnan peruselementit — kuten merkit, liimat, laatikot, rangaistukset, kernit ja [*markit*](#why-were-here-understanding-mark-nodes) (muutamia mainitaksemme) — TeX-moottorit käyttävät erilaisia *tyypeille* solmutyyppejä. Jotkin solmut, kuten laatikkosolmut, tarvitsevat enemmän tietoa tallennettavaksi kuin yksinkertaisemmat solmutyypit, kuten merkkisolmut; näin ollen jotkin solmut ovat suurempia kuin toiset — ne vievät enemmän tavuja muistissa. TeXistä lukiessasi saatat kohdata termejä kuten *merkkisolmut*, *liimasolmut*, [*mark-solmut*](#why-were-here-understanding-mark-nodes) ja niin edelleen: nyt tiedät, että nämä ovat vain nimiä muistipaloille, jotka on varattu tallentamaan TeXin ladonnan elementtiä kuvaavaa tietoa.

#### Miksi olemme täällä: mark-solmujen ymmärtäminen

Monista solmutyypeistä se, jota meidän on käsiteltävä, on nimeltään *mark-solmu* jonka luo `\mark` komento:

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

Se `\mark` komento ei suoraan tuota ladottua sisältöä: sen argumentti `*tallennettava sisältö*` tallennetaan muistiin myöhempää käyttöä varten, ja *mark-solmu* luodaan sisältämään muistipaikan *tallennettava sisältö*. Kuten näemme, `\mark` komento luotiin *nimenomaan* helpottamaan ylä- ja alatunnisteiden tuottamista.

Mark-solmut, jotka luodaan `\mark` komennoilla, “upotetaan” sivun sisältöön valmiina käytettäväksi sivun koostamisen loppuvaiheissa, kun TeX-moottori on valmis lisäämään ylä- ja alatunnisteet ladotun sivun (pääosan) päälle. Tyypillisesti, `*tallennettava sisältö*` sisältää aineistoa, kuten sivunumeroita ja luku- tai osiootsikoita/-numeroita — ylä- ja alatunnisteiden rakennuspalikoita.

#### ε-TeX lisää \marks-komennon

[ε-TeXin versio 2](https://texdoc.org/serve/e-TeX/0), joka on Knuthin alkuperäisen TeXin laajennus, julkaistiin vuonna 1998 ja tarjoaa uusia ominaisuuksia sekä parannuksia olemassa oleviin toimintoihin. Nykyään suurin osa ε-TeXin parannuksista on sisällytetty valtavirran TeX-moottoreihin: pdfTeXiin, LuaTeXiin ja XeTeXiin — katso [**`-etex`** TeX-moottoreiden komentorivivalinta](/latex/fi/lisaa-aiheita/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) joka mahdollistaa ε-TeX-laajennusten käytön.

Knuthin alkuperäinen TeX-ohjelmisto tarjoaa \mark-komennon, joka luo vain yhden “luokan” tai “tyypin” mark-solmuja. Asiakirjasi voi sisältää monia \mark-komentoja, mutta ne kaikki luovat saman “tyypin” tai “luokan” mark-solmuja — niille ei ole sisäänrakennettua mekanismia ryhmitellä tai luokitella niitä. Tämä rajoitus poistettiin ε-TeXin parannuksella: \marks-komennolla, jota pdfTeX, LuaTeX ja XeTeX tukevat:

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

jossa `n` on kokonaisluku (`0` <= `n` < `32768`) joka määrittää mark-solmun *luokan*.

Huomautuksia:

* kirjoittamalla `\marks 0` (eli, `n`=`0`) on synonyymi TeXin alkuperäisen `\mark` komento
* ε-TeX toi myös käyttöön merkkimuuttujat ([katso myöhemmin](#pre-output-checks-looking-for-mark-nodes)) jokaista luokkaa (`n`) varten: `\firstmarks n`, `\topmarks n` ja `\botmarks n`. Valittuja merkkimuuttujaluokkia voitiin käyttää tarjoamaan merkkitietoja tiettyihin ladontatehtäviin.
* LuaTeX kasvatti enimmäisarvoa `n` kohteeseen `65535`, mikä mahdollisti $$2^{16}$$ mark-luokat

### Syyt siihen, miksi TeX käyttää markkeja

Ymmärtääksemme *miksi* (ja miten) TeX-moottorit käyttävät `\mark` (tai `\marks`) -komentoa ylä- ja alatunnisteiden tuottamiseen, meidän on ymmärrettävä joitakin TeX-moottorin sivunrakennusmekanismien “erikoispiirteitä” — sivunvaihtojen löytämistä ja valmiiden sivujen lähettämistä PDF-tiedostoon. Todellisuudessa nämä sivunrakennusprosessit ovat monimutkaisia, mutta perusperiaatteet/käsitteet voidaan yksinkertaistaa niin, että saadaan riittävät taustaselitykset, jotka auttavat meitä ymmärtämään merkkejä.

Kun TeX-moottori saa valmiiksi yksittäisten sisältöelementtien, kuten kappaleiden, taulukoiden tai matematiikan, ladonnan, se kutsuu sisäistä rutiinia (funktiota nimeltä `build_page(...)`) joka yrittää lisätä nuo vastaladotut elementit parhaillaan muistissa rakennettavaan sivuun. Kun tuo uusi aineisto lisätään rakennettavaan sivuun, TeX tarkistaa myös, onko juuri lisätty sisältö tehnyt nykyisestä sivusta “sopivan täyden”. Jos sivu on täynnä, TeX voi luoda *sivunvaihdon*— lähettäen tuon sivun verran sisältöä lopullista käsittelyä (“pakkaamista”) ja sen jälkeistä tulostusta varten PDF-tiedostoon.

Sivun pakkaamisen (koostamisen) loppuvaiheen yksi keskeinen ominaisuus on niin sanottu *ulostusrutiini* joka on käytännössä käyttäjän määrittelemä komentojono, jota käytetään sivun sisällön pakkaamiseen valmiiksi PDF-tiedostoon lähettämistä varten. Yksi “pakkaamisen” esimerkki on ylä- ja alatunnisteiden lisääminen, mutta ulostusrutiineja voi käyttää monin tavoin — esimerkiksi katso [tämä artikkeli TUGboatissa](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Ulostusrutiinit ovat TeXissä melko monimutkainen alue, joten emme mene tässä yksityiskohtiin: tämän hetken kannalta riittää, että muistat sivun koostamisen loppuvaiheen sisältävän jonkin käyttäjän määrittelemän komentojonon (jota yhdessä kutsutaan *ulostusrutiini*).

Mutta tarkastellaan, mitä voisi tapahtua, kun TeX saa valmiiksi pitkän tekstikappaleen ladonnan ja jakaa sen yksittäisten ladottujen rivien sarjaksi. TeX haluaa lisätä tuon juuri ladotun kappaleen — rivi riviltä — parhaillaan rakennettavaan sivuun, mutta ehkä vain *joistakin* osa noista riveistä mahtuu nykyiselle sivulle. Huomaa, että “sivulla” tarkoitamme varsinaista tekstialuetta (sivun pääosaa), joka *ei* voi sisältää muita sivuelementtejä, kuten ylä- ja alatunnisteita, jotka lisätään myöhemmin (ulostusrutiinin toimesta).

Kun useita kappalerivejä on lisätty nykyiselle sivulle, siitä voi tulla “sopivan täysi”, ja TeXille tulee aika luoda sivunvaihto. Meillä on kuitenkin jonkin verran “ylijäämäistä” aineistoa, koska vain *part* osa kappaleesta päätyi nykyiselle sivulle: “ylijäämäinen kappalesisältö” tallennetaan *seuraavan* sivun luontia varten. Seuraava kuva havainnollistaa tätä ideaa: osa kappaleesta on *nykyiseen* sivulla ja osa pidätetään *seuraavan* sivun Integraatiot-osiossa.

![Kaaviomainen esitys kappaleesta, joka ulottuu sivunvaihdon yli](/files/f0f05a50cce7643a5e6493543654253ecbc99d65)

Tämä kappale-esimerkki osoittaa, että TeX-moottori käsittelee usein sisältöpalasia, jotka eivät voi, *kokonaisuudessaan*, mahtua nykyiselle sivulle — koska sisältö ulottuu sen kohdan yli, jossa sivunvaihto käy tarpeelliseksi. Muista, että TeX-moottorit löytävät rivinvaihdot syöttämällä, sitten latomalla, *kokonaisia kappaleita* eivätkä, toisin kuin jotkin sovellukset, käytä kappaleiden latomisessa rivi riviltä -lähestymistapaa. Toisin sanoen TeX latoa *koko* kappaleen, riippumatta siitä, mahtuuko se nykyiselle sivulle (se ratkaistaan myöhemmin). Sivumennen sanoen periaate “ladotaan ensin kokonaan ja lisätään sitten nykyiselle sivulle” pätee myös muunlaiseen TeX-sisältöön, mukaan lukien taulukot, jotka luetaan kokonaan .tex-tiedostosta ja ladotaan kokonaisuudessaan ennen kuin niitä yritetään lisätä nykyiselle sivulle.

Kappale-esimerkissämme kyseisen kappaleen täydellinen teksti, *mukaan lukien siinä olevat komennot*, on käsitelty kokonaan — mikä tarkoittaa, että TeXin ladonta on saavuttanut tietyn kohdan sinun `.tex` tiedostossasi. TeX-moottorin “nykyinen sisäinen tila”, kuten muuttujien arvot tai tallennetut parametrien asetukset, heijastaa materiaalia, mukaan lukien kaikki komennot, jotka on käsitelty nykyiseen kohtaan asti — eli kappaleen loppuun.

Vaikka koko kappale on ladottu, kaikkea siitä ei voida sovittaa nykyiselle sivulle, minkä vuoksi “ylijäämäinen kappalesisältö” tallennetaan *seuraavan* sivua varten. LaTeX-koodissa (teksti plus komennot), joka tuotti “ylijäämäisen kappalesisällön”, TeX-moottori *olisi voinut* kutsua mitä tahansa määriä komentoja ja makroja, jotka muuttivat TeX-moottorin sisäisesti tallentamia arvoja ja muuttujia — eli tekivät muutoksia TeXin “nykyiseen tilaan”.

Seuraava kaavio havainnollistaa erittäin tärkeää TeXin “erikoispiirrettä”, joka vaikuttaa useisiin TeX-pohjaisen ladonnan osa-alueisiin. Kaavion oikealla puolella näet esityksen solmuista, jotka muodostavat kaiken muistissa tällä hetkellä tallennetun sisällön: vaaleanharmaa alue sisältää solmuja, jotka muodostavat *nykyiseen* sivun, ja tummanharmaa alue on ladottua sisältöä, joka on tarkoitettu *seuraavan* sivua varten. Tämä tilanne heijastaa kappale-esimerkkiämme: tummanharmaa alue edustaa “ylijäämäistä kappalesisältöä”: tekstirivejä, jotka pidätetään, koska ne eivät mahdu nykyiselle sivulle.

![Kaaviomainen esitys solmun sijainnista, jossa TeX löytää sivunvaihdon, sekä sisällöstä, joka pidätetään seuraavaa sivua varten](/files/5a71570c4665ba3c2c20dbe6f8d7e0abc1273ac8)

Muista, että kun TeXillä on “sopivan täysi” sivu (pääosa), se siirtää tuon sisällön niin sanotulle *ulostusrutiini* joka on käyttäjän määrittelemä komentojono. Muun muassa ulostusrutiini lisää ylä- ja alatunnisteet sivun pääosaan, viimeistellen sivun valmiiksi sen lähettämistä varten PDF-tiedostoon.

Yllä oleva kuva esittää tapausta, jossa TeX on valinnut sivunvaihdon tietyn solmun kohdalle, kuten `\baselineskip` ladottujen rivien väliseen liimaan, ja on valmis aloittamaan nykyisen sivun pakkaamisen ulostusrutiinia käyttäen — sisäänrakennettujen komentojen ja käyttäjän määrittelemien makrojen sarjaa. *Kuitenkin*, nykyisen sivun muodostavan sisällön (muistissa tallennettuna) lisäksi TeX on jo käsitellyt ja tallentanut (muistiin) *lisämateriaalia*, sinun `.tex` tiedostostasi. Tuo lisämateriaali ulottuu *sivunvaihdon yli* ja *olisi voinut* ovat sisältäneet komentoja, jotka muuttivat tärkeitä sivuun liittyviä arvoja tai muuttujia, vaikuttaen TeXin “nykyiseen sisäiseen tilaan” — joka sisältää sisäisten parametrien arvot tai makrojen tallentamat tiedot.

Kun TeX alkaa pakata nykyistä sivua, sen “nykyinen sisäinen tila” on *sisällä* määrittynyt kaikkeen siihen, mikä on ladottu sivunvaihdon kohtaan asti, koska TeX on jo *mennyt tuon kohdan ohi* tiedostossasi ja käsitellyt lisämateriaalia. Jos tarkastelet tiedostossasi kohtaa, joka vastaa sitä, missä sivunvaihto tapahtuu, ja kohtaa, johon TeX on todellisuudessa päässyt `.tex` tiedostossasi, TeXin kaksi vastaavaa sisäistä tilaa, mukaan lukien tallennetut tiedot ja muuttujien arvot, voivat olla hyvin erilaisia. TeXin ladonnan nykyinen tila on yleensä edellä sitä kohtaa, jossa sivunvaihto tapahtuu; eli TeXin ladontatoiminnot *eivät ole synkronoituja* ladottujen sivujen tulostusprosessin kanssa ulostusrutiinin kautta.

#### Hypoteettinen esimerkki: miten saada väärät ylä- ja alatunnisteet

Seuraava kaavio havainnollistaa hypoteettisia komentoja `\myheader` ja `\myfooter` joita käytetään tallentamaan ylä- ja alatunnisteiden haluttu teksti; esimerkiksi käyttäen perusmääritelmiä kuten

```latex
\newtoks\headertoks% uusi token-listamuuttuja yläotsikon tekstiä varten
\newtoks\footertoks% uusi token-listamuuttuja alatunnisteen tekstiä varten
% Käytä \globalia varmistaaksesi, että tallennettu ylä- tai alatunnistetieto on
% käytettävissä kaikkialla, mukaan lukien komennot
% ulostusrutiinissa
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

jossa `\headertoks` ja `\footertoks` ovat token-listoja, joita käytetään ylä- ja alatunnisteiden tekstin tallentamiseen.

Lisäksi hypoteettisessa esimerkissämme on myös ulostusrutiini, joka hakee ylä- ja alatunnisteiden tekstin nykyisistä arvoista `\myheader` ja `\myfooter`. Kuten kaaviossa näkyy, nykyiselle sivulle tarkoitetun sisällön sisällä `\myheader` ja `\myfooter` asettavat oikeat (asianmukaiset) arvot. Olisi kuitenkin mahdollista, että `\myheader` ja/tai `\myfooter` kutsuttaisiin kappaleen sisällä, joka ulottuu sivunvaihdon yli. Koska TeXin on käsiteltävä koko kappale, `\myheader` ja `\myfooter` kutsuttaisiin uudelleen nollatakseen “TeXin sisäiseen tilaan” tallennetun ylä-/alatunnisteen tekstin, mikä tuottaisi arvoja, jotka eivät ole oikeita nykyiselle sivulle. Kun ulostusrutiini tuottaa ylä- ja alatunnisteet, ne sisältävät seuraavaa sivua varten tarkoitetun tekstin.

![Kuva, joka esittää virheellisiä ylä- ja alatunnisteita, jos ulostusrutiini käyttää TeX-makroja vain ylä- ja alatunnisteiden tekstin hakemiseen](/files/f917e3acc0f49f373f70f09144806d1047afcd08)

#### TeXin asynkroninen käyttäytyminen: \mark-komento pelastaa

TeXin ladonta- (sisällönrakennus-) toiminnot ovat *eivät synkronoidu* ladotun sivun lopullisen ulostusprosessin kanssa ulostusrutiinissa olevien komentojen kautta. Kun sivu on aika tulostaa, TeXin todellinen sisäinen tila on edellä mitä tahansa tilaa sillä olisi voinut olla sivunvaihdon kohdalla — jossa se lateli viimeisen sisällönpalasen tällä hetkellä ulostettavalle sivulle.

On [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, TeXin luoja, kuvaa tätä tilannetta näin

> ... TeXin ulostusrutiini laahaa sen sivunrakennustoimien perässä

Tämän synkronoimattoman suhteen vuoksi tarvitaan “erikoistoimintoja” muodossa *merkkimekanismin*, jota sovelletaan `\mark` (tai `\marks n`) -komennon kautta, jotta varmistetaan, että ylä- ja alatunnisteet sisältävät aineistoa, joka liittyy ulostettavaan varsinaiseen sivuun.  `\mark` komento upottaa mark-solmut sivun sisältöön ja tallentaa sen sisällön muistipaikan, jota voidaan käyttää isäntäsivun ylä- ja alatunnisteessa.

Tunnetun ja arvostetun kirjan kirjoittaja [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) kuvaa `\mark` mekanismia näin

> ... päämekanismina, jonka kautta ulostusrutiini voi saada tietoa parhaillaan katkenneen sivun sisällöstä, erityisesti sen ylä- ja alaosasta.

Se `\mark` komento on mekanismi, joka on suunniteltu kiertämään TeXin sivunvaihto- ja ulostusrutiinialgoritmin asynkroninen luonne.

![Kaaviomainen esitys sivun pääsisältöön upotetusta merkkidatasta (solmuista)](/files/96e2b5abecee2d5e6fac7fbffa4cae5e5fd2bbf5)

### Ennen ulostusta tehtävät tarkistukset: mark-solmujen etsiminen

Kun TeX-moottori on määrittänyt sivunvaihdon sijainnin, se kutsuu sisäistä rutiinia (nimeltä `fire_up()`) joka tekee paljon esikäsittelyä ennen kuin ulostusrutiini saa sivun koostamisen valmiiksi ja kirjoittaa valmiin sivun PDF-tiedostoon. Tärkeä osa näitä esikäsittelyvaiheita on asettaa kolmen *globaalin merkkimuuttujan*: `\botmark`, `\topmark` ja `\firstmark` arvot, joita käytetään ylä- ja alatunnisteiden rakentamiseen tarvittavan tiedon tarjoamiseen. Tietysti sivu voi sisältää useita mark-solmuja, mutta ne suodatetaan niin, että tuotetaan kolme merkkimuuttujaa, jotka toimivat seuraavasti:

* **`\botmark`** on markki, joka on voimassa nykyisessä sivunvaihdossa; eli viimeinen markki, joka on nähty *nykyiseen* page
* **`\topmark`** on `\botmark` paketista *edellisen* page
* **`\firstmark`** on ensimmäinen markki *nykyiseen* sivulla — ensimmäinen markki välillä `\topmark` ja `\botmark`

Seuraava kaavio näyttää ladotun sivusisällön esikäsittelyn perusperiaatteet, joilla kolmen globaalin merkkimuuttujan arvot määritetään `\botmark`, `\topmark` ja `\firstmark`:

![Kaaviomainen esitys perusperiaatteista, joita käytetään kolmen globaalin merkkimuuttujan \botmark, \topmark ja \firstmark arvojen määrittämiseen](/files/3520272a495faccf0e5c51f29ead4d9c4e961c30)

Seuraava osa käyttää joitakin yllä annetuista selityksistä hahmotellakseen, miten LaTeX latoa ylä- ja alatunnisteet.

### LaTeXin luokat: sivutyylit ja ylä-/alatunnisteet

Kun kirjoitat `\documentclass{*class*}` jossa `*luokka*` voi olla `article`, `book`, `raportti` tai `letter`, LaTeX lataa tiedoston nimeltä `*luokka*.cls`; esimerkiksi, `book.cls`, `article.cls` ja niin edelleen. Nämä `.cls` tiedostot sisältävät LaTeX-koodia, jolla toteutetaan luokkakohtaisia muunnelmia erilaisista komennoista ja ominaisuuksista, joiden odotetaan olevan läsnä kaikissa asiakirjaluokissa ja joita ne tarjoavat — kaikille asiakirjaluokille yhteisiä käyttäytymisiä. Esimerkkejä voisivat olla luokkakohtaiset sivun asettelun reunukset sekä luokkakohtaiset versiot komennoista, kuten `\section`, `\subsection` ja niin edelleen.

Toinen tärkeä osa `.cls` tiedostoja on standardien sivutyylien luokkakohtainen toteutus, joka määrittelee tietyn luokan ja sivutyylin avulla tuotettujen asiakirjojen ylä- ja alatunnisteet. Esimerkiksi:

* **`book.cls`** ja **`article.cls`** kukin sisältää sivutyylien toteutukset `headings` ja `myheadings`
* **`letter.cls`** sisältää määritelmät sivutyyleille `headings`, `empty`, `plain` ja yhden nimeltä `firstpage`
* **`report.cls`** sisältää määritelmät sivutyyleille `headings` ja `myheadings`

Sivutyylien toteutukset riippuvat usein `twoside`  -valinnasta `\documentclass`— siitä, onko asiakirja yksi- vai kaksipuolinen — jotta ylä- ja alatunnisteet määritellään asianmukaisesti vasemmanpuoleisille (parillisille) ja oikeanpuoleisille (parittomille) sivuille.

Asiakirjaluokat voivat tukeutua `plain` tai `empty` LaTeXissä muualla — tämän `.cls` käytössä olevan tiedoston ulkopuolella — tarjottuihin sivutyylien oletusmääritelmiin.

#### Lisää sivutyyleistä

Kun muutat sivun tyyliä käyttäen `\pagestyle{*somestyle*}` tai `\thispagestyle{*somestyle*}` LaTeX odottaa löytävänsä sisäisen komennon nimeltä `ps@*somestyle*`— jonka yleensä tarjoaa asiakirjaluokan `.cls` tiedosto tai ehkä paketti kuten `fancyhdr`. Muuten, “sisäisellä komennolla” tarkoitamme komentoa, joka on osa LaTeXin lähdekoodia ja jonka nimi sisältää `@` symbolin, mikä tavallisesti estää sen satunnaisen käytön (sen [kategoriakoodi](/latex/fi/lisaa-aiheita/43-table-of-tex-category-codes.md)).

Määritelmä `\ps@*somestyle*` vastaa kyseisen sivutyylin ominaisuuksien/käyttäytymisten toteuttamisesta, mikä sisältää määritelmät seuraaville:

* komennot, joita käytetään sivun koostamisen loppuvaiheissa (ylä- ja alatunnisteiden lisäämiseksi, katso [myöhemmin artikkelissa](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* komennot, joilla lisätään osioihin liittyvää merkkitietoa käytettäväksi asiakirjan ylä- ja alatunnisteiden luomisessa, jotka sisältävät osioiden otsikot, numerot ja vastaavat. Esimerkiksi `headings` sivutyyli (sisällä `book.cls`) määrittelee seuraavat markkeja tuottavat komennot:
  * `\chaptermark`
  * `\sectionmark`

Tulemme [tutkimaan tarkemmin merkkejä tuottavia komentoja](#mark-commands-and-mark-data), kuten `\chaptermark`, mutta vain esimerkkinä: kun kirjoitat `\chapter{chapter title}` sivustolta `\chaptermark` komento suoritetaan myös, jotta lukuun liittyvä merkkitieto lisätään myöhempää sivujen yläotsikoiden tuotantoa varten.

#### Sivutyylin perusteella toteutettujen ylä- ja alatunnistekomentojen anatomia

Tässä osassa tutkitaan joitakin keskeisiä LaTeX-komentoja ja -prosesseja, joita käytetään ylä- ja alatunnisteiden luomiseen — hyödyntäen aiemmin tässä artikkelissa esitettyjä selityksiä ja käsitteitä.

**LaTeXin ylä- ja alatunnisteiden “malli”**

LaTeXin (oletus)ylä- ja alatunnisteiden sisältö perustuu asiakirjaosien kaksitasoiseen hierarkiaan: “ylemmän tason” osioon, joka sisältää useita “alemman tason” osioita. Book- ja article-luokille tämä tarkoittaa:

* `**book**` **luokan**: “ylemmän tason” osiot tuotetaan `\chapter` komennoilla ja “alemman tason” osiot `\section`, mikä heijastaa lukuja, jotka sisältävät monta osiota.
* `**article**` **luokan** (olettaen kaksipuoliset asiakirjat): “ylemmän tason” osiot tuotetaan käyttäen `\section` komentoja ja “alemman tason” osiot `\subsection`, mikä heijastaa useita alaosioita saman osion sisällä.

LaTeX soveltaa ylä- ja alatunnisteiden “malliaan” osiointikomennoillaan, jotka “injektoivat” mark-solmuja ( `\mark` komennon kautta) tallentaakseen tietoa, joka liittyy luotavaan asiakirjaosioon. Esimerkiksi aina kun kirjoitat `\section{*some section title*}` luodaan mark-solmu, joka sisältää tietoa, joka heijastaa `*jonkin osion otsikko*` ja osion numeroa.

LaTeX käyttää merkkijärjestelmää, jonka data on muotoa `{left}{right}`, ja joka tuotetaan lopulta `\mark` komennot

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

useisiin makrokerroksiin sisällytettynä, joiden tarkoitus on suojata käyttäjiä matalamman tason yksityiskohdilta — joita käsitellään tämän artikkelin myöhemmissä osissa.

#### Book-luokan tarkastelu

Kun `book.cls` tiedosto ladataan, yksi sen viimeisistä toimista on suorittaa `\pagestyle{headings}` joka asettaa oletussivutyyliksi `headings`, joten tarkastelemme tätä sivutyyliä tarkemmin.

Kuten [edellä todettiin](#more-on-page-styles), `headings` sivutyylin ominaisuudet/piirteet, sellaisina kuin ne on toteuttanut `book` luokka, määrittää (sisäinen) komento `\ps@headings` tiedostossa `book.cls`. Määritelmä tarkkaan ottaen `\ps@headings` riippuu siitä, onko asiakirja yksi- vai kaksipuolinen (oletus `book` luokassa).

**“Mark-komennot” ja “mark-data”**

Kaksipuolisissa asiakirjoissa, jotka on tuotettu `book` luokan avulla, määritelmä `\ps@headings` luo (määrittelee) kaksi “mark-komentoa”: `\chaptermark` ja `\sectionmark` jotka tuottavat “mark-dataa” muotoa `{left}{right}`, joita käytetään ylä- ja alatunnisteissa. Nämä mark-komennot heijastavat LaTeXin ylä- ja alatunnisteiden mallia — joka perustuu asiakirjaosien hierarkiaan:

* “ylemmän tason” osion komento (tässä, `\chapter`) käytetään tuottamaan “mark-dataa” vasemmalle aukeavien (parillisten) sivujen yläotsikoihin. Kun aloitat uuden luvun kirjoittamalla `\chapter{*chapter title*}`, `\chaptermark` kutsutaan luomaan “mark-dataa”, joka heijastaa tuota uutta lukua — sisältäen sen `*luvun otsikko*` ja numeron.
* “alemman tason” osion komento (tässä, `\section`) käytetään tarjoamaan “merkintätietoa” oikealle aukeaville (parittomille) sivuille. Kun kirjoitat `\section{*section title*}` sivustolta `\sectionmark` komento kutsutaan luomaan “merkintätietoa”, joka heijastaa uutta osiota — sisältäen sen `*section title*` ja numeron. Kaikki edellisen tarjoama merkintätieto `\chapter` ei muutu myöhempien \section-komentojen vaikutuksesta.

**\markboth ja \markright**

LaTeXin osiokohtaiset merkintäkomennot, kuten `\chaptermark` ja `\sectionmark`, käyttävät kahta muuta komentoa nimeltä `\markboth` ja `\markright` jotka tuottavat varsinaisen merkintätiedon otsakkeille ja alatunnisteille. `\markboth` ja/tai `\markright` voi sisältää komentoja otsake- tai alatunnistetekstin muotoiluun, kuten sen muuttamiseen suuraakkosiksi.

Kun asiakirjat tuotetaan käyttäen `book` luokan oletusasetuksia (kaksipuolinen, `headings` sivutyyliä), merkintöjä tuottavat komennot toimivat seuraavasti:

* `\chaptermark` tuottaa merkintätietoa käyttäen `\markboth`
* `\sectionmark` tuottaa merkintätietoa `\markright`

`\markboth` ja `\markright` ovat makroja, jotka lopulta käyttävät primitiivistä (sisäänrakennettua, matalan tason) `\mark` komentoa lisätäkseen todella osiointikomennoissa tuotetut merkinnät.

`\markboth` on muotoa

* **`\markboth{left}{right}`**: lisää merkinnän (solmun) käyttäen `\mark{{left}{right}}` mikä tuottaa merkintäsolmun, joka sisältää kaksi aaltosulkeissa olevaa arvoa `{left}{right}`.

`\markright` on muotoa

* **`\markright{newright}`**: lisää merkinnän (solmun) käyttäen `\mark{{currentleft}{newright}}`; eli se muuttaa nykyistä arvoa `right` kohteeseen `newright` mutta nykyinen arvo `left` (eli, `currentleft`) ei muutu, mikä tuottaa merkintäsolmun, joka sisältää kaksi aaltosulkeissa olevaa arvoa `{currentleft}{newright}`.

Käyttäytyminen `\markboth` ja `\markright` tukevat kaksitasoista osiorakennetta, kuten asiakirjaa, jossa jokaisen luvun sisällä on useita osioita.

Esimerkkien muodossa (kaksipuoliselle) `book` asiakirjaluokalle (käyttäen headings-sivutyyliä):

* `\chaptermark` käyttää `\markboth` asettaakseen:
  * a `{left}` kenttä, joka ladotaan CHAPTER . suuraakkosin.
  * tyhjä {right}-kenttä (`{}`)
* `\sectionmark` käyttää `\markright` asettamaan `{right}` merkintäkentän ladottavaksi., myös suuraakkosin.

Ymmärtääksemme miksi `\sectionmark` käyttää `\markright` voimme havaita, että jokaisen uuden `\section` komennon tulisi:

* lisätä uusi merkintä, joka sisältää tämän `\section` (kuten sen nimen ja numeron).
* mutta *sisällä* vaikuttaa nykyisen `\chapter` sivun merkintätietoarvoihin, jossa kyseinen `\section` komento esiintyy

Näistä syistä `\section` komento kutsuu `\sectionmark` joka käyttää `\markright` luodakseen yhden `\section`-aiheisen merkinnän: se päivittää `{right}` merkintätietokentän, mutta ei vaikuta nykyiseen `{left}` merkintätietokentän arvoon, joka asetettiin nykyisen `\chapter`.

Huom: LaTeXin lähdekoodi sisältää huomautuksen:

> Merkintäkomennot toimivat melko hyvin oikeille merkinnöille, jotka on “numeroitu vasemman merkinnän sisällä” — esim. vasenta merkintää muuttaa \chapter-komento ja oikeaa merkintää \section-komento. Ne tuottavat kuitenkin hieman poikkeavia tuloksia, jos samalla sivulla esiintyy 2 \markboth-komentoa.

**Komennot tulostusrutiinille**

Se `\ps@headings` komento toteuttaa seuraavien komentojen määrittelyt

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

joita tulostusrutiini käyttää lisätäkseen otsakkeet ja alatunnisteet sivun ladonnan loppuvaiheessa. Esimerkiksi, `book.cls` asettaa `\@oddfoot` ja `\@evenfoot` arvoon `\@empty`, joka on määritelty seuraavasti `\def\@empty{}`, näin ollen `\ps@headings` tuottaa tyhjät alatunnisteet vasemmalle ja oikealle aukeaville sivuille:

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

Otsakkeet on määritelty seuraavasti:

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

jossa

* `\leftmark` poimii `{left}` arvon `{left}{right}` merkintäparista
* `\rightmark` poimii `{right}` arvon `{left}{right}` merkintäparista
* \thepage tulostaa nykyisen sivun numeron

Pohjimmiltaan nämä `\@evenhead` ja `\@oddhead` toteutukset tuottavat seuraavat tulokset:

* `\@evenhead`: sivunumero näkyy otsakkeen vasemmalla puolella ja `\leftmark`, joka on muotoiltu kirjasinkomennolla `\slshape`, tulostuu otsakkeen oikealle puolelle — välissä olevan tyhjän tilan tarjoaa erittäin joustava `\hfil` liiman käyttö.
* `\@oddhead`: sisällön `\rightmark`, joka on muotoiltu kirjasinkomennolla `\slshape`, näkyy otsakkeen vasemmalla puolella ja nykyinen sivunumero tulostuu otsakkeen oikealla puolella — jälleen välissä olevan tyhjän tilan tarjoaa `\hfil` liiman käyttö.

Keskeinen kysymys kuitenkin jää: *mitä* `{left}{right}` merkintäparia käyttävät `\leftmark` ja `\rightmark`: toisin sanoen, mistä ne saavat merkintätietoarvonsa?

Kuten [edellä todettiin](#filtering) mutta [selitetään alla](#explainfiltering), asiakirjan sivuilla olevat merkinnät “suodatetaan” sivun ladonnan loppuvaiheessa ja niitä käytetään kolmen globaalin merkintämuuttujan arvon asettamiseen: `\botmark`, `\topmark` ja `\firstmark`. LaTeXin merkintöjen [rakenne](#latexs-model-of-headers-and-footers), kukin näistä kolmesta merkintämuuttujasta sisältää lopulta arvon `{left}{right}` jollekin arvojen parille `{left}` ja `{right}` ja juuri nämä tarjoavat varsinaisen `{left}{right}` merkintäparin (kentät) varten `\leftmark` ja `\rightmark`:

* `\leftmark` poimii `left` arvon `{left}{right}` merkintäparista (kentät), jonka tarjoaa `\botmark`
* `\rightmark` poimii `right` arvon `{left}{right}` merkintäparista, jonka tarjoaa `\firstmark`

Huomaa `\markboth` ja `\markright` voi sisältää komentoja otsake- ja alatunnistetekstin muotoiluun — kuten muuttamisen suuraakkosiksi.

### Esimerkkejä, joissa käytetään alemman tason LaTeX-komentoja

Seuraavat esimerkit osoittavat, miten sivutyylejä tai otsakkeita ja alatunnisteita voidaan muuttaa määrittelemällä uudelleen joitakin tässä artikkelissa käsiteltyjä matalan tason (sisäisiä) LaTeX-komentoja (sellaisia, joissa on @-symboli). Emme suosittele tätä menetelmää otsakkeiden ja alatunnisteiden muuttamiseen, mutta se on käytettävissä niille, jotka sitä tarvitsevat (esim. pakettien tekijät). Suositeltu ratkaisu otsakkeiden ja alatunnisteiden muuttamiseen on käyttää [`fancyhdr` paketti](https://ctan.org/pkg/fancyhdr?lang=en), josta keskustellaan [Overleafin ohjeartikkelissa](/latex/fi/muotoilu/02-headers-and-footers.md).

#### Minimaalisen sivutyylin määrittely

Seuraava esimerkki määrittelee uuden, erittäin minimaalisen sivutyylin nimeltä `demostyle` joka käyttää staattista tekstiä otsakkeiden ja alatunnisteiden määrittämiseen eikä nojaudu osiointikomentoihin (`\chapter`, `\section` jne.) otsake- ja alatunnistesisällön asettamisessa.

Esimerkki alkaa muuttamalla `@` merkin luokkanumeroksi 11, jotta sitä voidaan käyttää makronimissä.  `\ps@demostyle` komento toteuttaa minimaalisen sivutyylimme määrittelemällä uudelleen komennot, joita käytetään (tulostusrutiinissa) otsakkeiden ja alatunnisteiden tuottamiseen: `\@oddhead`, `\@oddfoot`, `\@evenhead` ja `\@evenfoot`. Huomaa `twoside` valitsin meidän `\documentclass` määrittelyssämme — joka käyttää `article` luokkaa.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Parittoman sivun alatunniste\hfil}%
\renewcommand\@evenfoot{\hfil Parillisen sivun alatunniste\hfil}%
\renewcommand\@evenhead{\thepage\hfil Parillisen sivun otsake}%
\renewcommand\@oddhead{Parittoman sivun otsake\hfil\thepage}}
\catcode`@=12
\title{Sivutyylin esittely}
\author{Overleaf}
\date{elokuu 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduction}
\newpage
\section{Lisää aineistoa}
\end{document}
```

[Avaa tämä esimerkki Overleafissa](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)

#### Otsakkeiden muuttaminen book-luokalle

Seuraava esimerkki muuttaa book-luokan otsakkeita määrittelemällä uudelleen `\@oddhead` ja `\@evenhead` jotta vasemmalle ja oikealle aukeavien sivujen otsakkeet sisältävät nykyisen sivun numeron ja luvun nimen. Huomaa, kuinka toinen `\chapter` komento käyttää valinnaista lyhennettä luvun nimestä `[Lyhyt nimi]` joka tarjoaa nyt otsaketekstin pitkän nimen sijaan.

`\section` komennoilla ei ole vaikutusta otsakkeen sisältöön, koska otsakkeen uudelleenmäärittelymme käyttävät vain `\leftmark` joka hakee nykyisen luvun tiedot. Jotta pääsisimme käsiksi nykyisen osion tietoihin, meidän pitäisi käyttää `\rightmark` määrittelyssä `\@oddhead` ja/tai `\evenhead`.

```latex
\documentclass{book}
% HUOM: '@'-merkin luokkanumero muutettu tilapäisesti arvoon 11
% jotta sitä voidaan käyttää komentojen nimissä
\catcode `@=11
% Tehdään \@oddfootista ja \evenfootista vastaavat kuin \@empty
% jotta ne olisivat tyhjiä
\let\@oddfoot\empty\let\evenfoot\empty
% Määrittele \@oddhead ja \@evenhead uudelleen
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Käytä sopivan pientä sivukokoa
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Erään \TeX{}-käyttäjän muistelmia}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Tämä on etuosa, jossa käytetään roomalaisia numeroita.
\mainmatter
\chapter{Mistä aloitan?}
Luku 1: Lyhyt luku.
\newpage
\section{Alussa...}
Osio.
\chapter[Lyhyt nimi]{Luku, jolla on hyvin pitkä nimi, joten se ei sovi otsakkeisiin}
\newpage
\section{Toinen osio}
Vähän sisältöä.
\newpage
\section{Mitä, vielä yksi osa?}
Myös vähän sisältöä.
\end{document}
```

[Avaa tämä esimerkki Overleafissa](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)

#### ε-TeXin laajennettujen merkintäkomentojen käyttäminen

Se `book` luokka käyttää seuraavia määrittelyjä `\@evenhead` ja `\@oddhead` otsakkeiden tuottamiseen:

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

jossa komennot `\leftmark` ja `\rightmark` on määritelty seuraavasti

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

Käyttämällä ε-TeXin laajennettuja komentoja ja ε-TeXin merkintäluokan 0 ja alkuperäisten TeX-komentojen vastaavuutta voimme:

* kirjoittaa uudelleen `\leftmark` korvaamaan `\botmark` ε-TeXin `\botmarks0` vastineeksi, ja
* kirjoittaa uudelleen `\rightmark` korvaamaan `\firstmark` ε-TeXin `\firstmarks0` vastineeksi

Nämä uudelleenmäärittelyt tuottavat

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

Huomaa `\relax` TeXin etsintä jatkavien numeroiden lopettamiseksi — voit myös korvata `\relax` välilyönnillä, joka toimii päättimenä.

Seuraava esimerkki tuottaa tulosteen, joka on identtinen alkuperäisten määrittelyjen kanssa `\leftmark` ja `\rightmark`.

```latex
\documentclass{book}
% Määrittele \leftmark ja \rightmark uudelleen käyttämään
% \botmarks0:a ja \firstmarks0:a vastaavasti
% HUOM: '@'-merkin luokkanumero muutettu tilapäisesti arvoon 11
% jotta sitä voidaan käyttää komentojen nimissä
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Käytä sopivan pientä sivukokoa
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Erään \TeX{}-käyttäjän muistelmia}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Tämä on etuosa, jossa käytetään roomalaisia numeroita.
\mainmatter
\chapter{Mistä aloitan?}
Luku 1: Lyhyt luku.
\newpage
\section{Alussa...}
Osio.
\newpage
Toinen osa.
\end{document}
```

[Avaa tämä esimerkki Overleafissa](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)

**Huomioita ε-TeXistä**

Kuten [kuten yllä totesimme](#etex), ε-TeX tuo käyttöön `\marks` komento:

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

joka laajentaa alkuperäistä `\mark` Knuthin TeX-moottorin ominaisuutta ja on saatavilla kaikissa kolmessa valtavirran TeX-moottorissa: pdfTeXissä, LuaTeXissä ja XeTeXissä.

ε-TeXin toteutus tuo myös käyttöön uusia globaaleja merkintämuuttujia `\firstmarks n`, `\botmarks n` ja `\topmarks n`: yksi kutakin luokkaa kohti `n`. Nämä luokkapohjaiset merkintämuuttujat määräytyvät [yllä kuvattuja mekanismeja käyttäen](#pre-output-checks-looking-for-mark-nodes), ja niitä kaikkia voidaan käyttää otsakkeiden ja alatunnisteiden tuottamisessa.

Voit käyttää mitä tahansa $$2^{15}$$ = 32768 merkintäluokasta, alueella 0–32767, uudelleenmäärittelyissä `\leftmark` tai `\rightmark`. Tämä edellyttää, että olet antanut (lisännyt) sopivaa merkintätietoa valitsemallesi merkintäluokalle, `n`, käyttäen `\marks n{{left}{right}}`.

Huomaa, että LuaTeX tarjoaa $$2^{16}$$ = 65536 merkintäluokkaa, joissa `n` alue on 0–65535.

**Esimerkki käyttäen merkintäluokkaa 10**

Tämä esimerkki osoittaa, miten merkintäluokkaa 10 (satunnaisesti valittu) käytetään asiakirjan otsakkeiden luomiseen. Esimerkkiasiakirja ladotaan 6 sivuksi, jotka sisältävät merkintäjakson, joka esitetään [tämän artikkelin lopussa olevassa läpikäydyssä esimerkissä](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Tuon esimerkin tarkastelu osoittaa, miksi TeX-moottori on valinnut tietyn merkinnän, $$\alpha$$, $$\beta$$, $$\gamma$$ ja $$\delta$$, käytettäväksi kussakin otsakkeessa.

Aloitamme määrittelemällä apumakron `\domark`, joka käyttää `\marks 10` lisätäkseen merkintätietoa, joka noudattaa LaTeXin `{left}{right}` käytäntöä:

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

Luokan 10 merkinnät tehdään LaTeXin otsake- ja alatunnistemechanismin ulottuville määrittelemällä uudelleen `\leftmark` ja `\rightmark`—ja lisäämällä mukaan hieman lisätietoa:

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

Kun useita (luokan 10) merkintöjä on lisätty, TeX-moottori (tässä pdfTeX) luo mukautuvasti luokalle 10 globaalit merkintämuuttujat —`\botmarks10`, `\topmarks10` ja `\firstsmarks10` mitä `\leftmark` ja `\rightmark` joita käytetään otsakkeiden tuottamiseen.

```latex
\documentclass{book}
% Lyhyt komento luokan 10 merkintöjen käyttöön
% ja noudattaen LaTeXin merkintärakennetta {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Määrittele \leftmark ja \rightmark uudelleen käyttämään
% \botmarks10 ja \firstmarks10 vastaavasti
\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{Demonstrating \(\varepsilon\)-\TeX’s enhanced marks}
\author{Overleaf}
\date{elokuu 2022}
\begin{document}

Sivu 1: Merkintöjä ei lisätty, joten kaikki merkintämuuttujat pysyvät alustetussa tilassaan: tyhjinä (NULL).

\newpage
Sivu 2: $\alpha$-merkintä lisättiin tälle sivulle käyttäen

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

\newpage
Sivu 3: Tälle sivulle ei lisätty uusia merkintöjä.

\newpage
Sivu 4: $\beta$-merkintä ja sen jälkeen $\gamma$-merkintä lisättiin tälle sivulle käyttäen

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

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

\newpage
Sivu 5: $\delta$-merkintä lisättiin tälle sivulle käyttäen

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

\newpage
Sivu 6: Tälle sivulle ei lisätty merkintöjä.
\end{document}
```

[Avaa tämä esimerkki Overleafissa](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)

Seuraava kuva näyttää tämän esimerkin tuottamat otsakkeet:

![Kuva, joka näyttää LaTeX-koodin tulosteen käyttäen ε-TeXin laajennettuja merkintäkomentoja](/files/c075c23b3c758a50fffce2a0e248b8630ccdeeae)

* **Huomaa**: Sivun 1 otsake luodaan aikana, jolloin kaikki kolme luokan 10 merkintämuuttujaa —`\botmarks10`, `\topmarks10` ja `\firstsmarks10`—ovat tyhjiä. Lopputuloksena on, että `\rightmark` (sivulle 1) lisää vain viimeisen otsakekatkelman: `(\texttt{\string\firstmarks10}:n kautta)`, kuten yllä olevassa kuvassa näkyy.

## Läpikäyty esimerkki osoittaa, miten TeX-moottorit määrittävät \botmark-, \topmark- ja \firstmark-arvot

![Db.gif](/files/f03eb681a3f7086935304ebf6c7889e1f98c17a0)![Db.gif](/files/f03eb681a3f7086935304ebf6c7889e1f98c17a0) Tuntuu sopivalta toistaa Knuthin kahden vaarallisen mutkan merkin käyttö (kuvan tarjoaa [tämä verkkosivusto](http://www.truetex.com/db.htm)) koska aineisto on melko matalan tason ja “kurkistaa konepellin alle” — vaikka toivommekin sen kiinnostavan pelottomia lukijoita, jotka haluavat ymmärtää vielä joitakin lisäyksityiskohtia.

Seuraava keskustelu perustuu läheisesti sivun 258 viimeiseen esimerkkiin teoksessa [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Tässä olemme muokanneet ja ladoneet sen esimerkin uudelleen niille, joilla ei ole pääsyä The TeXbookiin:

![Muokattu ja uudelleenladottu versio TeXbookin sivun 258 esimerkistä](/files/67e2c481761f9915a92bdc9df44ceb8f59e02ea4)

Tässä kuvassa esitetty taulukko on toistettu Knuthin antamasta, mutta alkuperäisen tapaan siinä ei selitetä, miten se on johdettu. Tässä käsittelemme sitä antaaksemme lisätietoja, jotka näyttävät, miten nuo arvot `\botmark`, `\topmark` ja `\firstmark` määritettiin — näiden tietojen saaminen edellytti TeX-moottorin lähdekoodin tutkimista!

Arvojen asettamisen prosessi `\botmark`, `\topmark` ja `\firstmark` voidaan tiivistää kolmeen lyhyeen pseudokoodikatkelmaan, kuten seuraavassa kaaviossa ja myöhemmissä selityksissä näytetään:

1. Sisältöä edeltävä tarkistus
2. Sisältösilmukka
3. Sisällön jälkeinen tarkistus

Huom:

* Vaiheen 1 “Sisältöä edeltävä tarkistus” ja vaiheen 3 “Sisällön jälkeinen tarkistus” testit suoritetaan kerran sivua kohden.
* Vaihe 2 “Sisältösilmukka” tarkoittaa, että TeX käy läpi sivun sisällön etsien merkintäsolmuja ja käyttää niitä merkintämuuttujien arvojen asettamiseen kuten on esitetty.

![Kuva, joka näyttää pseudokoodiversiot koodista, jota käytetään TeX-moottoreiden kolmen globaalin merkintämuuttujan arvojen asettamiseen](/files/c39a3416aa54830895f4ffc4e72feb942776976a)

Aina kun TeX löytää sopivan sivunvaihdon, se lähettää kyseisen sivun sisällön loppukäsittelyyn ja suorittaa nämä (kolme) merkintöjen käsittelyvaihetta jokaiselle asiakirjasi sivulle. Vaiheet 1, 2 ja 3 on viitattu tämän jakson lopullisessa kaaviossa.

Huomaa, että:

* ennen kuin ensimmäistä sivua on käsitelty, kaikki kolme globaalia merkintämuuttujaa `\botmark`, `\topmark` ja `\firstmark` on alustettu tyhjiksi (NULL).
* lopulliset arvot `\botmark`, `\topmark` ja `\firstmark` jotka määritetään *edellisen* sivun lopussa, tulevat (syöte)arvoiksi käsiteltäessä *nykyiseen* sivua — eli käsiteltävää sivua.

Seuraavat koodikatkelmat ovat ***pseudokoodia*** johdettuja (tiivistettyjä) todellisesta TeX-moottorin lähdekoodista. Tavoitteena on tarjota tiivis koodiyhteenveto, joka auttaa havainnollistamaan asiaan liittyviä perusperiaatteita.

**Vaihe 1: Sisältöä edeltävä tarkistus** Ennen kuin TeX käy läpi nykyisen sivun varsinaisen sisällön, se tarkistaa, onko nykyinen `\botmark` arvo — eli tuloksena *edellisen* sivusta — tyhjä (NULL):

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

Tässä testissä, jos `\botmark` ( *edellisen* sivulta) on *sisällä* tyhjä:

* `\topmark` niin *nykyiseen* sivulle asetetaan *edellisen* sivun `\botmark` arvo
* `\firstmark`, ja *nykyiseen* sivun (käsiteltävän) arvoksi asetetaan tyhjä (NULL): aloita tämä sivu olettaen, että ei ole `\mark` solmuja.

Huomaa, että tämä testi suoritetaan *kerran* jokaiselle käsiteltävälle sivulle.

**Vaihe 2: Sisältösilmukka** Seuraavaksi TeX käy läpi sivun sisällön; osa tuosta silmukasta sisältää etsimisen `\mark` solmuja:

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

Tätä testiä sovelletaan jokaiseen nykyisellä sivulla sijaitsevaan (sisältyvään) mark-solmuun. Edellinen testi (yllä oleva vaihe 1) on voinut asettaa `\firstmark` tyhjäksi, jotta nykyiseltä sivulta löytyvä aivan ensimmäinen mark tulee arvoksi `\firstmark` ja `\botmark`. Mikä tahansa *seuraava* `\mark` solmu, joka havaitaan tämän silmukan suorituksen aikana, ei muuta arvon `\firstmark`, koska se ei ole enää tyhjä (NULL), vaan `\botmark` päivitetään — koska se on `\botmark`: tallentaa viimeksi nähdyn `\mark` solmun tälle sivulle.

**Vaihe 3: Sisällön jälkeinen tarkistus** Kun TeX on käynyt läpi sivun sisällön, se soveltaa seuraavaa, lopullista testiä, joka suoritetaan myös kerran per sivu:

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

* Jos `\topmark` ei ole tyhjä (NULL), tiedämme vaiheen 1 perusteella, että `\botmark` edellisellä sivulla ei ollut tyhjä (NULL).
* Jos `\firstmark` on edelleen tyhjä, emme ole nähneet yhtään `\mark` solmua, koska vaiheen 2 testi ei käynnistynyt; näin ollen, `\firstmark` asetetaan arvoksi `\topmark` joka on myös arvon `\botmark` edelliseltä sivulta.

Kun nämä kolme vaihetta on sovellettu peräkkäin kaikkiin esimerkkimme 6 sivuun, arvojen `\botmark`, `\topmark` ja `\firstmark` saaminen johdetaan alla olevassa kaaviossa esitetyistä siirtymistä, joissa:

* vaaleansiniset pyöristetyt suorakulmiot ovat kunkin sivun lopulliset mark-muuttujien arvot
* vaaleanharmaat pyöristetyt neliöt edustavat käsittelyn aikana syntyviä väliaikaisia arvoja
* merkityt nuolet edustavat mark-muuttujien arvojen muutoksia yllä olevan kaavion vaiheiden 1, 2 tai 3 mukaisesti — tai sitä, että mikään vaiheista ei ole muuttanut arvoa; merkitty “ei muutosta”.

Seuraava kaavio näyttää, kuinka pseudokoodin kolme katkelmaa tuottavat arvojen lopulliset arvot `\botmark`, `\topmark` ja `\firstmark` lueteltuina The TeXbookin sivulla 258 olevassa taulukossa.

![Siirtymäkaavio The TeXbookin sivun 258 esimerkkiä varten, joka näyttää sisäiset siirtymät, kun globaaleille mark-muuttujille annetaan niiden arvot](/files/d77c09680e0efaeb53f558f238eb8075f976f850)


---

# 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/fi/syvalliset-artikkelit/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.
