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

# Як LaTeX верстає колонтитули?

## Як LaTeX набирає верхні та нижні колонтитули?

### Вступ

Якщо ви шукаєте інструкцію зі зміни верхніх та нижніх колонтитулів, будь ласка, [відвідайте нашу довідкову сторінку](/latex/uk/formatuvannya/02-headers-and-footers.md) оскільки ця стаття зосереджена на поясненні низькорівневих механізмів, які використовують рушії TeX і LaTeX для створення верхніх та нижніх колонтитулів.

* **Примітка (оновлення)**: У цій статті досліджується основний механізм позначок LaTeX, що використовувався до червня 2022 року, коли було запроваджено нову й більш універсальну реалізацію обробки позначок у LaTeX. Див. [Огляд нового механізму позначок LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) для докладніших відомостей. З міркувань зворотної сумісності LaTeX і надалі підтримує свій застарілий механізм позначок. Матеріал статті, що обговорює поведінку рушіїв TeX, не зазнав змін через ці зміни в LaTeX.
* **Примітка**: у цих обговореннях уживаються терміни «LaTeX», «TeX» і «рушій TeX», тож корисно розуміти їхнє значення — див. статтю Overleaf [Що в назві: путівник багатьма варіантами TeX](/latex/uk/dokladni-statti/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) для додаткової інформації.

Щоб надати корисний контекст/тло, ми почнемо з огляду деяких відповідних низькорівневих аспектів верстки на основі TeX — зокрема тимчасового (внутрішнього) зберігання вмісту, розбиття на сторінки та їхнього формування. Обговорення було спрощено, якщо розглядати набрану сторінку, яка містить «тіло» тексту плюс деякі верхні та нижні колонтитули. Елементи сторінки, такі як рисунки (плаваючі об’єкти) та виноски, тут не розглядаються, оскільки вони пов’язані зі складним механізмом TeX під назвою *вставки*, що далеко виходить за межі цієї статті.

Почнемо з базового поняття *вузлів*: фундаментальних будівельних блоків, які рушії TeX використовують для тимчасового (внутрішнього) зберігання вмісту.

### Декілька приміток щодо зберігання вмісту: вузли TeX

Коли базовий рушій TeX обробляє ваш код LaTeX, щоб створити набраний матеріал — такий як абзаци, таблиці та математика, — йому потрібно тимчасово зберігати цей вміст у пам’яті того рушія TeX, який використовується для обробки вашого коду LaTeX. Для зберігання набраного вмісту рушії TeX використовують послідовність так званих *вузлів*, які можна уявити як «шматки» комп’ютерної (пристроєвої) пам’яті змінного розміру, з’єднані між собою у список (див. цю [статтю Вікіпедії про зв’язані структури даних](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Схематичне зображення того, як рушії TeX зберігають вміст, використовуючи зв’язані вузли](/files/cae161c67717e017b0a66f0350046334d9810b9a)

Для представлення фундаментальних елементів верстки на основі TeX — таких як символи, проміжки, блоки, штрафи, керни та [*позначки*](#why-were-here-understanding-mark-nodes) (це лише деякі з них) — рушії TeX використовують різні *типів* типи вузлів. Деякі вузли, наприклад вузли для блоків, мають зберігати більше даних порівняно з простішими типами вузлів, такими як вузли символів; отже, деякі вузли більші за інші — для їхнього зберігання в пам’яті потрібно більше байтів. Читаючи про TeX, ви можете натрапити на терміни на кшталт *вузли символів*, *вузли проміжків*, [*вузли позначок*](#why-were-here-understanding-mark-nodes) і так далі: тепер ви знаєте, що це просто назви, дані частинам пам’яті, виділеним для зберігання даних, які представляють елемент верстки TeX.

#### Навіщо ми тут: розуміння вузлів позначок

Серед багатьох типів вузлів той, про який нам потрібно поговорити, називається *вузол позначки* який створюється за допомогою `\mark` команди:

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

Функція `\mark` команда безпосередньо не створює жодного набраного вмісту: її аргумент `*stuff to store*` зберігається в пам’яті для подальшого використання, а *вузол позначки* створюється для збереження адреси в пам’яті *що зберігати*. Як ми побачимо, команда `\mark` була створена *саме* для допомоги у створенні верхніх та нижніх колонтитулів.

Вузли позначок, створені `\mark` командами «вбудовуються» у вміст сторінки, готові до використання на завершальних етапах складання сторінки, коли рушій TeX готовий додати верхні та нижні колонтитули до набраної сторінки (тіла). Зазвичай, `*stuff to store*` будуть містити такі елементи, як номери сторінок і заголовки/номери розділів або підрозділів — будівельні блоки верхніх та нижніх колонтитулів.

#### ε-TeX додає команду \marks

[Версія 2 ε-TeX](https://texdoc.org/serve/e-TeX/0), розширення оригінального TeX Кнута, була опублікована у 1998 році та надає нові можливості разом із покращеннями наявних функцій. Сьогодні більшість удосконалень ε-TeX було включено до основних рушіїв TeX: pdfTeX, LuaTeX і XeTeX — див. [**`-etex`** параметр командного рядка рушіїв TeX](/latex/uk/inshi-temi/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) який уможливлює використання розширень ε-TeX.

Оригінальне програмне забезпечення TeX Кнута надає команду \mark, яка створює лише 1 «клас» або «тип» вузла позначки. Ваш документ може містити багато команд \mark, але всі вони створюють вузли позначок одного й того самого «типу» або «класу» — вбудованого механізму для групування чи класифікації немає. Це обмеження було знято завдяки вдосконаленню ε-TeX: команді \marks, яку підтримують pdfTeX, LuaTeX і XeTeX:

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

де `n` є цілим числом (`0` <= `n` < `32768`) що визначає вузол позначки *клас*.

Примітки:

* записання `\marks 0` (тобто, `n`=`0`) є синонімом використання оригінальної `\mark` команду
* ε-TeX також запровадив змінні позначок ([див. далі](#pre-output-checks-looking-for-mark-nodes)) для кожного класу (`n`) позначок: `\firstmarks n`, `\topmarks n` та `\botmarks n`. Вибрані класи змінних позначок можна було використовувати для надання даних позначок для конкретних завдань верстки.
* LuaTeX збільшив максимальне значення `n` на `65535`, що уможливило $$2^{16}$$ класи позначок

### Причини використання позначок у TeX

Щоб зрозуміти *чому* (і як) рушії TeX використовують `\mark` (або `\marks`) команду для створення верхніх та нижніх колонтитулів, нам потрібно зрозуміти деякі «особливості» механізмів рушія TeX для побудови сторінок — пошуку розривів сторінок і виведення готових сторінок у PDF-файл. Насправді ці процеси побудови сторінок складні, але основні принципи/поняття можна спростити, щоб надати достатнє теоретичне пояснення, яке допоможе нам зрозуміти позначки.

Коли рушій TeX завершує верстку окремих елементів вмісту, таких як абзаци, таблиці чи математичні формули, він викликає внутрішню процедуру (функцію під назвою `build_page(...)`), яка намагається додати ці щойно набрані елементи до сторінки, що наразі створюється в пам’яті. Коли цей новий матеріал додається до сторінки, яку будується, TeX також перевіряє, чи не стала поточна сторінка «достатньо заповненою». Якщо сторінка заповнена, TeX може створити *розрив сторінки*— надсилаючи вміст цієї сторінки на остаточну обробку («пакування») і подальше виведення до PDF-файлу.

Однією з ключових особливостей завершального етапу пакування сторінки (складання) є те, що називається *процедурою виведення* яка, по суті, є визначеною користувачем послідовністю команд, що використовується для пакування сторінки вмісту, щоб підготувати її до надсилання у PDF-файл. Одним із прикладів такого «пакування» є додавання верхніх та нижніх колонтитулів, але є багато способів використання процедур виведення — наприклад, див. [цю статтю в TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Процедури виведення — це досить складна сфера TeX, тож тут ми не будемо заглиблюватися в деталі: для наших цілей просто пам’ятайте, що завершальний етап складання сторінки передбачає використання певної послідовності команд, визначеної користувачем (разом називаної *процедурою виведення*).

Але розгляньмо, що може статися, коли TeX завершує верстку довгого абзацу тексту, розбиваючи його на послідовність окремих набраних рядків. TeX захоче додати цей щойно набраний абзац — рядок за рядком — до сторінки, яка наразі будується, але, можливо, лише *деяких* з цих рядків може вміститися на поточній сторінці. Зауважте, що під «сторінкою» ми маємо на увазі основну текстову область (тіло сторінки), яка *не* не включає інші елементи сторінки, такі як верхні та нижні колонтитули, які додаються пізніше (процедурою виведення).

Після того як кілька рядків абзацу було додано до поточної сторінки, вона може стати «достатньо заповненою», і настане час TeX створити розрив сторінки. Однак у нас є деякий «залишковий» матеріал, оскільки лише *part* частина абзацу потрапила на поточну сторінку: «надлишковий вміст абзацу» зберігається на потім, готовий до створення *наступної* сторінки. Наступна схема ілюструє цю ідею: частина абзацу на *поточного* сторінці, а частину відкладено для *наступної* сторінці.

![Схематичне зображення абзацу, що перетинає розрив сторінки](/files/49eb2684bc9d6f56c270b38ea477c4bc9c1fa198)

Цей приклад абзацу демонструє, що рушій TeX часто обробляє (верстає) фрагменти вмісту, які не можуть, *у повному обсязі*, поміститися на поточній сторінці — оскільки цей вміст виходить за межу, після якої стає необхідним розрив сторінки. Пам’ятайте, що рушії TeX знаходять розриви рядків, вводячи, а потім верстаючи, *цілі абзаци* і, на відміну від деяких застосунків, не використовують покроковий підхід до верстки абзаців по рядках. Іншими словами, TeX верстає *увесь* абзац, незалежно від того, поміщається він на поточній сторінці чи ні (це з’ясовується пізніше). До речі, принцип «спочатку набрати повністю, а потім додати до поточної сторінки» справедливий і для інших типів вмісту TeX, зокрема таблиць, які повністю зчитуються з файла .tex і верстаються цілком перед будь-якою спробою додати їх до поточної сторінки.

Для нашого прикладу з абзацом повний текст цього абзацу, *включно з будь-якими командами в цьому тексті*, було повністю оброблено — тобто верстка TeX досягла певного місця у вашому `.tex` файлі. «Поточний внутрішній стан» рушія TeX, наприклад значення змінних або збережених налаштувань параметрів, відображатиме вміст, включно з будь-якими командами, обробленими до поточного місця — кінця абзацу.

Хоча весь абзац було набрано, частину його неможливо розмістити на поточній сторінці, внаслідок чого «надлишковий вміст абзацу» зберігається для *наступної* сторінки. У коді LaTeX (текст плюс команди), який створив «надлишковий вміст абзацу», рушій TeX *міг* викликати будь-яку кількість команд і макросів, які змінювали значення та змінні, внутрішньо збережені рушієм TeX, тобто вносили зміни до «поточного стану» TeX.

Наведена нижче діаграма ілюструє надзвичайно важливу «особливість» TeX, яка впливає на кілька аспектів верстки на основі TeX. На правому боці діаграми ви бачите зображення вузлів, що складають увесь вміст, який наразі зберігається в пам’яті: світло-сіра область містить вузли, що утворюють *поточного* сторінку, а темно-сіра область — це набраний вміст, призначений для *наступної* сторінки. Цей сценарій відображає наш приклад з абзацом: темно-сіра область представляє «надлишковий вміст абзацу»: рядки тексту, які було відкладено, оскільки вони не поміщаються на поточній сторінці.

![Схематичне зображення розташування вузла, де TeX знаходить розрив сторінки, також показано вміст, відкладений для наступної сторінки](/files/855d5015c84616973217b249d708f35ce0dfe505)

Пам’ятайте, що коли TeX має «достатньо заповнену» сторінку (тіло), він передає цей вміст тому, що називається *процедурою виведення* яка є послідовністю команд, визначеною користувачем. Серед іншого, процедура виведення додає верхні та нижні колонтитули до тіла сторінки, завершуючи її підготовку до виведення в PDF-файл.

Наша схема (вище) показує випадок, коли TeX вирішив зробити розрив сторінки на певному вузлі, наприклад `\baselineskip` на проміжку між набраними рядками, і готовий почати пакування поточної сторінки за допомогою процедури виведення — послідовності вбудованих команд і макросів, визначених користувачем. *Однак*, окрім вмісту, що складає поточну сторінку (збереженого в пам’яті), TeX уже обробив і зберіг (у пам’яті) *додатковий матеріал*, з вашого `.tex` файла. Цей додатковий матеріал простягається *за межі розриву сторінки* та *міг* міг містити команди, які змінювали важливі значення або змінні, пов’язані зі сторінкою, впливаючи на «поточний внутрішній стан» TeX, що включає значення внутрішніх параметрів або дані, збережені макросами.

Коли TeX починає пакувати поточну сторінку, його «поточний внутрішній стан» *не* визначається всім, що було набрано до місця розриву сторінки, оскільки TeX уже *пройшов цю точку* у вашому файлі та обробив додатковий матеріал. Якщо ви порівняєте місце у вашому файлі, що відповідає точці розриву сторінки, і місце, до якого TeX фактично дійшов у вашому `.tex` файлі, то два відповідні внутрішні стани TeX, включно зі збереженими даними та значеннями змінних, можуть сильно відрізнятися. Поточний стан верстки TeX зазвичай випереджає місце, де відбувається розрив сторінки; тобто верстальні дії TeX *не синхронізовані* з процесом виведення набраних сторінок через процедуру виведення.

#### Гіпотетичний приклад: як отримати неправильні колонтитули

Наведена нижче діаграма ілюструє гіпотетичні команди `\myheader` та `\myfooter` які використовуються для збереження потрібного тексту верхніх та нижніх колонтитулів; наприклад, за допомогою базових визначень на кшталт

```latex
\newtoks\headertoks% нова змінна списку токенів для тексту верхнього колонтитула
\newtoks\footertoks% нова змінна списку токенів для тексту нижнього колонтитула
% Використовуйте \global, щоб гарантувати, що збережені дані верхнього або нижнього колонтитула є
% доступними всюди, включно з командами в
% процедурі виведення
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

у яких `\headertoks` та `\footertoks` є списками токенів, що використовуються для зберігання тексту верхніх та нижніх колонтитулів.

Крім того, наш гіпотетичний приклад також має процедуру виведення, яка отримує текст верхнього та нижнього колонтитулів із поточних значень `\myheader` та `\myfooter`. Як показано на діаграмі, у вмісті, призначеному для поточної сторінки, `\myheader` та `\myfooter` встановлюють відповідні (правильні) значення. Однак `\myheader` та/або `\myfooter` можна було б викликати всередині абзацу, що перетинає розрив сторінки. Оскільки TeX має обробити весь абзац, `\myheader` та `\myfooter` буде викликано ще раз, щоб скинути текст верхнього/нижнього колонтитула, збережений у «внутрішньому стані TeX», унаслідок чого буде отримано значення, які не є правильними для поточної сторінки. Коли процедура виведення створить верхній та нижній колонтитули, вони міститимуть текст, призначений для наступної сторінки.

![Схема, що показує неправильні верхні та нижні колонтитули, які виникають, якщо процедура виведення використовує лише макроси TeX для отримання тексту верхнього та нижнього колонтитулів](/files/a3cd9e4239931b52907bd4d460c86e9ef9bd0812)

#### Асинхронна поведінка TeX: на допомогу приходить команда \mark

Верстальні (конструювання вмісту) дії TeX *не синхронізовані* з фінальним процесом виведення набраної сторінки через команди, що містяться в процедурі виведення. Коли настає час виводити сторінку, фактичний внутрішній стан TeX випереджає будь-який стан, який він міг би мати в місці розриву сторінки — там, де він набрав останній фрагмент вмісту на поточній сторінці, що виводиться.

У [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Дональд Кнут, творець TeX, описує цю ситуацію так:

> ... процедура виведення TeX відстає від його дій із побудови сторінок

Через цей несинхронізований зв’язок «спеціальні засоби» у вигляді *механізму позначок*, застосованого через `\mark` (або `\marks n`) команда, потрібна, щоб забезпечити, аби верхні та нижні колонтитули містили матеріал, релевантний фактичній сторінці, що виводиться.  `\mark` Команда вбудовує вузли позначок у вміст сторінки, зберігаючи адресу в пам’яті того вмісту, який може бути використаний для верхнього та нижнього колонтитулів відповідної сторінки.

Автор відомої й шанованої книги [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) описує `\mark` механізм як

> ... основний механізм, за допомогою якого процедура виведення може отримати інформацію про вміст сторінки, що наразі була розірвана, зокрема про її верх і низ.

Функція `\mark` Команда є механізмом, розробленим для подолання асинхронної природи алгоритму розриву сторінок і процедури виведення TeX.

![Схематичне зображення даних позначок (вузлів), вбудованих у вміст тіла сторінки](/files/348cc10bdf7475f6443642d549a583b4110b014c)

### Перевірки перед виведенням: пошук вузлів позначок

Після того як рушій TeX визначив місце розриву сторінки, він викликає внутрішню процедуру (під назвою `fire_up()`), яка виконує багато попередньої обробки перед тим, як процедура виведення завершить складання сторінки і запише готову сторінку у PDF-файл. Важливою частиною цих кроків попередньої обробки є встановлення значень трьох *глобальних змінних позначок*: `\botmark`, `\topmark` та `\firstmark` які використовуються для надання даних для створення верхніх та нижніх колонтитулів. Звісно, сторінка може містити кілька вузлів позначок, але їх фільтрують, щоб отримати три змінні позначок, які працюють так:

* **`\botmark`** є позначкою, що діє на поточному розриві сторінки; тобто останньою позначкою, побаченою на *поточного* page
* **`\topmark`** є значенням `\botmark` з *попередній* page
* **`\firstmark`** є першою позначкою на *поточного* сторінці — першою позначкою між `\topmark` та `\botmark`

Наведена нижче схема показує основні принципи попередньої обробки набраного вмісту сторінки для визначення значень трьох глобальних змінних позначок `\botmark`, `\topmark` та `\firstmark`:

![Схематичне зображення основних принципів, що використовуються для визначення значень трьох глобальних змінних позначок \botmark, \topmark і \firstmark](/files/f8be4afad0830a7b8aceee65a0f95e8dc19e4291)

У наступному розділі використано деякі з наведених вище пояснень, щоб окреслити, як LaTeX набирає верхні та нижні колонтитули.

### Класи LaTeX: стилі сторінок і верхні/нижні колонтитули

Коли ви пишете `\documentclass{*class*}` де `*class*` може бути `article`, `book`, `report` або `літерний`, LaTeX завантажує файл із назвою `*class*.cls`; наприклад, `book.cls`, `article.cls` і так далі. Ці `.cls` файли містять код LaTeX для реалізації варіантів різних команд і функцій, специфічних для класу, які очікується, що будуть наявні в усіх класах документів і надаватимуться ними — поведінка, спільна для всіх класів документів. Прикладами можуть бути специфічні для класу поля розмітки сторінки разом зі специфічними версіями команд, таких як `\section`, `\subsection` і так далі.

Іншим важливим елементом `.cls` файлів є специфічна для класу реалізація стандартних стилів сторінок, які визначають верхні та нижні колонтитули документів, створених за допомогою певного класу та стилю сторінки. Наприклад:

* **`book.cls`** та **`article.cls`** кожен містить реалізації стилів сторінок `headings` та `myheadings`
* **`letter.cls`** містить визначення стилів сторінок `headings`, `empty`, `plain` і одного під назвою `firstpage`
* **`report.cls`** містить визначення стилів сторінок `headings` та `myheadings`

Реалізації стилів сторінок часто залежать від `twoside` параметра `\documentclass`— чи документ односторонній, чи двосторонній — так, щоб верхні та нижні колонтитули були визначені належним чином для лівих (парних) і правих (непарних) сторінок.

Класи документів можуть покладатися на стандартні визначення `plain` або `empty` стилів сторінок, надані в іншому місці LaTeX — поза межами `.cls` файла, що використовується.

#### Докладніше про стилі сторінок

Коли ви змінюєте стиль сторінки за допомогою `\pagestyle{*somestyle*}` або `\thispagestyle{*somestyle*}` LaTeX очікує знайти внутрішню команду з назвою `ps@*somestyle*`—зазвичай надану класом документа `.cls` файлом або, можливо, пакетом на кшталт `fancyhdr`. До речі, під «внутрішньою командою» ми маємо на увазі команду, що є частиною вихідного коду LaTeX і назва якої містить `@` символ, що зазвичай унеможливлює випадкове використання (через його [код категорії](/latex/uk/inshi-temi/43-table-of-tex-category-codes.md)).

Визначення `\ps@*somestyle*` відповідає за реалізацію функцій/поведінки цього стилю сторінки, що включає надання визначень:

* команд, що використовуються на завершальних етапах складання сторінки (для додавання верхніх та нижніх колонтитулів, див. [далі в статті](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* команд для вставлення даних позначок, пов’язаних із розділами, для використання під час створення верхніх та нижніх колонтитулів документа, які містять назви розділів, номери та подібне. Наприклад, `headings` стиль сторінки (у `book.cls`) визначає такі команди, що створюють позначки:
  * `\chaptermark`
  * `\sectionmark`

Ми [ще розглянемо команди, що генерують позначки](#mark-commands-and-mark-data), такі як `\chaptermark`, але лише як приклад: коли ви пишете `\chapter{chapter title}` сайті `\chaptermark` команда також виконується, щоб вставити дані позначок, пов’язані з розділом, для подальшого створення верхніх колонтитулів сторінок.

#### Анатомія команд верхніх і нижніх колонтитулів на основі стилю сторінки

У цьому розділі досліджуються деякі основні команди/процеси LaTeX, що використовуються для створення верхніх та нижніх колонтитулів, спираючись на пояснення або поняття, наведені раніше в цій статті.

**«Модель» верхніх та нижніх колонтитулів у LaTeX**

Зміст (типових) верхніх та нижніх колонтитулів LaTeX ґрунтується на дворівневій ієрархії розділів документа: розділ «вищого рівня», що містить кілька розділів «нижчого рівня». Для класів book і article це означає:

* `**book**` **клас**: розділи «вищого рівня» створюються за допомогою `\chapter` команд, а розділи «нижчого рівня» — за допомогою `\section`, що відображає глави, які містять багато розділів.
* `**article**` **клас** (для двосторонніх документів): розділи «вищого рівня» створюються за допомогою `\section` команд, а «нижчого рівня» — за допомогою `\subsection`, що відображає кілька підрозділів у межах одного й того самого розділу.

LaTeX застосовує свою «модель» верхніх та нижніх колонтитулів через команди структурування розділів, які «вставляють» вузли позначок (через `\mark` команду), щоб зберігати дані, релевантні для створюваного розділу документа. Наприклад, щоразу, коли ви пишете `\section{*some section title*}` буде створено вузол позначки, що містить дані, які відображають `*some section title*` і номер розділу.

LaTeX використовує систему позначок, що містять дані у формі `{left}{right}`, що врешті-решт генеруються через `\mark` команди

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

вкладені в шари макросів, призначених приховати від користувачів низькорівневі деталі, які розглядаються в наступних розділах цієї статті.

#### Розглядаємо клас book

Коли `book.cls` файл завантажується, однією з його останніх дій є виконання `\pagestyle{headings}` яка встановлює стиль сторінки за замовчуванням на `headings`, тож ми розглянемо цей стиль сторінки докладніше.

Як [зазначено вище](#more-on-page-styles), функції/властивості `headings` стилю сторінки, реалізованого `book` класом, визначатимуться (внутрішньою) командою `\ps@headings` що міститься у файлі `book.cls`. Точне визначення `\ps@headings` залежить від того, чи документ односторонній, чи двосторонній (типово для `book` класу).

**«Команди позначок» і «дані позначок»**

Для двосторонніх документів, створених класом `book` визначення `\ps@headings` створює (визначає) дві «команди позначок»: `\chaptermark` та `\sectionmark` які створюють «дані позначок» у формі `{left}{right}`, для використання у верхніх та нижніх колонтитулах. Ці команди позначок відображають модель верхніх та нижніх колонтитулів LaTeX — на основі ієрархії розділів документа:

* команда розділу «вищого рівня» (тут, `\chapter`) використовується для надання «даних позначок» для заголовків лівих (парних) сторінок. Коли ви починаєте нову главу, написавши `\chapter{*chapter title*}`, `\chaptermark` викликається для створення «даних позначок», які відображають цю нову главу — містячи її `*chapter title*` і номер.
* команда розділу «нижчого рівня» (тут, `\section`) використовується для надання «даних позначки» для правих (непарних) сторінок. Коли ви пишете `\section{*section title*}` сайті `\sectionmark` буде викликано команду для створення «даних позначки», які відображають новий розділ — що містить його `*section title*` та номер. Будь-які дані позначки, надані попередньою `\chapter` не зазнають впливу від будь-яких наступних команд \section.

**\markboth та \markright**

Команди позначок LaTeX, специфічні для розділів, такі як `\chaptermark` та `\sectionmark`, використовують ще дві команди, що називаються `\markboth` та `\markright` які надають фактичні дані позначки для колонтитулів. `\markboth` та/або `\markright` можуть містити команди для стилізації тексту верхнього або нижнього колонтитула, наприклад для переведення його в верхній регістр.

Для документів, створених з використанням `book` типових налаштувань класу (двосторонній, `headings` стиль сторінки), команди, що генерують позначки, працюють так:

* `\chaptermark` генерує дані позначки, використовуючи `\markboth`
* `\sectionmark` генерує дані позначки `\markright`

`\markboth` та `\markright` є макросами, які зрештою використовують примітивну (вбудовану, низькорівневу) `\mark` команду для фактичного вставлення позначок, згенерованих усередині команд розбиття на розділи.

`\markboth` має форму

* **`\markboth{left}{right}`**: вставляє позначку (вузол), використовуючи `\mark{{left}{right}}` що призводить до вузла позначки, який містить пару значень у фігурних дужках `{left}{right}`.

`\markright` має форму

* **`\markright{newright}`**: вставляє позначку (вузол), використовуючи `\mark{{currentleft}{newright}}`; тобто змінює поточне значення `right` на `newright` але поточне значення `left` (тобто, `currentleft`) не змінюється, що призводить до вузла позначки, який містить пару значень у фігурних дужках `{currentleft}{newright}`.

Поведінка `\markboth` та `\markright` підтримують дворівневу ієрархію розділів, наприклад документ, що містить кілька розділів у кожній главі.

Як приклад для (двостороннього) `book` класу документа (із використанням стилю сторінки headings):

* `\chaptermark` використовує `\markboth` щоб установити:
  * a `{left}` поле, яке виводить CHAPTER . у верхньому регістрі.
  * поле {right}, яке є порожнім (`{}`)
* `\sectionmark` використовує `\markright` щоб установити `{right}` поле позначки для виведення., також у верхньому регістрі.

Щоб зрозуміти чому `\sectionmark` використовує `\markright` ми можемо помітити, що кожна нова `\section` команда повинна:

* вставити нову позначку, що містить дані для цього `\section` (наприклад, його назву та номер).
* але *не* впливати на значення даних позначки для поточного `\chapter` у якому ця конкретна `\section` команда з’являється

З цих причин `\section` команда викликає `\sectionmark` яка використовує `\markright` щоб створити `\section`пов’язану позначку: вона оновлює `{right}` поле даних позначки, але не впливає на поточне `{left}` значення поля даних позначки, яке було встановлене поточною `\chapter`.

Примітка: у вихідному коді LaTeX міститься застереження:

> Команди позначення працюють досить добре для правих позначок, «нумерованих усередині» лівих позначок — наприклад, ліва позначка змінюється командою \chapter, а права позначка змінюється командою \section. Однак це дає дещо аномальні результати, якщо 2 \markboth трапляються на одній сторінці.

**Команди для процедури виведення**

Функція `\ps@headings` команда реалізує визначення таких команд

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

які використовуються процедурою виведення для додавання верхніх і нижніх колонтитулів на завершальному етапі складання сторінки. Наприклад, `book.cls` встановлює `\@oddfoot` та `\@evenfoot` значення `\@empty`, яке визначено як `\def\@empty{}`, отже `\ps@headings` створює порожні нижні колонтитули на лівих і правих сторінках:

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

Верхні колонтитули визначено так:

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

де

* `\leftmark` витягує `{left}` значення з `{left}{right}` пари позначок
* `\rightmark` витягує `{right}` значення з `{left}{right}` пари позначок
* \thepage виводить поточний номер сторінки

По суті, ці реалізації `\@evenhead` та `\@oddhead` дають такі результати:

* `\@evenhead`: номер сторінки з’являється ліворуч у верхньому колонтитулі, а вміст `\leftmark`, оформлений командою шрифту `\slshape`, виводиться праворуч у верхньому колонтитулі — проміжний пробіл забезпечується дуже гнучкою `\hfil` клейового заповнення.
* `\@oddhead`: вміст `\rightmark`, оформлений командою шрифту `\slshape`, з’являється ліворуч у верхньому колонтитулі, а поточний номер сторінки виводиться праворуч у верхньому колонтитулі — знову ж таки, проміжний пробіл забезпечується `\hfil` клейового заповнення.

Однак залишається ключове запитання: *яка* `{left}{right}` пара позначок використовується `\leftmark` та `\rightmark`: іншими словами, звідки вони отримують свої значення даних позначки?

Як [зазначено вище](#filtering) але [пояснено нижче](#explainfiltering), під час завершальних етапів складання сторінки будь-які позначки, що містяться на сторінках документа, «фільтруються» й використовуються для встановлення значення трьох глобальних змінних позначок: `\botmark`, `\topmark` та `\firstmark`. Через [структуру позначок LaTeX](#latexs-model-of-headers-and-footers), кожна з цих 3 змінних позначок зрештою міститиме значення `{left}{right}` для деякої пари значень `{left}` та `{right}` і саме вони надають фактичні `{left}{right}` пару позначок (полів) для `\leftmark` та `\rightmark`:

* `\leftmark` витягує `left` значення з `{left}{right}` пари позначок (полів), наданої `\botmark`
* `\rightmark` витягує `right` значення з `{left}{right}` пари позначок, наданої `\firstmark`

Примітка `\markboth` та `\markright` можуть містити команди для стилізації тексту верхнього та нижнього колонтитулів — наприклад, переведення в верхній регістр.

### Приклади з використанням низькорівневих команд LaTeX

Наведені нижче приклади демонструють внесення змін до стилів сторінок або до верхніх і нижніх колонтитулів шляхом перевизначення деяких низькорівневих (внутрішніх) команд LaTeX, обговорених у цій статті (тих, що містять символ @). Ми не пропонуємо цей метод для зміни верхніх і нижніх колонтитулів, але він доступний тим, кому він потрібен (наприклад, авторам пакетів). Переважним рішенням для зміни верхніх і нижніх колонтитулів є використання [`fancyhdr` accents](https://ctan.org/pkg/fancyhdr?lang=en), яка обговорюється в [статті довідки Overleaf](/latex/uk/formatuvannya/02-headers-and-footers.md).

#### Визначення мінімального стилю сторінки

Наведений нижче приклад визначає новий, надзвичайно мінімальний стиль сторінки під назвою `demostyle` який використовує статичний текст для визначення верхніх і нижніх колонтитулів і не покладається на команди розбиття на розділи (`\chapter`, `\section` тощо) для встановлення вмісту верхнього та нижнього колонтитулів.

Приклад починається зі зміни коду категорії `@` символу @ на 11, щоб його можна було використовувати в назвах макросів.  `\ps@demostyle` команда реалізує наш мінімальний стиль сторінки шляхом перевизначення команд, що використовуються (у процедурі виведення) для створення верхніх і нижніх колонтитулів: `\@oddhead`, `\@oddfoot`, `\@evenhead` та `\@evenfoot`. Зверніть увагу на `twoside` параметр у нашій `\documentclass` декларації, яка використовує `article` клас.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Нижній колонтитул непарної сторінки\hfil}%
\renewcommand\@evenfoot{\hfil Нижній колонтитул парної сторінки\hfil}%
\renewcommand\@evenhead{\thepage\hfil Верхній колонтитул парної сторінки}%
\renewcommand\@oddhead{Верхній колонтитул непарної сторінки\hfil\thepage}
\catcode`@=12
\title{Демонстрація стилю сторінки}
\author{Overleaf}
\date{Серпень 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Вступ}
\newpage
\section{Більше матеріалу}
\end{document}
```

[Відкрити цей приклад в 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)

#### Зміна верхніх колонтитулів для класу book

Наведений нижче приклад змінює верхні колонтитули для класу book шляхом перевизначення `\@oddhead` та `\@evenhead` так, щоб у верхніх колонтитулах лівих і правих сторінок містилися поточний номер сторінки та назва глави. Зверніть увагу, як друга `\chapter` команда використовує необов’язковий короткий заголовок глави `[Короткий заголовок]` який тепер надає текст колонтитула замість довгої назви.

`\section` команди не впливають на вміст колонтитулів, оскільки наші перевизначення колонтитулів використовують лише `\leftmark` яка отримує відомості про поточну главу. Щоб отримати відомості про поточний розділ, нам потрібно було б використати `\rightmark` у визначенні `\@oddhead` та/або `\evenhead`.

```latex
\documentclass{book}
% NB: код категорії символу '@' тимчасово змінено на 11
% щоб дозволити його використання в назвах команд
\catcode `@=11
% Нехай \@oddfoot і \evenfoot будуть еквівалентні \@empty
% щоб зробити їх порожніми
\let\@oddfoot\empty\let\evenfoot\empty
% Перевизначимо \@oddhead і \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Використаємо зручно малий розмір сторінки
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Спогади користувача \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Це вступна частина, яка використовує римські цифри.
\mainmatter
\chapter{З чого мені почати?}
Глава 1: Коротка глава.
\newpage
\section{На початку...}
Розділ.
\chapter[Короткий заголовок]{Глава з дуже довгою назвою, що робить її непридатною для колонтитулів}
\newpage
\section{Ще один розділ}
З невеликим обсягом вмісту.
\newpage
\section{Що, ще один розділ?}
Також із невеликим обсягом вмісту.
\end{document}
```

[Відкрити цей приклад в 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)

#### Використання розширених команд позначок ε-TeX

Функція `book` клас використовує такі визначення `\@evenhead` та `\@oddhead` для створення верхніх колонтитулів:

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

де команди `\leftmark` та `\rightmark` визначено як

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

Використовуючи розширені команди ε-TeX і еквівалентність між класом позначок 0 у ε-TeX та оригінальними командами TeX, ми можемо:

* переписати `\leftmark` щоб замінити `\botmark` за допомогою `\botmarks0` еквівалентним, а
* переписати `\rightmark` щоб замінити `\firstmark` за допомогою `\firstmarks0` еквівалентним

Ці перевизначення дають

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

Зверніть увагу на використання `\\relax` щоб завершити пошук TeX наступних цифр — ви також можете замінити `\\relax` на пробіл, який слугуватиме завершувачем.

Наведений нижче приклад створює вивід, ідентичний оригінальним визначенням `\leftmark` та `\rightmark`.

```latex
\documentclass{book}
% Перевизначимо \leftmark і \rightmark, щоб використовувати
% \botmarks0 і \firstmarks0 відповідно
% NB: код категорії символу '@' тимчасово змінено на 11
% щоб дозволити його використання в назвах команд
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Використаємо зручно малий розмір сторінки
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Спогади користувача \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Це вступна частина, яка використовує римські цифри.
\mainmatter
\chapter{З чого мені почати?}
Глава 1: Коротка глава.
\newpage
\section{На початку...}
Розділ.
\newpage
Ще один розділ.
\end{document}
```

[Відкрити цей приклад в 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)

**Примітки щодо ε-TeX**

Як [ми зазначали вище](#etex), ε-TeX запроваджує `\marks` команди:

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

який розширює початкову `\mark` функцію рушія TeX Кнута і доступний у всіх трьох основних рушіях TeX: pdfTeX, LuaTeX і XeTeX.

Реалізація ε-TeX також запроваджує нові глобальні змінні позначок `\firstmarks n`, `\botmarks n` та `\topmarks n`: по одній для кожного класу `n`. Ці змінні позначок на основі класів визначаються [з використанням механізмів, описаних вище](#pre-output-checks-looking-for-mark-nodes), і всі вони можуть використовуватися під час створення верхніх і нижніх колонтитулів.

Ви можете використовувати будь-який із $$2^{15}$$ = 32768 класів позначок, від 0 до 32767, у межах перевизначень `\leftmark` або `\rightmark`. Це припускає, що ви надали (вставили) відповідні дані позначки для вибраного вами класу позначок, `n`, через `\marks n{{left}{right}}`.

Зверніть увагу, що LuaTeX надає $$2^{16}$$ = 65536 класів позначок, з `n` діапазоном від 0 до 65535.

**Приклад використання класу позначок 10**

Цей приклад демонструє використання класу позначок 10 (вибраного випадково) для створення колонтитулів документа. У зразку документа набрано 6 сторінок, які містять послідовність позначок, подану в [прикладі наприкінці цієї статті](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Аналіз цього прикладу покаже, чому рушій TeX вибрав певну позначку, $$\alpha$$, $$\beta$$, $$\gamma$$ та $$\delta$$, для використання в кожному з колонтитулів.

Почнімо з визначення допоміжного макроса, `\domark`, який використовує `\marks 10` для вставлення даних позначки, що відповідають конвенції LaTeX `{left}{right}` :

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

Позначки класу 10 стають доступними для механізму верхніх і нижніх колонтитулів LaTeX шляхом перевизначення `\leftmark` та `\rightmark`—із додаванням трохи додаткової інформації:

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

Після вставлення кількох позначок (класу 10) рушій TeX (тут pdfTeX) справно створює глобальні змінні позначок для класу 10 —`\botmarks10`, `\topmarks10` та `\firstsmarks10` яка `\leftmark` та `\rightmark` які використовуються для створення колонтитулів.

```latex
\documentclass{book}
% Коротка команда для використання позначок класу 10
% і дотримання структури позначок LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Перевизначимо \leftmark і \rightmark, щоб використовувати
% \botmarks10 і \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{Демонстрація розширених позначок \(\varepsilon\)-\TeX}
\author{Overleaf}
\date{Серпень 2022}
\begin{document}

Сторінка 1: Жодних позначок не додано, тож усі змінні позначок залишаються у своєму початковому стані: порожні (NULL).

\newpage
Сторінка 2: позначку $\alpha$ додано на цю сторінку через

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

\newpage
Сторінка 3: На цю сторінку не додано нових позначок.

\newpage
Сторінка 4: позначку $\beta$ та потім позначку $\gamma$ додано на цю сторінку через

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

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

\newpage
Сторінка 5: позначку $\delta$ додано на цю сторінку через

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

\newpage
Сторінка 6: На цю сторінку не додано позначок.
\end{document}
```

[Відкрити цей приклад в 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)

Наведена нижче графіка показує колонтитули, створені цим прикладом:

![Графіка, що показує вивід коду LaTeX із використанням розширених команд позначок ε-TeX](/files/fe1f4be65e0ef19a049e4fb1b967724d3a559e82)

* **Примітка**: Верхній колонтитул на сторінці 1 створюється в той момент, коли всі три змінні позначок для класу 10 —`\botmarks10`, `\topmarks10` та `\firstsmarks10`—порожні. У підсумку `\rightmark` (для сторінки 1) вставляє лише останній фрагмент верхнього колонтитула: `(via \texttt{\string\firstmarks10})`, як показано на графіці вище.

## Розгорнутий приклад, що показує, як рушії TeX визначають значення для \botmark, \topmark і \firstmark

![Db.gif](/files/578e0ae88e0c910a6fcfd70dfd64c73f34cef622)![Db.gif](/files/578e0ae88e0c910a6fcfd70dfd64c73f34cef622) Здається доречним відтворити використання Кнутом подвійних знаків «небезпечний поворот» (зображення надано [цим вебсайтом](http://www.truetex.com/db.htm)), оскільки матеріал є дещо низькорівневим і «зазирaє під капот» — хоча ми сподіваємося, що він може зацікавити сміливих читачів, які бажають зрозуміти ще кілька деталей.

Наведене нижче обговорення тісно ґрунтується на останньому прикладі на сторінці 258 із [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Тут ми відредагували й повторно набрали той приклад для тих, хто не має доступу до The TeXbook:

![Відредагована й повторно набрана версія прикладу зі сторінки 258 The TeXbook](/files/00de21a2ff1f2b2b0d389f79196d43fb3fa0b2cf)

Таблиця, подана на цій графіці, відтворена з тієї, що надав Кнут, але, як і в оригіналі, без пояснення того, як її було отримано. Тут ми це виправимо, щоб надати додаткові відомості, які показують, як ці значення `\botmark`, `\topmark` та `\firstmark` були визначені — для отримання цих відомостей довелося дослідити вихідний код рушія TeX!

Процес встановлення значень для `\botmark`, `\topmark` та `\firstmark` можна підсумувати у 3 коротких фрагментах псевдокоду, як показано на наведеній нижче діаграмі та в подальших поясненнях:

1. Перевірка перед вмістом
2. Цикл вмісту
3. Перевірка після вмісту

Примітка:

* Перевірки на кроці 1 «Перевірка перед вмістом» і кроці 3 «Перевірка після вмісту» виконуються один раз на сторінку.
* Крок 2 «Цикл вмісту» передбачає, що TeX сканує вміст сторінки в пошуках вузлів позначок і використовує їх для встановлення значень змінних позначок, як показано.

![Зображення, що показує псевдокодові версії коду, який використовується для встановлення значень трьох глобальних змінних позначок, що використовуються рушіями TeX](/files/5c983bd5c7332adba7e2b15e04c642b946d8f224)

Щоразу, коли TeX знаходить придатний розрив сторінки, він надсилає вміст цієї сторінки на фінальну обробку, виконуючи ці (три) кроки обробки позначок для кожної сторінки у вашому документі. Кроки обробки, позначені 1, 2 і 3, згадуються в кінцевій діаграмі в цьому розділі.

Зверніть увагу:

* до того, як буде оброблено першу сторінку, усі три глобальні змінні позначок `\botmark`, `\topmark` та `\firstmark` було ініціалізовано як порожні (NULL).
* кінцеві значення `\botmark`, `\topmark` та `\firstmark` визначені наприкінці *попередній* сторінки стають (вхідними) значеннями для обробки *поточного* сторінки — тієї, що обробляється.

Наведені нижче фрагменти коду є ***псевдокодом*** отриманим (узагальненим) із реального вихідного коду рушія TeX. Мета — подати стислий підсумок коду, який допомагає показати основні принципи.

**Крок 1: Перевірка перед вмістом** Перш ніж TeX перегляне фактичний вміст поточної сторінки, він перевіряє, чи поточне `\botmark` значення — тобто отримане з *попередній* сторінки — порожнє (NULL):

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

У цій перевірці, якщо `\botmark` (із *попередній* сторінки) є *не* порожнім:

* `\topmark` для *поточного* сторінки встановлюється *попередній* сторінки `\botmark` значення
* `\firstmark`, для *поточного* сторінки (що обробляється) встановлюється як порожнє (NULL): почніть цю сторінку, припускаючи, що немає `\mark` вузлів.

Зверніть увагу, що ця перевірка виконується *один раз* для кожної оброблюваної сторінки.

**Крок 2: Цикл вмісту** Далі TeX проходить по вмісту сторінки; частина цього циклу включає пошук `\mark` вузлів:

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

Цей тест застосовується до кожного вузла мітки, розташованого всередині (що міститься в) поточної сторінки. Попередній тест (Крок 1, вище) міг установити `\firstmark` у порожнє значення, тож найперший знайдений на поточній сторінці вузол мітки стає значенням `\firstmark` та `\botmark`. Будь-який *подальший* `\mark` вузол, виявлений під час виконання цього циклу, не змінить значення `\firstmark`, бо воно вже не порожнє (NULL), але `\botmark` оновлюється — адже саме для цього й призначено `\botmark`: щоб зберігати останній побачений `\mark` вузол для цієї сторінки.

**Крок 3: Перевірка після вмісту** Після того як він пройде циклом по вмісту сторінки, TeX застосовує такий остаточний тест, який також виконується один раз на сторінку:

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

* Якщо `\topmark` не порожнє (NULL), ми знаємо з Кроку 1, що `\botmark` для попередньої сторінки не було порожнім (NULL).
* Якщо `\firstmark` все ще порожнє, тоді ми не бачили жодних `\mark` вузлів, бо тест у Кроці 2 не спрацював; отже, `\firstmark` встановлюється у значення `\topmark` яке також є значенням `\botmark` з попередньої сторінки.

Після послідовного застосування цих трьох кроків до всіх 6 сторінок нашого прикладу значення `\botmark`, `\topmark` та `\firstmark` виводяться за переходами, показаними на діаграмі нижче, де:

* світло-блакитні заокруглені прямокутники — це кінцеві значення змінної мітки для кожної сторінки
* світло-сірі заокруглені квадрати представляють проміжні значення, що виникають під час обробки
* стрілки з підписами позначають зміни значень змінної мітки відповідно до кроків 1, 2 або 3 на діаграмі вище — або значення не було змінено жодним із кроків; підписано «без змін».

Наведена нижче діаграма показує, як три фрагменти псевдокоду генерують кінцеві значення `\botmark`, `\topmark` та `\firstmark` перелічені в таблиці на сторінці 258 The TeXbook.

![Діаграма переходів, що супроводжує приклад зі сторінки 258 The TeXbook, показує внутрішні переходи, коли глобальним змінним міток присвоюються їхні значення](/files/4ae5d61e3e6816681f7d1da39b600d02fe2a361c)


---

# 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/uk/dokladni-statti/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.
