> 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/20-how-tex-macros-actually-work-part-2.md).

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

[Частина 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)

## Вступ: історія в картинках

Як зазначалося в Частині 1, TeX має «прочитати» кожен символ у вашому `.tex` файлі, і цей процес читання точніше називають *скануванням*. Традиційно процес введення TeX (сканування) уподібнюють тому, ніби TeX має «очі», якими спостерігає за введенням, тож ми використаємо цю перевірену часом аналогію в наведених нижче графіках.

### Графіка 1: Очі готові

Припустімо, що TeX отримав деяке введення з `.tex` файлу й ось-ось оброблятиме наш рядок символів `Привіт, світ \jobname` що міститься в абзаці тексту. Він перевірятиме кожен символ по черзі та розглядатиме його код категорії.

![Очі TeX готові сканувати рядок тексту](/files/7416a6d7f0090ef266ce23810c43cbafe9b2deaf)

### Графіка 2: Обробка кодів категорій

У наступній графіці ми бачимо в загальних рисах (докладніше нижче), як TeX реагує на кілька різних кодів категорій. Зауважте, що всього є 16 кодів категорій, але для простоти ми показуємо використання лише трьох: 11, 10 і 0. Інші коди символів стають важливими під час процесів верстання TeX, таких як побудова таблиць, набір математичних формул і розпізнавання параметрів макросів.

![Реакція TeX на кілька різних кодів категорій](/files/a01fb95e7c83614bea1e62af12747aa0cefcfe11)

#### Примітки до графіки 2

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

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

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

* **(червоні очі)** Тут TeX спостеріг символ, який має дуже важливий код категорії: 0 (символ керування).

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

* багатолітерні команди, які називаються *керівних слів*: символ, що безпосередньо йде після символу керування, має код категорії 11. Усі наступні символи, що мають код категорії 11, вважаються частиною назви команди. TeX припинить пошук символів, які є частиною назви команди, коли виявить будь-який символ, який *не* має код категорії 11 — наприклад, символ пробілу з кодом категорії 10.
* однолітерні команди, які називаються *символами керування*: символ, що безпосередньо слідує за символом керування *не* має код категорії 11.

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

### Графіка 3: Обробка коду категорії 11 («літери»)

У Частині 1 цієї серії ми зазначали, що кожен символ, який TeX читає зі свого введення, описується двома цілими числами:

* код символу: ціле число, що визначає числове представлення символу;
* код категорії: значення від 0 до 15, яке TeX призначає кожному символу, що може з’явитися у його введенні.

TeX використовує ці дві частини інформації на наступному етапі своєї обробки: створенні токенів символів.

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

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

![TeX обробляє символи з кодом категорії 11](/files/367ef0a3ba1e975b2875d17a2de36003033b8164)

Графіка 5 нижче покаже, що робить TeX, коли бачить символ з кодом категорії 0 (символ керування).

#### Примітки до Графіки 3: Обробка коду категорії 11 («літера»)

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

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

**Обчислення токенів символів**

Системи TeX використовують просту формулу для обчислення токена символу, $$T$$, для символу з кодом категорії $$C$$ і кодом символу $$A$$:

$$T = \text{constant} \times C + A$$

8-бітні системи, такі як pdfTeX, використовують:

$$T = 256\times C + A$$

Системи, що підтримують Unicode, такі як XeTeX або LuaTeX, змушені використовувати іншу формулу, оскільки в Unicode коди символів можуть бути значно більшими за максимальне значення 255 у старішому світі 8-бітного кодування ASCII. Наприклад, XeTeX використовує:

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

Ще раз варто зазначити, що символи з кодом категорії 0 не перетворюються на токени символів: код категорії 0 має особливе місце у фільтрації введення TeX і використовується лише як «перемикач», щоб перевести TeX у спеціальний режим сканування наступних кількох символів. Це розглядається у Графіці 5.

### Графіка 4: Обробка коду категорії 10 («роздільник»)

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

![TeX обробляє символи з кодом категорії 10](/files/988cffecc7f4e6a41f9fc8a596022aa4a045865d)

Поведінка TeX щодо пробілів може здаватися досить своєрідною, але гарний огляд можна знайти в розділах 1 і 2 [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) Віктора Ейкхаута — ви можете [завантажити безкоштовну PDF-копію](https://bitbucket.org/VictorEijkhout/tex-by-topic) на його вебсайті.

Наприклад, коли TeX бачить символ із кодом категорії 10, бувають випадки, коли TeX:

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

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

### Графіка 5а: Обробка коду категорії 0 («символ керування»)

У цій графіці TeX обробив усі символи до `\` символу, який має код категорії 0: «символу керування» — ми використаємо подальшу послідовність графік, щоб показати, як TeX обробляє символ керування та визначає назву команди.

![TeX обробляє символи з кодом категорії 0](/files/a6b5c150f86b00b618b72b59c7f5470abd3131d4)

### Графіка 5b: Пошук назви команди

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

![TeX шукає назву команди](/files/afe8abaf0d87f68642a58a9556277d8182ebc7fe)

**Примітки до Графіки 5b**

* Після розпізнавання символ керування виконав свою роботу: він спрацював як перемикач і не бере участі в подальшій обробці — зокрема, він **не** перетворюється на токен символу.
* Для зручності ми повторимо деякі деталі, згадані раніше. Після того як TeX бачить символ керування, він перевіряє код категорії символу, що йде *безпосередньо після нього*; це тому, що TeX розпізнає два типи команд:
* * багатолітерні команди, які називаються *керівних слів*: символ, що безпосередньо йде після символу керування, має код категорії 11. Усі наступні символи, що мають код категорії 11, вважаються такими, що утворюють назву команди (*керівне слово*). TeX припинить шукати символи, що утворюють частину назви команди, коли виявить будь-який символ, який *не* має код категорії 11 — наприклад, символ пробілу з кодом категорії 10.
  * однолітерні команди, які називаються *символами керування*: символ, що безпосередньо слідує за символом керування *не* має код категорії 11.
* У нашому прикладі перший символ після `\` є `j` (код категорії 11), що підказує TeX шукати команду, яка є (потенційно) багатолітерною послідовністю символів із кодом категорії 11.
* TeX продовжує перевіряти наявність інших символів, що мають код категорії 11. Щойно він виявляє символ із будь-яким іншим кодом категорії, наприклад пробіл із кодом категорії 10, TeX розуміє, що досяг кінця назви команди. Щоб ще раз підкреслити: тут саме символ пробілу (код категорії 10) «завершив» команду, але це міг бути будь-який символ, який **не** має код категорії 11.

## Частина 3

У Частині 3 ми продовжимо з Графіки 5b, щоб завершити цю частину історії — як 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/20-how-tex-macros-actually-work-part-2.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.
