> 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/es/articulos-en-profundidad/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# Una introducción a \endlinechar: cómo TeX lee líneas de archivos de texto

Como humanos, preferimos ver y editar archivos de texto línea por línea. Una vez que pensamos que una línea de texto es lo bastante larga, pulsamos «retorno» (en el editor de texto) para señalar el final de esa línea. Entre bastidores, tu editor de texto interpretará eso como una instrucción para añadir un [carácter de nueva línea](https://en.wikipedia.org/wiki/Newline) en el punto en que decides cortar una línea.

Sin embargo, ojalá fuera así de simple: el problema es que distintos sistemas operativos tienen nociones diferentes de lo que constituye un carácter de nueva línea. Para empeorar las cosas, Windows tratará los caracteres de nueva línea de manera diferente según si un archivo se abre en el llamado [*modo binario* o *modo texto*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). El resultado es que, dependiendo del sistema operativo anfitrión, las líneas de un archivo de texto pueden terminar con distintas combinaciones de caracteres llamadas *retorno de carro* (carácter ASCII/Unicode 13) y *salto de línea* (carácter ASCII/Unicode 10): representados por `\r` y `\n` respectivamente.

Está claro que, para ser independiente del sistema, TeX necesita una forma de lidiar con las particularidades introducidas por los distintos caracteres usados para terminar una línea dentro de los archivos de texto que necesita leer y procesar.

### El búfer de entrada de TeX

Puede que te sorprenda, o puede que no, saber que los motores TeX (incluidos LuaTeX y XeTeX) leen los archivos de entrada una línea a la vez: no leen todo el archivo de texto en memoria. Aunque la mayoría de los archivos de texto procesados por los motores TeX son minúsculos comparados con la memoria disponible en los dispositivos modernos, cada línea del archivo se lee y almacena individualmente en un pequeño búfer interno. Pero, por supuesto, el proceso de TeX de leer y almacenar una línea tiene algunos matices adicionales.

## «Lo haré a mi manera»: el comando \endlinechar de TeX

Cuando TeX lee otra línea de texto de un archivo de entrada realiza dos «tareas de mantenimiento»:

* elimina cualquier carácter de nueva línea final (\r o \n) encontrado al final de la línea; es decir, suprime todos los finales de línea añadidos cuando el archivo de texto se guardó originalmente en el disco;
* también elimina todos los caracteres de espacio finales encontrados al final de la línea.

Estos dos procesos ocurren antes de que TeX empiece realmente a analizar los caracteres contenidos en la propia línea: piensa en ellos como una forma de «mantenimiento» en preparación para la siguiente etapa del procesamiento (el análisis). Así que, durante esta etapa inicial del proceso de lectura de líneas, TeX ha eliminado todos los finales de línea dependientes de la plataforma (y cualquier espacio en blanco final): entonces, ¿cómo sabrá TeX (detectará) dónde termina esa línea? TeX tiene un truco más bajo la manga: el `\endlinechar` comando.

Para evitar el problema de los caracteres de nueva línea dependientes de la plataforma, TeX introduce el concepto de `\endlinechar`, un parámetro definible por el usuario que TeX usa para insertar su propio carácter de fin de línea al final mismo de una línea de texto que acaba de leer de un archivo. Observa de nuevo que esto ocurre antes de que TeX empiece realmente a analizar los caracteres: es el paso final de las «tareas de mantenimiento» de TeX antes de que esté listo para empezar a leer (analizar) los caracteres reales contenidos en la línea.

TeX usará el valor almacenado en `\endlinechar` para añadir su propio terminador de fin de línea si, y solo si, `\endlinechar` está definido de forma apropiada—en el TeX de Knuth eso significa que debe tener un valor >-1 y < 256. Normalmente, `\endlinechar` se le asigna el valor 13: el carácter de retorno de carro—normalmente denotado por `\r` en la literatura de programación.

Pero si escribes `\endlinechar=-1` en algún lugar de tu entrada, entonces la *la próxima vez* que TeX lea una línea de texto de un archivo no *contiene* añadirá ningún terminador adicional al final de una línea. En consecuencia, tu entrada se tratará como una sola cadena continua de texto hasta que restablezcas `\endlinechar` a un valor apropiado—normalmente 13 (`\r`):

```latex
\endlinechar=13
```

Uno de los 16 códigos de categoría de TeX (valor 5) está reservado para identificar el carácter de «fin de línea», que suele ser el carácter que `\endlinechar` inserta—que se inserta si (y solo si) el valor de `\endlinechar` se establece en un valor apropiado.

## Resumen del procesamiento de fin de línea

Aunque estos detalles son bastante de bajo nivel, serán de interés para cualquiera que quiera explorar la escritura de macros que traten con la lectura de líneas de texto.

1. Cuando TeX lea una línea de tu archivo, primero eliminará todos los caracteres de fin de línea (`\r` y `\n`) añadidos por tu editor de texto cuando se guardó el archivo. Además:

* TeX también elimina cualquier carácter de espacio final al final de la línea;
* TeX *no* elimina los caracteres de tabulación finales (código de carácter ASCII 9).

**Nota aparte**: Uno de los archivos de código fuente de LuaTeX, aquel que contiene el código para realizar esta eliminación de espacios, contiene la siguiente nota:

> (Citado en el archivo `luatex.c`) «David Fuchs menciona que esta eliminación de \[espacios] se hizo para garantizar la portabilidad de los documentos TeX dado el relleno con espacios en las “líneas” de registro fijo en algunos sistemas de la época, por ejemplo, IBM VM/CMS y OS/360.»

3. Después del paso (1), TeX añade (inserta) un carácter adicional cuyo valor se almacena en \endlinechar (siempre que esté definido de forma adecuada: >-1 y < 256)
4. \endlinechar normalmente se establece en el valor 13 (`\r`), lo que significa que el carácter añadido en el paso (2) suele ser el carácter 13 (`\r`)—pero, por supuesto, puedes establecer \endlinechar en otro valor para lograr efectos especiales mediante programación de macros.
5. Cuando sus rutinas de análisis de entrada detectan el carácter `\r` (código de carácter 13) al final de su búfer interno, TeX, como de costumbre, comprobará su código de categoría para decidir qué hacer con él.
6. Carácter 13 *normalmente* tiene un valor de código de categoría 5 («fin de línea») a menos que, por supuesto, su código de categoría haya sido cambiado—algunas macros hacen que el carácter de fin de línea sea activo para realizar un procesamiento sofisticado.
7. Dependiendo del estado interno de TeX (en efecto, de lo que esté haciendo), TeX puede convertir el carácter de fin de línea (normalmente `\r`, código de categoría 5) en un carácter de espacio—así es como los caracteres de fin de línea se convierten en espacios.
8. Ten en cuenta también que TeX usa caracteres con código de categoría 5 para detectar cuándo ha leído una línea vacía y necesita generar un `\par` token.

El siguiente gráfico ofrece un resumen visual de los pasos (1) y (2): eliminar los caracteres de nueva línea y los caracteres de espacio finales e insertar `\endlinechar` listo para la tarea de analizar la entrada.

![Cómo usa TeX \endlinechar](/files/59685900822aebe8a1abaa3d01bb3b7908e62d57)


---

# 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/es/articulos-en-profundidad/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.
