> 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/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md).

# Як працює \expandafter: вступ до токенів TeX

[Частина 1](/latex/uk/dokladni-statti/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Частина 2](/latex/uk/dokladni-statti/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Частина 3](/latex/uk/dokladni-statti/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Частина 4](/latex/uk/dokladni-statti/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Частина 5](/latex/uk/dokladni-statti/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Частина 6](/latex/uk/dokladni-statti/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## Передумови до \expandafter: токени TeX і списки токенів

Як перший крок до розуміння того, як `\expandafter` насправді працює, розгляньмо два компоненти TeX, які є фундаментальними для роботи `\expandafter`: токени TeX (цілі числа) та списки токенів (списки цілих чисел). Читачам, які хотіли б дослідити ці теми значно детальніше, може бути цікаво прочитати такі статті, опубліковані Overleaf:

* [Що таке токен TeX?](/latex/uk/dokladni-statti/53-what-is-a-tex-token.md)
* [Що таке список токенів TeX?](/latex/uk/dokladni-statti/54-what-is-a-tex-token-list.md)-[Як насправді працюють макроси TeX?](/latex/uk/inshi-temi/01-a-six-part-series-how-do-tex-macros-actually-work.md)

### Звідки взялися дані про токени?

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

## TeX Tokens 101 (і поняття розгортання)

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

## Як TeX обчислює значення токенів

Тут ми розглядаємо обчислення токенів, які використовуються в оригінальному TeX Кнута, e-TeX і pdfTeX; для інших рушіїв TeX, особливо XeTeX і LuaTeX, їхні обчислення токенів мають дещо відрізнятися, щоб урахувати використання Unicode, але методи обчислення подібні до описаних нижче.

### Токени символів (неактивні символи)

Обчислення значень токенів для неактивних символів є простим:

$$\text{character token} = 256\times \text{(category code)} + \text{character (ASCII) code}$$

**Приклад**: Літера A з [код категорії](/latex/uk/inshi-temi/43-table-of-tex-category-codes.md) 11, кодом символу 65 подається TeX як значення токена символу $$256\times 11 + 65 = 2881$$.

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

### Токени команд

Обробка вводу і генерація токенів у TeX розпізнають два типи команд:

* команди, побудовані з одного або кількох символів, що мають категорійний код 11;
* односимвольні команди, у яких категорійний код цього символу не дорівнює 11: наприклад `\$` або `\#`.

В обох випадках TeX не враховує початковий `\` символ і використовує код символу кожного з решти символів для обчислення цілого числа, яке TeX називає `curcs` (**поточ**ний **c**керувальн **ність**ою послідовністю). Потім TeX використовує значення `curcs` для обчислення значення токена для команди.

#### Команди, утворені з символів із категорійним кодом 11

Припустімо, що наша команда (без початкового `\` символу) складається з послідовності символів: $$\mathrm{C\_1C\_2C\_3...C\_N}$$ де $$\mathrm{C}\_i$$ є кодом символу для кожного символу — наприклад, код символу A дорівнює 65. TeX використовує всі коди символів $$\mathrm{C}\_i$$ для обчислення цілого числа `curcs` (використовуючи [хеш-функцію](https://en.wikipedia.org/wiki/Hash_function)). Після того як TeX обчислив значення `curcs` він просто додає 4095 до цього значення, щоб отримати значення токена:

$$\text{command token} = \text{curcs + 4095}$$

Зверніть увагу, що змінна `curcs` відіграє надзвичайно важливу роль у внутрішній обробці TeX.

#### Односимвольні команди

Токени, що представляють такі команди, як `\$`, `\#` тощо, обчислюються дещо інакше: ціле число `curcs` тепер обчислюється простіше:

$$\text{curcs} = 257 + \text{character (ASCII) code}$$

Наприклад, за `\$`, $$\text{curcs}=257 + 36 = 293$$. TeX знову додає 4095 до цього значення (використовуючи $$\text{command token} = \text{curcs} + 4095$$), у результаті `\$` має значення токена $$293 + 4095 = 4388$$.

Порівняно з командами, складеними зі символів із категорійним кодом 11, єдина різниця тут полягає в тому, як TeX обчислює значення для `curcs`.

**Примітка**: ціле число `curcs` не обчислюється для токенів символів: коли TeX створює токени символів або працює з ними, його завжди встановлюють у 0.

#### Токени активних символів

TeX має поняття так званих *активних символів*: будь-який символ, якому призначено категорійний код 13. Токени для цього особливого класу символів обчислюються інакше, ніж звичайні символи.

Механізм активних символів дає TeX змогу створювати фактично макроси з одного символу, які можна використовувати *без* без необхідності ставити перед активним символом символ екранування (зазвичай `\`): ізольований символ запускає свою макроповедінку. Класичний приклад — символ тильди (\~), який TeX/LaTeX використовують для нерозривних пробілів і який можна визначити/увімкнути так:

```
\catcode`~=13 %призначаємо категорійний код 13 символу ~
\def~{\penalty100000\ } % визначаємо ~ як макрос
```

Коли TeX згодом читає `~` символ, він виявить, що його категорійний код дорівнює 13, і обробить його як «мінімакрос». Щоб обчислити токен, який представляє активний символ, TeX застосовує іншу варіацію обчислення `curcs`:

$$\begin{align\*} \text{curcs} &= \text{character code} + 1\ \text{active character token} &= \text{curcs} + 4095\ \end{align\*}$$

Наприклад, символ \~ має код символу 126, тобто його подання у вигляді значення токена активного символу обчислюється так:

$$\begin{align\*} \text{curcs} &= 126 + 1\ \text{active character token} &= 127 + 4095\ &=4222\ \end{align\*}$$

Зверніть увагу, що, як і команди, токени, що представляють активні символи, мають значення > 4095.

### Наслідки/примітки

* Будь-який токен, значення якого перевищує 4095, одразу можна ідентифікувати як токен команди — отже, TeX дуже легко може визначити, чи представляє певний токен символ або команду.
* Для будь-якого значення токена TeX може, коли це потрібно, «розпакувати» цей токен, щоб показати символ (і його категорійний код) або команду, які спочатку були присутні у вашому `.tex` файлі, збережені у визначенні макроса або містилися в якомусь іншому списку токенів.
* Проміжна величина, що називається `curcs`—яку TeX використовує для обчислення значень токенів команд — відіграє важливу роль у низькорівневій обробці TeX. `curcs` виконує роль «індексного значення», яке TeX використовує для збереження/пошуку поточного значення команди. Для будь-якого токена команди, $$\mathrm{T}$$, TeX просто віднімає 4095, щоб отримати доступ до значення `curcs`: $$\text{curcs} = \mathrm{T}-4095$$

До речі, TeX справді зберігає зрозумілий для людини ряд символів, з яких генерується токен команди — це необхідно для повідомлень про помилки та інших команд, таких як `\string` чия розгортка є зрозумілою для людини версією значення токена. Однак ті зрозумілі для людини рядки символів, що зберігаються всередині TeX, використовуються/виводяться лише на запит: для всієї іншої обробки використовується ціле значення токена.

## Розгляньмо деякі справжні токени

Щоб трохи зняти непрозорість поняття токенів, визначмо такий простий макрос і подивімося на токени, які створює TeX:

```
\def\hello{Вітаємо від \TeX. \hskip 10pt}
```

Для `\hello` макроса TeX використовує символи `h`, `e`, `l`, `l`, `o` для обчислення значення 3745 для `curcs`; потім TeX додає 4095, щоб створити значення токена $$3745 + 4095 = 7840$$ (для TeX Кнута, e-TeX або pdfTeX).

Після створення токена для представлення `\hello`, а `\def` команда змушує TeX прочитати наступні токени й використати їх для створення списку токенів, який зберігається як *визначенням* цього `\hello` команда. `\hello` команду.

Збережене визначення (список токенів) потім можна отримати щоразу, коли ви наказуєте TeX використати `\hello` У наведеній нижче таблиці перелічено фактичні значення токенів, створені для кожного елемента (символа, макроса або примітива), що міститься у [зв’язаний список](https://en.wikipedia.org/wiki/Linked_list)). Читачам, які хочуть детальніше зрозуміти списки токенів, варто звернутися до статті Overleaf [Що таке список токенів TeX?](/latex/uk/dokladni-statti/54-what-is-a-tex-token-list.md)

|                         |                           |
| ----------------------- | ------------------------- |
| **Значення токена TeX** | **Представлений елемент** |
| 2887                    | G                         |
| 2930                    | r                         |
| 2917                    | e                         |
| 2917                    | e                         |
| 2932                    | t                         |
| 2921                    | i                         |
| 2926                    | n                         |
| 2919                    | g                         |
| 2931                    | ність                     |
| 3116                    | ,                         |
| 2592                    |                           |
| 2918                    | f                         |
| 2930                    | r                         |
| 2927                    | o                         |
| 2925                    | m                         |
| 2592                    |                           |
| 5235                    | \TeX                      |
| 3118                    | .                         |
| 2592                    |                           |
| 7943                    | \hskip                    |
| 3121                    | 1                         |
| 3120                    | 0                         |
| 2928                    | p                         |
| 2932                    | t                         |

У наведеному вище списку токенів символи мають категорійні коди 10, 11 або 12. Наприклад:

* символи мають категорійний код 10 і код символу 32, що дає значення токена $$256\times 10 + 32 = 2592$$
* `,` та `.` мають категорійний код 12 і коди символів 44 та 46 відповідно, що дає токени:
* токен для `,` $$= 256 \times 12 + 44 = 3116$$
* токен для `.` $$= 256\times 12+ 46 = 3118$$

Щоразу, коли TeX згодом натрапляє на значення токена 7840 (що позначає `\hello`), він може, якщо потрібно, «розпакувати» цей токен, щоб витягти `curcs` за простою формулою $$\text{curcs} = \text{token value} - 4095$$ (див. вище). Використовуючи значення `curcs` TeX може звернутися до своїх внутрішніх таблиць даних, щоб визначити, що токен команди 7840 представляє макрокоманду. Крім того, знову через `curcs`TeX може також знайти й отримати збережене визначення `\hello`.

Коли TeX потрібно повністю обробити токен 7840, тобто виконати `\hello` макрос, йому вже не потрібен токен 7840: цей токен *виконав свою роботу*—тобто він змусив TeX запустити макрос `\hello`. TeX тепер може відкинути токен 7840 і отримати токени, які представляють визначення (список токенів), збережене в пам’яті. По суті, `\hello` макрокоманда (токен 7840) була *видалена* з поточного джерела введення TeX і *замінена* токенами, що містяться у визначенні `\hello`. Щойно ми описали одну форму *розгортання токенів*.

Функція `\TeX` команди (значення токена 5235, наведене вище), що використовується в `\hello` сам по собі є макросом, побудованим із більшої кількості токенів — тож його визначення також зберігається як список токенів:

|                         |                           |
| ----------------------- | ------------------------- |
| **Значення токена TeX** | **Представлений елемент** |
| 2900                    | T                         |
| 19598                   | \kern                     |
| 3117                    | -                         |
| 3118                    | .                         |
| 3121                    | 1                         |
| 3126                    | 6                         |
| 3126                    | 6                         |
| 3127                    | 7                         |
| 2917                    | e                         |
| 2925                    | m                         |
| 19597                   | \lower                    |
| 3118                    | .                         |
| 3125                    | 5                         |
| 2917                    | e                         |
| 2936                    | x                         |
| 6175                    | \hbox                     |
| 379                     | {                         |
| 2885                    | E                         |
| 637                     | }                         |
| 19598                   | \kern                     |
| 3117                    | -                         |
| 3118                    | .                         |
| 3121                    | 1                         |
| 3122                    | 2                         |
| 3125                    | 5                         |
| 2917                    | e                         |
| 2925                    | m                         |
| 2904                    | X                         |

Якби ми замінили `\hello` команду повним списком токенів, з яких вона побудована, включно з `\TeX` макросом, це був би досить довгий список — тобто якщо ми також *розгорнули* сайті `\TeX` макрос, ми б побачили:

![Список токенів, збережений у макросі TeX](/files/9779006086d80f74105401506d226648f599c7de)

По суті, одне значення токена 7840 (для `\hello`) при повному розгортанні дасть усього 51 токен (ціле число), що представляє символи та примітивні команди. У наведеному нижче списку символ або команда, що представлена кожним токеном, подається в дужках «(...)» — вони не зберігаються безпосередньо у списках токенів TeX і наведені для зручності читача:

```
2887 (G), 2930 (r), 2917 (e), 2917 (e), 2932 (t), 2921 (i), 2926 (n), 2919 (g), 2931 (s), 3116 (,), 2592 (<пробіл>), 2918 (f), 2930 (r), 2927 (o), 2925 (m), 2592 (<пробіл>),  2900 (T), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3126 (6), 3126 (6), 3127 (7), 2917 (e), 2925 (m), 19597 (\lower), 3118 (.), 3125 (5), 2917 (e), 2936 (x), 6175 (\hbox), 379 ({), 2885 (E), 637 (}), 19598 (\kern), 3117 (-), 3118 (.), 3121 (1), 3122 (2), 3125 (5), 2917 (e), 2925 (m), 2904 (X), 3118 (.), 2592 (<пробіл>), 7943 (\hskip), 3121 (1), 3120 (0), 2928 (p), 2932 (t)
```

Для людини це лише ряд цілих чисел, але для TeX воно кодує дуже багато інформації.

## Читай токени зараз і збережи їх на потім

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

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

### Збереження токенів за допомогою регістрів токенів

Інший приклад зберігання токенів — це явне створення списків токенів, які зберігаються в так званих *регістрах токенів*: спеціальні внутрішні області зберігання, які TeX надає користувачам для збереження списків токенів. Примітив TeX `\toksdef` є одним зі способів використання регістрів токенів; наприклад, щоб використати регістр токенів `100` і звертатися до нього за допомогою команди `\mylist`:

```
        \toksdef\mylist=100
        \mylist={якісь \TeX{} токени тут}
```

`\mylist` по суті, лише ім’я, яке ви призначаєте списку токенів, збереженому в регістрі з номером `100`. Подібно до визначення макроса, `\mylist` містить такий список токенів:

|                         |                           |
| ----------------------- | ------------------------- |
| **Значення токена TeX** | **Представлений елемент** |
| 2931                    | ність                     |
| 2927                    | o                         |
| 2925                    | m                         |
| 2917                    | e                         |
| 2592                    |                           |
| 5235                    | \TeX                      |
| 379                     | {                         |
| 637                     | }                         |
| 2592                    |                           |
| 2932                    | t                         |
| 2927                    | o                         |
| 2923                    | k                         |
| 2917                    | e                         |
| 2926                    | n                         |
| 2931                    | ність                     |
| 2592                    |                           |
| 2920                    | h                         |
| 2917                    | e                         |
| 2930                    | r                         |
| 2917                    | e                         |

**Примітка**: щоб завершити `\TeX` макрос і не дати йому поглинути наступний `<space>` символ, ми використали пару фігурних дужок `{}` одразу після `\TeX`—токени для `{` (379) і `}` (637) зберігаються у списку токенів. Інший варіант — використовувати токен «керуючий пробіл» `\<space>` який би з’являвся в списку токенів, як показано нижче (жирним):

|                         |                           |
| ----------------------- | ------------------------- |
| **Значення токена TeX** | **Представлений елемент** |
| 2931                    | ність                     |
| 2927                    | o                         |
| 2925                    | m                         |
| 2917                    | e                         |
| 2592                    |                           |
| 5235                    | \TeX                      |
| **4384**                | **\\**                    |
| 2932                    | t                         |
| 2927                    | o                         |
| 2923                    | k                         |
| 2917                    | e                         |
| 2926                    | n                         |
| 2931                    | ність                     |
| 2592                    |                           |
| 2920                    | h                         |
| 2917                    | e                         |
| 2930                    | r                         |
| 2917                    | e                         |

Зауважте, що `<space>` символ представлено як *токеном символу* зі значенням $$256\times 10 + 32 = 2592$$ але `\﻿<space>` розглядається як односимвольна *токен команди* (значення 4384), яке обчислюється за наведеними вище формулами:

\begin{align\*} \text{curcs} & = 257 + \text{код символу (ASCII)}\\\ & = 257 + 32\\\ &=289\\\ \text{токен команди для} \left<\text{\\\space}\right> & = \text{curcs + 4095}\\\ & = 289+4095\\\ &=4384\\\ \end{align\*}

По суті `\mylist={якісь \TeX{} токени тут}` каже TeX: будь ласка, проскануй мій вхідний файл, щоб перетворити такі символи/команди на токени й зберегти їх для подальшого використання. TeX це виконає і збереже ці токени в адресі пам’яті, до якої ви можете звернутися, написавши `\the\mylist`, наказуючи TeX вставити копію токенів, що містяться в регістрі токенів `\mylist`. Рушії TeX містять низку примітивних команд, які явно створюють і зберігають списки токенів — наприклад `\everyjob`, `\everypar`, `\mark`, і багато інших.

[Частина 1](/latex/uk/dokladni-statti/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Частина 2](/latex/uk/dokladni-statti/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Частина 3](/latex/uk/dokladni-statti/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Частина 4](/latex/uk/dokladni-statti/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Частина 5](/latex/uk/dokladni-statti/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Частина 6](/latex/uk/dokladni-statti/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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://overleaf-pro.ayaka.space/latex/uk/dokladni-statti/19-how-does-expandafter-work-an-introduction-to-tex-tokens.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.
