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

# Úvod do \endlinechar: Jak TeX čte řádky z textových souborů

Jako lidé dáváme přednost prohlížení a úpravě textových souborů po jednotlivých řádcích. Jakmile si myslíme, že je řádek textu dostatečně dlouhý, stiskneme v textovém editoru „Enter“, čímž signalizujeme konec daného řádku. V pozadí to váš textový editor interpretuje jako pokyn k přidání [znaku nového řádku](https://en.wikipedia.org/wiki/Newline) v místě, kde se rozhodnete řádek zalomit.

Jenže kdyby to bylo tak jednoduché: potíž je v tom, že různé operační systémy mají odlišné představy o tom, co tvoří znak nového řádku. A aby toho nebylo málo, Windows zachází se znaky nového řádku různě podle toho, zda je soubor otevřen v takzvaném [*binárním režimu* nebo *textovém režimu*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Výsledkem je, že v závislosti na hostitelském operačním systému mohou být řádky v textovém souboru ukončeny různými kombinacemi znaků zvaných *návrat vozíku* (znak ASCII/Unicode 13) a *posun o řádek* (znak ASCII/Unicode 10): označované `\r` a `\n` v uvedeném pořadí.

Je zřejmé, že aby bylo TeX nezávislé na systému, potřebuje způsob, jak se vypořádat s rozmary zavedenými různými znaky používanými k ukončení řádku v textových souborech, které musí číst a zpracovávat.

### Vstupní vyrovnávací paměť TeXu

Možná vás překvapí, anebo také ne, když zjistíte, že TeXové enginy (včetně LuaTeXu a XeTeXu) čtou vstupní soubory po řádcích: nečtou celý textový soubor do paměti. I když je většina textových souborů zpracovávaných TeXovými enginy ve srovnání s dostupnou pamětí na moderních zařízeních nepatrná, každý řádek v souboru je jednotlivě načten a uložen do malé interní vyrovnávací paměti. Ale samozřejmě proces TeXu při čtení a ukládání řádku má několik dalších záludností.

## „Udělám to po svém“ — příkaz TeXu \endlinechar

Když TeX načítá další řádek textu ze vstupního souboru, provádí dvě „údržbové“ úlohy:

* odstraní všechny koncové znaky nového řádku (\r nebo \n) nalezené na konci řádku — tj. odstraní všechny konce řádků přidané při původním uložení textového souboru na disk;
* také odstraní všechny koncové znaky mezery nalezené na konci řádku.

Tyto dva procesy proběhnou dříve, než TeX skutečně začne procházet znaky obsažené v samotném řádku: představte si je jako formu „údržby“ v přípravě na další fázi zpracování (skenování). Takže během této počáteční fáze procesu čtení řádku TeX odstranil všechny konce řádků závislé na platformě (a veškeré koncové bílé znaky): jak tedy TeX pozná (zjistí), kde tento řádek končí? TeX má ještě jeden trik v rukávu: `\endlinechar` příkaz.

Aby se TeX vyhnul problému znaků nového řádku závislých na platformě, zavádí pojem `\endlinechar`— uživatelsky definovatelný parametr, který TeX používá k vložení vlastního znaku konce řádku úplně na konec textového řádku, který právě načetl ze souboru. Opět si všimněte, že k tomu dochází dříve, než TeX skutečně začne procházet znaky — je to poslední krok TeXovy „údržby“ před tím, než je připraven začít číst (skenovat) skutečné znaky obsažené v řádku.

TeX použije hodnotu uloženou v `\endlinechar` k přidání svého vlastního ukončovacího znaku na konec řádku, pokud a pouze pokud `\endlinechar` je řádně definováno — v TeXu Knutha to znamená, že musí mít hodnotu >-1 a < 256. Obvykle `\endlinechar` je mu přiřazena hodnota 13: znak návratu vozíku — obvykle označovaný `\r` v programátorské literatuře.

Ale pokud někde ve svém vstupu napíšete `\endlinechar=-1` pak *při příštím* když TeX načte řádek textu ze souboru, bude *ne* přidávat jakýkoli další ukončovací znak na konec řádku. V důsledku toho bude váš vstup považován za jeden dlouhý souvislý řetězec textu, dokud nenastavíte `\endlinechar` na vhodnou hodnotu — obvykle 13 (`\r`):

```latex
\endlinechar=13
```

Jeden z 16 kategoriálních kódů TeXu (hodnota 5) je vyhrazen k identifikaci znaku „konec řádku“, jímž je obvykle znak, který `\endlinechar` vkládá — který se vloží, pokud (a pouze pokud) je hodnota `\endlinechar` nastavena na vhodnou hodnotu.

## Shrnutí zpracování konce řádku

Ačkoli jsou tyto detaily poměrně nízkoúrovňové, budou zajímat každého, kdo chce zkoumat psaní maker, která pracují se čtením řádků textu.

1. Když TeX načte řádek z vašeho souboru, nejprve odstraní všechny znaky konce řádku (`\r` a `\n`) přidané vaším textovým editorem při uložení souboru. Kromě toho:

* TeX také odstraní všechny koncové znaky mezery z konce řádku;
* TeX *ne* odstranit koncové tabulátory (ASCII kód znaku 9).

**Poznámka**: Jeden ze zdrojových souborů LuaTeXu, ten, který obsahuje kód pro toto odstraňování mezer, obsahuje následující poznámku:

> (Citováno v souboru `luatex.c`) „David Fuchs uvádí, že toto \[space] odstraňování bylo provedeno, aby byla zajištěna přenositelnost dokumentů TeX s ohledem na vycpávání mezerami u pevných záznamových "řádků" na některých tehdejších systémech, např. IBM VM/CMS a OS/360.“

3. Po kroku (1) TeX přidá (vloží) další znak, jehož hodnota je uložena v \endlinechar (za předpokladu, že je vhodně definována: >-1 a < 256)
4. \endlinechar je obvykle nastavena na hodnotu 13 (`\r`), což znamená, že znak přidaný v kroku (2) je obvykle znak 13 (`\r`) — ale samozřejmě můžete \endlinechar nastavit na jinou hodnotu a dosáhnout zvláštních efektů pomocí programování maker.
5. Když jeho rutiny pro skenování vstupu detekují znak `\r` (kód znaku 13) na konci své interní vyrovnávací paměti, TeX jako obvykle zkontroluje jeho kategoriální kód, aby se rozhodl, co s ním udělat.
6. Znak 13 *obvykle* má hodnotu kategoriálního kódu 5 („konec řádku“), pokud ovšem jeho kategoriální kód nebyl změněn — některá makra dělají znak konce řádku aktivním, aby mohla provádět sofistikované zpracování.
7. V závislosti na interním stavu TeXu (v podstatě na tom, co právě dělá) může TeX změnit znak konce řádku (obvykle `\r`, kategoriální kód 5) na znak mezery — takto se znaky konce řádku mění na mezery.
8. Všimněte si také, že TeX používá znaky s kategoriálním kódem 5 k rozpoznání, kdy načetl prázdný řádek a potřebuje vygenerovat `\par` token.

Následující obrázek poskytuje vizuální shrnutí kroků (1) a (2): odstranění znaků nového řádku a koncových znaků mezery a vložení `\endlinechar` připraveno pro úlohu skenování vstupu.

![Jak TeX používá \endlinechar](/files/27d937e000b1f380cdcb1de06f0806da74e01d2e)


---

# 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/cs/clanky-do-hloubky/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.
