> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/uk/inshi-temi/19-how-tex-macros-actually-work-part-1.md).

# Як насправді працюють макроси TeX: частина 1

[Частина 1](/latex/uk/inshi-temi/19-how-tex-macros-actually-work-part-1.md) [Частина 2](/latex/uk/inshi-temi/20-how-tex-macros-actually-work-part-2.md) [Частина 3](/latex/uk/inshi-temi/21-how-tex-macros-actually-work-part-3.md) [Частина 4](/latex/uk/inshi-temi/22-how-tex-macros-actually-work-part-4.md) [Частина 5](/latex/uk/inshi-temi/23-how-tex-macros-actually-work-part-5.md) [Частина 6](/latex/uk/inshi-temi/24-how-tex-macros-actually-work-part-6.md)

## Вступ: цілі цієї серії

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

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

### Мова програмування TeX: знайоме відчуття?

Не буде надто суворо описати мову програмування TeX як дещо загадкову, бо так і є — принаймні за стандартами більшості сучасних поширених мов програмування. Коли ви починаєте свій шлях до глибшого вивчення TeX/LaTeX, особливо якщо хочете писати нетривіальні макроси, ви швидко стикаєтеся з такими поняттями, як коди категорій, токени/токенізація та «розгортання» команд або макросів. Такий потік понять, ймовірно, буде зовсім незнайомим і, можливо, змусить вас почуватися спантеличено, а інколи й трохи роздратовано, оскільки ваш шлях до успіху не завжди полегшують майже непрозорі повідомлення про помилки TeX/LaTeX.

## Отже, з чого почати? Із кодів категорій.

Ядра TeX належать до класу програмного забезпечення, що називається [компіляторами](https://en.wikipedia.org/wiki/Compiler): програмами, які приймають файл, записаний у *вхідній* мові, і *компілюють* (перетворюють) його на вихідний файл, записаний у *цільовій* мові. Точніше, TeX є *компілятором документів*. Для ядер TeX (компіляторів) вхідний файл записаний мовою верстки TeX, а ціллю є вихідний файл, записаний іншою «мовою», такою як [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) або PDF — хоча ми тут трохи вільно використовуємо поняття «мова».

Розгляньмо докладніше вихідну, або вхідну, «мову», яку використовують для написання вашого файла TeX. Файл `.tex` — це, зрештою, одна довга послідовність символів (включно зі символами розриву рядка): вона складається з тексту, призначеного для верстки, перемішаного з `\`, `}`, `$`, `[` та всілякими символами, які можуть з’являтися в, здавалося б, майже нескінченній кількості комбінацій. Той, хто не користується TeX/LaTeX, може подивитися на типовий `.tex` файл і вибачливо сприйняти його як доволі заплутану мішанину символів із малою, якщо взагалі помітною, структурою файла. Пакет макросів LaTeX, безумовно, певною мірою «накладає» на вхідний .tex-файл певну базову структуру. Однак, між `\begin{document}` та `\end{document}` це вже залежить від автора документа, що саме туди потрапить. Якщо ви подивитеся на `.tex` файли, написані за допомогою оригінального пакета макросів Plain TeX Кнута, ви побачите, що структура документа майже повністю відсутня.

Отже, загалом вхідний файл TeX може здаватися доволі безструктурним, наче довільною сумішшю вмісту для верстки, перемішаного з інструкціями (командами), які спрямовують верстку цього вмісту. Як TeX взагалі може зрозуміти типовий `.tex` вхідний файл: як відфільтрувати цей потік символів, щоб перетворити його на придатні до виконання інструкції для механізму верстки та вміст, який потрібно верстати?

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

Будь-який людський спостерігач, який нічого не знає про TeX, може подивитися на `.tex` файл і впізнати певні символи, такі як `$` та знати, що це знак валюти, або побачити `&` і визначити його як амперсанд. Такий спостерігач робить висновок про *форму* для кожного символу, який він бачить, — значення, засноване на ролі, яку цей символ відіграє в людському спілкуванні. Крім того, він може побачити символи, такі як `a`, `e`, `або` і знати, що вони класифікуються як голосні, тоді як інші, такі як `b`, `c` або `d` класифікуються як приголосні. Як люди, ми маємо своєрідну вбудовану таблицю пошуку (у нашій пам’яті), через яку надаємо значення кожному символу, який бачимо, — значення, засноване на ролі, яку цей символ виконує в мовах, якими ми можемо спілкуватися.

Щоб обробити `.tex` файл, програмне забезпечення TeX також має подивитися на кожен символ у вашому вхідному потоці, і воно також повинно призначити *форму* значення

кожному символу, який воно «бачить». Однак TeX — це лише програмна машина, яка займається обробкою тексту, збереженого як послідовність цілих чисел (кодів символів) у вхідному файлі. Як машина, TeX має бути запрограмований відповідними даними, які вказують йому, як визначити значення символу, на який він «дивиться», і що далі з ним робити. Як TeX цього досягає? *Відповідь — одне з тих понять, притаманних лише TeX:* коди категорій, `.tex` яких є 16, від 0 до 15. З точки зору TeX, кожен символ, який він коли-небудь очікує побачити у *код категорії* файлі, має так званий *заздалегідь* призначений йому. Усередині програмного забезпечення TeX є своєрідна «таблиця пошуку», у якій перелічено код категорії *форму* поточний

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

У таблиці нижче перелічено ці 16 кодів категорій: що кожен із них означає разом із прикладами символів, які зазвичай відносять до кожної категорії.

| **Код категорії** | **Опис**                                                              | **Стандартний LATEX/TEX**                                                     |
| ----------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| 0                 | Символ екранування — наказує TEX почати шукати команду                | `\`                                                                           |
| 1                 | Почати групу                                                          | {                                                                             |
| 2                 | Завершити групу                                                       | }                                                                             |
| 3                 | Математичний зсув — перемикання в/з математичного режиму              | $                                                                             |
| 4                 | Табулятор вирівнювання                                                | &                                                                             |
| 5                 | Кінець рядка                                                          | ASCII-код 13 (`\\r`)                                                          |
| 6                 | Параметр макроса                                                      | #                                                                             |
| 7                 | Верхній індекс — для набору математичних формул: `$y=x^2$` $$y=x^2$$  | ˆ                                                                             |
| 8                 | Нижній індекс — для набору математичних формул: `$y=x_2$` $$y=x\_2$$  | \_                                                                            |
| 9                 | Ігнорований символ                                                    | ASCII 0 `<нуль>`                                                              |
| 10                | Пробіл                                                                | ASCII-коди 32 (пробіл) і 9 (символ табуляції)                                 |
| 11                | Літера                                                                | A...Z, a...z, (і тисячі символів Unicode)                                     |
| 12                | Інше                                                                  | 0...9, а також ,.;?" і багато інших                                           |
| 13                | Активний символ                                                       | Спеціальний код категорії для створення макросів з одного символу, таких як ˜ |
| 14                | Символ коментаря — ігнорує все, що йде далі, до кінця рядка           | %                                                                             |
| 15                | Недопустимий символ, не дозволяється з’являтися у вхідному файлі .tex | ASCII-код 127 (`DEL`)                                                         |

Використання кодів категорій — це основний механізм TeX для фільтрування потоку символів, що надходить, і для осмислення вашого вводу, щоб визначити:

* символи, які складають текст, що буде верстатися;
* розділення вмісту, який має верстатися як математика;
* послідовності символів, що є назвами команд, які треба опрацювати або виконати;
* … та багато інших операцій верстки.

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

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

Коли ваше ядро TeX запускається («[завантажується](https://en.wikipedia.org/wiki/Bootstrapping)») воно використовуватиме набір стандартних призначень символів кодам категорій, але через `\catcode` команду ці стандартні значення можуть бути змінені основним кодом LaTeX (макросами) та/або пакетами LaTeX, які ви завантажили — або ж вашим власним кодом TeX чи макросами. Однак з часом і завдяки традиції/використанню певні символи, призначені конкретним кодам категорій, стали прийнятими як «стандарти», і дотримання цих стандартів, безумовно, бажане, якщо ви хочете, щоб ваші документи були переносними та легко поширювалися серед колег чи інших користувачів. Наприклад, символ `\` призначений коду категорії 0, щоб позначати початок команди TeX/LaTeX — див. [таблиця вище](#tbl-0).

### Читання (сканування) вхідних даних

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

Припустімо, що у нас є .tex-файл, який містить текст `Привіт, світ \jobname` десь усередині абзацу. Якщо ми заглянемо всередину `.tex` файла за допомогою [шістнадцяткового редактора](https://en.wikipedia.org/wiki/Hex_editor), ми побачимо, що послідовність символів `Привіт, світ \jobname` у нашому `.tex` файлі — це просто ряд цілих чисел, або *коди символів*, показані на знімку екрана нижче як шістнадцяткова послідовність:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Шістнадцяткові коди символів у файлі TeX](/files/e1953e934aa348f7eabe74f6e7457fc63aa140a2)

Якщо ми переведемо з шістнадцяткової системи (основа 16) у десяткову (основа 10), послідовність кодів символів буде такою:

![Десяткові коди символів у файлі TeX](/files/f4795853a66332ea6e3aa28739722f55c89ed22b)

Ми також знаємо, що для TeX кожен символ має відповідний код категорії; тож, спираючись на [таблиця вище](#tbl-0) ми знаємо, що, ймовірно, також використовуються такі стандартні призначення кодів категорій:

![Коди категорій TeX](/files/184e3a390b697d874b6c62e4d8b73febde5102ac)

Отже, для TeX кожен символ у вхідному файлі представлений *два* числовими значеннями — його кодом символу та кодом категорії:

![Коди символів і відповідні коди категорій TeX](/files/ec22ef69d5c5dffb915587c7dd6a366fcc6c9e55)

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

## Частина 2

У частині 2 ми докладніше розглянемо, як TeX читає ваші вхідні дані: удаючи з себе «очі» TeX, коли він дивиться на ваш ввід символ за символом.

[Частина 1](/latex/uk/inshi-temi/19-how-tex-macros-actually-work-part-1.md) [Частина 2](/latex/uk/inshi-temi/20-how-tex-macros-actually-work-part-2.md) [Частина 3](/latex/uk/inshi-temi/21-how-tex-macros-actually-work-part-3.md) [Частина 4](/latex/uk/inshi-temi/22-how-tex-macros-actually-work-part-4.md) [Частина 5](/latex/uk/inshi-temi/23-how-tex-macros-actually-work-part-5.md) [Частина 6](/latex/uk/inshi-temi/24-how-tex-macros-actually-work-part-6.md)


---

# 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://ayakaleaf-pro.ayaka.space/latex/uk/inshi-temi/19-how-tex-macros-actually-work-part-1.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.
