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

# En introduktion till \endlinechar: Hur TeX läser rader från textfiler

Som människor föredrar vi att visa och redigera textfiler rad för rad. När vi tycker att en textrad är tillräckligt lång trycker vi på ”retur” (i textredigeraren) för att signalera slutet på den raden. I bakgrunden kommer din textredigerare att tolka det som en instruktion att lägga till en [radbrytningstecken](https://en.wikipedia.org/wiki/Newline) på den punkt där du väljer att bryta en rad.

Men om det ändå vore så enkelt: problemet är att olika operativsystem har olika uppfattningar om vad som utgör ett radbrytningstecken. För att göra saken värre behandlar Windows radbrytningstecken olika beroende på om en fil öppnas i det så kallade [*binärt läge* eller *textläge*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Resultatet är att rader i en textfil, beroende på värdsystemets operativsystem, kan avslutas med olika kombinationer av tecken som kallas *vagnretur* (ASCII-/Unicode-tecken 13) och *radmatning* (ASCII-/Unicode-tecken 10): betecknas med `\r` och `\n` respektive.

Uppenbarligen behöver TeX, för att vara systemoberoende, ett sätt att hantera de variationer som införs genom de olika tecken som används för att avsluta en rad i textfiler som det behöver läsa och bearbeta.

### TeX:s inmatningsbuffert

Det kanske överraskar dig, eller inte, att få veta att TeX-motorer (inklusive LuaTeX och XeTeX) läser inmatningsfiler en rad i taget: de läser inte hela textfilen in i minnet. Även om de flesta textfiler som bearbetas av TeX-motorer är pyttesmå jämfört med det tillgängliga minnet på moderna enheter, läses varje rad i filen in och lagras individuellt i en liten intern buffert. Men naturligtvis har TeX:s process att läsa och lagra en rad några extra finesser.

## ”Jag gör det på mitt sätt” — TeX:s \endlinechar-kommando

När TeX läser ytterligare en textrad från en inmatningsfil utför det två ”underhållsuppgifter”:

* det tar bort eventuella avslutande radbrytningstecken (\r eller \n) som finns i slutet av raden – det vill säga, det rensar bort alla radslut som lades till när textfilen ursprungligen sparades på disk;
* det tar också bort alla avslutande blanktecken som finns i slutet av raden.

Dessa två processer sker innan TeX faktiskt börjar tolka tecknen i själva raden: betrakta dem som en form av ”underhåll” som förberedelse inför nästa bearbetningssteg (skanning). Under detta inledande skede av radläsningsprocessen har TeX alltså tagit bort alla plattformsberoende radslut (och eventuella avslutande blanktecken): så hur ska TeX veta (detektera) var raden slutar? TeX har ett sista ”trick” i rockärmen: `\endlinechar` kommandot.

För att undvika problemet med plattformsberoende radbrytningstecken inför TeX begreppet `\endlinechar`, en användardefinierbar parameter som TeX använder för att infoga sitt eget radslutstecken allra längst ut i slutet av en textrad som det just har läst från en fil. Observera återigen att detta sker innan TeX faktiskt börjar skanna tecknen – det är det sista steget i TeX:s ”underhåll” innan det är redo att börja läsa (skanna) de faktiska tecken som finns i raden.

TeX kommer att använda värdet som lagras i `\endlinechar` för att lägga till sin egen radslutsavgränsare om, och endast om, `\endlinechar` är lämpligt definierad – i Knuths TeX betyder det att den måste ha ett värde som är >-1 och < 256. Vanligtvis, `\endlinechar` tilldelas värdet 13: vagnreturtecknet – vanligtvis betecknat med `\r` i programmeringslitteraturen.

Men om du skriver `\endlinechar=-1` någonstans i din inmatning så kommer *nästa gång* TeX läser en textrad från en fil kommer det att *inte* inte lägga till någon extra avgränsare i slutet av raden. Följaktligen kommer din inmatning att behandlas som en enda lång sammanhängande textsträng tills du återställer `\endlinechar` till ett lämpligt värde – vanligtvis 13 (`\r`):

```latex
\endlinechar=13
```

En av TeX:s 16 kategorikoder (värde 5) är reserverad för att identifiera tecknet för ”radslut”, vilket vanligtvis är det tecken som `\endlinechar` infogar – vilket infogas om (och endast om) värdet av `\endlinechar` är inställt på ett lämpligt värde.

## Sammanfattning av bearbetning av radslut

Även om dessa detaljer är ganska lågnivåmässiga kommer de att vara av intresse för alla som vill utforska hur man skriver makron som hanterar läsning av textrader.

1. När TeX läser en rad från din fil tar det först bort alla radslutstecken (`\r` och `\n`) som lades till av din textredigerare när filen sparades. Dessutom:

* tar TeX också bort eventuella avslutande blanktecken i slutet av raden;
* TeX *gör inte* tar bort avslutande tabbtecken (ASCII-teckenkod 9).

**Sidonotis**: En av LuaTeX:s källkodsfiler, den som innehåller kod för att utföra denna borttagning av blanktecken, innehåller följande anmärkning:

> (Citerat i filen `luatex.c`) ”David Fuchs nämner att denna \[blank]teckenborttagning gjordes för att säkerställa portabiliteten hos TeX-dokument, med tanke på utfyllnaden med blanktecken på fasta post-”rader” på vissa system på den tiden, t.ex. IBM VM/CMS och OS/360.”

3. Efter steg (1) lägger TeX till (infogar) ett extra tecken vars värde lagras i \endlinechar (förutsatt att det är lämpligt definierat: >-1 och < 256)
4. \endlinechar är vanligtvis satt till värdet 13 (`\r`), vilket betyder att tecknet som läggs till i steg (2) vanligtvis är tecken 13 (`\r`) – men du kan förstås sätta \endlinechar till ett annat värde för att uppnå specialeffekter via makroprogrammering.
5. När dess inmatningsskanningsrutiner upptäcker tecknet `\r` (teckenkod 13) i slutet av sin interna buffert kommer TeX, som vanligt, att kontrollera dess kategorikod för att avgöra vad som ska göras med det.
6. Tecken 13 *vanligtvis* har kategorikodsvärdet 5 (”radslut”) om inte dess kategorikod förstås har ändrats – vissa makron gör radslutstecknet aktivt för att kunna utföra avancerad bearbetning.
7. Beroende på TeX:s interna tillstånd (i praktiken vad det håller på med) kan TeX ändra att radslutstecknet (vanligtvis `\r`, kategorikod 5) till ett blanktecken – så blir radslutstecken till blanktecken.
8. Observera också att TeX använder tecken med kategorikod 5 för att upptäcka när det har läst en tom rad och behöver generera en `\par` token.

Följande grafiska översikt ger en visuell sammanfattning av steg (1) och (2): borttagning av radbrytningstecken och avslutande blanktecken samt infogning av `\endlinechar` redo för uppgiften att skanna inmatningen.

![Hur TeX använder \endlinechar](/files/3d85f308a4eaa9876433d4e7fe0896eee02cbd96)


---

# 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/sv/fordjupade-artiklar/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.
