> 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/21-how-does-expandafter-work-tex-uses-temporary-token-lists.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)

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

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

`\jobname` є розширюваним примітивом TeX, чиє розгортання генерує послідовність символьних токенів, що представляють ім'я основного вхідного `.tex` файлу. Наприклад, припустімо, що ми мали б такий текст як частину `.tex` файл під назвою `mycode.tex`:

```
    Ім'я мого файла — \jobname .tex %Зверніть увагу на пробіл після \jobname
```

Це буде набрано як

```
    Ім'я мого файла — mycode.tex
```

Коли ми використовуємо `\jobname` команду, набрані в результаті символи не зчитуються з вашого фізичного `.tex` файлу, тож звідки вони беруться: де TeX зберігає/зчитує ці токени? Невидимий для користувача (тобто глибоко всередині самого TeX) процес розгортання для `\jobname` створює тимчасовий список токенів, сформований із послідовності символьних токенів, що представляють ім'я вашого файла. Після того як `\jobname` створив цей список токенів, TeX тимчасово «відводить погляд» від свого поточного джерела введення (тут, нашого `.tex` файла), щоб зчитувати токени (символьні токени) з цього тимчасового списку токенів. Коли TeX потребує ще одного вхідного токена, він зчитує наступний токен із цього внутрішнього списку і продовжує робити це, доки не дійде до кінця списку; після цього TeX відновлює зчитування токенів зі свого попереднього джерела введення, яким тут був би текст, прочитаний із нашого `.tex` вхідного файла.

Як показано на наведеній нижче діаграмі, TeX відновлює зчитування `.tex` вхідного файла в точному місці, де він зупинився після обробки `\jobname`—після зчитування символу пробілу, але перед зчитуванням символу «.» . Крапка (.) на практиці чекає на зчитування з вхідного буфера TeX — невеликої ділянки пам’яті TeX, призначеної для зберігання рядка тексту, прочитаного з `.tex` файла — TeX зчитує та обробляє ваш `.tex` файл по одному рядку за раз; він не зчитує весь файл у пам’ять.

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

![Як TeX розгортає \jobname](/files/fac8fc7c153c64222f0aee9c708051e2b860613e)

Повертаючись до нашого обговорення розгортання, ми можемо побачити, що розгортання `\jobname` призвело до того, що `\jobname` команда (токен) була *видалена* з вхідного потоку й *замінена* з токенами, що виникли внаслідок розгортання: тимчасовий список токенів, згенерований для зберігання імені `.tex` файлі.

Розширювані команди (такі як `\jobname`) — не єдині примітиви TeX, які «потай» створюють і використовують списки токенів для досягнення свого ефекту. Наприклад, команди `\uppercase` та `\lowercase` обидві створюють внутрішні списки токенів, щоб змінити регістр свого аргументу. Після завершення роботи зі зміною регістру TeX перемикається на зчитування символьних токенів зі списків токенів, згенерованих цими командами. Списки токенів — це єдиний механізм TeX для «зберігання даних токенів» — окрім запису даних у фізичний файл на диску.

### Джерела токенів: TeX — майстер жонглювання

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

Припустімо, що ми хочемо просте макровизначення, яке набирає ім'я нашого `.tex` файл:

```
    \def\myfile{The name of my file is \jobname .tex}
```

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

1. сайті `.tex` текстовий файл, що містить `\myfile` макрос;
2. список токенів, який зберігає визначення `\myfile` макрос;
3. список токенів, створений командою `\jobname` команди всередині `\myfile` макроса.

Коли TeX обробляє документ, він постійно перемикається між джерелами введення: фізичними файлами та списками токенів, тож як TeX це відстежує? Відповідь така: внутрішньо рушії TeX ведуть так званий [стек введення](https://en.wikipedia.org/wiki/Stack_\(abstract_data_type\)) який слугує своєрідною «пам’яттю», що дозволяє TeX запам’ятовувати, чим він займався (звідки читав), коли перемикається між джерелами введення.

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

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

## Поглиблення теми (необов’язково до читання)

Наведені нижче розділи містять додаткову довідкову інформацію для читачів, які люблять деталі.

### Справжні списки токенів

Наведена нижче графіка була створена за допомогою спеціальної збірки TeX від Кнута в Overleaf, яка надає доступ до внутрішніх даних і структур даних TeX. Ця ілюстрація списку токенів ґрунтується на спрощеній версії, наведеної вище, і містить додаткові дані, зокрема показує символи, згенеровані `\jobname` мають код категорії 12, а не звичайний код категорії 11. У цій діаграмі «вузол» — це просто назва, дана одиниці зберігання пам’яті, яку використовує TeX.

![Всередині списку токенів TeX](/files/8b17a5764c6a68655bd7667be959598dc6e18d28)

### Як TeX зчитує та обробляє \jobname

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

![Як TeX сканує та обробляє \jobname](/files/8817a66288ae44c4c1d5b3539e2dd438083bad1a)

[Частина 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/21-how-does-expandafter-work-tex-uses-temporary-token-lists.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.
