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

# En introduktion til \endlinechar: Hvordan TeX læser linjer fra tekstfiler

Som mennesker foretrækker vi at se og redigere tekstfiler linje for linje. Når vi synes, at en tekstlinje er lang nok, trykker vi på “return” (i teksteditoren) for at markere slutningen af den linje. Bag kulisserne vil din teksteditor fortolke det som en instruktion om at tilføje et [linjeskifttegn](https://en.wikipedia.org/wiki/Newline) på det sted, hvor du vælger at bryde en linje.

Men hvis det blot var så simpelt: problemet er, at forskellige operativsystemer har forskellige opfattelser af, hvad der udgør et linjeskifttegn. For at gøre tingene værre behandler Windows linjeskifttegn forskelligt afhængigt af, om en fil åbnes i såkaldt [*binær tilstand* eller *teksttilstand*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Resultatet er, at linjer i en tekstfil, afhængigt af værtens operativsystem, kan afsluttes med forskellige kombinationer af tegn kaldet *vognretur* (ASCII/Unicode-tegn 13) og *linjeskift* (ASCII/Unicode-tegn 10): angivet med `\r` og `\n` henholdsvis.

Det er tydeligt, at TeX for at være systemuafhængigt har brug for en måde at håndtere de særheder, som de forskellige tegn, der bruges til at afslutte en linje i de tekstfiler, det skal læse og behandle, medfører.

### TeX’s inputbuffer

Det vil måske, eller måske ikke, overraske dig at høre, at TeX-motorer (inklusive LuaTeX og XeTeX) læser inputfiler en linje ad gangen: de læser ikke hele tekstfilen ind i hukommelsen. Selvom de fleste tekstfiler, der behandles af TeX-motorer, er mikroskopiske sammenlignet med den tilgængelige hukommelse på moderne enheder, læses og gemmes hver linje i filen individuelt i en lille intern buffer. Men selvfølgelig har TeX’s proces med at læse og gemme en linje nogle ekstra drejninger.

## “Jeg gør det på min egen måde”—TeX’s \endlinechar-kommando

Når TeX læser endnu en linje tekst fra en inputfil, udfører det to “vedligeholdelsesopgaver”:

* det fjerner eventuelle afsluttende linjeskifttegn (\r eller \n) fundet i slutningen af linjen—dvs. det fjerner alle linjeafslutninger, der blev tilføjet, da tekstfilen oprindeligt blev gemt på disken;
* det fjerner også alle efterfølgende mellemrumstegn i slutningen af linjen.

Disse to processer sker, før TeX faktisk begynder at skanne de tegn, der er indeholdt i selve linjen: tænk på dem som en form for “vedligeholdelse” som forberedelse til næste trin i behandlingen (skanning). Så under dette indledende trin af linjelæsningsprocessen har TeX fjernet alle platformsafhængige linjeafslutninger (og enhver afsluttende whitespace): så hvordan vil TeX vide (registrere), hvor den linje slutter? TeX har endnu et “trick” i ærmet: `\endlinechar` kommandoen.

For at undgå problemet med platformsafhængige linjeskifttegn introducerer TeX begrebet `\endlinechar`, en brugerdefinerbar parameter, som TeX bruger til at indsætte sit eget linjesluttegn helt i slutningen af en tekstlinje, som det netop har læst fra en fil. Bemærk igen, at dette sker, før TeX faktisk begynder at skanne tegnene—det er det sidste trin i TeX’s “vedligeholdelse”, før det er klar til at begynde at læse (skanne) de faktiske tegn i linjen.

TeX vil bruge den værdi, der er gemt i `\endlinechar` til at tilføje sin egen linjeslutterminator, hvis og kun hvis, `\endlinechar` er passende defineret—i Knuths TeX betyder det, at den skal have en værdi, der er >-1 og < 256. Typisk, `\endlinechar` tildeles værdien 13: vognreturtegnet—normalt angivet med `\r` i programmeringslitteraturen.

Men hvis du skriver `\endlinechar=-1` et sted i dit input, så vil den *næste gang* TeX læser en linje tekst fra en fil, vil den *ikke* ikke tilføje nogen ekstra terminator til slutningen af en linje. Følgelig vil dit input blive behandlet som én lang sammenhængende tekststreng, indtil du nulstiller `\endlinechar` til en passende værdi—typisk 13 (`\r`):

```latex
\endlinechar=13
```

En af TeX’s 16 kategorikoder (værdi 5) er reserveret til at identificere “slut på linje”-tegnet, som normalt er det tegn, som `\endlinechar` indsætter—hvilket indsættes, hvis (og kun hvis) værdien af `\endlinechar` er sat til en passende værdi.

## Oversigt over behandling af linjeslutning

Selvom disse detaljer er ret lavniveau, vil de være af interesse for enhver, der ønsker at udforske skrivning af makroer, der håndterer læsning af tekstlinjer.

1. Når TeX læser en linje fra din fil, vil det først fjerne alle linjeslutningstegn (`\r` og `\n`) som din teksteditor tilføjede, da filen blev gemt. Derudover:

* TeX fjerner også eventuelle efterfølgende mellemrumstegn fra slutningen af linjen;
* TeX *ikke* fjern efterfølgende tabulatortegn (ASCII-tegnkode 9).

**Bemærkning**: En af LuaTeX’s kildekodefiler, den som indeholder kode til at udføre denne fjernelse af mellemrum, indeholder følgende note:

> (Citeret i filen `luatex.c`) “David Fuchs nævner, at denne \[space]-fjernelse blev gjort for at sikre TeX-dokumenters portabilitet givet udfyldningen med mellemrum på fastrecord-"linjer" på nogle systemer fra den tid, f.eks. IBM VM/CMS og OS/360.”

3. Efter trin (1) tilføjer TeX et ekstra tegn (indsætter), hvis værdi er gemt i \endlinechar (forudsat at dette er passende defineret: >-1 og < 256)
4. \endlinechar er typisk sat til værdien 13 (`\r`), hvilket betyder, at tegnet tilføjet i trin (2) normalt er tegn 13 (`\r`)—men selvfølgelig kan du sætte \endlinechar til en anden værdi for at opnå særlige effekter via makroprogrammering.
5. Når dens inputskanningsrutiner registrerer tegnet `\r` (tegnkode 13) i slutningen af dens interne buffer, vil TeX som sædvanligt kontrollere dets kategorikode for at afgøre, hvad der skal gøres med det.
6. Tegn 13 *som regel* har kategorikodeværdien 5 (“slut på linje”), medmindre naturligvis dets kategorikode er blevet ændret—nogle makroer gør slut-på-linje-tegnet aktivt for at udføre avanceret behandling.
7. Afhængigt af TeX’s interne tilstand (i praksis, hvad det laver) kan TeX ændre, at slut-på-linje-tegnet (normalt `\r`, kategorikode 5) til et mellemrumstegn—sådan bliver slut-på-linje-tegn til mellemrum.
8. Bemærk også, at TeX bruger tegn med kategorikode 5 til at registrere, når det har læst en tom linje og skal generere et `\par` token.

Følgende grafik giver en visuel oversigt over trin (1) og (2): fjernelse af linjeskifttegn og efterfølgende mellemrumstegn samt indsættelse af `\endlinechar` klar til opgaven med at skanne inputtet.

![Hvordan TeX bruger \endlinechar](/files/ce84e5b72b776447a4c8d10e5fa94eae6cfee537)


---

# 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/da/dybtgaende-artikler/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.
