> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/latex/ru/drugie-temy/19-how-tex-macros-actually-work-part-1.md).

# Как на самом деле работают макросы TeX: часть 1

[Часть 1](/latex/ru/drugie-temy/19-how-tex-macros-actually-work-part-1.md) [Часть 2](/latex/ru/drugie-temy/20-how-tex-macros-actually-work-part-2.md) [Часть 3](/latex/ru/drugie-temy/21-how-tex-macros-actually-work-part-3.md) [Часть 4](/latex/ru/drugie-temy/22-how-tex-macros-actually-work-part-4.md) [Часть 5](/latex/ru/drugie-temy/23-how-tex-macros-actually-work-part-5.md) [Часть 6](/latex/ru/drugie-temy/24-how-tex-macros-actually-work-part-6.md)

## Введение: цели этой серии

У этой серии статей амбициозная цель: объяснить *как* как на самом деле работают макросы TeX (например, команды LaTeX) — на самом фундаментальном уровне, внутри самого программного ядра TeX. Вместо того чтобы полагаться *исключительно* на набор примеров макросов, предназначенных для демонстрации различных возможностей, крайних случаев и поведения TeX, мы заглянем внутрь самого TeX, чтобы увидеть *как* и *почему* почему его методы программирования макросов работают именно так.

Чтобы достичь нашей цели, нам нужно начать с обсуждения тем, которые находятся на довольно низком уровне, и поначалу это может показаться несколько далеким от задачи верстки ваших документов. Надеюсь, после более глубокого погружения у вас появится фундамент для формирования лучшего понимания, которое в конечном счете сэкономит вам много времени и, возможно, снизит уровень разочарования.

### Язык программирования TeX: знакомо чувство?

Не будет слишком сурово назвать язык программирования TeX несколько загадочным, потому что это так — по крайней мере по меркам большинства распространенных языков программирования, используемых сегодня. По мере того как вы начинаете свой путь к более глубокому изучению TeX/LaTeX, особенно если хотите писать нетривиальные макросы, вы быстро сталкиваетесь с такими понятиями, как коды категорий, токены/токенизация и «расширение» команд или макросов. Этот поток концепций, вероятно, окажется весьма чуждым, возможно, заставляя вас чувствовать растерянность и временами даже легкое раздражение, поскольку путь к успеху не всегда облегчают почти непроницаемые сообщения об ошибках TeX/LaTeX.

## Итак, с чего начать? С кодов категорий.

Движки TeX относятся к классу программного обеспечения, называемому [компиляторами](https://en.wikipedia.org/wiki/Compiler): программами, которые принимают файл, написанный на *исходном* языке, и *компилируют* (преобразуют) его в выходной файл, написанный на *целевом* языке. Точнее говоря, TeX — это *компилятор документов*. Для движков TeX (компиляторов) входной файл написан на языке верстки TeX, а целевым является выходной файл, написанный на другом «языке», таком как [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) или PDF — хотя мы несколько вольно используем понятие «язык».

Давайте внимательнее рассмотрим исходный, или входной, «язык», используемый для написания вашего файла TeX. Файл `.tex` в конечном счете представляет собой одну длинную последовательность символов (включая символы перевода строки): состоящую из текста, предназначенного для верстки, перемежаемого `\`, `}`, `$`, `[` и всевозможными символами, которые могут появляться в, казалось бы, почти бесконечном диапазоне сочетаний. Любой, кто не использует TeX/LaTeX, посмотрев на типичный `.tex` файл, может быть прощен за то, что воспримет его как довольно запутанную мешанину символов с мало заметной, если вообще заметной, структурой файла. Пакет макросов LaTeX, конечно, в некоторой степени «навязывает» базовую структуру входному файлу .tex. Однако, между `\begin{document}` и `\end{document}` тем, что туда поместить, решает автор документа. Если вы посмотрите на `.tex` файлы, написанные с использованием оригинального пакета макросов Plain TeX Кнута, вы увидите, что структура документа почти полностью отсутствует.

Итак, в целом входной файл TeX может выглядеть довольно неструктурированным, как будто произвольная смесь содержимого для верстки, перемежаемого инструкциями (командами), которые направляют верстку этого содержимого. Как TeX вообще способен понять типичный `.tex` входной файл: как отфильтровать этот поступающий хаос символов в выполнимые инструкции для движка верстки и содержимое, которое нужно верстать?

### Фильтрация хаоса: поздоровайтесь с кодами категорий

Любой человек-наблюдатель, который ничего не знает о TeX, может посмотреть на `.tex` файл и распознать определенные символы, такие как `$` и знать, что это знак валюты, или увидеть `&` и определить его как амперсанд. Такой наблюдатель выводит *значение* для каждого увиденного символа — значение, основанное на роли, которую этот символ играет в человеческом общении. Кроме того, он может увидеть такие символы, как `один`, `e`, `или` и знать, что они классифицируются как гласные, тогда как другие, такие как `b`, `c` или `d` классифицируются как согласные. Как люди, мы имеем своего рода встроенную таблицу поиска (в нашей памяти), с помощью которой присваиваем значение каждому видимому символу — значение, основанное на роли, которую этот символ выполняет в языках, на которых мы способны общаться.

Чтобы обработать `.tex` файл, программному обеспечению TeX также приходится просматривать каждый символ во входных данных, и ему тоже нужно присвоить *значение* значение

Ответ — одна из таких только для TeX концепций: *коды категорий,* которых 16, от 0 до 15. Что касается TeX, каждый символ, который он когда-либо ожидает увидеть во `.tex` файле, имеет так называемый *код категории* код категории, заранее *в данный момент* присвоенный ему. Внутри программного обеспечения TeX есть своего рода «таблица поиска», которая перечисляет код категории *значение* в настоящее время

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

В следующей таблице перечислены эти 16 кодов категорий: что каждый из них означает, а также примеры символов, обычно относимых к каждой категории.

| **Код категории** | **Описание**                                                            | **Стандартный LATEX/TEX**                                                  |
| ----------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| 0                 | Escape-символ — сообщает TEX начать поиск команды                       | `\`                                                                        |
| 1                 | Начало группы                                                           | {                                                                          |
| 2                 | Конец группы                                                            | }                                                                          |
| 3                 | Сдвиг в математический режим — переключение в/из математического режима | $                                                                          |
| 4                 | Табуляция выравнивания                                                  | &                                                                          |
| 5                 | Конец строки                                                            | ASCII-код 13 (`\r`)                                                        |
| 6                 | Параметр макроса                                                        | #                                                                          |
| 7                 | Надстрочный индекс — для набора формул: `$y=x^2$` $$y=x^2$$             | ˆ                                                                          |
| 8                 | Подстрочный индекс — для набора формул: `$y=x_2$` $$y=x\_2$$            | \_                                                                         |
| 9                 | Игнорируемый символ                                                     | ASCII 0 `<null>`                                                           |
| 10                | Пробельный символ                                                       | ASCII-коды 32 (пробел) и 9 (символ табуляции)                              |
| 11                | Буква                                                                   | A...Z, a...z, (и тысячи символов Unicode)                                  |
| 12                | Другое                                                                  | 0...9 плюс ,.;?" и многие другие                                           |
| 13                | Активный символ                                                         | Специальный код категории для создания однобуквенных макросов, таких как ˜ |
| 14                | Символ комментария — игнорировать всё, что следует до конца строки      | %                                                                          |
| 15                | Недопустимый символ, не разрешено появляться во входном файле .tex      | ASCII-код 127 (`DEL`)                                                      |

Использование кодов категорий — это ключевой механизм TeX для фильтрации поступающего потока символов, позволяющий понять:

* символы, из которых состоит текст, подлежащий верстке;
* разграничивающие содержимое, которое следует верстать как математический материал;
* последовательности символов, являющиеся именами команд, которые нужно обработать или выполнить;
* … и многие другие операции верстки.

Поначалу вам может показаться, что код категории каждого символа (значение) — это некая фиксированная привязка: неизменяемая и навсегда встроенная в саму основу программного обеспечения TeX, но это не так. Как уже отмечалось, TeX ведет внутреннюю таблицу поиска, чтобы хранить сведения о том, какой код категории *в данный момент* присвоен каждому символу — мы вполне сознательно говорим *«присвоен в текущий момент»* потому что код категории любого символа (который еще не был прочитан) можно изменить с помощью примитивной (встроенной) команды под названием `\catcode`. Это дает значительную гибкость, поскольку при желании вы можете полностью изменить то, как TeX будет относиться к значению любого символа, впоследствии прочитанного из входных данных, открывая огромные возможности для сложных приложений верстки.

Если вас в основном интересует использование LaTeX, чтобы «сделать дело», вполне вероятно, что вы напрямую не сталкивались с кодами категорий, кроме, возможно, через сообщения об ошибках, которые могли видеть. Но будьте уверены: коды категорий — это ключевой компонент работы движка TeX, позволяющий LaTeX (и пакетам LaTeX) реально выполнять работу по верстке вашего документа.

Когда ваш TeX-движок запускается («[инициализируется](https://en.wikipedia.org/wiki/Bootstrapping)») он будет использовать набор стандартных присвоений символов кодам категорий, но с помощью команды `\catcode` , эти стандартные значения могут быть изменены основным кодом LaTeX (макросами) и/или загруженными вами пакетами LaTeX — а также, разумеется, вашим собственным кодом TeX или макросами. Однако со временем и благодаря традиции/использованию определенные символы, отнесенные к конкретным кодам категорий, стали признанными «стандартами», и соблюдение этих стандартов, безусловно, желательно, если вы хотите, чтобы ваши документы были переносимыми и легко обменивались с коллегами или другими пользователями. Например, символ `\` \ [таблица выше](#tbl-0).

### Чтение (сканирование) входных данных

Когда TeX читает (сканирует) следующий символ из вашего входного файла, первое, что он делает, — смотрит на его код категории, так что давайте внимательнее рассмотрим, что происходит, когда TeX читает типичную строку входных данных.

Предположим, что у нас есть файл .tex, который содержит текст `Hello World \jobname` где-то внутри абзаца. Если мы заглянем в `.tex` файл с помощью [шестнадцатеричного редактора](https://en.wikipedia.org/wiki/Hex_editor), мы увидим, что последовательность символов `Hello World \jobname` в нашем `.tex` файле — это просто ряд целых чисел, или *кодов символов*, показанных на снимке экрана ниже как шестнадцатеричная последовательность:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Шестнадцатеричные коды символов в файле TeX](/files/310cb4ed5b2e010129e3fe5c03773d0f5c91387d)

Если мы преобразуем из шестнадцатеричной системы (основание 16) в десятичную (основание 10), последовательность кодов символов выглядит так:

![Десятичные коды символов в файле TeX](/files/4d4cef5dbe28ea1e044a37c26d2c3f365cb628ee)

Мы также знаем, что для TeX каждый символ имеет соответствующий код категории; поэтому, основываясь на [таблица выше](#tbl-0) мы знаем, что, вероятно, также используются следующие стандартные присвоения кодов категорий:

![Коды категорий TeX](/files/0d2ec24b2269965adc4e4ea5736a8a1346a4ad33)

Таким образом, для TeX каждый символ во входном файле представлен *два* числовыми значениями — своим кодом символа и своим кодом категории:

![Коды символов и соответствующие коды категорий TeX](/files/eca1cdb385a47cd137b31d7630603596b27f17fd)

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

## Часть 2

В части 2 мы внимательнее рассмотрим, как TeX читает ваши входные данные: притворяясь «глазами» TeX, когда он смотрит на ваши данные, символ за символом.

[Часть 1](/latex/ru/drugie-temy/19-how-tex-macros-actually-work-part-1.md) [Часть 2](/latex/ru/drugie-temy/20-how-tex-macros-actually-work-part-2.md) [Часть 3](/latex/ru/drugie-temy/21-how-tex-macros-actually-work-part-3.md) [Часть 4](/latex/ru/drugie-temy/22-how-tex-macros-actually-work-part-4.md) [Часть 5](/latex/ru/drugie-temy/23-how-tex-macros-actually-work-part-5.md) [Часть 6](/latex/ru/drugie-temy/24-how-tex-macros-actually-work-part-6.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/latex/ru/drugie-temy/19-how-tex-macros-actually-work-part-1.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.
