> 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/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md).

# Новая серия статей: токены TeX и связанные концепции — но зачем (и как)?

Эта вводная статья призвана объяснить, зачем была написана эта серия, чего я надеюсь достичь, и предоставить справочную информацию о методах, используемых для изучения токенов TeX путём наблюдения за внутренним устройством движка TeX. Эта страница статьи также предназначена для размещения ссылок на все статьи серии и будет обновляться, чтобы добавлять эти ссылки по мере публикации каждой новой статьи.

### Ссылки на статьи

Каждая статья будет содержать набор ссылок на другие статьи этой серии.

* [Что такое «токен TeX»?](/latex/ru/podrobnye-stati/53-what-is-a-tex-token.md)
* [Что такое «список токенов TeX»?](/latex/ru/podrobnye-stati/54-what-is-a-tex-token-list.md)

## Справочная информация к этой серии статей

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

Объём и содержание первой статьи, [Что такое «токен TeX»?](/latex/ru/podrobnye-stati/53-what-is-a-tex-token.md)— по самой своей природе довольно «приближены к металлу», как сказали бы программисты, и нет сомнений, что «токены TeX» можно было бы отнести к довольно эзотерической теме для статьи: так зачем вообще этим заниматься? В конечном счёте вы исходите из того — или, возможно, делаете скачок веры, — что и другие люди, возможно, ломали голову над той же темой и что есть место для одной-двух статей, чтобы заполнить некоторые пробелы. Моя цель — дать полезные пояснения по общему фону, которые могут дополнять другой материал, который вы, возможно, читаете, и, надеюсь, помочь лучше понять некоторые ключевые концепции, возникающие по мере изучения TeX и исследования макросов и программирования.

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

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

## Теперь, когда вопрос задан, что дальше?

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

Один из способов подступиться к ответу на эти вопросы — попытаться прочитать исходный код TeX в [`tex.web`](https://www.ctan.org/tex-archive/systems/knuth/dist/tex)—путём запуска [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) чтобы извлечь документацию TeX — или купив экземпляр книги [Компьютеры и набор текста, том B: TeX: Программа](https://www.amazon.co.uk/Computers-Typesetting-TEX-Program-v/dp/0201134373). Я купил печатную книгу! Безусловно, очень полезно иметь исходный код TeX, опубликованный в книжной форме, и, конечно, там есть множество полезных объяснений по всему тексту. Однако TeX Кнута написан на Pascal и, естественно, исходный код на Pascal документирован с использованием методологии литерального программирования Кнута — код подаётся небольшими, удобоваримыми кусками. Легко оценить, насколько подход Кнута к документации действительно помогает для такого сложного ПО, как TeX, но чтение книги действительно требует довольно много перекрёстных ссылок и прыжков по страницам.

Хотя книга полезна, одной её для меня оказалось недостаточно, чтобы лучше понять, что происходит, когда TeX создаёт «токены» — тему, которая меня особенно интересовала. Есть только один способ действительно это выяснить: собрать программу TeX, запустить её на небольшом TeX-файле и буквально наблюдать, как код выполняется, пока TeX сканирует и читает ввод. Детали сборки TeX из исходников несколько эзотеричны — преобразование Pascal в C — но краткое описание есть в следующем разделе, вместе со ссылкой на личный блог-пост, где это изложено подробнее.

В отличие от XeTeX и LuaTeX, которые могут обрабатывать текст в формате UTF-8 и поддерживают кодировку Unicode, TeX Кнута — это 8-битный движок, то есть он предполагает, что входные символы находятся в диапазоне от 0 до 255. Хотя это важное различие, оно не *существенно* влияет на наше обсуждение токенов TeX, поскольку мы рассматриваем темы и принципы, общие для всех движков TeX: они находятся в самом сердце программного обеспечения.

## Как можно изучать токены TeX?

Для меня распутывание пути от входного текста к токенам TeX стало настоящим путешествием — признаюсь, что разные степени замешательства были полупостоянными спутниками на этом пути: TeX — очень сложное ПО.

В течение нескольких лет (примерно с 2009 года) я регулярно собирал последнюю версию LuaTeX из исходного кода — процесс довольно простой благодаря совершенно превосходному способу распространения исходников LuaTeX. На основе этого опыта мне стало интересно лучше понять, как собрать оригинальный TeX Кнута из его исходного кода — *очень* иная задача, потому что TeX написан с использованием методологии литерального программирования Кнута. Эта моя личная сборка TeX на Windows, но с использованием компиляторов и наборов инструментов с открытым исходным кодом, выполнялась вне дистрибутива TeX Live и представляет собой самостоятельный проект. Также потребовалось собрать цепочку инструментов, необходимую для преобразования `tex.web` в программу C, которую можно было бы скомпилировать, а затем запустить под отладчиком, чтобы увидеть, что TeX на самом деле делает, обрабатывая символы входных данных.

Оригинальный TeX Кнута использовался вместо pdfTeX, XeTeX или LuaTeX, потому что мне нужна была версия TeX, максимально близкая к печатному исходному коду в книге TeX: The Program. Эта книга была впервые опубликована в 1986 году, и хотя с тех пор TeX претерпел некоторые обновления, последняя версия TeX (3.14159265, выпущенная в январе 2014 года) безусловно достаточно близка к исходному коду, содержащемуся в книге.

Отражая методологию литерального программирования Кнута, исходный код TeX распространяется в текстовом формате под названием WEB: смесь документации TeX и исходного кода Pascal. Основная идея состоит в том, что вы используете две утилиты под названиями TANGLE и WEAVE, которые обрабатывают WEB-файлы, чтобы извлечь либо документацию TeX, либо исходный код Pascal:

* [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) извлекает исходный код Pascal из WEB-файла
* [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) извлекает документацию TeX из WEB-файла

Однако прежде чем извлекать исходный код Pascal, вам нужно предварительно обработать файл Кнута `tex.web` файл, чтобы применить ряд изменений, которые позволяют преобразовать Pascal-код TeX в C-код с помощью процесса под названием Web2C. Этот этап предварительной обработки называется *применением файлов изменений*.

Исходный файл кода Кнута (tex.web) нельзя напрямую каким-либо образом изменять; вместо этого модификации применяются с помощью так называемых файлов изменений (расширение `.ch`) которые содержат изменения, которые вы хотите применить к основному `.web` файлу — например, `tex.web`. Файлы изменений объединяются с исходным кодом Кнута — с использованием дополнительной служебной программы под названием TIE — чтобы создать файл, скажем, `mytex.web` который вы обрабатываете TANGLE, чтобы извлечь Pascal-код в `mytex.pas`. Как только у вас есть подходящий исходный файл Pascal, вы можете выполнить заключительные шаги процесса Web2C, чтобы преобразовать его в файл исходного кода C, который можно скомпилировать в исполняемую программу TeX. Если вы хотите прочитать о довольно запутанном процессе преобразования Web2C, дополнительные сведения есть в [личном блоге автора](http://www.readytext.co.uk/?p=2529).

Итогом является программа TeX, которую можно запустить с помощью бесплатной и превосходной [Eclipse IDE для C/C++](http://www.eclipse.org/home/index.php) чтобы пошагово пройти по исходному коду TeX (на C) и наблюдать, что происходит, пока он сканирует ввод. Это определённо не самое увлекательное занятие, поскольку код C сгенерирован машиной и местами чрезвычайно труден для восприятия (исходный код TeX очень щедро использует оператор GOTO и глобальные переменные). Книга TeX: The Program по-прежнему бесценна для навигации по исходному коду C, хотя в книге исходный код TeX представлен в прекрасно сверстанном коде Pascal.

Чтобы завершить обсуждение, вот пример снимка экрана, показывающего запуск TeX через Eclipse IDE, с приостановленным выполнением на функции `getnext()`—которая находится в самом сердце процессов генерации токенов TeX.

![Снимок экрана, показывающий запуск TeX через Eclipse IDE](/files/01c3b7ae1c671b0a98e2d60614c775a426c055ef)

Пошаговое выполнение исходного кода TeX на C с использованием открытой IDE Eclipse для C/C++.

## Выводы и благодарность

Написание первой статьи и подготовка идей для будущих постов серии, безусловно, заняли довольно много времени. Я чрезвычайно благодарен Джону Хаммерсли и Мэри Энн Бейнс из Overleaf за поддержку этой идеи серии и за то, что они позволили мне потратить необходимое время на дополнительное исследование. Я надеюсь, что эта серия статей успешно выявит и рассмотрит темы, вызывающие общий интерес и заботу, и окажется полезной для тех, кто их прочитает.


---

# 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/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.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.
