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

# Johdanto \endlinechariin: miten TeX lukee rivejä tekstitiedostoista

Ihmisinä haluamme tarkastella ja muokata tekstitiedostoja rivi riviltä. Kun ajattelemme, että tekstirivi on tarpeeksi pitkä, painamme tekstieditorissa “return”-näppäintä ilmoittaaksemme kyseisen rivin lopun. Taustalla tekstieditorisi tulkitsee tämän ohjeeksi lisätä [rivinvaihtomerkki](https://en.wikipedia.org/wiki/Newline) siihen kohtaan, jossa päätät katkaista rivin.

Mutta jospa se olisikin noin yksinkertaista: ongelmana on, että eri käyttöjärjestelmillä on erilaiset käsitykset siitä, mikä muodostaa rivinvaihtomerkin. Tilannetta pahentaa se, että Windows käsittelee rivinvaihtomerkkejä eri tavoin sen mukaan, avataanko tiedosto niin sanotussa [*binääritilassa* tai *tekstitilassa*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Tämän seurauksena, isäntäkäyttöjärjestelmästä riippuen, tekstitiedoston rivit voidaan päättää eri merkkien yhdistelmillä, joita kutsutaan *vaununpalautukseksi* (ASCII-/Unicode-merkki 13) ja *rivinsyötöksi* (ASCII-/Unicode-merkki 10): merkitään `\r` ja `\n` vastaavasti.

On selvää, että järjestelmäriippumattomaksi tullakseen TeX tarvitsee tavan käsitellä niitä vaihteluita, joita syntyy eri merkeistä, joilla rivi päätetään sen tekstitiedostojen sisällä, joita sen täytyy lukea ja käsitellä.

### TeXin syöttöpuskuri

Sinua saattaa tai ei saata yllättää kuulla, että TeX-moottorit (mukaan lukien LuaTeX ja XeTeX) lukevat syötetiedostoja rivi kerrallaan: ne eivät lue koko tekstitiedostoa muistiin. Vaikka useimmat TeX-moottoreiden käsittelemät tekstitiedostot ovat nykylaitteiden käytettävissä olevaan muistiin verrattuna mitättömän pieniä, tiedoston jokainen rivi luetaan ja tallennetaan erikseen pieneen sisäiseen puskuriin. Mutta tietenkin TeXin riviä lukiessa ja tallentaessa on omat lisävivahteensa.

## “Teen sen omalla tavallani” — TeXin \endlinechar-komento

Kun TeX lukee toisen tekstirivin syötetiedostosta, se suorittaa kaksi “ylläpitotehtävää”:

* se poistaa kaikki rivin lopusta löytyvät päättävät rivinvaihtomerkit (\r tai \n) — eli se riisuu pois kaikki rivinloput, jotka lisättiin, kun tekstitiedosto alun perin tallennettiin levylle;
* se poistaa myös kaikki rivin lopussa olevat välilyönnit.

Nämä kaksi prosessia tapahtuvat ennen kuin TeX varsinaisesti alkaa käydä itse rivin merkkejä läpi: ajattele niitä eräänlaisena “ylläpitona” valmistautumisena käsittelyn seuraavaan vaiheeseen (skannaukseen). Joten tämän rivinlukuprosessin alkuvaiheen aikana TeX on poistanut kaikki alustariippuvat rivinloput (sekä mahdolliset lopussa olevat tyhjät merkit): miten TeX sitten tietää (havaitsee), missä kyseinen rivi päättyy? TeXillä on vielä yksi “temppu” hihassaan: `\endlinechar` komento.

Alustariippuvaisten rivinvaihtomerkkien ongelman välttämiseksi TeX esittelee käsitteen `\endlinechar`, käyttäjän määriteltävissä olevan parametrin, jota TeX käyttää lisätäkseen oman rivinlopun merkkinsä juuri tiedostosta lukemansa tekstirivin aivan loppuun. Huomaa jälleen, että tämä tapahtuu ennen kuin TeX varsinaisesti alkaa skannata merkkejä — se on TeXin “ylläpidon” viimeinen vaihe, ennen kuin se on valmis aloittamaan rivillä olevien varsinaisten merkkien lukemisen (skannauksen).

TeX käyttää arvoa, joka on tallennettu kohtaan `\endlinechar` lisätäkseen oman rivinlopputunnisteensa, jos ja vain jos `\endlinechar` on määritelty asianmukaisesti — Knuthin TeXissä se tarkoittaa, että sen arvon täytyy olla >-1 ja < 256. Tyypillisesti `\endlinechar` sille annetaan arvo 13: vaununpalautusmerkki — yleensä merkitään `\r` ohjelmointikirjallisuudessa.

Mutta jos kirjoitat `\endlinechar=-1` jossakin syötteessäsi, niin *seuraavalla kerralla* kun TeX lukee tekstirivin tiedostosta, se *sisällä* ei lisää mitään ylimääräistä päätemerkkiä rivin loppuun. Tämän seurauksena syötteesi käsitellään yhtenä pitkänä, yhtäjaksoisena tekstijonona, kunnes palautat `\endlinechar` sopivaan arvoon — tyypillisesti 13 (`\r`):

```latex
\endlinechar=13
```

Yksi TeXin 16 kategoriakoodista (arvo 5) on varattu tunnistamaan “rivin lopun” merkki, joka on yleensä merkki, joka `\endlinechar` lisää — joka lisätään, jos ja vain jos arvon `\endlinechar` asetetaan sopivaksi arvoksi.

## Rivinlopun käsittelyn yhteenveto

Vaikka nämä yksityiskohdat ovat varsin matalan tason asioita, ne kiinnostavat kaikkia, jotka haluavat perehtyä makrojen kirjoittamiseen, kun ne käsittelevät tekstirivien lukemista.

1. Kun TeX lukee rivin tiedostostasi, se poistaa ensin kaikki rivinlopun merkit (`\r` ja `\n`) joita tekstieditorisi lisäsi, kun tiedosto tallennettiin. Lisäksi:

* TeX poistaa myös kaikki rivin lopussa olevat välilyönnit;
* TeX *ei* poistaa rivin lopussa olevat tabulaattorimerkit (ASCII-merkkikoodi 9).

**Oheishuomautus**: Yksi LuaTeXin lähdekooditiedostoista, se, jossa on koodi tämän välilyöntien poistamisen suorittamiseksi, sisältää seuraavan huomautuksen:

> (Lainattu tiedostossa `luatex.c`) “David Fuchs mainitsee, että tämä \[välilyöntien] poisto tehtiin TeX-dokumenttien siirrettävyyden varmistamiseksi, kun joissakin silloisissa järjestelmissä kiinteän mittaisille "riveille" täytettiin välilyöntejä, esim. IBM VM/CMS:ssä ja OS/360:ssa.”

3. Vaiheen (1) jälkeen TeX lisää ylimääräisen merkin, jonka arvo on tallennettu kohtaan \endlinechar (edellyttäen, että se on määritelty asianmukaisesti: >-1 ja < 256)
4. \endlinechar asetetaan tyypillisesti arvoon 13 (`\r`), mikä tarkoittaa, että vaiheessa (2) lisätty merkki on yleensä merkki 13 (`\r`) — mutta tietenkin voit asettaa \endlinecharin toiseen arvoon saavuttaaksesi erikoistehosteita makro-ohjelmoinnin avulla.
5. Kun sen syötteen skannausrutiinit havaitsevat merkin `\r` (merkkikoodi 13) sisäisen puskurinsa lopussa, TeX tarkistaa, kuten tavallista, sen kategoriakoodin päättääkseen, mitä sille tehdään.
6. Merkki 13 *yleensä* on kategoriakoodin arvo 5 (“rivin loppu”), ellei tietenkin sen kategoriakoodia ole muutettu — jotkin makrot tekevät rivinlopun merkistä aktiivisen suorittaakseen monimutkaisempaa käsittelyä.
7. Riippuen TeXin sisäisestä tilasta (käytännössä siitä, mitä se on tekemässä) TeX voi muuttaa sen, että rivinlopun merkki (yleensä `\r`, kategoriakoodi 5) muuttuu välilyönniksi — näin rivinlopun merkit muuttuvat välilyönneiksi.
8. Huomaa myös, että TeX käyttää kategoriakoodin 5 merkkejä havaitakseen, milloin se on lukenut tyhjän rivin ja sen täytyy tuottaa `\par` tunniste.

Seuraava kuva antaa visuaalisen yhteenvedon vaiheista (1) ja (2): rivinvaihtomerkkien ja lopussa olevien välilyöntien poistamisesta sekä `\endlinechar` valmiina syötteen skannaustehtävää varten.

![Miten TeX käyttää \endlinecharia](/files/dbdb6720ab16b02db35f8208b17eddda6c496501)


---

# 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/fi/syvalliset-artikkelit/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.
