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

# Eine Einführung in \endlinechar: Wie TeX Zeilen aus Textdateien liest

Als Menschen bevorzugen wir es, Textdateien zeilenweise anzuzeigen und zu bearbeiten. Sobald wir denken, dass eine Textzeile lang genug ist, drücken wir „Return“ (im Texteditor), um das Ende dieser Zeile zu signalisieren. Im Hintergrund wird Ihr Texteditor dies als Anweisung interpretieren, ein [Zeilenumbruchzeichen](https://en.wikipedia.org/wiki/Newline) an der Stelle einzufügen, an der Sie sich entscheiden, eine Zeile umzubrechen.

Doch wäre es nur so einfach: Das Problem ist, dass verschiedene Betriebssysteme unterschiedliche Vorstellungen davon haben, was als Zeilenumbruchzeichen gilt. Noch schlimmer: Windows behandelt Zeilenumbruchzeichen unterschiedlich, je nachdem, ob eine Datei im sogenannten [*Binärmodus* oder *Textmodus*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Das Ergebnis ist, dass Zeilen in einer Textdatei – je nach Host-Betriebssystem – durch unterschiedliche Kombinationen von Zeichen beendet werden können, die genannt werden *Wagenrücklauf* (ASCII-/Unicode-Zeichen 13) und *Zeilenvorschub* (ASCII-/Unicode-Zeichen 10): bezeichnet mit `\\r` und `\n` bzw.

Offensichtlich braucht TeX, um systemunabhängig zu sein, eine Möglichkeit, mit den Unwägbarkeiten umzugehen, die durch die unterschiedlichen Zeichen entstehen, mit denen eine Zeile in den Textdateien, die es lesen und verarbeiten muss, abgeschlossen wird.

### TeXs Eingabepuffer

Es mag Sie überraschen, oder auch nicht, zu erfahren, dass TeX-Engines (einschließlich LuaTeX und XeTeX) Eingabedateien zeilenweise lesen: Sie lesen nicht die gesamte Textdatei in den Speicher. Obwohl die meisten von TeX-Engines verarbeiteten Textdateien im Vergleich zum verfügbaren Speicher auf modernen Geräten winzig sind, wird jede Zeile der Datei einzeln gelesen und in einem kleinen internen Puffer gespeichert. Doch natürlich hat TeXs Prozess des Lesens und Speicherns einer Zeile noch einige zusätzliche Besonderheiten.

## „Ich mache es auf meine Art“ – der \endlinechar-Befehl von TeX

Wenn TeX eine weitere Textzeile aus einer Eingabedatei liest, erledigt es zwei „Verwaltungsaufgaben“:

* es entfernt alle abschließenden Zeilenumbruchzeichen (\r oder \n), die am Ende der Zeile gefunden werden – d. h. es entfernt alle Zeilenenden, die beim ursprünglichen Speichern der Textdatei auf der Festplatte hinzugefügt wurden;
* es entfernt außerdem alle am Zeilenende gefundenen Leerzeichen.

Diese beiden Prozesse finden statt, bevor TeX tatsächlich damit beginnt, die in der Zeile selbst enthaltenen Zeichen zu scannen: Betrachten Sie sie als eine Art „Verwaltungsarbeit“ zur Vorbereitung auf die nächste Verarbeitungsstufe (das Scannen). Während dieser ersten Phase des Zeilenlesens hat TeX also alle plattformspezifischen Zeilenenden (und jegliche nachgestellten Leerzeichen) entfernt: wie soll TeX also wissen (erkennen), wo diese Zeile endet? TeX hat noch einen weiteren „Trick“ im Ärmel: den `\endlinechar` Befehl zu interpretieren ist.

Um das Problem plattformabhängiger Zeilenumbruchzeichen zu vermeiden, führt TeX das Konzept von `\endlinechar`, einen benutzerdefinierbaren Parameter, den TeX verwendet, um sein eigenes Zeilenendzeichen ganz am Ende einer Textzeile einzufügen, die es gerade aus einer Datei gelesen hat. Beachten Sie erneut, dass dies geschieht, bevor TeX tatsächlich mit dem Scannen der Zeichen beginnt – es ist der letzte Schritt von TeXs „Verwaltungsarbeit“, bevor es bereit ist, mit dem Lesen (Scannen) der eigentlichen in der Zeile enthaltenen Zeichen zu beginnen.

TeX verwendet den in `\endlinechar` gespeicherten Wert, um seinen eigenen Zeilenendabschluss hinzuzufügen, wenn und nur wenn `\endlinechar` ordnungsgemäß definiert ist – in Knuths TeX bedeutet das, dass er einen Wert > -1 und < 256 haben muss. Typischerweise `\endlinechar` wird ihm der Wert 13 zugewiesen: das Wagenrücklaufzeichen – üblicherweise bezeichnet mit `\\r` in der Programmierliteratur.

Wenn Sie jedoch `\endlinechar=-1` irgendwo in Ihrer Eingabe schreiben, dann *beim nächsten Mal* wird TeX eine Textzeile aus einer Datei lesen und *nicht* kein zusätzliches Abschlusszeichen an das Ende einer Zeile anhängen. Folglich wird Ihre Eingabe als ein einziger langer, fortlaufender Textstring behandelt, bis Sie `\endlinechar` auf einen geeigneten Wert zurücksetzen – typischerweise 13 (`\\r`):

```latex
\endlinechar=13
```

Einer von TeXs 16 Kategoriecodes (Wert 5) ist reserviert, um das Zeichen für das „Zeilenende“ zu kennzeichnen, das normalerweise das Zeichen ist, das `\endlinechar` einfügt – welches eingefügt wird, wenn (und nur wenn) der Wert von `\endlinechar` auf einen geeigneten Wert gesetzt ist.

## Zusammenfassung der Verarbeitung von Zeilenenden

Obwohl diese Details recht niedrigstufig sind, werden sie für alle interessant sein, die sich mit dem Schreiben von Makros beschäftigen möchten, die das Lesen von Textzeilen behandeln.

1. Wenn TeX eine Zeile aus Ihrer Datei liest, entfernt es zunächst alle Zeilenendzeichen (`\\r` und `\n`) die Ihr Texteditor beim Speichern der Datei hinzugefügt hat. Außerdem:

* TeX entfernt außerdem alle Leerzeichen am Ende der Zeile;
* TeX *nicht* entfernt nachgestellte Tabulatorzeichen (ASCII-Zeichencode 9).

**Nebenbei**: Eine der Quellcodedateien von LuaTeX, die den Code zum Entfernen dieser Leerzeichen enthält, enthält die folgende Notiz:

> (Zitiert in der Datei `luatex.c`) „David Fuchs erwähnt, dass dieses Entfernen von \[Leerzeichen] durchgeführt wurde, um die Portabilität von TeX-Dokumenten sicherzustellen, angesichts der Auffüllung mit Leerzeichen bei festen Datensatz-„Zeilen“ auf einigen Systemen jener Zeit, z. B. IBM VM/CMS und OS/360.“

3. Nach Schritt (1) fügt TeX ein zusätzliches Zeichen hinzu (es wird eingefügt), dessen Wert in \endlinechar gespeichert ist (vorausgesetzt, es ist ordnungsgemäß definiert: >-1 und < 256)
4. \endlinechar wird typischerweise auf den Wert 13 gesetzt (`\\r`), was bedeutet, dass das in Schritt (2) hinzugefügte Zeichen normalerweise Zeichen 13 ist (`\\r`) – aber natürlich können Sie \endlinechar auf einen anderen Wert setzen, um über die Makroprogrammierung spezielle Effekte zu erzielen.
5. Wenn seine Eingabescann-Routinen das Zeichen `\\r` (Zeichencode 13) am Ende seines internen Puffers erkennen, prüft TeX wie üblich seinen Kategoriecode, um zu entscheiden, was damit zu tun ist.
6. Zeichen 13 *normalerweise* hat den Kategoriecode-Wert 5 („Zeilenende“), sofern sein Kategoriecode nicht natürlich geändert wurde – einige Makros machen das Zeilenendzeichen aktiv, um anspruchsvolle Verarbeitungen durchzuführen.
7. Je nach internem Zustand von TeX (also faktisch danach, was es gerade tut) kann TeX das Zeilenendzeichen (normalerweise `\\r`, Kategoriecode 5) in ein Leerzeichen umwandeln – so werden Zeilenendzeichen zu Leerzeichen.
8. Beachten Sie auch, dass TeX Zeichen mit dem Kategoriecode 5 verwendet, um zu erkennen, wann es eine leere Zeile gelesen hat und ein `\par` Token erzeugen muss.

Die folgende Grafik gibt eine visuelle Zusammenfassung der Schritte (1) und (2): Entfernen von Zeilenumbruchzeichen und nachgestellten Leerzeichen sowie Einfügen von `\endlinechar` bereit für die Aufgabe, die Eingabe zu scannen.

![Wie TeX \endlinechar verwendet](/files/5ea9fe0bf54bef27492ee500f18df885ea49ed72)


---

# 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/de/ausfuhrliche-artikel/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.
