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

# Нова серія статей: токени TeX та пов’язані поняття — але навіщо (і як)?

Ця вступна стаття покликана пояснити, чому була написана ця серія, чого я сподіваюся досягти, а також надати довідкову інформацію про методи, що використовуються для дослідження токенів TeX шляхом спостереження за внутрішньою роботою рушія TeX. Ця сторінка статті також задумана як місце, де зібрано посилання на всі статті серії, і її буде оновлено, щоб додавати ці посилання щоразу, коли публікується нова стаття.

### Посилання на статті

Кожна стаття міститиме набір посилань на інші статті в цій серії.

* [Що таке «токен TeX»?](/latex/uk/dokladni-statti/53-what-is-a-tex-token.md)
* [Що таке «список токенів TeX»?](/latex/uk/dokladni-statti/54-what-is-a-tex-token-list.md)

## Передісторія цієї серії статей

Мотивом для написання цієї серії статей стало читання матеріалів про TeX, у яких багато дій TeX пояснювали через поняття «токенів» разом із «процесом токенізації» TeX, «списками токенів» та пов’язаними поняттями, такими як «розгортання макросів» і «команди, що розгортаються». Щоразу, коли я натрапляв на пояснення, пов’язані з TeX, сформульовані через поняття «TeX tokens», у мене постійно виникало те саме запитання: Що, власне, *є* є токен TeX? Мені потрібно було це з’ясувати.

Обсяг і зміст першої статті, [Що таке «токен TeX»?](/latex/uk/dokladni-statti/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 — або придбати примірник книги [Computers & Typesetting, Volume B: TeX: The Program](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, яку можна запускати за допомогою безплатної та чудової [IDE Eclipse для C/C++](http://www.eclipse.org/home/index.php) щоб виконувати покрокове проходження вихідним кодом TeX (на C) і спостерігати, що відбувається, коли програма проходить через ваші вхідні дані. Це точно не найцікавіше заняття, тому що код C згенеровано машиною і місцями його надзвичайно важко читати (вихідний код TeX дуже щедро використовує оператори GOTO та глобальні змінні). Книга TeX: The Program і досі безцінна для навігації по C-коду, хоча в книзі вихідний код TeX подано у вигляді чудово зверстаного коду Pascal.

Щоб завершити обговорення, ось приклад знімка екрана, який показує виконання TeX через IDE Eclipse із призупиненням виконання на функції `getnext()`— яка лежить в основі процесів генерації токенів TeX.

![Знімок екрана, який показує виконання TeX через IDE Eclipse](/files/df858ac47782e5e0cc177312e3b641e1707b6558)

Покрокове проходження вихідним кодом TeX за допомогою відкритого середовища розробки 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/uk/dokladni-statti/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.
