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

# Introduction à \endlinechar : comment TeX lit les lignes des fichiers texte

En tant qu’êtres humains, nous préférons afficher et modifier les fichiers texte ligne par ligne. Dès que nous pensons qu’une ligne de texte est suffisamment longue, nous appuyons sur « retour » (dans l’éditeur de texte) pour signaler la fin de cette ligne. En coulisses, votre éditeur de texte interprétera cela comme une instruction d’ajouter un [caractère de retour à la ligne](https://en.wikipedia.org/wiki/Newline) à l’endroit où vous décidez de couper une ligne.

Cependant, si seulement c’était aussi simple : le problème, c’est que les différents systèmes d’exploitation ont des notions variables de ce qui constitue un caractère de retour à la ligne. Pire encore, Windows traitera les caractères de retour à la ligne différemment selon qu’un fichier est ouvert en ce qu’on appelle [*mode binaire* ou *mode texte*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Il en résulte que, selon le système d’exploitation hôte, les lignes d’un fichier texte peuvent se terminer par différentes combinaisons de caractères appelées *retour chariot* (caractère ASCII/Unicode 13) et *saut de ligne* (caractère ASCII/Unicode 10) : noté `\r` et `\n` respectivement.

Manifestement, pour être indépendant du système, TeX a besoin d’un moyen de gérer les aléas introduits par les différents caractères utilisés pour terminer une ligne dans les fichiers texte qu’il doit lire et traiter.

### tampon d’entrée de TeX

Vous serez peut-être surpris, ou pas, d’apprendre que les moteurs TeX (y compris LuaTeX et XeTeX) lisent les fichiers d’entrée ligne par ligne : ils ne chargent pas tout le fichier texte en mémoire. Même si la plupart des fichiers texte traités par les moteurs TeX sont minuscules par rapport à la mémoire disponible sur les appareils modernes, chaque ligne du fichier est lue individuellement et stockée dans un petit tampon interne. Mais, bien sûr, le processus de TeX consistant à lire et stocker une ligne comporte quelques subtilités supplémentaires.

## « Je le ferai à ma façon » — la commande \endlinechar de TeX

Lorsque TeX lit une autre ligne de texte d’un fichier d’entrée, il effectue deux « tâches de nettoyage » :

* il supprime tous les caractères de retour à la ligne terminaux (\r ou \n) trouvés à la fin de la ligne — c’est-à-dire qu’il enlève toutes les fins de ligne ajoutées lorsque le fichier texte a été enregistré à l’origine sur le disque ;
* il supprime également tous les espaces de fin trouvés à la fin de la ligne.

Ces deux processus se produisent avant que TeX ne commence réellement à analyser les caractères contenus dans la ligne elle-même : considérez-les comme une forme de « nettoyage » en préparation de l’étape suivante du traitement (l’analyse). Ainsi, durant cette phase initiale du processus de lecture des lignes, TeX a supprimé toutes les fins de ligne dépendantes de la plateforme (ainsi que tout espace blanc final) : alors, comment TeX saura-t-il (détectera-t-il) où cette ligne se termine ? TeX a encore un « tour » dans son sac : `\endlinechar` commande.

Pour éviter le problème des caractères de retour à la ligne dépendants de la plateforme, TeX introduit le concept de `\endlinechar`, un paramètre définissable par l’utilisateur que TeX utilise pour insérer son propre caractère de fin de ligne tout à la fin d’une ligne de texte qu’il vient de lire depuis un fichier. Notez encore que cela se produit avant que TeX ne commence réellement à analyser les caractères — c’est la dernière étape du « nettoyage » de TeX avant qu’il soit prêt à commencer à lire (analyser) les caractères réels contenus dans la ligne.

TeX utilisera la valeur stockée dans `\endlinechar` pour ajouter son propre séparateur de fin de ligne si, et seulement si, `\endlinechar` est défini de manière appropriée — dans le TeX de Knuth, cela signifie qu’il doit avoir une valeur > -1 et < 256. En général, `\endlinechar` se voit attribuer la valeur 13 : le caractère de retour chariot — généralement noté par `\r` dans la littérature de programmation.

Mais si vous écrivez `\endlinechar=-1` quelque part dans votre entrée, alors le *la prochaine fois* que TeX lira une ligne de texte depuis un fichier, il *pas* n’ajoutera aucun séparateur supplémentaire à la fin d’une ligne. Par conséquent, votre entrée sera traitée comme une longue chaîne de texte continue jusqu’à ce que vous réinitialisiez `\endlinechar` à une valeur appropriée — généralement 13 (`\r`):

```latex
\endlinechar=13
```

L’un des 16 codes de catégorie de TeX (valeur 5) est réservé pour identifier le caractère « fin de ligne », qui est généralement le caractère qui `\endlinechar` insère — qui est inséré si (et seulement si) la valeur de `\endlinechar` est définie à une valeur appropriée.

## Résumé du traitement de fin de ligne

Bien que ces détails soient assez bas niveau, ils intéresseront toute personne souhaitant explorer l’écriture de macros qui gèrent la lecture de lignes de texte.

1. Lorsque TeX lit une ligne de votre fichier, il commence par supprimer tous les caractères de fin de ligne (`\r` et `\n`) ajoutés par votre éditeur de texte lors de l’enregistrement du fichier. De plus :

* TeX supprime également tout espace de fin à la fin de la ligne ;
* TeX *ne* supprimer les caractères de tabulation de fin (code caractère ASCII 9).

**Remarque**: l’un des fichiers de code source de LuaTeX, celui qui contient le code chargé d’effectuer cette suppression des espaces, contient la note suivante :

> (Cité dans le fichier `luatex.c`) « David Fuchs mentionne que cette suppression \[des espaces] a été effectuée pour assurer la portabilité des documents TeX, compte tenu du remplissage avec des espaces sur des “lines” à enregistrements fixes sur certains systèmes de l’époque, par exemple IBM VM/CMS et OS/360. »

3. Après l’étape (1), TeX ajoute (insère) un caractère supplémentaire dont la valeur est stockée dans \endlinechar (à condition qu’il soit défini de manière appropriée : > -1 et < 256)
4. \endlinechar est généralement défini à la valeur 13 (`\r`), ce qui signifie que le caractère ajouté à l’étape (2) est généralement le caractère 13 (`\r`) — mais, bien sûr, vous pouvez définir \endlinechar sur une autre valeur pour obtenir des effets spéciaux via la programmation de macros.
5. Lorsque ses routines d’analyse d’entrée détectent le caractère `\r` (code caractère 13) à la fin de son tampon interne, TeX vérifiera, comme d’habitude, son code de catégorie afin de décider quoi en faire.
6. Le caractère 13 *généralement* a une valeur de code de catégorie de 5 (« fin de ligne ») sauf, bien sûr, si son code de catégorie a été modifié — certaines macros rendent le caractère de fin de ligne actif afin d’effectuer un traitement sophistiqué.
7. Selon l’état interne de TeX (en pratique, ce qu’il est en train de faire), TeX peut transformer le caractère de fin de ligne (généralement `\r`, code de catégorie 5) en caractère espace — c’est ainsi que les caractères de fin de ligne deviennent des espaces.
8. Notez aussi que TeX utilise des caractères de code de catégorie 5 pour détecter lorsqu’il a lu une ligne vide et doit générer un `\\par` jeton.

Le schéma suivant donne un résumé visuel des étapes (1) et (2) : suppression des caractères de retour à la ligne et des espaces de fin, puis insertion de `\endlinechar` prêt pour la tâche d’analyse de l’entrée.

![Comment TeX utilise \endlinechar](/files/bd2be35c38e6a668cdd0453d9bcbe08f50a9d835)


---

# 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/fr/articles-approfondis/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.
