> 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/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.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 і того, як вони обчислюються;
* принципи процесу розгортання TeX;
* використання/створення TeX тимчасових списків токенів під час обробки документа;
* як TeX використовує і «жонглює» кількома джерелами введення (включно з тимчасовими списками токенів).

У цій статті ми зведемо ці теми/поняття разом, щоб пояснити механізми, що лежать в основі TeX `\expandafter` команди: коротко, як вона працює.

## Отже, до \expandafter

Ідея, що стоїть за `\expandafter` полягає в тому, щоб примусово розгорнути команду (токен) раніше, ніж TeX зробив би це зазвичай. За наявності двох токенів, $$\mathrm{T\_1}$$ та $$\mathrm{T\_2}$$ дія `\expandafter` $$\mathrm{T\_1T\_2}$$ призводить до того, що TeX обробляє $$\mathrm{T\_1}\text{<}$$розгортання $$\mathrm{T\_2}\text{>}$$, де $$\text{<}\dots\text{>}$$ позначає список токенів. TeX розгортає $$\mathrm{T\_2}$$ заздалегідь, щоб токен $$\mathrm{T\_1}$$ (наприклад, примітив або макрос) може побачити або використати токени, що виникають унаслідок розгортання $$\mathrm{T\_2}$$. Якщо токен $$\mathrm{T\_2}$$ позначає нерозгортаний елемент, такий як неактивний символ або (більшість) примітивів, дія `\expandafter` нічого не змінює: TeX продовжив би обробляти токени $$\mathrm{T\_1T\_2}$$ звичайним способом.

### Вступ до використання \expandafter

Якщо ви не користувалися `\expandafter`, ось приклад його використання з примітивом `\uppercase{...}`. Припустімо, ми хотіли б набрати ім’я нашого головного `.tex` вхідного файла, але великими літерами. Нам можуть бути відомі такі примітивні команди TeX:

* `\uppercase`: робить те, що підказує назва, — перетворює символічні токени на відповідні їм великі літери (де це можливо);
* `\jobname`: як ми вже бачили, розгортається, повертаючи ім’я головного `.tex` файлі.

Якщо наш файл TeX називається `mycode.tex` ми могли б обґрунтовано очікувати `\uppercase{\jobname}` щоб було набрано `MYCODE`. Але ні, воно набирає `mycode` малими літерами. Що пішло «не так»?

Якщо записати загальне використання `\uppercase` як

```
\uppercase{<token list>}
```

можна сказати, що `\uppercase` переглядає `<token list>` і працюватиме (змінюватиме регістр) лише з *символьними токенами* які він знаходить у `<token list>`: усі нетекстові токени *ігноруються* тому що `\uppercase` не буде «заглядати всередину» (розгортати) нетекстові токени, щоб побачити, що вони містять або що означають. Оскільки токен — це просто ціле числове значення, усе, що `\uppercase` має зробити, — це переглянути список токенів і перевірити, чи числове значення кожного токена в `<token list>` потрапляє в діапазон значень, що позначають символьний токен. До речі, `\uppercase` також *змінить регістр активних символів* щоб створити активний символ у верхньому регістрі, який, оскільки він і далі активний, також має бути визначений; інакше TeX згенерує помилку: `Невизначена керувальна послідовність`, але ми відволіклися...

Наприклад, навіть якщо ми визначимо макрос, який є просто текстом

```
\def\foo{some lower-case text}
```

то `\uppercase{\foo}` все одно набирає `деякий текст малими літерами` а не `ДЕЯКИЙ ТЕКСТ МАЛИМИ ЛІТЕРАМИ` як ми й сподівалися, просто тому, що дія `\uppercase` не намагається визначити, що `\foo` означає: він бачить `\foo` як командний токен і ігнорує його, як він робив це з `\jobname`.

### Як це виправити? На допомогу приходить \expandafter

Щоб набрати версію імені файла у верхньому регістрі, нам потрібно змінити `\uppercase{\jobname}` шляхом примусового замінювання TeX `\jobname` його розгортанням (послідовністю символьних токенів) *до того, як* `\uppercase` почне працювати. Знову ж таки, розгортання використовується, щоб прибрати `\jobname` токен (команду) і замінити його результатом його розгортання (списком токенів, що містить символьні токени). Отже, якщо ми запишемо

```
\uppercase\expandafter{\jobname}
```

тоді це працює: `MYCODE` було б набрано. Відбувається ось що: TeX починає обробляти `\uppercase` і відразу перевіряє наявність обов’язкового символу відкривної фігурної дужки (`{`); однак TeX виявляє `\expandafter` команду, яка змушує його тимчасово «переключити увагу» на обробку `\expandafter{\jobname}`.

Якщо порівняти

`\expandafter` $$\mathrm{T\_1T\_2}$$

з нашим прикладом

`\expandafter{\jobname}`

ми можемо побачити

* $$\mathrm{T\_1} =\space$$`{`<sub>токен</sub>
* $$\mathrm{T\_2} =\space$$`\jobname`<sub>токен</sub>

Де `{`<sub>токен</sub> та `\jobname`<sub>токен</sub> посилатися на значення токенів, обчислені TeX, — нижній індекс <sub>токен</sub> використовується, щоб нагадати нам, що TeX працює у світі цілих токенів.

Запис `\uppercase\expandafter{\jobname}` працює тому, що в загальних рисах (деталі далі), `\expandafter` змушує TeX виконати такі дії:

1. прочитати й зберегти відкривну `{`<sub>токен</sub>;
2. прочитати наступний токен: `\jobname`<sub>токен</sub>. TeX розпізнає, що `\jobname`<sub>токен</sub> позначає команду, що розгортається, і розгортає її. `\jobname`<sub>токен</sub> замінюється своїм розгортанням — серією символьних токенів;
3. після розгортання `\jobname` команди TeX повертає `{`$$\_\mathrm{token}$$ «назад у введення» і використовує список токенів, що виник під час розгортання `\jobname` щоб TeX прочитав `\uppercase{`<sub>токен</sub>`<expansion of \jobname>`<sub>список токенів (символи)</sub>`}`, і це дає потрібний нам результат.

Наведена нижче діаграма показує, як TeX обробляє `\uppercase\expandafter{\jobname}`— читайте схему знизу вгору, щоб простежити потік процесу.

![Як працює \expandafter](/files/cad2a9e87daacd3d05e24b5770b22058b548439b)

Наведені нижче примітки пояснюють різні етапи обробки.

1. TeX починає обробляти `\uppercase` і перевіряє наявність обов’язкового символу відкривної фігурної дужки (`{`) але виявляє `\expandafter` команду.
2. Якщо порівняти `\expandafter` $$\mathrm{T\_1T\_2}$$ у нашому введенні `\expandafter{\jobname}` ми можемо побачити $$\mathrm{T\_1} =$$`{`<sub>токен</sub> та $$\mathrm{T\_2} =$$`\jobname`<sub>токен</sub>. Зауважте, що тут ми використовуватимемо нижній індекс <sub>токен</sub> щоб показати, що TeX обробляє цілі значення токенів.
3. `\expandafter` читає, а потім тимчасово зберігає `{`<sub>токен</sub> зберігаючи це ціле значення токена у внутрішній змінній. Пізніше TeX знову вставить цей токен у введення після обробки `\jobname` команду.
4. `\expandafter` читає наступний токен, `\jobname`<sub>токен</sub>і розгортає `\jobname` команду.
5. Розгортання `\jobname` створює тимчасовий список токенів, що містить послідовність символьних токенів, які представляють `.tex` ім’я файла. Зауважте, що всі символьні токени, згенеровані `\jobname` обчислюються з використанням коду категорії 12.
6. Після того як `\jobname` було розгорнуто, TeX повторно вставляє токен, збережений на кроці 3 (`{`<sub>токен</sub>) і повертає його у введення. TeX робить це, створюючи ще один список токенів, що містить *один* `{`<sub>токен</sub>
7. TeX тепер завершив обробку `\expandafter`, унаслідок чого маємо два списки токенів, готові до використання як джерела введення TeX. Тепер TeX повертається до обробки `\uppercase` але налаштував своє введення так, що два списки токенів, створені `\expandafter` стають джерелом токенів для `\uppercase`—який тепер бачить `\uppercase{`<sub>токен</sub>`<expansion of \jobname>`<sub>список токенів (символи)</sub>`}`. `\uppercase` тепер бачить послідовність символьних токенів і може дати потрібний нам результат.
8. Після прочитання всіх символьних токенів, вироблених `\jobname`TeX повертається до отримання токенів зі свого попереднього джерела введення (нашого `.tex` файла), звідки він прочитає наступний токен: закривну `}` потрібну для завершення списку токенів, що обробляється `\uppercase`.

### \expandafter і внутрішні списки токенів

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

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

Щоб краще зрозуміти тимчасові списки токенів, ми розглянемо ще один приклад `\expandafter`, цього разу з `\the` команду.

#### \expandafter і внутрішні списки токенів: приклад 2

У цьому прикладі ми побачимо, як `\expandafter` можна використовувати для впливу на токени, збережені в регістрі токенів, через `\toks` команду. Ось примітиви TeX, які ми використовуватимемо:

* `**\count** *register*=*number*`: примітив TeX, який використовується для збереження значення `*number*` у позиції TeX `*register*`;
* `**\toks** *register*={*token list*}`: примітив TeX, який використовується для збереження `*token list*` у місці регістра токенів `*register*`— зберігаючи послідовність токенів для подальшого використання;
* `**\the** *token*`: командний примітив TeX, що розгортається, який обробляє `*token*`, хоча точний результат залежить від природи `*token*` того, що обробляється. `\the` має кілька застосувань: серед них — набір значення, збереженого в параметрі або змінній TeX (наприклад, регістрі). Інші застосування `\the` включають вставлення копії токенів, збережених у регістрі токенів. Тут ми використаємо `\the` щоб набрати значення, збережене в `\count` регістрі.

Почнемо з такого коду TeX, щоб зберегти значення `12345` у `\count` регістрі `99`:

```
\count99=12345
```

Якщо ми хочемо набрати значення, збережене в `\count99` ми можемо використати `\the\count99` (або `\number\count99`).

Далі ми використаємо `\toks` команду, щоб зберегти деякі токени в регістрі токенів `99`:

```
\toks99={\the\count99 }
```

Список токенів, збережених у регістрі токенів `99` містив би таке:

|                         |                                                                                                        |
| ----------------------- | ------------------------------------------------------------------------------------------------------ |
| **Значення токена TeX** | **Представлений елемент**                                                                              |
| 5382                    | `\the`                                                                                                 |
| 7885                    | `\count`                                                                                               |
| 3129                    | `9` (код символу 57 з кодом категорії 12), що дає значення токена $$256 \times 12 + 57 = 3129$$        |
| 3129                    | `9` (код символу 57 з кодом категорії 12), що дає значення токена $$256 \times 12 + 57 = 3129$$        |
| 2592                    | `<пробіл>` (код символу 32 з кодом категорії 10), що дає значення токена $$256 \times 10 + 32 = 2592$$ |

Зауважте, що список токенів, створений `\toks99` не *не* містить фактичне значення даних, збережене в `\count99` тому що `\toks` команда не виконує розгортання: вона просто створює токени й зберігає їх. У нашому прикладі, `\the` не розгортається, тому не обробляє `\count99`; тут `\the` просто перетворюється на токен (значення 5382) і зберігається у списку токенів.

Якщо ми хочемо, щоб `\toks99` список токенів містив токени, що представляють дані, збережені в `\count99` нам знадобиться якийсь спосіб створити ці токени (зробити їх доступними), щоб `\toks` команда могла отримати до них доступ. І, звісно, `\expandafter` може зробити це за нас. Якщо ми запишемо:

```
        \toks99=\expandafter{\the\count99 }
```

дія/обробка `\toks` команди буде «поставлена на паузу», поки `\expandafter` спричиняє (примушує) розгортання `\the` яке, у свою чергу, діє на `\count` щоб згенерувати тимчасовий список токенів, що містить символьні токени, які представляють дані, збережені в `\count99`. Невелика, але важлива деталь — це `<пробіл>` символ після цифр `99`: цей `<пробіл>` символ завершує процес сканування TeX, коли він шукає числову величину.

Тут дія `\expandafter` дуже схожа на `\jobname` приклад.

1. Прочитайте й збережіть відкривну `{`<sub>токен</sub>.
2. Прочитайте наступний токен, `\the`<sub>токен</sub>, який представляє команду, що розгортається, тому TeX розгортає його. `\expandafter` примушує розгортання `\the` яке потім діє на `\count99` щоб перетворити дані, збережені в `\count` регістрі `99` (число 12345) на тимчасовий список токенів. Цей список міститиме символьні токени, що представляють цифри `1`, `2`, `3`, `4` та `5`— символьні токени з кодом категорії 12.
3. Після розгортання й обробки `\the`, TeX повертає `{`<sub>токен</sub> «назад у введення» і використовує список токенів, що виник унаслідок `\the\count99` щоб TeX прочитав `\toks99={`<sub>токен</sub>`<expansion of \the\count99>`<sub>список токенів (символи)</sub>`}` і це дає потрібний нам результат.

Ця послідовність подій підсумована на наведеній нижче діаграмі — читайте схему знизу вгору, щоб простежити хід процесу.

![Як працює \expandafter](/files/dd5e27ea6d0eba2a4b109a13d5bf08c806e52047)

1. TeX починає обробляти `\toks`; він бачить необов’язковий `=` знак, потім перевіряє обов’язковий символ відкривної фігурної дужки (`{`, або будь-який символ із кодом категорії 1), який використовується для позначення початку списку токенів. Однак TeX виявляє `\expandafter` команду і натомість переходить до її виконання.
2. Якщо порівняти `\expandafter` $$\mathrm{T\_1T\_2}$$ у нашому введенні `\expandafter{\the\count99 }` ми можемо побачити $$\mathrm{T\_1} =$$ `{`<sub>токен</sub> та $$\mathrm{T\_2} =$$ `\the<sub>token</sub>`.
3. `\expandafter` читає, а потім тимчасово зберігає `{`<sub>токен</sub> (TeX тимчасово зберігає це ціле значення токена у внутрішній змінній). Пізніше TeX знову вставить цей токен у введення після обробки `\the`
4. `\expandafter` читає наступний токен, `\the`<sub>токен</sub> і розгорне його.
5. Розгортання `\the` створює тимчасовий список токенів у результаті обробки `\count99`— цей список токенів містить послідовність символьних токенів, які представляють значення даних, збережене в `\count` регістрі `99`.
6. Після того як `\the` було розгорнуто, TeX повторно вставляє токен, збережений на кроці 3 (`{`<sub>токен</sub>) і повертає цей токен у введення. TeX робить це, створюючи ще один список токенів, що містить *один* токен `{`<sub>токен</sub>.
7. TeX тепер завершив обробку `\expandafter` і створив два списки токенів, готові до використання як наступні джерела введення. TeX повертається до обробки `\toks99=` але тепер TeX налаштував своє введення так, що два списки токенів, створені `\expandafter` стають джерелом токенів для `\toks`—який тепер бачить `{`<sub>токен</sub>`<expansion of \the\count99>`<sub>список токенів (символи)</sub>`}`. `\toks` тепер може отримати доступ і зберегти послідовність із 5 символьних токенів, які представляють значення даних (`12345`) збережене в `\count99`: потрібний нам результат.
8. Після прочитання всіх символьних токенів, створених `\the\count99`TeX повертається до отримання токенів зі свого попереднього джерела введення (нашого `.tex` файла), звідки він прочитає наступний токен: закривну `}` потрібний для завершення списку токенів, що мають бути збережені за допомогою `\toks99={...}`.

## Як \expandafter працює насправді

У цьому розділі ми зазирнемо всередину самого TeX на «низькому рівні»: дослідимо вихідний код/функції всередині TeX, які реалізують поведінку `\expandafter`. Деталі подано у псевдо-C, але вони мають бути зрозумілими будь-кому, хто знайомий з іншими мовами програмування.

Наведена нижче анотована діаграма пояснює, як TeX реалізує `\expandafter` як частину більшої функції під назвою `expand()`— основної функції, що керує процесом розгортання TeX. У блоці, відповідальному за реалізацію `\expandafter` ми можемо побачити [*рекурсивної* поведінки](https://en.wikipedia.org/wiki/Recursion) де ще один виклик `expand()` функції використовується для обробки другого прочитаного токена, $$\mathrm{T\_2}$$для тих випадків, коли $$\mathrm{T\_2}$$ можна розгортати.

Хоча цей код міститься в рушії TeX Кнута, основні принципи, показані на цій діаграмі, застосовні до всіх рушіїв TeX.

![Як \expandafter працює всередині TeX](/files/2aa122b8ce7371f668535608477f34209bfac37e)

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

Якщо команда, яку треба розгорнути, є примітивом, `expand()` функція використовує поточне значення коду команди (збережене в глобальній змінній `curcmd`) щоб визначити, який саме примітив потрібно обробити. Ми можемо побачити ці деталі в повнішому списку `expand()`:

```
    void expand(void)
    {
    //curcmd is a global variable
    if(curcmd != macro) // curcmd < 111
    {
      switch(curcmd)
      {
        оператор \expandafter: // Обробити команду \expandafter T1T2
        {
            gettoken(); // Зчитати токен T1
            t = curtok; // Зберегти токен T1 у локальній змінній t
            gettoken(); // Зчитати токен T2
            if(curcmd > 100) // Чи є токен T2 розширюваним?
                expand();    // Так! T2 є розширюваним:
                             // виконати розширення T2 шляхом
                             // виконання рекурсивного виклику функції expand()
            інакше
                backinput(); // T2 не є розширюваним: повернути цей токен
                             // назад у вхідні дані, щоб його було зчитано знову (пізніше)

            curtok = t ;  // Відновити глобальну змінну curtok до збереженого значення T1
            backinput() ; // Повернути токен T1 назад у вхідні дані
                          // перед токенами, що виникають унаслідок розширення T2
        }
        break;

        // Код для обробки інших розширюваних команд
        випадок команди «перетворити на текст»: // Будь-яка з \number, \string, \romannumeral,
                                        // \meaning, \fontname, \jobname
                                        // Вони мають те саме значення curcmd
        break;

        випадок \noexpand: // Придушити розширення наступного токена
        ...
        break;

        випадок \csname:  //Створити ім'я керувальної послідовності.
        ...
        break;

        випадок \the: // Вставити деякі токени
        ....
        break;

        випадок команди «\if... test»: // Обробити один із умовних операторів TeX:
                                      // \if, \ifcat, \ifnum, \ifdim,\ifodd, \ifvmode,
                                      // \ifhmode, \ifmmode, \ifinner, \ifvoid,
                                      // \ifhbox, \ifvbox, \ifx, \ifeof, \iftrue, \iffalse,
                                      // \ifcase, \ifdefined, \ifcsname, \iffontchar
        ...
        break;

        випадок «\fi або \else»: // Завершити поточну умову
        ...
        break;

        // тощо для будь-яких інших розширюваних примітивних команд, підтримуваних
        // рушієм TeX

        }

    }else // Не розширюваний примітив: це макрос
        {
             macrocall()
        }
        //... більше коду видалено
    }
```

### Любов TeX до глобальних змінних

Можливо, це відображає його вік та епоху, в яку він був спроєктований, але вихідний код TeX широко використовує так звані [глобальні змінні](https://en.wikipedia.org/wiki/Global_variable)— насправді їх сотні. За своєю природою глобальні змінні можна змінювати/модифікувати звідки завгодно у вихідному коді TeX, який для TeX Кнута є одним монолітним файлом, що містить понад 25 000 рядків коду і сотні функцій. Зрозуміти, як працює TeX, не завжди легко...

Щоб обробити `\expandafter`, TeX зчитує токени зі свого поточного вводу за допомогою функції з назвою `gettoken()` яка створює токен і встановлює значення кількох ключових глобальних змінних, що використовуються по всьому вихідному коду TeX. Дві такі змінні, які оновлюються дією `gettoken()`, використовуються в реалізації `\expandafter`:

* `curtok`: (поточний токен) цілочисельне значення щойно зчитаного токена;
* `curcmd`: (поточний код команди) код команди (або символу), представлений токеном `curtok`.

Під час обробки `\expandafter`$$\mathrm{T\_1T\_2}$$ TeX зчитує токен $$\mathrm{T\_1}$$ і тимчасово зберігає його значення (ціле число) у локальній змінній з назвою `t`. Потім TeX зчитує $$\mathrm{T\_2}$$ і перевіряє, чи представляє цей токен розширювану команду — перевіряючи, чи її код команди (`curcmd`) > 100. Якщо так, TeX потрібно розширити команду, представлену $$\mathrm{T\_2}$$ і робить ще один виклик функції `expand()`: це приклад *рекурсії* тому що `expand()` рекурсії: функція викликає сама себе. Усвідомлення рекурсивної природи розширення, особливо під час використання `\expandafter`, може допомогти зрозуміти, як кілька послідовних `\expandafter` команд — тобто `\expandafter\expandafter\expandafter...` — досягають своїх ефектів.

Якщо токен $$\mathrm{T\_2}$$ є розширюваним, розширення відбувається, і коли рекурсивний виклик до `expand()` повертається, код у реалізації `\expandafter` повторно вставляє токен $$\mathrm{T\_1}$$ назад у вхідні дані. Глобальну змінну `curtok` перепризначають значенням збереженого токена — що зберігається в локальній змінній `t`, тобто значенням токена $$\mathrm{T\_1}$$— і викликають функцію `backinput().`

#### Функція backinput()

Як випливає з назви, ця функція повертає токен «назад у вхідні дані». Для цього TeX використовує поточне значення глобальної змінної `curtok` щоб створити список токенів, що містить один токен (цілочисельне значення якого задається `curtok`). TeX також організовує обробку вводу так, щоб цей список з одним токеном у належний час був повторно зчитаний TeX як частина подальшої обробки вводу. Уважно зауважте, що токен $$\mathrm{T\_1}$$ вставляється назад *після завершення розширення*, що гарантує, що TeX зчитуватиме цей повторно вставлений токен *до того, як* коли він зчитує токени, що виникають унаслідок розширення $$\mathrm{T\_2}$$.

### Обробка макросів: функція macrocall()

Як уже зазначалося, усі макроси разом із деякими примітивними командами є розширюваними, і вся обробка розширення проходить через `expand()` функцію. Проте, `expand()` уважно використовує `curcmd` значення (поточна команда), щоб розрізняти розширювані примітиви та макроси, оскільки процес розширення макросів обробляється спеціальною функцією під назвою `macrocall()`. Макроси потребують спеціалізованого процесу розширення, оскільки аргументи макроса та токени-розділювачі мають шукатися в дуже особливий і суворий спосіб; отже, цей процес передається функції, призначеній саме для цього: `macrocall()`.

#### Розширення макроса проти виконання макроса

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

#### Розширення макроса

Щоб розширити макрос, TeX спочатку перевіряє, чи макрос приймає аргументи; якщо так, `macrocall()` дуже уважно сканує вхідні дані, шукаючи токени, призначені стати аргументами макроса. Цей процес включає перевірку введення користувача на наявність будь-яких токенів-розділювачів, використаних в оригінальному визначенні макроса — шаблон токенів у виклику макроса має точно відповідати шаблону токенів, що міститься у збереженому визначенні. Однак токени, використані як розділювачі, TeX просто відкидає: по суті, це лише форма «пунктуації», яку TeX використовує, щоб визначити фактичні токени, призначені стати аргументами макроса, тобто токени, які користувач має намір обробити через макрос. Докладніше про токени-розділювачі дивіться [Як насправді працюють макроси TeX](/latex/uk/inshi-temi/22-how-tex-macros-actually-work-part-4.md).

Для кожного параметра (`#1, #2...#9`) у початковому визначенні макроса TeX сканує фактичний виклик макроса, щоб визначити, які токени, надані користувачем, призначені для кожного параметра (тобто формують аргументи макроса). Цей процес створює один або кілька мінісписків токенів: по одному для кожного аргументу макроса.

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

Ще раз: розширення макрокоманди означає *видалення* цієї макрокоманди (токена) з вводу та *заміщення* її списком токенів, збереженим як текст заміни макроса.

Для детальнішого розгляду обробки макросів у TeX дивіться шестисерійний цикл статей [Як насправді працюють макроси TeX?](/latex/uk/inshi-temi/01-a-six-part-series-how-do-tex-macros-actually-work.md)

[Частина 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/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.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.
