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

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

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

## Вступ та огляд

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

### Можливе додаткове тло для читання

Overleaf уже опублікував дві статті, пов’язані з токенами, які надають додаткову довідкову інформацію про токени TeX і списки токенів TeX. Будь ласка, знайдіть час, щоб ознайомитися з ними, якщо вам потрібно заповнити будь-які прогалини у своєму розумінні й отримати максимум від Частин 5 і 6 цієї серії.

* [Що таке «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 виявляє команду створення макроса (`\def`, `\edef`, `\gdef` або `\xdef`) у вхідному потоці, він запускає процес, який перетворює обидві секції `<parameter text><replacement text>` нашого визначення макроса в один довгий список токенів — але дуже особливий тип списку токенів.

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

### Коротко про те, як зберігаються списки токенів: вузли

Для зберігання списку токенів (цілих значень) TeX використовує структуру даних, яка називається [зв'язаний список](https://en.wikipedia.org/wiki/Linked_list), який у випадку TeX складається зі списку так званих *вузлів*. Вузол можна уявити як невеликий блок комп'ютерної пам'яті, який можна використати для зберігання набору елементів даних. Щоб зберігати макрос, ці вузли з'єднуються в ланцюг, де кожен вузол (ланка в ланцюзі) може зберігати кілька фрагментів інформації — зокрема значення токена та адресу пам'яті наступного вузла в списку. Для подальшої інформації ви можете прочитати статтю [Що таке список токенів TeX](/latex/uk/dokladni-statti/54-what-is-a-tex-token-list.md) але наступна діаграма підсумовує ключові особливості макроса, збереженого як список токенів:

![Діаграма списку токенів макроса TeX, збереженого як список вузлів зі зв'язаними вузлами](/files/34a18313c30e7da2f3fd201b5352f009966fa708)

### Нагадування: 4 частини визначення макроса

Як обговорювалося в Частині 4, структуру будь-якого макроса можна записати так:

```
<TeX macro primitive><macro name><parameter text>{<replacement text>}
```

де:

* `<TeX macro primitive>` = одна з `\def`, `\edef`, `\gdef` або `\xdef`;
* `<macro name>`=назва вашого макроса, наприклад `\foo`;
* `<parameter text>` може бути «порожнім» (відсутнім) або може бути рядком токенів-роздільників і токенів параметрів макроса;
* `<replacement text>` є фактичним тілом вашого макроса: секцією, яка «виконується», коли ви викликаєте макрос.

**ПРИМІТКА**: (Як також зазначалося в Частині 4) упродовж усього обговорення ми припускаємо, що `<macro name>` за ним буде пробіл із кодом категорії 10, який виконуватиме роль роздільника для завершення `<macro name>`. Ми *не* явно не показали цей символ пробілу в нашому тексті/обговоренні, але припускаємо, що він є. Якщо бути точним, ми мали б подати це приблизно так:

```
<TeX macro primitive><macro name><space><parameter text>{<replacement text>}
```

Однак ми пропустимо явне включення `<пробіл>` символу й неявно припускатимемо його наявність.

**ПРИМІТКА**: Символи `{` та `}` *не* стають частиною списку токенів макроса: їхня мета лише вказати вхідному сканеру TeX (який створює токени), де `<replacement text>` починається і закінчується.

Коли TeX визначає макрос, секції `<parameter text><replacement text>` перетворюються на один довгий безперервний список токенів — загальна кількість токенів у цьому списку залежить від складності макроса. Як ми бачили, секція має спеціальне призначення: вона слугує як «шаблон токенів» або «креслення», яке TeX використовує, щоб виділити токени, що утворюють аргументи (значення) для використання з фактичним макросом: тобто токени, які подаються в `<replacement text>`.

Щоб закріпити ці ідеї, візьмімо приклад макроса, але зробімо його коротким, щоб наступні діаграми не ставали надто перевантаженими:

```
\def\foo A#1\fake{123 #1}
```

Для нашого макроса, `\foo`

* `<parameter text>` = `A#1\fake`
* `<replacement text>` = `123 #1`

Хоча цей приклад є простим макросом, він містить усі потрібні нам для дослідження особливості.

Як зазначалося, TeX перетворить `<parameter text><replacement text>` у один довгий список токенів, який ви можете побачити на діаграмі нижче. У нашому прикладі токени, утворені з `A#1\fake{123 #1}` були перетворені на послідовну послідовність токенів, збережених у списку токенів (як зв'язаний список вузлів).

## Зображення, що показує реальний список токенів макроса

Наступна діаграма, що показує, як макрос `\def\foo A#1\fake{123 #1}` зберігається, використовує реальні дані зсередини рушія TeX. Вона була створена за допомогою [налаштованої версії TeX Кнута](/latex/uk/dokladni-statti/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) яка була модифікована додатковим кодом, щоб перехоплювати виклики макросів, досліджувати внутрішні дані TeX і експортувати їх у форматі для обробки за допомогою програми з відкритим кодом для роботи з графікою під назвою [Graphviz](https://www.graphviz.org/).

Ви можете завантажити наведену нижче графіку як [PDF-файл](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 КБ) або [SVG-файл](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 МБ).

![Діаграма анотованого списку токенів TeX](/files/133540174e52e812e69f26232cf1f2544a541bcc)

#### Розуміння вузлів

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

![Значення next node та current node](/files/6ad19dbf5c825db62d4346450977716c04975264)

#### Повернімося до прикладу

На діаграмі вузлів список токенів, утворений з `A#1\fake{123 #1}` містить кілька «спеціальних токенів», запроваджених на початку цієї статті. Крім того, список вузлів, що представляє наш макрос, починається зі «спеціального першого вузла»: ми розглянемо, що це таке і що вони роблять.

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

![Вузол лічильника посилань є першим у списку токенів](/files/e37c773b8463d2c35d621dfc26462da9f33037d4)

Перший токен `<parameter text>` зберігається у вузлі, що безпосередньо слідує за лічильником посилань: ви можете бачити, що це токен, який представляє літеру `Скопійований` з кодом категорії 11. З обговорень у Частинах 2 і 3 ми знаємо, що символьний токен обчислюється за допомогою

$$\text{token value}=256\times \text{category code} + \text{character code}$$

яка, для літери `Скопійований` з кодом категорії 11, є

$$\text{token value}=256\times 11 + 65$$

що дає значення 2881, як показано у вузлі.

#### «Команда» \fake, використана в \foo

У нашому визначенні макроса `\def\foo A#1\fake{123 #1}` одним із роздільників є *невизначений* команду `\fake` який зберігається в списку токенів як частина `<parameter text>` секції. Як ви бачите, у загальному списку токенів макроса `\fake` є токен, значення якого дорівнює `19491`—цілочисельне значення, обчислене TeX за формулою, обговореною в Частині 3. Коли TeX намагається виконати `\foo` він очікуватиме знайти `\fake` значення токена наприкінці `<parameter text>` секції. TeX *не* спробує виконати `\fake` команду, оскільки її роль полягає лише в тому, щоб забезпечити форму «пунктуації» в межах `<parameter text>` «шаблону токенів».

![Використання токена команди як роздільника макроса](/files/dd80f43c479f0b5eb47ca45bb979e7d3dd7a0e0b)

#### Спеціальні токени у списку токенів

**Токен «завершення зіставлення»**

Під час виклику макроса першим завданням TeX є просканувати макрос у тому вигляді, як його набрав користувач, і порівняти токени, наявні в `<parameter text>` секції користувача, з токенами, що містяться в шаблоні `<parameter text>` збереженому в пам'яті (створеному в момент визначення макроса). Оскільки повне визначення макроса, побудоване з `<parameter text><replacement text>` зберігається як один довгий послідовний список токенів, TeX потрібно знати, де в цьому списку токенів `<parameter text>` *закінчується* і де `<replacement text>` *починається*. Щоб цього досягти, коли TeX визначає макрос (створює список токенів), він вставляє спеціальний токен-термінатор, який називається **токеном «завершення зіставлення»** як останній токен у наборі токенів, згенерованих із `<parameter text>`. **токеном «завершення зіставлення»** цей токен не може бути згенерований командами користувача; створити його може лише сам TeX, отже TeX напевно виявить кінець `<parameter text>`.

![Показ токена завершення зіставлення у списку токенів TeX](/files/3e0ff9fb77081260665ccbe13b4f7d3147be74bb)

Тут ми бачимо, що перший токен після **токеном «завершення зіставлення»** є токеном, що представляє цифру `1` з кодом категорії 12. Це й слід очікувати, тому що `<replacement text>` для нашого макроса `\foo` є `123 #1`—тобто він починається з токена, що представляє цифру `1` (з кодом категорії 12).

З обговорення в Частинах 2 і 3 ми знаємо, що символьний токен обчислюється за допомогою

$$\text{token value}=256\times \text{category code} + \text{character code}$$

яка, для цифри `1` з кодом категорії 12, є

$$\text{token value}=256\times 12 + 49$$

що дає значення токена 3121, як показано у вузлі.

**токени «match parameter»**

Коли TeX зберігає визначення макроса, він перетворює будь-які токени параметрів (`#1`, `#2`… `#9`) у межах `<parameter text>` на один, який називається **токеном match parameter** токен. Ці токени повідомляють TeX, що йому потрібно почати шукати токени у виклику макроса користувача, які є аргументами макроса.

![Показ токена match parameter у списку токенів TeX](/files/a9bd3a268cebd774bf5a309ab35ac1d0421392d2)

### Спеціальні токени у списку токенів

#### токени «output parameter»

Коли TeX усе обробив і готовий фактично запускати (розгортати) макрос, токени **output parameter** повідомляють TeX про місця всередині `<replacement text>` де йому потрібно підставити токени, що представляють аргументи, надані користувачем під час виклику макроса. Фактично: «У цьому місці вставте токени, що представляють аргумент користувача n, де n=1...9».

У `<replacement text>` секції збереженого списку токенів визначення макроса буде **output parameter** токен, що відповідає кожному `#1`, `#2`... `#9` наявному в оригінальному визначенні.

![Показ токена output parameter у списку токенів TeX](/files/039befa19b61474dc44ea1e7485c3f4ab18e1a15)

Якщо ми подивимося на наше визначення `\foo` (`\def\foo A#1\fake{123 #1}`) ми бачимо, що є лише 1 параметр макроса (`#1`) у `<parameter text>` (`A#1\fake`) і, відповідно, лише 1 параметр макроса (`#1`) з'являється в `<replacement text>` (`123 #1`): це призводить лише до 1 **output parameter** токена, наявного в списку токенів, що представляє `<replacement text>`.

Зверніть увагу на таке в списку вузлів, що представляє `\foo`’s `<replacement text>`:

* токен безпосередньо перед **output parameter** токеном представляє символ пробілу (код категорії 10, код символу 32), тому що між `123` і параметром макроса (`#1`) в оригінальному визначенні `\foo`;
* сайті **output parameter** є останнім токеном у списку:  **наступний вузол** має спеціальне значення «null» (тобто «порожній»), яке використовується для завершення списку: після **output parameter** немає більше вузлів, оскільки це останній токен, що позначає кінець `<replacement text>` а отже й кінець визначення макроса.

## Частина 6

У Частині 6 ми використовуємо детальну графіку, щоб пояснити й дослідити точне значення розгортання макроса та наслідки токенізації аргументів макроса в TeX перед їх подачею в макроса `<replacement text>`.

[Частина 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/23-how-tex-macros-actually-work-part-5.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.
