> 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/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# Як працює \expandafter: значення розгортання

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

## Вступ до поняття «розгортання» у TeX

Розглянувши [токени TeX і списки токенів](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true), далі в нашому списку базових тем для `\expandafter` є поняттям TeX про *розширення*: основний процес TeX `\expandafter` призначений для роботи з.

### Про складність пояснення розгортання...

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

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

### Ключові моменти про токени TeX

Упродовж наступного обговорення важливо пам’ятати, що TeX може отримувати свій наступний елемент введення з двох джерел:

1. **фізичні текстові файли**: генеруючи *нові токени* шляхом читання/сканування символів і команд у цих файлах, або
2. **списках токенів**: отримуючи вхідні дані, читаючи зі списку наявних, *заздалегідь підготовлених*, токенів, що зберігаються в пам’яті TeX.

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

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

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

* для *токени команд* (значення токена > 4095): обчислити `curcs` через $$\text{curcs}=\text{token value}-4095$$ і використати `curcs` для пошуку інформації про команду;
* для *токени символів* (значення токена < 4095): розбити токен символу на його складову пару (код символу, код категорії).

### На початку...

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

### Поняття «розгортних» команд

Усі програми верстки на основі TeX («рушії» TeX) розуміють два основні «класи» команд:

* команди, вбудовані безпосередньо у виконуваний рушій: так звані *примітивів*;
* команди, визначені користувачем: так звані *макросів*.

Рушії TeX також використовують «бути розгортним», тобто один із видів поведінки команди, як механізм класифікації всіх команд на дві групи:

* розгортні команди;
* нерозгортні команди.

Тож можна вважати, що набір усіх команд (примітиви плюс макроси) можна класифікувати, як показано на наведеній нижче схемі:

![Схема, що показує класифікацію всіх команд TeX](/files/eb4c048e9812fc0bf08a4449e060e0da829f47ca)

Хоча ми ще не знаємо, що насправді означає розгортання/розгортний, видно, що:

* усі макроси класифікуються як розгортні команди;
* деякі примітивні (вбудовані) команди також класифікуються як розгортні (переважна більшість — ні).

**Примітка про активні символи**: Окрім примітивів і макросів, існує третій клас «розгортного» елемента: активні символи — будь-які символи, яким призначено код категорії 13, також вважаються «розгортними», оскільки вони обробляються як «мініатюрні макроси».

#### Як TeX дізнається, чи є команда «розгортною»?

З нашого [обговорення токенів TeX](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) ми знаємо, що токени — це не що інше, як цілі числа, які TeX обчислює та використовує, щоб «упаковувати» інформацію про елемент введення: символ або команду. Ми також зазначили, що, маючи будь-яке значення токена (цілого числа), TeX може, якщо/коли потрібно, обернути процес токенізації, щоб «розпакувати» токен і виявити дані про команду чи символ, який він представляє.

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

![Схема, що показує, як TeX упаковує/розпаковує токени](/files/400310331ad3dce382e35aeb052dd3a0b7bf7634)

### Коди команд

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

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

Ось кілька прикладів кодів команд:

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` (та інші) — усі класифікуються як команди «створення коробок» і мають спільний код команди 20;
* `\def`, `\edef`, `\gdef`, `\xdef` усі є командами «визначення макросів» і мають спільний код команди 97;
* усі макроси класифікуються одним із кодів команди 111, 112, 113 або 114: різні коди команд визначаються використанням `\long` або `\outer` під час визначення макроса:
* 111: код команди для не-long, не-outer макроса (напр., `\def\foo{...}`)
* 112: код команди для long, не-outer макроса (напр., `\long\def\foo{...}`)
* 113: код команди для не-long, outer макроса (напр., `\outer\def\foo{...}`)
* 114: код команди для long, outer макроса (напр., `\long\outer\def\foo{...}`)

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

* *нерозширюваних* команди (переважна більшість) мають код команди <= 100
* *розгортні* команди мають код команди > 100

Отже, якщо TeX шукає відомості про певну команду і виявляє код команди > 100, TeX одразу знає, що вона розгортна. Усі макроси та невелика кількість примітивів (вбудованих команд) мають призначений код команди, що вказує, що вони розгортні: але навіщо TeX взагалі перейматися цією класифікацією «розгортний»? Як ви, можливо, підозрюєте, це просто означає, що ці команди дещо «особливі»; тобто вони можуть підлягати процесові TeX із *розширення*.

**Примітка (символи)**: Якщо символ не визначено як активний (код категорії 13), усі символи є нерозгортними. Активні символи можна вважати однолітерними «міні-макросами».

## Так, так, але що таке розгортання???

Ми зазначили, що значення токенів, більші за 4095, використовуються для позначення команд; отже, TeX може, якщо/коли потрібно, «розпакувати» цей токен, щоб отримати доступ до інформації про команду TeX, яку цей токен представляє. TeX може знайти значення коду команди цієї команди, щоб визначити, чи належить вона до особливої категорії розгортних. Але що TeX робить із цією інформацією і що означає «бути розгортним», тобто розгортання, *насправді означає*?

### Розгортання: Загальний термін для набору операцій

У певні моменти під час обробки TeX йому потрібно знати, чи представляє токен розгортну команду:

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

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

Потрібно практики й досвіду, щоб знати, коли TeX виконує, а коли не виконує розгортання токенів — на сторінці 215 The TeXbook перелічено ситуації, у яких розгортні токени не розгортаються. Реальність така, що процес виконання розгортання в TeX є складним і тонким.

#### Які команди є розгортними?

Якщо поглянути на список примітивних (вбудованих) команд, які рушії TeX класифікують як розгортні (напр., сторінки 212–215 The TeXbook), стає очевидно, що на практиці розгортання — це радше загальний термін, яким TeX описує поведінку дещо еклектичної групи команд. Результати розгортання певної (розгортної) команди справді різняться, і це можна побачити, перелічивши набір розгортних команд, згрупованих за їхньою функціональністю. Точна семантика окремих команд тут не є важливою; найбільше цікавлять загальні наслідки їхніх дій — те, що їхнє розгортання насправді *робить або досягає*.

| **Команда**                                                                                                                                                                                                                                                                                                                                                                                                                                                                | **Опис**                                                                                                                                                                   | **Поведінка розгортання**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>усі макроси</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                              | Збережена послідовність токенів команд/символів                                                                                                                            | <p>По суті, розгортання макроса означає вставлення списку токенів для читання TeX. Це включає:</p><ul><li>створення списків токенів для будь-яких аргументів макроса — цей процес включає ідентифікацію/поглинання роздільників-токенів;</li><li>отримання списку збережених токенів (визначення макроса) і підготовку до вставлення (у визначення макроса) параметричних токенів, створених на першому кроці.</li></ul><p>Фактично розгортання макроса <em>видаляє токен макроса</em> з вхідних даних і <em>замінює його</em> токенами, що містяться у визначенні.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | Змінює порядок розгортання                                                                                                                                                 | Фільтрування/перемішування токенів                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | Запобігти розгортанню (так, що дивно, це класифікується як розгортна команда)                                                                                              | Відкласти розгортання (щось на кшталт фільтрування токенів)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | Пов’язано з введенням нового джерела токенів через вихідні файли — так, `\scantokens` у цій категорії через використання так званих «псевдофайлів»                         | Виступати джерелом нових токенів                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | Почати умовний вираз                                                                                                                                                       | Почати «фільтрування» токенів: вирішувати, які з наступних токенів обробляти.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | Завершити умовний вираз                                                                                                                                                    | Зупинити «фільтрування» токенів: вирішувати, які токени обробляти                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | Сконструювати/згенерувати токен команди                                                                                                                                    | Перетворити послідовність токенів на один токен команди                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | Перетворити щось на послідовність токенів                                                                                                                                  | Згенерувати деякі токени (що представляють внутрішню кількість або значення)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` має різні застосування, зокрема вставлення токенів; `\detokenize` перетворює список токенів на список токенів символів; `\unexpanded` запобігає розгортанню токенів | Вставити/згенерувати деякі токени або керувати розгортанням                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | Команди для доступу до списків токенів, які мають спеціалізоване використання                                                                                              | Отримати доступ до джерела збережених токенів (списків токенів)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |

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

* генерація токенів
* вставлення токенів
* фільтрування токенів
* зміна/керування розгортанням наступного токена

### І нарешті: що означає розгортання?

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

## Розгортання та структура TeX

Можна стверджувати, що найкращий спосіб побачити, як/де TeX розрізняє розгортні й нерозгортні команди, — це подивитися на вихідний код TeX.

Внутрішньо TeX — це надзвичайно складний програмний продукт; отже, намагатися повністю описати безліч нюансованих поведінок, притаманних роботі TeX, недоцільно. Як зазначалося, коли саме або де саме TeX фактично виконуватиме розгортання під час читання токенів — «дещо складне» питання; отже, наведене нижче обговорення припускає, що TeX перебуває в стані, який вимагає виконання розгортання. Ситуації, коли TeX читав би/створював токени, але не виконував розгортання, включають створення/збереження токенів для `\def` команди визначення макроса або збереження токенів у `\toks` реєстрі.

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

![](/files/fb087e865ab4855a72a57a22a64cd93059000162)

### Пояснення схеми структури TeX

Загалом обробка TeX керується функцією під назвою `maincontrol()` яку в вихідному коді TeX Кнут називає «головним виконавчим механізмом» і описує так:

> «Тепер ми переходимо до `maincontrol` — рутини, яка містить головний перемикач, що змушує всі різні частини TeX робити своє, у правильному порядку… це велика кульмінація програми… Ми тепер у центрі павутини, у центральній нервовій системі, яка торкається більшості інших частин і пов’язує їх між собою.»

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

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

### Розуміння maincontrol()

Функція `maincontrol()` функція містить великий так званий [оператор switch](https://en.wikipedia.org/wiki/Switch_statement)— Кнут називає його «великим перемикачем» — який TeX використовує для виконання всіх *нерозширюваних* примітивних команд: тих, що мають код команди <=100.

Щоб виконати певну команду (або символ), цей оператор «великого перемикача» використовує комбінацію поточного режиму TeX:

* внутрішній/зовнішній вертикальний режим, або
* обмежений/абзацний горизонтальний режим, або
* рядковий/відображуваний математичний режим

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

|                                    |                                          |                     |
| ---------------------------------- | ---------------------------------------- | ------------------- |
| **Режим**                          | **Значення**                             | **Значення режиму** |
| Зовнішній вертикальний             | Між абзацами (побудова сторінок)         | 1                   |
| Внутрішній вертикальний            | Безпосередньо всередині `\vbox{...}`     | -1                  |
| Горизонтальний                     | Під час набору/побудови абзаців          | 102                 |
| Обмежений горизонтальний           | Безпосередньо всередині `\hbox{...}`     | -102                |
| Математичний для відображення      | Набір *відображувальному* рівнянь/формул | 203                 |
| Рядковий (формульний) математичний | Набір *вбудованому* рівнянь/формул       | -203                |

Зверніть увагу на використання від’ємних значень для доповнення різних режимів, наприклад внутрішнього проти зовнішнього вертикального режиму. Під час обробки команд у `maincontrol()`Під час обробки команд у $$102 + 11 = 113$$ у своєму «великому перемикачі», щоб перейти до коду, який обробляє ці символи в будь-якому горизонтальному режимі (побудова абзаців або всередині `\hbox`).

#### Отримання наступного токена

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

Декілька нотаток про `getnext()` та `getxtoken()`:

* **`getnext()`**: це основна функція введення TeX. Вона читає та обробляє символи, введені з фізичного файла, або читає токени зі списку токенів. Зауважте, що `getnext()` насправді не обчислює значення токенів, але встановлює низку ключових *глобальних* змінних (наприклад, код команди та `curcs`) які згодом використовуються в обробці.
* **`getxtoken()`**: «get expanded token» використовує `getnext()` для читання наступного елемента введення. Потім вона перевіряє код команди щойно прочитаного елемента, щоб з’ясувати, чи представляє цей елемент розгортну команду: якщо так, його розгортають або викликають макрос. Для нерозгортних елементів `getxtoken()` обчислює значення токена, і ці відомості передаються до наступного етапу обробки: «великого перемикача», де виконуються нерозгортні примітиви та набираються символи.

По суті, саме через `getxtoken()` усі розгортні елементи «відфільтровуються» перед тим, як вони обробляються в `maincontrol()`: це призводить до того, що «великий перемикач» TeX обробляє лише нерозгортні примітивні команди.

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

* коли TeX шукає (сканує) числові значення, він запускає розгортання у пошуку цілих чисел (викликаючи `getxtoken()`) ;
* примітивну команду `\romannumeral` спричиняє розгортання — див. статтю [Розгортання за допомогою `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) для нюансованого використання цього факту;
* Функція `\edef` команда визначення макроса («розгорнуте визначення») примушує до повного розгортання;
* TeX розгортає токени в певні моменти під час обробки преамбули `\halign` або `\valign` (обидві команди пов’язані з алгоритмами табличного набору 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)


---

# 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/22-how-does-expandafter-work-the-meaning-of-expansion.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.
