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

# Как работает \\\expandafter: значение расширения

[Часть 1](/latex/ru/podrobnye-stati/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Часть 2](/latex/ru/podrobnye-stati/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Часть 3](/latex/ru/podrobnye-stati/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Часть 4](/latex/ru/podrobnye-stati/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Часть 5](/latex/ru/podrobnye-stati/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Часть 6](/latex/ru/podrobnye-stati/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 может получать следующий элемент ввода из двух источников:

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/d6ef7fa403b840d080f91a75e3d375b55f763f65)

Хотя мы пока ещё не знаем, что именно означает расширение/расширяемость, можно увидеть, что:

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

**Примечание об активных символах**: Помимо примитивов и макросов существует третий класс «расширяемых» объектов: активные символы — любые символы, которым назначен код категории 13, также считаются «расширяемыми», поскольку они обрабатываются как «миниатюрные макросы».

#### Как TeX узнаёт, является ли команда «расширяемой»?

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

Используя данные, полученные, когда TeX создаёт новый токен, или данные, извлечённые из существующего токена — например, хранящегося в макросе или другом списке токенов, — TeX может проверить свои внутренние таблицы хранения данных, чтобы найти подробную информацию о команде (или символе), представленной этим токеном. Следующая схема кратко описывает процесс создания токена команды («упаковка»), а затем, когда TeX нужна некоторая информация, обратный процесс («распаковка» токена) для получения данных о команде, представленной определённым значением токена.

![Диаграмма, показывающая, как TeX упаковывает/распаковывает токены](/files/90a2ca6f22ef3c1008cb49a2dd12d0f77e479bad)

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

Часть информации, которую 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/13e9ce40caf18fb3bfe43623781fc12a2c7cb84b)

### Пояснение к диаграмме структуры 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()`TeX использует абсолютное значение текущего режима — то есть игнорирует знак минус. Так, например, если TeX находится в одном из своих горизонтальных режимов и должен обработать символ с кодом категории 11, он использовал бы сумму $$102 + 11 = 113$$ внутри своего «большого переключателя», чтобы перейти к коду, который обрабатывает эти символы в любом горизонтальном режиме (построение абзацев или внутри `\hbox`).

#### Получение следующего токена

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

Несколько замечаний о `getnext()` и `getxtoken()`:

* **`getnext()`**: это основная функция ввода TeX. Она читает и обрабатывает вводимые символы из физического файла или читает токены из списка токенов. Заметьте, что `getnext()` на самом деле не вычисляет значения токенов, но устанавливает ряд ключевых *глобальных* переменных (например, код команды и `curcs`), которые используются позже в процессе обработки.
* **`getxtoken()`**: «получить расширенный токен» использует `getnext()` для чтения следующего элемента ввода. Затем он проверяет код команды только что прочитанного элемента, чтобы выяснить, представляет ли этот элемент расширяемую команду: если да, он расширяется или вызывается макрос. Для нерасширяемых элементов `getxtoken()` вычисляет значение токена, и эти сведения передаются следующему этапу обработки: «большому переключателю», где выполняются нерасширяемые примитивы и печатаются символы.

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

Ещё раз подчеркнём, что приведённая выше диаграмма — упрощение, поскольку другие области обработки TeX также будут вызывать расширение токенов; например:

* когда TeX ищет (сканирует) числовые значения, он будет запускать расширение в поисках целых чисел (вызывая `getxtoken()`) ;
* примитивную команду `\romannumeral` вызывает расширение — см. статью [Расширение с использованием `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) для тонкого использования этого факта;
* Это `\edef` («expanded definition») команда определения макроса принудительно выполняет полное расширение;
* TeX будет расширять токены в определённых точках при обработке преамбулы `\halign` или `\valign` (обе команды связаны с алгоритмами табличной вёрстки TeX).

[Часть 1](/latex/ru/podrobnye-stati/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Часть 2](/latex/ru/podrobnye-stati/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Часть 3](/latex/ru/podrobnye-stati/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Часть 4](/latex/ru/podrobnye-stati/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Часть 5](/latex/ru/podrobnye-stati/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Часть 6](/latex/ru/podrobnye-stati/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/ru/podrobnye-stati/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.
