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

# Wprowadzenie do \endlinechar: jak TeX odczytuje linie z plików tekstowych

Jako ludzie wolimy przeglądać i edytować pliki tekstowe linia po linii. Gdy uznamy, że dana linia tekstu jest wystarczająco długa, naciskamy „Enter” (w edytorze tekstu), aby zaznaczyć koniec tej linii. W tle edytor tekstu zinterpretuje to jako polecenie dodania [znaku nowej linii](https://en.wikipedia.org/wiki/Newline) w miejscu, w którym decydujesz się podzielić linię.

Jednak gdyby tylko było to takie proste: problem polega na tym, że różne systemy operacyjne mają różne wyobrażenia o tym, co stanowi znak nowej linii. Co gorsza, Windows będzie traktować znaki nowej linii inaczej w zależności od tego, czy plik jest otwarty w tak zwanym [*trybie binarnym* lub *trybie tekstowym*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). W rezultacie, w zależności od systemu operacyjnego hosta, linie w pliku tekstowym mogą być zakończone różnymi kombinacjami znaków zwanych *powrót karetki* (znak ASCII/Unicode 13) oraz *wysuw wiersza* (znak ASCII/Unicode 10): oznaczanych przez `\\r` i `\n` odpowiednio.

Oczywiście, aby być niezależnym od systemu, TeX potrzebuje sposobu radzenia sobie z kaprysami wprowadzanymi przez różne znaki używane do zakończenia linii w plikach tekstowych, które musi odczytać i przetworzyć.

### Bufor wejściowy TeX-a

Może Cię, a może nie, zaskoczyć fakt, że silniki TeX-a (w tym LuaTeX i XeTeX) odczytują pliki wejściowe po jednej linii: nie wczytują całego pliku tekstowego do pamięci. Choć większość plików tekstowych przetwarzanych przez silniki TeX-a jest mikroskopijna w porównaniu z dostępną pamięcią na współczesnych urządzeniach, każda linia w pliku jest odczytywana i przechowywana indywidualnie w małym wewnętrznym buforze. Oczywiście jednak proces odczytywania i zapisywania linii przez TeX ma kilka dodatkowych zawiłości.

## „Zrobię to po swojemu” — polecenie \endlinechar w TeX-ie

Gdy TeX odczytuje kolejną linię tekstu z pliku wejściowego, wykonuje dwa „zadania porządkowe”:

* usuwa wszelkie końcowe znaki nowej linii (\r lub \n) znalezione na końcu linii — tj. usuwa wszystkie zakończenia linii dodane podczas pierwotnego zapisu pliku tekstowego na dysku;
* usuwa również wszystkie końcowe znaki spacji znajdujące się na końcu linii.

Te dwa procesy zachodzą zanim TeX faktycznie zacznie skanować znaki zawarte w samej linii: traktuj je jako formę „porządkowania” przygotowującą do następnego etapu przetwarzania (skanowania). Zatem na tym początkowym etapie procesu odczytywania linii TeX usunął wszystkie zależne od platformy zakończenia linii (i wszelkie końcowe białe znaki): skąd więc TeX będzie wiedział (wykryje), gdzie ta linia się kończy? TeX ma jeszcze jeden „trik” w rękawie: `\endlinechar` polecenie.

Aby uniknąć problemu znaków nowej linii zależnych od platformy, TeX wprowadza pojęcie `\endlinechar`, parametru definiowalnego przez użytkownika, którego TeX używa do wstawienia własnego znaku końca linii na sam koniec właśnie odczytanej z pliku linii tekstu. Zauważ ponownie, że dzieje się to zanim TeX faktycznie zacznie skanować znaki — to końcowy etap porządkowania TeX-a, zanim będzie gotowy rozpocząć odczytywanie (skanowanie) rzeczywistych znaków zawartych w linii.

TeX użyje wartości przechowywanej w `\endlinechar` do dodania własnego terminatora końca linii tylko wtedy i tylko wtedy, gdy `\endlinechar` jest odpowiednio zdefiniowany — w TeX-u Knutha oznacza to, że musi mieć wartość >-1 i < 256. Zazwyczaj `\endlinechar` przypisuje mu się wartość 13: znak powrotu karetki — zwykle oznaczany przez `\\r` w literaturze programistycznej.

Ale jeśli wpiszesz `\endlinechar=-1` gdzieś w swoim wejściu, to *przy następnym* razie, gdy TeX odczyta linię tekstu z pliku, nie będzie *nie* dodawał żadnego dodatkowego terminatora na końcu linii. W konsekwencji Twoje wejście będzie traktowane jako jeden długi, ciągły ciąg tekstu, dopóki nie ustawisz ponownie `\endlinechar` na odpowiednią wartość — zazwyczaj 13 (`\\r`):

```latex
\endlinechar=13
```

Jedna z 16 kategorii znaków TeX-a (wartość 5) jest zarezerwowana do identyfikowania znaku „końca linii”, którym zwykle jest znak, który `\endlinechar` wstawia — który jest wstawiany, jeśli (i tylko jeśli) wartość `\endlinechar` jest ustawiona na odpowiednią wartość.

## Podsumowanie przetwarzania końca linii

Chociaż te szczegóły są dość niskopoziomowe, będą interesujące dla każdego, kto chce zgłębić pisanie makr zajmujących się odczytem linii tekstu.

1. Gdy TeX odczytuje linię z Twojego pliku, najpierw usuwa wszystkie znaki końca linii (`\\r` i `\n`) dodane przez edytor tekstu podczas zapisywania pliku. Ponadto:

* TeX usuwa również wszelkie końcowe znaki spacji z końca linii;
* TeX *nie* usuwa końcowe znaki tabulacji (kod znaku ASCII 9).

**Uwaga**: Jeden z plików kodu źródłowego LuaTeX, ten zawierający kod wykonujący to usuwanie spacji, zawiera następującą uwagę:

> (Cytowane w pliku `luatex.c`) „David Fuchs wspomina, że to usuwanie \[spacji] zostało wykonane, aby zapewnić przenośność dokumentów TeX-a, biorąc pod uwagę wypełnianie spacjami stałodługościowych „linii” w niektórych systemach tamtych czasów, np. IBM VM/CMS i OS/360.”

3. Po kroku (1) TeX dodaje (wstawia) dodatkowy znak, którego wartość jest przechowywana w \endlinechar (pod warunkiem, że jest to odpowiednio zdefiniowane: >-1 i < 256)
4. \endlinechar jest zazwyczaj ustawiane na wartość 13 (`\\r`), co oznacza, że znak dodawany w kroku (2) jest zwykle znakiem 13 (`\\r`) — ale oczywiście możesz ustawić \endlinechar na inną wartość, aby osiągnąć specjalne efekty za pomocą programowania makr.
5. Gdy procedury skanowania wejścia wykryją znak `\\r` (kod znaku 13) na końcu swojego wewnętrznego bufora, TeX, jak zwykle, sprawdzi jego kategorię, aby zdecydować, co z nim zrobić.
6. Znak 13 *zwykle* ma wartość kodu kategorii 5 („koniec linii”), chyba że oczywiście jego kod kategorii został zmieniony — niektóre makra czynią znak końca linii aktywnym, aby wykonywać zaawansowane przetwarzanie.
7. W zależności od wewnętrznego stanu TeX-a (w praktyce od tego, co robi) TeX może zmienić znak końca linii (zwykle `\\r`, kod kategorii 5) w znak spacji — tak znaki końca linii stają się spacjami.
8. Zauważ też, że TeX używa znaków z kodem kategorii 5 do wykrywania, kiedy odczytał pustą linię i musi wygenerować `\par` token.

Poniższa grafika przedstawia wizualne podsumowanie kroków (1) i (2): usuwania znaków nowej linii i końcowych znaków spacji oraz wstawiania `\endlinechar` gotowe do zadania skanowania wejścia.

![Jak TeX używa \endlinechar](/files/9d275e02eb12cd3d05b419d7427f9173df42bfeb)


---

# 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/pl/artykuly-szczegolowe/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.
