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

# Un'introduzione a \endlinechar: come TeX legge le righe dai file di testo

Come esseri umani, preferiamo visualizzare e modificare i file di testo riga per riga. Quando pensiamo che una riga di testo sia abbastanza lunga, premiamo “Invio” (nell'editor di testo) per segnalare la fine di quella riga. Dietro le quinte, il tuo editor di testo interpreterà questo come un'istruzione per aggiungere un [carattere di nuova riga](https://en.wikipedia.org/wiki/Newline) nel punto in cui decidi di andare a capo.

Tuttavia, se solo fosse così semplice: il problema è che i diversi sistemi operativi hanno nozioni diverse di ciò che costituisce un carattere di nuova riga. A complicare ulteriormente le cose, Windows tratterà i caratteri di nuova riga in modo diverso a seconda che un file sia aperto nella cosiddetta [*modalità binaria* o *modalità testo*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Il risultato è che, a seconda del sistema operativo host, le righe in un file di testo possono terminare con varie combinazioni di caratteri chiamate *ritorno a capo* (carattere ASCII/Unicode 13) e *avanzamento riga* (carattere ASCII/Unicode 10): indicato da `\r` e `\n` rispettivamente.

Chiaramente, per essere indipendente dal sistema TeX ha bisogno di un modo per gestire le variabili introdotte dai diversi caratteri usati per terminare una riga nei file di testo che deve leggere ed elaborare.

### Il buffer di input di TeX

Potresti essere sorpreso, oppure no, nell'apprendere che i motori TeX (inclusi LuaTeX e XeTeX) leggono i file di input una riga alla volta: non leggono l'intero file di testo in memoria. Anche se la maggior parte dei file di testo elaborati dai motori TeX è minuscola rispetto alla memoria disponibile sui dispositivi moderni, ogni riga del file viene letta e memorizzata singolarmente in un piccolo buffer interno. Ma, naturalmente, il processo di lettura e memorizzazione di una riga da parte di TeX ha qualche ulteriore particolarità.

## “Lo farò a modo mio” — il comando \endlinechar di TeX

Quando TeX legge un'altra riga di testo da un file di input, esegue due “attività di manutenzione”:

* rimuove eventuali caratteri di nuova riga finali (\r o \n) trovati alla fine della riga — cioè elimina tutti gli a capo aggiunti quando il file di testo è stato originariamente salvato su disco;
* rimuove anche tutti i caratteri di spazio finali trovati alla fine della riga.

Questi due processi avvengono prima che TeX inizi effettivamente a scansionare i caratteri contenuti nella riga stessa: pensali come una forma di “manutenzione” in preparazione alla fase successiva dell'elaborazione (scansione). Quindi, durante questa fase iniziale del processo di lettura delle righe TeX ha rimosso tutti gli a capo dipendenti dalla piattaforma (e ogni spazio bianco finale): come farà quindi TeX a sapere (rilevare) dove finisce quella riga? TeX ha un altro “trucco” nella manica: il `\endlinechar` comando.

Per evitare il problema dei caratteri di nuova riga dipendenti dalla piattaforma, TeX introduce il concetto di `\endlinechar`, un parametro definibile dall'utente che TeX usa per inserire il proprio carattere di fine riga alla fine di una riga di testo appena letta da un file. Si noti ancora che questo avviene prima che TeX inizi effettivamente a scansionare i caratteri: è l'ultimo passo della “manutenzione” di TeX prima che sia pronto a iniziare a leggere (scansionare) i caratteri effettivi contenuti nella riga.

TeX utilizzerà il valore memorizzato in `\endlinechar` per aggiungere il proprio terminatore di fine riga se, e solo se, `\endlinechar` è definito in modo appropriato — nel TeX di Knuth ciò significa che deve avere un valore >-1 e < 256. Tipicamente, `\endlinechar` viene assegnato il valore 13: il carattere di ritorno a capo — solitamente indicato da `\r` nella letteratura di programmazione.

Ma se scrivi `\endlinechar=-1` da qualche parte nel tuo input, allora il *prossima volta* che TeX leggerà una riga di testo da un file, esso *non* non aggiungerà alcun terminatore aggiuntivo alla fine della riga. Di conseguenza, il tuo input verrà trattato come un'unica lunga stringa continua di testo finché non reimposti `\endlinechar` a un valore appropriato — tipicamente 13 (`\r`):

```latex
\endlinechar=13
```

Uno dei 16 codici di categoria di TeX (valore 5) è riservato a identificare il carattere di “fine riga”, che di solito è il carattere che `\endlinechar` viene inserito — il quale viene inserito se (e solo se) il valore di `\endlinechar` è impostato a un valore appropriato.

## Riepilogo dell'elaborazione della fine riga

Sebbene questi dettagli siano piuttosto di basso livello, saranno di interesse per chiunque voglia esplorare la scrittura di macro che gestiscono la lettura di righe di testo.

1. Quando TeX legge una riga dal tuo file, rimuoverà innanzitutto tutti i caratteri di fine riga (`\r` e `\n`) aggiunti dal tuo editor di testo quando il file è stato salvato. Inoltre:

* TeX rimuove anche eventuali caratteri di spazio finali dalla fine della riga;
* TeX *non* rimuovere i caratteri di tabulazione finali (codice ASCII 9).

**Inciso**: uno dei file di codice sorgente di LuaTeX, quello che contiene il codice per eseguire questa rimozione degli spazi, contiene la seguente nota:

> (Citato nel file `luatex.c`) “David Fuchs osserva che questa rimozione degli \[spazi] è stata fatta per garantire la portabilità dei documenti TeX, dato il riempimento con spazi sulle "righe" a record fisso su alcuni sistemi dell'epoca, ad esempio IBM VM/CMS e OS/360.”

3. Dopo il passaggio (1), TeX aggiunge (inserisce) un carattere aggiuntivo il cui valore è memorizzato in \endlinechar (a condizione che sia definito in modo adeguato: >-1 e < 256)
4. \endlinechar è tipicamente impostato al valore 13 (`\r`), il che significa che il carattere aggiunto nel passaggio (2) è solitamente il carattere 13 (`\r`) — ma, naturalmente, puoi impostare \endlinechar su un altro valore per ottenere effetti speciali tramite la programmazione di macro.
5. Quando le sue routine di scansione dell'input rilevano il carattere `\r` (codice carattere 13) alla fine del suo buffer interno, TeX controllerà, come al solito, il suo codice di categoria per decidere cosa farne.
6. Il carattere 13 *di solito* ha valore di codice di categoria 5 (“fine riga”) a meno che, naturalmente, il suo codice di categoria non sia stato modificato — alcune macro rendono attivo il carattere di fine riga per eseguire elaborazioni sofisticate.
7. A seconda dello stato interno di TeX (in pratica, di ciò che sta facendo), TeX può trasformare il carattere di fine riga (di solito `\r`, codice di categoria 5) in un carattere di spazio — è così che i caratteri di fine riga diventano spazi.
8. Si noti inoltre che TeX usa i caratteri con codice di categoria 5 per rilevare quando ha letto una riga vuota e deve generare un `\par` token.

La seguente figura fornisce un riepilogo visivo dei passaggi (1) e (2): rimozione dei caratteri di nuova riga e dei caratteri di spazio finali e inserimento di `\endlinechar` pronto per il compito di scansionare l'input.

![Come TeX usa \endlinechar](/files/fafe2dbd0220802093f5dea0903fffcc5ddadf8f)


---

# 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/it/articoli-approfonditi/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.
