> 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# Вступ до \endlinechar: як TeX читає рядки з текстових файлів

Як люди, ми віддаємо перевагу перегляду й редагуванню текстових файлів построково. Коли нам здається, що рядок тексту вже досить довгий, ми натискаємо «Return» (у текстовому редакторі), щоб позначити кінець цього рядка. У тлі ваш текстовий редактор інтерпретує це як вказівку додати [символ нового рядка](https://en.wikipedia.org/wiki/Newline) у місці, де ви вирішили розірвати рядок.

Однак, якби все було так просто: проблема в тому, що різні операційні системи по-різному визначають, що саме є символом нового рядка. І, що ще гірше, Windows оброблятиме символи нового рядка по-різному залежно від того, чи відкрито файл у так званому [*бінарному режимі* або *текстовому режимі*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). У результаті, залежно від операційної системи хоста, рядки у текстовому файлі можуть завершуватися різними комбінаціями символів, що називаються *повернення каретки* (символ ASCII/Unicode 13) і *переведення рядка* (символ ASCII/Unicode 10): позначається як `\\r` та `\n` відповідно.

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

### Вхідний буфер TeX

Ви можете здивуватися, а можете й ні, дізнавшись, що рушії TeX (зокрема LuaTeX і XeTeX) читають вхідні файли построково: вони не завантажують увесь текстовий файл у пам’ять. Хоча більшість текстових файлів, які обробляють рушії TeX, мізерні порівняно з обсягом пам’яті, доступним на сучасних пристроях, кожен рядок у файлі зчитується окремо й зберігається в невеликому внутрішньому буфері. Але, звісно, процес читання й збереження рядка в TeX має ще кілька додаткових нюансів.

## «Я зроблю це по-своєму» — команда TeX \endlinechar

Коли TeX читає ще один рядок тексту з вхідного файлу, він виконує дві «службові» дії:

* він видаляє всі завершальні символи нового рядка (\r або \n), знайдені в кінці рядка — тобто прибирає всі кінці рядків, додані під час початкового збереження текстового файла на диск;
* він також видаляє всі пробільні символи в кінці рядка.

Ці два процеси відбуваються до того, як TeX фактично починає сканувати символи, що містяться в самому рядку: сприймайте їх як своєрідне «прибирання» в підготовці до наступного етапу обробки (сканування). Отже, на цьому початковому етапі процесу читання рядка TeX уже прибрав усі залежні від платформи кінці рядків (і будь-які пробіли наприкінці): тож як TeX знатиме (визначить), де цей рядок закінчується? У TeX є ще один «трюк» у запасі: `\endlinechar` команду.

Щоб уникнути проблеми залежних від платформи символів нового рядка, TeX запроваджує поняття `\endlinechar`, параметра, який може визначати користувач і який TeX використовує, щоб вставити власний символ кінця рядка в самий кінець текстового рядка, щойно прочитаного з файла. Знову ж таки, зауважте, що це відбувається до того, як TeX фактично починає сканувати символи — це завершальний крок TeX’ового «прибирання» перед тим, як він буде готовий почати читати (сканувати) справжні символи, що містяться в рядку.

TeX використовуватиме значення, збережене в `\endlinechar` щоб додати власний завершувач рядка, якщо і лише якщо, `\endlinechar` він належно визначений — у TeX Кнута це означає, що він має мати значення >-1 і < 256. Зазвичай, `\endlinechar` йому присвоюють значення 13: символ повернення каретки — зазвичай позначається як `\\r` у програмістській літературі.

Але якщо ви запишете `\endlinechar=-1` десь у вашому вхідному тексті, тоді *наступного разу* TeX читає рядок тексту з файла, він *не* не додасть жодного додаткового завершувача в кінець рядка. Відповідно, ваш вхідний текст буде сприйматися як один довгий безперервний рядок тексту, доки ви не скинете `\endlinechar` до відповідного значення — зазвичай 13 (`\\r`):

```latex
\endlinechar=13
```

Один із 16 категорійних кодів TeX (значення 5) зарезервовано для визначення символу «кінця рядка», яким зазвичай є символ, що `\endlinechar` вставляє, — який вставляється, якщо (і лише якщо) значення `\endlinechar` встановлено на відповідне значення.

## Підсумок обробки кінця рядка

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

1. Коли TeX читає рядок із вашого файла, він спершу видалить усі символи кінця рядка (`\\r` та `\n`) додані вашим текстовим редактором під час збереження файла. Крім того:

* TeX також видаляє всі пробільні символи в кінці рядка;
* TeX *не* видаляє завершальні символи табуляції (ASCII-код 9).

**Примітка**: Один із файлів вихідного коду LuaTeX, той, що містить код для видалення пробілів, має таку примітку:

> (Цитується у файлі `luatex.c`) «Девід Фукс зазначає, що це \[видалення] пробілів було зроблено для забезпечення портативності документів TeX з огляду на заповнення пробілами фіксованих "рядків" на деяких системах того часу, наприклад IBM VM/CMS і OS/360.»

3. Після кроку (1) TeX додає (вставляє) додатковий символ, значення якого зберігається в \endlinechar (за умови, що він належно визначений: >-1 і < 256)
4. \endlinechar зазвичай встановлюють у значення 13 (`\\r`), що означає, що символ, доданий на кроці (2), зазвичай є символом 13 (`\\r`) — але, звісно, ви можете встановити \endlinechar в інше значення, щоб досягти особливих ефектів за допомогою макропрограмування.
5. Коли його процедури сканування вхідних даних виявляють символ `\\r` (код символу 13) у кінці свого внутрішнього буфера, TeX, як завжди, перевірить його категорійний код, щоб вирішити, що з ним робити.
6. Символ 13 *зазвичай* має категорійний код зі значенням 5 («кінець рядка»), якщо, звісно, його категорійний код не було змінено — деякі макроси роблять символ кінця рядка активним, щоб виконувати складну обробку.
7. Залежно від внутрішнього стану TeX (фактично, від того, що він робить) TeX може перетворювати символ кінця рядка (зазвичай `\\r`, категорійний код 5) на символ пробілу — так символи кінця рядка стають пробілами.
8. Також зауважте, що TeX використовує символи з категорійним кодом 5, щоб визначити, коли він прочитав порожній рядок і має згенерувати `\par` токен.

Наведена нижче схема дає наочний підсумок кроків (1) і (2): видалення символів нового рядка й завершальних пробілів та вставлення `\endlinechar` готового до завдання сканування вхідних даних.

![Як TeX використовує \endlinechar](/files/17cb644d290222ca7db8a60fb9b67d88f49470d6)


---

# 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.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.
