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

# Jak LaTeX składa nagłówki i stopki?

## Jak LaTeX składa nagłówki i stopki?

### Wstęp

Jeśli szukasz poradnika, jak zmieniać nagłówki i stopki, proszę [odwiedź naszą stronę pomocy](/latex/pl/formatowanie/02-headers-and-footers.md) ponieważ ten artykuł skupia się na wyjaśnianiu niskopoziomowych mechanizmów używanych przez silniki TeX i LaTeX do tworzenia nagłówków i stopek.

* **Uwaga (aktualizacja)**: Ten artykuł omawia podstawowy mechanizm znaczników LaTeX używany przed czerwcem 2022 r., kiedy wprowadzono nową i bardziej wszechstronną implementację obsługi znaczników w LaTeX. Zobacz [Omówienie nowego mechanizmu znaczników LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) po więcej szczegółów. Ze względu na zgodność wsteczną LaTeX nadal obsługuje swój starszy mechanizm znaczników. Treść artykułu omawiająca zachowanie silników TeX nie jest dotknięta tymi zmianami w LaTeX.
* **Uwaga**: terminy „LaTeX”, „TeX” i „silnik TeX” są używane w całym tym omówieniu, więc warto zrozumieć ich znaczenie — zobacz artykuł Overleaf [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/pl/artykuly-szczegolowe/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) w celu uzyskania dalszych informacji.

Aby zapewnić użyteczne tło/kontekst, zaczynamy od przeglądu kilku istotnych niskopoziomowych obszarów składu opartego na TeX-ie — w tym tymczasowego (wewnętrznego) przechowywania treści, łamania stron i budowy strony. Omówienie zostało uproszczone przez rozważenie składanej strony, która zawiera „ciało” tekstu oraz pewne nagłówki i stopki. Elementy strony, takie jak ilustracje (floaty) i przypisy dolne, nie są tu omawiane, ponieważ wiążą się ze złożonym mechanizmem TeX-a zwanym *wstawki*, co wykracza daleko poza zakres tego artykułu.

Zaczniemy od podstawowego pojęcia *węzłów*: podstawowych elementów składowych używanych przez silniki TeX do tymczasowego (wewnętrznego) przechowywania treści.

### Kilka uwag o przechowywaniu treści: węzły TeX

Gdy bazowy silnik TeX przetwarza twój kod LaTeX, aby utworzyć złożony materiał — taki jak akapity, tabele i matematyka — musi tymczasowo przechować tę treść w pamięci używanego silnika TeX. Do przechowywania złożonej treści silniki TeX używają sekwencji tak zwanych *węzłów*, które można sobie wyobrazić jako różnej wielkości „kawałki” pamięci komputera (urządzenia), połączone ze sobą w listę (zobacz ten [artykuł Wikipedii o połączonych strukturach danych](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Schematyczna reprezentacja tego, jak silniki TeX przechowują treść za pomocą połączonych węzłów](/files/2981fa1022663639d8712e1a3ce8393d5de70500)

Do reprezentowania podstawowych elementów składu opartego na TeX — takich jak znaki, klej, ramki, kary, kerny i [*znaczniki*](#why-were-here-understanding-mark-nodes) (by wymienić tylko niektóre) — silniki TeX używają różnych *typów* rodzajów węzłów. Niektóre węzły, takie jak te dla ramek, muszą przechowywać więcej danych niż prostsze typy węzłów, takie jak węzły znaków; w konsekwencji niektóre węzły są większe od innych — wymagają więcej bajtów do przechowywania ich w pamięci. Czytając o TeX-ie, możesz natknąć się na terminy takie jak *węzłów znaków*, *węzłów kleju*, [*węzłów znaczników*](#why-were-here-understanding-mark-nodes) i tak dalej: teraz wiesz, że to po prostu nazwy nadane fragmentom pamięci przydzielonej do przechowywania danych reprezentujących element składu TeX.

#### Po co tu jesteśmy: zrozumienie węzłów znaczników

Spośród wielu typów węzłów ten, o którym musimy porozmawiać, nazywa się *węzeł znacznika* który jest tworzony przez `\mark` polecenia:

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

Ta `\mark` polecenie nie tworzy bezpośrednio żadnej złożonej treści: jego argument `*stuff to store*` jest zapisywany w pamięci do późniejszego użycia, a *węzeł znacznika* jest tworzony, aby zawierać lokalizację pamięci *stuff to store*. Jak zobaczymy, polecenie `\mark` zostało stworzone *specjalnie* w celu pomocy przy tworzeniu nagłówków i stopek.

Węzły znaczników tworzone przez `\mark` polecenia są „osadzane” w treści strony i gotowe do użycia podczas końcowych etapów składu strony, gdy silnik TeX jest gotowy dodać nagłówki i stopki do złożonej strony (ciała). Zwykle, `*stuff to store*` będzie zawierać takie elementy jak numery stron oraz tytuły/numery rozdziałów lub sekcji — budulec nagłówków i stopek.

#### ε-TeX dodaje polecenie \marks

[Wersja 2 ε-TeX](https://texdoc.org/serve/e-TeX/0) , będące rozszerzeniem oryginalnego TeX-a Knutha, została opublikowana w 1998 r. i zapewnia nowe możliwości wraz z ulepszeniami istniejących funkcji. Dziś większość ulepszeń ε-TeX została włączona do głównych silników TeX: pdfTeX, LuaTeX i XeTeX — zobacz [**`-etex`** opcję wiersza poleceń silników TeX](/latex/pl/wiecej-tematow/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) która umożliwia używanie rozszerzeń ε-TeX.

Oryginalne oprogramowanie TeX Knutha udostępnia polecenie \mark, które tworzy tylko 1 „klasę” lub „typ” węzła znacznika. Twój dokument może zawierać wiele poleceń \mark, ale wszystkie tworzą węzły znaczników tego samego „typu” lub „klasy” — nie ma wbudowanego mechanizmu grupowania ani klasyfikowania ich. To ograniczenie zostało usunięte przez ulepszenie ε-TeX: polecenie \marks, obsługiwane przez pdfTeX, LuaTeX i XeTeX:

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

gdzie `n` jest liczbą całkowitą (`0` <= `n` < `32768`), która określa klasę węzła znacznika *klasę*.

Uwagi:

* pisanie `\marks 0` (tzn. `n`=`0`) jest synonimiczne z użyciem oryginalnego `\mark` polecenie
* ε-TeX wprowadził także zmienne znaczników ([zobacz później](#pre-output-checks-looking-for-mark-nodes)) dla każdej klasy (`n`) znacznika: `\firstmarks n`, `\topmarks n` i `\botmarks n`. Wybrane klasy zmiennych znaczników mogły być używane do dostarczania danych znaczników dla określonych zadań składu.
* LuaTeX zwiększył maksymalną wartość `n` na `65535`, umożliwiając $$2^{16}$$ klasy znaczników

### Powody używania znaczników przez TeX

Aby zrozumieć *dlaczego* (i jak) silniki TeX używają `\mark` (lub `\marks`) polecenia do tworzenia nagłówków i stopek, musimy docenić pewne „osobliwości” mechanizmów silnika TeX służących do budowania stron — znajdowania podziałów stron i wysyłania ukończonych stron do pliku PDF. W rzeczywistości te procesy budowy stron są złożone, ale podstawowe zasady/koncepcje można uprościć, aby zapewnić wystarczające wyjaśnienia tła, które pomagają nam zrozumieć znaczniki.

Gdy silnik TeX kończy składanie pojedynczych elementów treści, takich jak akapity, tabele czy wzory matematyczne, wywołuje wewnętrzną procedurę (funkcję o nazwie `build_page(...)`) która próbuje dodać te właśnie złożone elementy do strony aktualnie budowanej w pamięci. Gdy nowa treść zostanie dodana do budowanej strony, TeX sprawdza też, czy ta nowo dodana treść uczyniła bieżącą stronę „wystarczająco pełną”. Jeśli strona jest pełna, TeX może utworzyć *podział strony*— wysyłając tę stronę treści do końcowego przetwarzania („pakowania”) i późniejszego wyjścia do pliku PDF.

Jedną z kluczowych cech końcowego etapu pakowania strony (składu) jest coś, co nazywa się *procedurą wyjściową* która w praktyce jest zdefiniowaną przez użytkownika sekwencją poleceń służących do spakowania strony treści, aby przygotować ją do wysłania do pliku PDF. Jedną z czynności „pakowania” jest dodanie nagłówków i stopek, ale istnieje wiele sposobów używania procedur wyjściowych — na przykład zobacz [ten artykuł w TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Procedury wyjściowe są dość złożonym obszarem TeX, więc nie będziemy tu wchodzić w szczegóły: na potrzeby tego artykułu wystarczy pamiętać, że końcowy etap składu strony obejmuje użycie pewnej zdefiniowanej przez użytkownika sekwencji poleceń (łącznie nazywanej *procedurą wyjściową*).

Ale rozważmy, co może się stać, gdy TeX kończy składanie długiego akapitu tekstu, dzieląc go na sekwencję pojedynczych złożonych wierszy. TeX będzie chciał dodać ten właśnie złożony akapit — wiersz po wierszu — do aktualnie budowanej strony, ale być może tylko *kilku* część tych wierszy zmieści się na bieżącej stronie. Przez „stronę” rozumiemy tutaj główny obszar tekstu (ciało strony), które *nie* nie obejmuje innych elementów strony, takich jak nagłówki i stopki, dodawane później (przez procedurę wyjściową).

Po dodaniu kilku wierszy akapitu do bieżącej strony może ona stać się „wystarczająco pełna” i nadejdzie czas, aby TeX utworzył podział strony. Jednak mamy pewną „pozostałą” treść, ponieważ tylko *part* część akapitu trafiła na bieżącą stronę: „nadmiarowa treść akapitu” jest zapisywana na później, gotowa do utworzenia *następnej* strony. Poniższa grafika ilustruje ten pomysł: część akapitu znajduje się na *bieżącego* stronie, a część jest wstrzymana dla *następnej* stronie.

![Schematyczna reprezentacja akapitu przechodzącego przez podział strony](/files/511167573b7e0281683fc6fafcf477ebcb12d359)

Ten przykład akapitu pokazuje, że silnik TeX często przetwarza (składa) fragmenty treści, które nie mogą, *w całości*, zmieścić się na bieżącej stronie — ponieważ ta treść wykracza poza punkt, w którym staje się konieczny podział strony. Pamiętaj, że silniki TeX znajdują podziały wierszy, najpierw wczytując, a następnie składając, *całe akapity* i, w przeciwieństwie do niektórych aplikacji, nie stosują podejścia wiersz po wierszu do składu akapitów. Innymi słowy, TeX składa *cały* akapit, niezależnie od tego, czy mieści się na bieżącej stronie (ustala się to później). A tak przy okazji, zasada „najpierw złożyć w całości, a potem dodać do bieżącej strony” dotyczy także innych rodzajów treści TeX, w tym tabel, które są w całości odczytywane z pliku .tex i składane w całości, zanim podejmie się próbę dodania ich do bieżącej strony.

W naszym przykładzie akapitu pełny tekst tego akapitu, *wraz z wszelkimi poleceniami w tym tekście*, został w pełni przetworzony — co oznacza, że skład TeX osiągnął pewne miejsce w twoim `.tex` pliku. „Bieżący stan wewnętrzny” silnika TeX, taki jak wartość zmiennych lub zapisane ustawienia parametrów, będzie odzwierciedlał treść, włącznie z wszelkimi poleceniami, przetworzoną do bieżącego miejsca — końca akapitu.

Chociaż cały akapit został złożony, część z niego nie może zostać umieszczona na bieżącej stronie, co skutkuje zapisaniem „nadmiarowej treści akapitu” dla *następnej* strony. W kodzie LaTeX (tekst plus polecenia), który wygenerował „nadmiarową treść akapitu”, silnik TeX *mógł* wywołać dowolną liczbę poleceń i makr, które zmieniły wartości i zmienne przechowywane wewnętrznie przez silnik TeX — czyli wprowadziły zmiany w „bieżącym stanie” TeX.

Poniższy diagram ilustruje niezwykle ważną osobliwość TeX-a, która wpływa na kilka aspektów składu opartego na TeX. Patrząc na prawą stronę diagramu, widzisz reprezentację węzłów obejmujących całą treść aktualnie przechowywaną w pamięci: jasnoszary obszar zawiera węzły tworzące *bieżącego* stronę, a ciemnoszary obszar to złożona treść przeznaczona dla *następnej* strony. Ten scenariusz odzwierciedla nasz przykład akapitu: ciemnoszary obszar przedstawia „nadmiarową treść akapitu”: wiersze tekstu wstrzymane, ponieważ nie mieszczą się na bieżącej stronie.

![Schematyczna reprezentacja miejsca węzła, w którym TeX znajduje podział strony, pokazująca także treść wstrzymaną do następnej strony](/files/1ce6e49d4ee6c8a1584817c21804780c246a8fb2)

Przypomnij sobie, że gdy TeX ma „wystarczająco pełną” stronę (ciało), przekazuje tę treść do czegoś, co nazywa się *procedurą wyjściową* które jest zdefiniowaną przez użytkownika sekwencją poleceń. Między innymi procedura wyjściowa dodaje nagłówki i stopki do ciała strony, finalizując stronę i przygotowując ją do wysłania do pliku PDF.

Nasz diagram (powyżej) przedstawia przypadek, w którym TeX wybrał utworzenie podziału strony przy pewnym konkretnym węźle, takim jak `\baselineskip` klej między złożonymi wierszami, i jest gotowy rozpocząć pakowanie bieżącej strony przy użyciu procedury wyjściowej — sekwencji wbudowanych poleceń i makr zdefiniowanych przez użytkownika. *Jednak*, oprócz treści składającej się na bieżącą stronę (przechowywanej w pamięci) TeX już przetworzył i przechował (w pamięci) *dodatkową treść*, z twojego `.tex` pliku. Ta dodatkowa treść rozciąga się *poza podział strony* i *mógł* mogły zawierać polecenia, które zmieniły ważne wartości lub zmienne związane ze stroną, wpływając na „bieżący stan wewnętrzny” TeX — który obejmuje wartości parametrów wewnętrznych lub danych przechowywanych przez makra.

Gdy TeX zaczyna pakować bieżącą stronę, jego „bieżący stan wewnętrzny” jest *nie* określony przez wszystko, co zostało złożone aż do miejsca podziału strony, ponieważ TeX już *minął ten punkt* w twoim pliku i przetworzył dodatkową treść. Jeśli porównasz miejsce w swoim pliku odpowiadające punktowi, w którym następuje podział strony, oraz miejsce, do którego TeX faktycznie dotarł w twoim `.tex` pliku, to dwa odpowiadające sobie stany wewnętrzne TeX, w tym zapisane dane i wartość zmiennych, mogą być bardzo różne. Bieżący stan składu TeX jest zwykle przed miejscem, w którym następuje podział strony; tzn. działania składu TeX *nie są zsynchronizowane* z procesem wyprowadzania złożonych stron za pomocą procedury wyjściowej.

#### Hipotetyczny przykład: jak uzyskać błędne nagłówki

Poniższy diagram ilustruje hipotetyczne polecenia `\myheader` i `\myfooter` używane do przechowywania pożądanego tekstu nagłówków i stopek; na przykład przy użyciu podstawowych definicji takich jak

```latex
\newtoks\headertoks% nowa zmienna listy tokenów dla tekstu nagłówka
\newtoks\footertoks% nowa zmienna listy tokenów dla tekstu stopki
% Użyj \global, aby zapewnić, że zapisane dane nagłówka lub stopki są
% dostępne wszędzie, w tym w poleceniach w
% procedurze wyjściowej
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

w których `\headertoks` i `\footertoks` są listami tokenów używanymi do przechowywania tekstu nagłówków i stopek.

Ponadto nasz hipotetyczny przykład ma także procedurę wyjściową, która pobiera tekst nagłówka i stopki z bieżących wartości `\myheader` i `\myfooter`. Jak pokazano na diagramie, w treści przeznaczonej dla bieżącej strony, `\myheader` i `\myfooter` ustawia odpowiednie (poprawne) wartości. Jednak możliwe byłoby, aby `\myheader` i/lub `\myfooter` zostało wywołane wewnątrz akapitu przechodzącego przez podział strony. Ponieważ TeX musi przetworzyć cały akapit, `\myheader` i `\myfooter` zostałoby wywołane ponownie, aby zresetować tekst nagłówka/stopki zapisany w „wewnętrznym stanie TeX”, tworząc wartości niepoprawne dla bieżącej strony. Gdy procedura wyjściowa wygeneruje nagłówek i stopkę, będą one zawierać tekst przeznaczony dla następnej strony.

![Grafika przedstawiająca niepoprawne nagłówki i stopki generowane, jeśli procedura wyjściowa używa wyłącznie makr TeX do pobierania tekstu nagłówka i stopki](/files/582a28283fa30a0270815bd6949a19c39c935d8b)

#### Asynchroniczne zachowanie TeX-a: polecenie \mark na ratunek

Działania TeX związane ze składem (konstruowaniem treści) są *niesynchronizowane* z końcowym procesem wyprowadzania złożonej strony za pomocą poleceń zawartych w procedurze wyjściowej. Gdy nadchodzi czas wyprowadzenia strony, rzeczywisty stan wewnętrzny TeX jest przed jakimkolwiek stanem, jaki mógł mieć w miejscu podziału strony — tam, gdzie złożył końcowy fragment treści na bieżącej wyprowadzanej stronie.

W [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, twórca TeX, opisuje tę sytuację jako

> ... procedura wyjściowa TeX pozostaje w tyle za jego działaniami budowy strony

Z powodu tej niesynchronizowanej relacji „specjalne mechanizmy” w postaci *mechanizmu znaczników*, stosowane za pomocą `\mark` (lub `\marks n`) są wymagane, aby zapewnić, że nagłówki i stopki zawierają treść odnoszącą się do faktycznie wyprowadzanej strony. Polecenie `\mark` osadza węzły znaczników w treści strony, zapisując lokalizację pamięci treści, która może być użyta do nagłówka i stopki strony macierzystej.

Autor dobrze znanej i cenionej książki [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) opisuje `\mark` mechanizm jako

> ... główny mechanizm, dzięki któremu procedura wyjściowa może uzyskać informacje o zawartości aktualnie odłamanej strony, w szczególności jej górze i dole.

Ta `\mark` polecenie jest mechanizmem zaprojektowanym tak, aby obejść asynchroniczny charakter algorytmu łamania stron i procedury wyjściowej TeX.

![Schematyczna reprezentacja danych znaczników (węzłów) osadzonych w treści ciała strony](/files/a4e9a8b0bd1bcc30c119bdc45ce38287c224f30b)

### Kontrola przed wyjściem: wyszukiwanie węzłów znaczników

Gdy silnik TeX ustali lokalizację podziału strony, wywołuje wewnętrzną procedurę (zwaną `fire_up()`) która wykonuje wiele przetwarzania wstępnego, zanim procedura wyjściowa zakończy skład strony i zapisze gotową stronę do pliku PDF. Ważną częścią tych kroków wstępnych jest ustawienie wartości trzech *globalnych zmiennych znaczników*: `\botmark`, `\topmark` i `\firstmark` które służą do dostarczania danych do tworzenia nagłówków i stopek. Oczywiście strona może zawierać wiele węzłów znaczników, ale są one filtrowane, aby utworzyć trzy zmienne znaczników, które działają następująco:

* **`\botmark`** to znacznik obowiązujący przy bieżącym podziale strony; tzn. ostatni znacznik widziany na *bieżącego* page
* **`\topmark`** to wartość `\botmark` z *poprzedniej* page
* **`\firstmark`** to pierwszy znacznik na *bieżącego* stronie — pierwszy znacznik między `\topmark` i `\botmark`

Poniższy schemat pokazuje podstawowe zasady wstępnego przetwarzania złożonej treści strony w celu określenia wartości trzech globalnych zmiennych znaczników `\botmark`, `\topmark` i `\firstmark`:

![Schematyczna reprezentacja podstawowych zasad używanych do określenia wartości trzech globalnych zmiennych znaczników \botmark, \topmark i \firstmark](/files/0c7a1a9c0d0856b474e29ab339223ad008175749)

Następna sekcja wykorzystuje niektóre z powyższych wyjaśnień, aby nakreślić, jak LaTeX składa nagłówki i stopki.

### Klasy LaTeX: style stron i nagłówki/stopki

Gdy piszesz `\documentclass{*class*}` gdzie `*class*` może być `article`, `book`, `report` lub `letter`, LaTeX wczytuje plik o nazwie `*class*.cls`; na przykład, `book.cls`, `article.cls` i tak dalej. Te `.cls` pliki zawierają kod LaTeX implementujący warianty różnych poleceń i funkcji specyficzne dla klasy, oczekiwane jako obecne we wszystkich klasach dokumentu i przez nie udostępniane — zachowania wspólne dla wszystkich klas dokumentu. Przykłady mogą obejmować marginesy układu strony specyficzne dla klasy wraz z wersjami poleceń specyficznymi dla klasy, takimi jak `\section`, `\subsection` i tak dalej.

Kolejnym ważnym elementem `.cls` plików jest implementacja standardowych stylów strony specyficzna dla klasy, która definiuje nagłówki i stopki dokumentów tworzonych przy użyciu określonej klasy i stylu strony. Na przykład:

* **`book.cls`** i **`article.cls`** każdy zawiera implementacje stylów strony `headings` i `myheadings`
* **`letter.cls`** zawiera definicje stylów strony `headings`, `empty`, `plain` oraz jednego o nazwie `firstpage`
* **`report.cls`** zawiera definicje stylów strony `headings` i `myheadings`

Implementacje stylów strony często zależą od `twoside` opcji `\documentclass`— to, czy dokument jest jednostronny, czy dwustronny — tak aby nagłówki i stopki były zdefiniowane odpowiednio dla stron lewych (parzystych) i prawych (nieparzystych).

Klasy dokumentu mogą opierać się na domyślnych definicjach `plain` lub `empty` stylów strony udostępnianych gdzie indziej w LaTeX — poza `.cls` używanym plikiem.

#### Więcej o stylach strony

Gdy zmieniasz styl strony za pomocą `\pagestyle{*somestyle*}` lub `\thispagestyle{*somestyle*}` LaTeX oczekuje znalezienia wewnętrznego polecenia o nazwie `ps@*somestyle*`— zwykle dostarczanego przez klasę dokumentu `.cls` plik lub być może pakiet taki jak `fancyhdr`. A tak przy okazji, przez „wewnętrzne polecenie” rozumiemy polecenie, które jest częścią kodu źródłowego LaTeX i którego nazwa zawiera `@` symbol @, który zwykle uniemożliwia swobodne użycie (z powodu jego [kodem kategorii](/latex/pl/wiecej-tematow/43-table-of-tex-category-codes.md)).

Definicja `\ps@*somestyle*` odpowiada za implementację funkcji/zachowań tego stylu strony, co obejmuje dostarczenie definicji:

* poleceń używanych podczas końcowych etapów składu strony (do dodawania nagłówków i stopek, zobacz [później w artykule](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* poleceń do wstawiania danych znaczników związanych z sekcjami do użycia przy generowaniu nagłówków i stopek dokumentu zawierających tytuły sekcji, numery i podobne elementy. Na przykład `headings` styl strony (w ramach `book.cls`) definiuje następujące polecenia tworzące znaczniki:
  * `\chaptermark`
  * `\sectionmark`

Będziemy [dalej zgłębiać polecenia generujące znaczniki](#mark-commands-and-mark-data), takie jak `\chaptermark`, ale tylko jako przykład: gdy piszesz `\chapter{chapter title}` stronie `\chaptermark` polecenie jest również wykonywane, aby wstawić dane znacznika związane z rozdziałem do późniejszego tworzenia nagłówków strony.

#### Anatomia poleceń nagłówka i stopki opartych na stylu strony

Ta sekcja bada niektóre z podstawowych poleceń/procesów LaTeX używanych do tworzenia nagłówków i stopek — opierając się na wyjaśnieniach lub pojęciach przedstawionych wcześniej w tym artykule.

**„Model” nagłówków i stopek w LaTeX**

Zawartość (domyślnych) nagłówków i stopek LaTeX opiera się na dwupoziomowej hierarchii sekcji dokumentu: sekcji „wyższego poziomu” zawierającej wiele sekcji „niższego poziomu”. Dla klas book i article przekłada się to na:

* `**book**` **klasę**: sekcje „wyższego poziomu” są tworzone przez `\\chapter` polecenia, a sekcje „niższego poziomu” przez `\section`, odzwierciedlając rozdziały zawierające wiele sekcji.
* `**article**` **klasę** (zakładając dokumenty dwustronne): sekcje „wyższego poziomu” są tworzone przy użyciu `\section` poleceń, a „niższego poziomu” za pomocą `\subsection`, odzwierciedlając wiele podsekcji występujących w obrębie tej samej sekcji.

LaTeX stosuje swój „model” nagłówków i stopek poprzez polecenia sekcjonowania, które „wstrzykują” węzły znaczników (za pośrednictwem `\mark` polecenia), aby przechowywać dane istotne dla tworzonej sekcji dokumentu. Na przykład za każdym razem, gdy piszesz `\section{*some section title*}` zostanie utworzony węzeł znacznika zawierający dane odzwierciedlające `*some section title*` i numer sekcji.

LaTeX używa systemu znaczników zawierających dane w formie `{left}{right}`, ostatecznie generowanych za pomocą `\mark` polecenia

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

otoczonych warstwami makr zaprojektowanych tak, aby chronić użytkowników przed niskopoziomowymi szczegółami — które są omawiane w kolejnych sekcjach tego artykułu.

#### Zgłębianie klasy book

Gdy `book.cls` plik jest wczytywany, jedną z jego końcowych czynności jest wykonanie `\pagestyle{headings}` które ustawia domyślny styl strony na `headings` , więc przyjrzymy się temu stylowi strony bardziej szczegółowo.

Jak [wspomniano powyżej](#more-on-page-styles) , cechy/właściwości `headings` stylu strony, zaimplementowanego przez `book` klasę, będą zdefiniowane przez (wewnętrzne) polecenie `\ps@headings` zawarte w pliku `book.cls`. Dokładna definicja `\ps@headings` zależy od tego, czy dokument jest jedno- czy dwustronny (domyślne dla `book` klasy).

**„Polecenia znaczników” i „dane znaczników”**

W przypadku dokumentów dwustronnych tworzonych przez `book` klasę definicja `\ps@headings` tworzy (definiuje) dwa „polecenia znaczników”: `\chaptermark` i `\sectionmark` które tworzą „dane znaczników” w postaci `{left}{right}`, do użycia w nagłówkach i stopkach. Te polecenia znaczników odzwierciedlają model nagłówków i stopek LaTeX — oparty na hierarchii sekcji dokumentu:

* polecenie sekcji „wyższego poziomu” (tu, `\\chapter`) służy do dostarczania „danych znaczników” dla nagłówków stron lewych (parzystych). Gdy rozpoczynasz nowy rozdział, wpisując `\chapter{*chapter title*}`, `\chaptermark` jest wywoływane, aby utworzyć „dane znaczników” odzwierciedlające ten nowy rozdział — zawierające jego `*chapter title*` i numer.
* polecenie sekcji „niższego poziomu” (tu, `\section`) służy do dostarczania „danych znaku” dla stron prawostronnych (o nieparzystych numerach). Gdy wpiszesz `\section{*tytuł sekcji*}` stronie `\sectionmark` zostanie wywołane polecenie, aby utworzyć „dane znaku”, które odzwierciedlają nową sekcję — zawierające jej `*tytuł sekcji*` i numer. Wszelkie dane znaku dostarczone przez poprzednie `\\chapter` nie są naruszane przez późniejsze polecenia \section.

**\markboth i \markright**

Polecenia znaku specyficzne dla sekcji w LaTeX-u, takie jak `\chaptermark` i `\sectionmark`, wykorzystują dwa dalsze polecenia zwane `\markboth` i `\markright` które dostarczają właściwych danych znaku dla nagłówków i stopek. `\markboth` i/lub `\markright` mogą zawierać polecenia formatujące tekst nagłówka lub stopki, na przykład zamieniające go na wielkie litery.

W przypadku dokumentów tworzonych przy użyciu `book` domyślnych ustawień klasy (dwustronnej, `headings` stylu strony), polecenia generujące znaki działają następująco:

* `\chaptermark` generuje dane znaku przy użyciu `\markboth`
* `\sectionmark` generuje dane znaku `\markright`

`\markboth` i `\markright` są makrami, które ostatecznie korzystają z pierwotnego (wbudowanego, niskopoziomowego) `\mark` polecenia do faktycznego wstawiania znaków generowanych wewnątrz poleceń dzielących dokument na sekcje.

`\markboth` ma postać

* **`\markboth{left}{right}`**: wstawia znak (węzeł) przy użyciu `\mark{{left}{right}}` w rezultacie tworząc węzeł znaku zawierający parę wartości w nawiasach klamrowych `{left}{right}`.

`\markright` ma postać

* **`\markright{newright}`**: wstawia znak (węzeł) przy użyciu `\mark{{currentleft}{newright}}`; tzn. zmienia bieżącą wartość `prawy` na `newright` ale bieżąca wartość `lewy` (tzn. `currentleft`) pozostaje bez zmian, co skutkuje węzłem znaku zawierającym parę wartości w nawiasach klamrowych `{currentleft}{newright}`.

Zachowanie `\markboth` i `\markright` obsługują dwupoziomową hierarchię sekcji, na przykład dokument zawierający wiele sekcji w każdym rozdziale.

Jako przykłady dla (dwustronnej) `book` klasy dokumentu (z użyciem stylu strony headings):

* `\chaptermark` używa `\markboth` do ustawienia:
  * a `{left}` pola, które składa CHAPTER . wielkimi literami.
  * oraz pola {right}, które jest puste (`{}`)
* `\sectionmark` używa `\markright` aby ustawić `{right}` pole znaku do składu., również wielkimi literami.

Aby zrozumieć, dlaczego `\sectionmark` używa `\markright` możemy zauważyć, że każde nowe `\section` polecenie powinno:

* wstawić nowy znak zawierający dane dla tej `\section` (takie jak tytuł i numer).
* ale *nie* wpływać na wartości danych znaku dla bieżącej `\\chapter` w której to konkretne `\section` polecenie występuje

Z tych powodów `\section` polecenie wywołuje `\sectionmark` które używa `\markright` aby utworzyć `\section`-powiązany znak: aktualizuje `{right}` pole danych znaku, ale nie wpływa na bieżące `{left}` wartość pola danych znaku, która została ustawiona przez bieżące `\\chapter`.

Uwaga: kod źródłowy LaTeX zawiera ostrzeżenie:

> Polecenia znaczników działają całkiem dobrze dla prawych znaczników „numerowanych wewnątrz” lewych znaczników — np. lewy znacznik jest zmieniany przez polecenie \chapter, a prawy znacznik przez polecenie \section. Jednak daje to nieco anormalne wyniki, jeśli na tej samej stronie wystąpią 2 polecenia \markboth.

**Polecenia dla procedury wyjściowej**

Ta `\ps@headings` polecenie implementuje definicje następujących poleceń

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

które są używane przez procedurę wyjściową do dodawania nagłówków i stopek podczas końcowego etapu składania strony. Na przykład, `book.cls` ustawia `\@oddfoot` i `\@evenfoot` na wartość `\@empty`, które jest zdefiniowane jako `\def\@empty{}`, więc `\ps@headings` powoduje puste stopki na stronach lewych i prawych:

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

Nagłówki są zdefiniowane następująco:

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

gdzie

* `\leftmark` wyodrębnia `{left}` wartość z `{left}{right}` pary znaków
* `\rightmark` wyodrębnia `{right}` wartość z `{left}{right}` pary znaków
* \thepage wyświetla bieżący numer strony

Zasadniczo te implementacje `\@evenhead` i `\@oddhead` dają następujące wyniki:

* `\@evenhead`: numer strony pojawia się po lewej stronie nagłówka, a zawartość `\leftmark`, sformatowana poleceniem czcionki `\slshape`, jest wyświetlana po prawej stronie nagłówka — odstęp między nimi zapewnia bardzo elastyczne `\hfil` wypełnienia.
* `\@oddhead`: zawartość `\rightmark`, sformatowana poleceniem czcionki `\slshape`, pojawia się po lewej stronie nagłówka, a bieżący numer strony po prawej — znów odstęp między nimi zapewnia `\hfil` wypełnienia.

Pozostaje jednak kluczowe pytanie: *które* `{left}{right}` para znaków jest używana przez `\leftmark` i `\rightmark`: innymi słowy, skąd pobierają swoje wartości danych znaku?

Jak [wspomniano powyżej](#filtering) ale [wyjaśnione poniżej](#explainfiltering), podczas końcowych etapów składania strony wszelkie znaki zawarte na stronach dokumentu są „filtrowane” i używane do ustawienia wartości trzech globalnych zmiennych znaku: `\botmark`, `\topmark` i `\firstmark`. Z powodu [struktury znaków LaTeX-a](#latexs-model-of-headers-and-footers), każda z tych 3 zmiennych znaku ostatecznie będzie zawierać wartość `{left}{right}` dla pewnej pary wartości `{left}` i `{right}` i to one dostarczają właściwe `{left}{right}` pary znaków (pól) dla `\leftmark` i `\rightmark`:

* `\leftmark` wyodrębnia `lewy` wartość z `{left}{right}` pary znaków (pól) dostarczonej przez `\botmark`
* `\rightmark` wyodrębnia `prawy` wartość z `{left}{right}` pary znaków dostarczonej przez `\firstmark`

Uwaga `\markboth` i `\markright` mogą zawierać polecenia formatujące tekst nagłówka i stopki — na przykład zamianę na wielkie litery.

### Przykłady z użyciem niskopoziomowych poleceń LaTeX-a

Poniższe przykłady pokazują wprowadzanie zmian w stylach stron lub nagłówkach i stopkach przez redefiniowanie niektórych niskopoziomowych (wewnętrznych) poleceń LaTeX-a omawianych w tym artykule (tych, które zawierają symbol @). Nie zalecamy tej metody zmiany nagłówków i stopek, ale jest ona dostępna dla tych, którzy jej potrzebują (np. autorów pakietów). Preferowanym rozwiązaniem do zmiany nagłówków i stopek jest użycie [`fancyhdr` pakietu](https://ctan.org/pkg/fancyhdr?lang=en), które jest omówione w [artykule pomocy Overleaf](/latex/pl/formatowanie/02-headers-and-footers.md).

#### Definiowanie minimalnego stylu strony

Poniższy przykład definiuje nowy, skrajnie minimalistyczny styl strony o nazwie `demostyle` który używa statycznego tekstu do definiowania nagłówków i stopek i nie opiera się na poleceniach dzielenia na sekcje (`\\chapter`, `\section` itp.) do ustawiania zawartości nagłówka i stopki.

Przykład zaczyna się od zmiany kodu kategorii `@` znaku na 11, aby mógł być używany w nazwach makr. Polecenie `\ps@demostyle` implementuje nasz minimalny styl strony przez redefiniowanie poleceń używanych (w procedurze wyjściowej) do tworzenia nagłówków i stopek: `\@oddhead`, `\@oddfoot`, `\@evenhead` i `\@evenfoot`. Zwróć uwagę na `twoside` opcję w naszym `\documentclass` deklaracji — która używa `article` klasy.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil The odd-page footer\hfil}%
\renewcommand\@evenfoot{\hfil The even-page footer\hfil}%
\renewcommand\@evenhead{\thepage\hfil The even-page header}%
\renewcommand\@oddhead{The odd-page header\hfil\thepage}}
\catcode`@=12
\title{Demonstrating a page style}
\author{Overleaf}
\date{August 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Wprowadzenie}
\newpage
\section{More material}
\end{document}
```

[Otwórz ten przykład w 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)

#### Zmiana nagłówków dla klasy book

Poniższy przykład zmienia nagłówki dla klasy book przez redefiniowanie `\@oddhead` i `\@evenhead` tak, aby nagłówki stron lewych i prawych zawierały bieżący numer strony i tytuł rozdziału. Zwróć uwagę, jak drugie `\\chapter` polecenie używa opcjonalnego skróconego tytułu rozdziału `[The short title]` który teraz dostarcza tekst nagłówka zamiast długiego tytułu.

`\section` polecenia nie mają wpływu na zawartość nagłówka, ponieważ nasze redefinicje nagłówków używają tylko `\leftmark` które pobiera informacje o bieżącym rozdziale. Aby uzyskać informacje o bieżącej sekcji, musielibyśmy użyć `\rightmark` w definicji `\@oddhead` i/lub `\evenhead`.

```latex
\documentclass{book}
% Uwaga: kod kategorii '@' tymczasowo zmieniony na 11
% aby umożliwić jego użycie w nazwach poleceń
\catcode `@=11
% Niech \@oddfoot i \evenfoot będą równoważne \@empty
% aby uczynić je pustymi
\let\@oddfoot\empty\let\evenfoot\empty
% Zdefiniuj ponownie \@oddhead i \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Użyj wygodnie małego rozmiaru strony
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
To jest część wstępna, która używa cyfr rzymskich.
\mainmatter
\chapter{Where do I start?}
Rozdział 1: Krótki rozdział.
\newpage
\section{Na początku...}
Sekcja.
\chapter[The short title]{A chapter with a very long title, making it unsuitable for headers}
\newpage
\section{Inna sekcja}
Z niewielką zawartością.
\newpage
\section{What, another section?}
Również z niewielką zawartością.
\end{document}
```

[Otwórz ten przykład w 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)

#### Korzystanie z rozszerzonych poleceń znaków ε-TeX-a

Ta `book` klasa używa następujących definicji `\@evenhead` i `\@oddhead` do tworzenia nagłówków:

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

gdzie polecenia `\leftmark` i `\rightmark` są zdefiniowane jako

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

Korzystając z rozszerzonych poleceń ε-TeX-a oraz z równoważności między klasą znaków 0 ε-TeX-a a oryginalnymi poleceniami TeX-a, możemy:

* przepisać `\leftmark` do zastąpienia `\botmark` z użyciem `\botmarks0` równoważnego, oraz
* przepisać `\rightmark` do zastąpienia `\firstmark` z użyciem `\firstmarks0` równoważnego

Te redefinicje dają

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

Zwróć uwagę na użycie `\\relax` do zakończenia wyszukiwania przez TeX kolejnych cyfr — można też zastąpić `\\relax` je spacją, aby pełniła rolę zakończenia.

Poniższy przykład daje wynik identyczny z oryginalnymi definicjami `\leftmark` i `\rightmark`.

```latex
\documentclass{book}
% Zdefiniuj ponownie \leftmark i \rightmark, aby używały
% odpowiednio \botmarks0 i \firstmarks0
% Uwaga: kod kategorii '@' tymczasowo zmieniony na 11
% aby umożliwić jego użycie w nazwach poleceń
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Użyj wygodnie małego rozmiaru strony
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
To jest część wstępna, która używa cyfr rzymskich.
\mainmatter
\chapter{Where do I start?}
Rozdział 1: Krótki rozdział.
\newpage
\section{Na początku...}
Sekcja.
\newpage
Kolejna sekcja.
\end{document}
```

[Otwórz ten przykład w 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)

**Uwagi o ε-TeX-ie**

Jak [zauważyliśmy powyżej](#etex), ε-TeX wprowadza `\marks` polecenia:

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

które rozszerza oryginalną `\mark` funkcję silnika TeX Knutha i jest dostępne we wszystkich trzech głównych silnikach TeX-a: pdfTeX, LuaTeX i XeTeX.

Implementacja ε-TeX-a wprowadza również nowe globalne zmienne znaku `\firstmarks n`, `\botmarks n` i `\topmarks n`: po jednej dla każdej klasy `n`. Te zmienne znaku oparte na klasach są określane [z użyciem mechanizmów opisanych powyżej](#pre-output-checks-looking-for-mark-nodes), i wszystkie mogą być używane przy tworzeniu nagłówków i stopek.

Możesz użyć dowolnej z $$2^{15}$$ = 32768 klas znaków, od 0 do 32767, w ramach redefinicji `\leftmark` lub `\rightmark`. Zakłada to, że dostarczyłeś (wstawiłeś) odpowiednie dane znaku dla wybranej klasy znaku, `n`, za pomocą `\marks n{{left}{right}}`.

Zauważ, że LuaTeX udostępnia $$2^{16}$$ = 65536 klas znaków, przy czym `n` w zakresie od 0 do 65535.

**Przykład użycia klasy znaków 10**

Ten przykład pokazuje użycie klasy znaków 10 (wybranej losowo) do tworzenia nagłówków dokumentu. Przykładowy dokument składa 6 stron zawierających sekwencję znaków przedstawioną w [przykładzie rozwiązanym na końcu tego artykułu](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Analiza tego przykładu pokaże, dlaczego silnik TeX wybrał określony znak, $$\alpha$$, $$\beta$$, $$\gamma$$ i $$\delta$$, do użycia w każdym z nagłówków.

Zaczynamy od zdefiniowania pomocniczego makra, `\domark`, które używa `\marks 10` do wstawiania danych znaku zgodnych z laTeX-ową `{left}{right}` konwencją:

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

Znaki klasy 10 są udostępniane mechanizmowi nagłówków i stopek LaTeX-a przez redefiniowanie `\leftmark` i `\rightmark`—z dodaniem niewielkiej ilości dodatkowych informacji:

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

Po wstawieniu pewnej liczby znaków (klasy 10) silnik TeX (tu: pdfTeX) uprzejmie tworzy globalne zmienne znaku dla klasy 10 —`\botmarks10`, `\topmarks10` i `\firstsmarks10` które `\leftmark` i `\rightmark` których używa się do tworzenia nagłówków.

```latex
\documentclass{book}
% Krótkie polecenie do używania znaków klasy 10
% i zgodnie ze strukturą znaków LaTeX-a {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Zdefiniuj ponownie \leftmark i \rightmark, aby używały
% odpowiednio \botmarks10 i \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{Demonstrating \(\varepsilon\)-\TeX’s enhanced marks}
\author{Overleaf}
\date{August 2022}
\begin{document}

Strona 1: Nie dodano żadnych znaków, więc wszystkie zmienne znaku pozostają w stanie zainicjalizowanym: puste (NULL).

\newpage
Strona 2: Znak $\alpha$ dodany do tej strony za pomocą

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

\newpage
Strona 3: Nie dodano żadnych nowych znaków do tej strony.

\newpage
Strona 4: Znak $\beta$, a następnie znak $\gamma$, dodane do tej strony za pomocą

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

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

\newpage
Strona 5: Znak $\delta$ dodany do tej strony za pomocą

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

\newpage
Strona 6: Nie dodano żadnych znaków do tej strony.
\end{document}
```

[Otwórz ten przykład w 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)

Poniższa grafika pokazuje nagłówki wygenerowane przez ten przykład:

![Grafika pokazująca wynik kodu LaTeX-a używającego rozszerzonych poleceń znaków ε-TeX-a](/files/f952bf428216f28c23298baeda2dd8208bfbd423)

* **Uwaga**: Nagłówek na stronie 1 jest tworzony w momencie, gdy wszystkie trzy zmienne znaku dla klasy 10 —`\botmarks10`, `\topmarks10` i `\firstsmarks10`— są puste. Końcowy rezultat jest taki, że `\rightmark` (dla strony 1) wstawia tylko ostatni fragment nagłówka: `(za pośrednictwem \texttt{\string\firstmarks10})`, jak pokazano na powyższej grafice.

## Przykład rozwiązany pokazujący, jak silniki TeX określają wartości \botmark, \topmark i \firstmark

![Db.gif](/files/93b812426c24c328250d9ffa560d58bb7ed64a44)![Db.gif](/files/93b812426c24c328250d9ffa560d58bb7ed64a44) Wydaje się stosowne odtworzyć użycie przez Knutha podwójnych znaków „niebezpiecznego zakrętu” (obraz dzięki uprzejmości [tej witryny](http://www.truetex.com/db.htm)) ponieważ materiał jest dość niskopoziomowy i „zagląda pod maskę” — choć mamy nadzieję, że zainteresuje śmiałych czytelników pragnących poznać kilka dodatkowych szczegółów.

Poniższa dyskusja jest ściśle oparta na ostatnim przykładzie ze strony 258 [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Tutaj przeredagowaliśmy i przetworzyliśmy ten przykład dla tych, którzy nie mają dostępu do The TeXbook:

![Zredagowana i ponownie skomponowana wersja przykładu ze strony 258 The TeXbook](/files/5049e638dde3833379341dad4bb87d6c41e9dc64)

Tabela przedstawiona na tej grafice została odtworzona na podstawie tabeli dostarczonej przez Knutha, ale podobnie jak oryginał nie zawiera wyjaśnienia, jak ją wyprowadzono. Tutaj to wyjaśnimy, aby dostarczyć dodatkowych szczegółów pokazujących, jak te wartości `\botmark`, `\topmark` i `\firstmark` zostały określone — uzyskanie tych szczegółów wymagało przejrzenia kodu źródłowego silnika TeX!

Proces ustawiania wartości dla `\botmark`, `\topmark` i `\firstmark` można streścić w 3 krótkich fragmentach pseudokodu, jak pokazano na poniższym diagramie i w dalszych wyjaśnieniach:

1. Kontrola przed zawartością
2. Pętla zawartości
3. Kontrola po zawartości

Uwaga:

* Testy w kroku 1 „Kontrola przed zawartością” i kroku 3 „Kontrola po zawartości” są wykonywane raz na stronę.
* Krok 2 „Pętla zawartości” polega na skanowaniu przez TeX zawartości strony w poszukiwaniu węzłów znaku i używaniu ich do ustawiania wartości zmiennych znaku, jak pokazano.

![Obraz przedstawiający pseudokodowe wersje kodu używanego do ustawiania wartości trzech globalnych zmiennych znaku używanych przez silniki TeX](/files/ca2d28ae9f938d0f1648c91ab11fcbfe6e17eca1)

Za każdym razem, gdy TeX znajdzie odpowiednie złamanie strony, wysyła zawartość tej strony do końcowego przetwarzania, wykonując te (trzy) kroki przetwarzania znaków dla każdej strony w dokumencie. Kroki przetwarzania oznaczone 1, 2 i 3 są przywołane w końcowym diagramie w tej sekcji.

Zauważ, że:

* zanim pierwsza strona zostanie przetworzona, wszystkie trzy globalne zmienne znaku `\botmark`, `\topmark` i `\firstmark` zostały zainicjalizowane jako puste (NULL).
* końcowe wartości `\botmark`, `\topmark` i `\firstmark` określone na końcu *poprzedniej* strony stają się wartościami (wejściowymi) do przetwarzania *bieżącego* strony — właśnie przetwarzanej.

Poniższe fragmenty kodu są ***pseudokodem*** wyprowadzone (podsumowane) z rzeczywistego kodu źródłowego silnika TeX. Celem jest dostarczenie zwięzłego podsumowania kodu, które pomaga zademonstrować kluczowe zasady.

**Krok 1: Kontrola przed zawartością** Zanim TeX przejrzy właściwą zawartość bieżącej strony, sprawdza, czy bieżąca `\botmark` wartość — tj. wynikająca z *poprzedniej* strony — jest pusta (NULL):

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

W tym teście, jeśli `\botmark` (z *poprzedniej* strony) jest *nie* pusta:

* `\topmark` dla *bieżącego* strony jest ustawiana na *poprzedniej* strony `\botmark` wartości
* `\firstmark`, a dla *bieżącego* strony (będącej przetwarzana) jest ustawiana na pustą (NULL): rozpocznij tę stronę, zakładając, że nie ma żadnych `\mark` węzłów.

Zauważ, że ten test jest wykonywany *raz* dla każdej przetwarzanej strony.

**Krok 2: Pętla zawartości** Następnie TeX przechodzi pętlą po zawartości strony; część tej pętli obejmuje wyszukiwanie `\mark` węzłów:

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

Ten test jest stosowany do każdego węzła mark znajdującego się w (zawartego w) bieżącej stronie. Poprzedni test (Krok 1, powyżej) mógł ustawić `\firstmark` na pusty, więc pierwszy napotkany mark na bieżącej stronie staje się wartością `\firstmark` i `\botmark`. Każdy *kolejny* `\mark` węzeł wykryty podczas wykonywania tej pętli nie zmieni wartości `\firstmark`, ponieważ nie jest już pusty (NULL), lecz `\botmark` jest aktualizowany — ponieważ właśnie taki jest cel `\botmark`: przechowywać ostatnio napotkany `\mark` węzeł dla tej strony.

**Krok 3: Sprawdzenie po treści** Gdy przejdzie przez treść strony, TeX stosuje następujący, końcowy test, wykonywany również raz na stronę:

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

* Jeśli `\topmark` nie jest pusty (NULL), wiemy z Kroku 1, że `\botmark` dla poprzedniej strony nie był pusty (NULL).
* Jeśli `\firstmark` jest nadal pusty, to nie napotkaliśmy żadnych `\mark` węzłów, ponieważ test z Kroku 2 nie został uruchomiony; w konsekwencji, `\firstmark` jest ustawiana na wartość `\topmark` która jest również wartością `\botmark` z poprzedniej strony.

Po sekwencyjnym zastosowaniu tych trzech kroków do wszystkich 6 stron naszego przykładu, wartości `\botmark`, `\topmark` i `\firstmark` są wyprowadzane z użyciem przejść pokazanych na poniższym diagramie, gdzie:

* jasnoniebieskie zaokrąglone prostokąty to końcowe wartości zmiennych mark dla każdej strony
* jasnoszare zaokrąglone kwadraty reprezentują wartości pośrednie powstające podczas przetwarzania
* strzałki z etykietami reprezentują zmiany wartości zmiennych markera zgodnie z krokami 1, 2 lub 3 na powyższym diagramie — albo wartość nie została zmieniona przez żaden z kroków; oznaczone „brak zmian”.

Poniższy diagram pokazuje, jak trzy fragmenty pseudokodu generują końcowe wartości `\botmark`, `\topmark` i `\firstmark` wymienione w tabeli znajdującej się na stronie 258 książki The TeXbook.

![Diagram przejść towarzyszący przykładowi ze strony 258 książki The TeXbook, pokazujący wewnętrzne przejścia podczas przypisywania wartości globalnym zmiennym mark](/files/bbd88be9856c0442d3cf136f4a15fb2e5564b30c)


---

# 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/pl/artykuly-szczegolowe/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.
