> 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/overleaf-learn-latex-pt/artigos-aprofundados/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# Uma introdução a \endlinechar: como o TeX lê linhas de ficheiros de texto

Como seres humanos, preferimos visualizar e editar ficheiros de texto linha a linha. Quando achamos que uma linha de texto já é suficientemente longa, carregamos em “return” (no editor de texto) para assinalar o fim dessa linha. Nos bastidores, o teu editor de texto interpretará isso como uma instrução para adicionar um [carácter de nova linha](https://en.wikipedia.org/wiki/Newline) no ponto em que decides partir uma linha.

No entanto, se ao menos fosse tão simples: o problema é que diferentes sistemas operativos têm noções diferentes sobre o que constitui um carácter de nova linha. Para complicar ainda mais, o Windows tratará os caracteres de nova linha de forma diferente consoante um ficheiro seja aberto no chamado [*modo binário* ou *modo de texto*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). O resultado é que, dependendo do sistema operativo anfitrião, as linhas num ficheiro de texto podem terminar por várias combinações de caracteres chamadas *retorno de carro* (carácter ASCII/Unicode 13) e *avanço de linha* (carácter ASCII/Unicode 10): representados por `\r` e `\n` respetivamente.

Claramente, para ser independente do sistema, o TeX precisa de uma forma de lidar com as peculiaridades introduzidas pelos diferentes caracteres usados para terminar uma linha nos ficheiros de texto que precisa de ler e processar.

### O buffer de entrada do TeX

Podes, ou não, ficar surpreendido ao saber que os motores TeX (incluindo LuaTeX e XeTeX) leem os ficheiros de entrada uma linha de cada vez: não leem o ficheiro de texto inteiro para a memória. Embora a maioria dos ficheiros de texto processados por motores TeX seja minúscula em comparação com a memória disponível em dispositivos modernos, cada linha do ficheiro é lida e armazenada individualmente num pequeno buffer interno. Mas, claro, o processo de leitura e armazenamento de uma linha pelo TeX tem alguns truques adicionais.

## “Vou fazê-lo à minha maneira” — o comando \endlinechar do TeX

Quando o TeX lê outra linha de texto de um ficheiro de entrada, executa duas “tarefas de manutenção”:

* remove quaisquer caracteres de nova linha terminadores (\r ou \n) encontrados no fim da linha — isto é, elimina todos os finais de linha adicionados quando o ficheiro de texto foi originalmente guardado no disco;
* também remove todos os caracteres de espaço finais encontrados no fim da linha.

Estes dois processos acontecem antes de o TeX começar realmente a analisar os caracteres contidos na própria linha: pensa neles como uma forma de “manutenção” em preparação para a fase seguinte do processamento (análise). Assim, durante esta fase inicial do processo de leitura de linhas, o TeX removeu todos os finais de linha dependentes da plataforma (e qualquer espaço em branco final): então como saberá (detetará) o TeX onde essa linha termina? O TeX tem mais um “trunfo” na manga: o `\endlinechar` comando.

Para evitar o problema dos caracteres de nova linha dependentes da plataforma, o TeX introduz o conceito de `\endlinechar`, um parâmetro definível pelo utilizador que o TeX usa para inserir o seu próprio carácter de fim de linha no próprio fim de uma linha de texto que acabou de ler de um ficheiro. Nota de novo que isto acontece antes de o TeX começar realmente a analisar os caracteres — é o passo final da “manutenção” do TeX antes de estar pronto para começar a ler (analisar) os caracteres reais contidos na linha.

O TeX usará o valor armazenado em `\endlinechar` para adicionar o seu próprio terminador de fim de linha se, e só se, `\endlinechar` estiver apropriadamente definido — no TeX de Knuth isso significa que tem de ter um valor >-1 e < 256. Normalmente, `\endlinechar` é-lhe atribuído o valor 13: o carácter de retorno de carro — normalmente representado por `\r` na literatura de programação.

Mas se escreveres `\endlinechar=-1` algures no teu input, então o *da próxima vez* que o TeX ler uma linha de texto de um ficheiro, ele *contém* não adicionará qualquer terminador adicional ao fim de uma linha. Consequentemente, o teu input será tratado como uma única sequência contínua e longa de texto até redefinires `\endlinechar` para um valor apropriado — normalmente 13 (`\r`):

```latex
\endlinechar=13
```

Um dos 16 códigos de categoria do TeX (valor 5) está reservado para identificar o carácter de “fim de linha”, que normalmente é o carácter que `\endlinechar` insere — o qual é inserido se (e só se) o valor de `\endlinechar` estiver definido para um valor apropriado.

## Resumo do processamento de fim de linha

Embora estes detalhes sejam bastante de baixo nível, serão de interesse para quem quiser explorar a escrita de macros que lidam com a leitura de linhas de texto.

1. Quando o TeX lê uma linha do teu ficheiro, primeiro remove todos os caracteres de fim de linha (`\r` e `\n`) adicionados pelo teu editor de texto quando o ficheiro foi guardado. Além disso:

* o TeX também remove quaisquer caracteres de espaço finais do fim da linha;
* TeX *não* remove caracteres de tabulação finais (código de carácter ASCII 9).

**Nota**: Um dos ficheiros de código-fonte do LuaTeX, aquele que contém o código para efetuar esta remoção de espaços, contém a seguinte nota:

> (Citado no ficheiro `luatex.c`) “David Fuchs menciona que esta remoção de \[espaços] foi feita para garantir a portabilidade dos documentos TeX, tendo em conta o preenchimento com espaços em “linhas” de registo fixo em alguns sistemas da época, por exemplo, IBM VM/CMS e OS/360.”

3. Após o passo (1), o TeX adiciona (insere) um carácter adicional cujo valor está armazenado em \endlinechar (desde que este esteja devidamente definido: >-1 e < 256)
4. \endlinechar está normalmente definido para o valor 13 (`\r`), o que significa que o carácter adicionado no passo (2) é normalmente o carácter 13 (`\r`) — mas, claro, podes definir \endlinechar para outro valor para obter efeitos especiais através de programação de macros.
5. Quando as suas rotinas de análise de input detetam o carácter `\r` (código de carácter 13) no fim do seu buffer interno, o TeX, como habitual, verificará o seu código de categoria para decidir o que fazer com ele.
6. Carácter 13 *normalmente* tem o valor de código de categoria 5 (“fim de linha”), a não ser, claro, que o seu código de categoria tenha sido alterado — algumas macros tornam o carácter de fim de linha ativo para fazer processamento sofisticado.
7. Dependendo do estado interno do TeX (na prática, do que ele está a fazer), o TeX pode transformar o carácter de fim de linha (normalmente `\r`, código de categoria 5) num carácter de espaço — é assim que os caracteres de fim de linha se tornam espaços.
8. Nota também que o TeX usa caracteres com código de categoria 5 para detetar quando leu uma linha vazia e precisa de gerar um `\par` token.

A seguinte figura apresenta um resumo visual dos passos (1) e (2): remover caracteres de nova linha e caracteres de espaço finais e inserir `\endlinechar` pronto para a tarefa de analisar o input.

![Como o TeX usa \endlinechar](/files/3f622c54f5596ad4034019a1077c29c42cc3a107)


---

# 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/overleaf-learn-latex-pt/artigos-aprofundados/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.
