> 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/mais-topicos/19-how-tex-macros-actually-work-part-1.md).

# Como é que as macros TeX funcionam realmente: Parte 1

[Parte 1](/latex/overleaf-learn-latex-pt/mais-topicos/19-how-tex-macros-actually-work-part-1.md) [Parte 2](/latex/overleaf-learn-latex-pt/mais-topicos/20-how-tex-macros-actually-work-part-2.md) [Parte 3](/latex/overleaf-learn-latex-pt/mais-topicos/21-how-tex-macros-actually-work-part-3.md) [Parte 4](/latex/overleaf-learn-latex-pt/mais-topicos/22-how-tex-macros-actually-work-part-4.md) [Parte 5](/latex/overleaf-learn-latex-pt/mais-topicos/23-how-tex-macros-actually-work-part-5.md) [Parte 6](/latex/overleaf-learn-latex-pt/mais-topicos/24-how-tex-macros-actually-work-part-6.md)

## Introdução: Objetivos desta série

Esta série de artigos tem um objetivo ambicioso: explicar *como* como as macros TeX (como os comandos LaTeX) realmente funcionam — ao nível mais fundamental, dentro do próprio software do motor TeX. Em vez de depender *apenas* de um conjunto de macros de exemplo concebidas para demonstrar várias funcionalidades, casos-limite e comportamentos do TeX, vamos olhar para dentro do próprio TeX para ver *como* e *porquê* como os seus métodos de programação de macros funcionam da forma como funcionam.

Para alcançarmos o nosso objetivo, precisamos de começar por discutir tópicos que são bastante de baixo nível e, inicialmente, estes podem parecer algo distantes da tarefa de compor tipograficamente os seus documentos. Esperemos que, após uma análise mais aprofundada, saia com uma base para construir uma melhor compreensão que, no fim, lhe poupará muito tempo e, talvez, também minimize os níveis de frustração.

### A linguagem de programação TeX: Conhece a sensação?

Não é excessivamente severo descrever a linguagem de programação TeX como algo arcana, porque ela é — pelo menos segundo os padrões da maioria das linguagens de programação convencionais em uso hoje. À medida que começa a sua viagem para aprender mais sobre TeX/LaTeX, particularmente se quiser escrever macros não triviais, encontra rapidamente noções como códigos de categoria, tokens/tokenização e “expansão” de comandos ou macros. Esse bombardeamento de conceitos é provavelmente bastante estranho, talvez deixando-o perplexo e, por vezes, possivelmente um pouco frustrado, à medida que o seu caminho para o sucesso nem sempre é ajudado por algumas das mensagens de erro quase impenetráveis do TeX/LaTeX.

## Então, por onde começamos? Pelos códigos de categoria.

Os motores TeX pertencem a uma classe de software chamada [compiladores](https://en.wikipedia.org/wiki/Compiler): programas que recebem como entrada um ficheiro escrito numa *linguagem de origem* e *compilam* (transformam-no) num ficheiro de saída escrito numa *linguagem de destino* Mais especificamente, o TeX é um *compilador de documentos*. Para os motores TeX (compiladores), o ficheiro de entrada é escrito na linguagem de composição tipográfica TeX e o alvo é um ficheiro de saída escrito noutra “linguagem”, como [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) ou PDF — embora estejamos a ser um pouco flexíveis com a nossa noção de “linguagem”.

Vamos olhar mais de perto para a “linguagem” de origem, ou de entrada, usada para escrever o seu ficheiro TeX. Um `.tex` ficheiro é, no fundo, uma longa sequência de caracteres (incluindo caracteres de quebra de linha): composta por texto destinado a ser composto tipograficamente intercalado com `\`, `}`, `$`, `[` e todo o tipo de caracteres que podem aparecer numa gama aparentemente quase infinita de combinações. Quem não usa TeX/LaTeX pode olhar para um típico `.tex` ficheiro e ser perdoado por o perceber como uma confusão bastante desconcertante de caracteres com pouca, ou nenhuma, estrutura de ficheiro visível. O pacote de macros LaTeX certamente impõe em certa medida alguma estrutura básica a um ficheiro de entrada .tex. No entanto, entre os `\begin{document}` e `\end{document}` cabe ao autor do documento decidir o que é colocado aí. Se olhar para `.tex` ficheiros escritos usando o pacote original de macros Plain TeX de Knuth, verá que a estrutura do documento está quase completamente ausente.

Assim, em geral, um ficheiro de entrada TeX pode parecer bastante desestruturado, uma mistura aparentemente arbitrária de conteúdo a ser composto tipograficamente intercalado com instruções (comandos) que orientam a composição desse conteúdo. Como é sequer possível para o TeX dar sentido a um típico `.tex` ficheiro de entrada: filtrar essa mistura de caracteres recebida em instruções acionáveis para o motor de composição e conteúdo que deve ser composto tipograficamente?

### Filtrar a mistura: Diga olá aos códigos de categoria

Qualquer observador humano, que não saiba nada sobre TeX, pode olhar para um `.tex` ficheiro e reconhecer certos caracteres como `$` $ `&` & *significado* significado `a`, `e`, `ou` e sabem que são classificadas como vogais enquanto outras, como `b`, `c` ou `d` são classificadas como consoantes. Como humanos, temos uma espécie de tabela de consulta incorporada (na nossa memória) pela qual atribuímos um significado a cada caractere que vemos — um significado baseado no papel que esse caractere desempenha na comunicação humana.

Para processar um `.tex` ficheiro, o software TeX também tem de olhar para cada caractere no seu texto de entrada e também precisa de atribuir um *significado* a cada e a todos os caracteres que “vê”. Contudo, o TeX é apenas uma máquina baseada em software que lida com o processamento de texto — armazenado como uma sequência de inteiros (códigos de caracteres) localizados num ficheiro de entrada. Como máquina, o TeX tem de ser programado com os dados relevantes que lhe dizem como determinar o significado de um caractere que está a “observar” e, subsequentemente, o que precisa de fazer com ele. Como é que o TeX consegue isto?

A resposta é um daqueles conceitos exclusivos do TeX: *códigos de categoria,* dos quais existem 16, variando de 0 a 15. No que diz respeito ao TeX, cada caractere que ele espera encontrar num `.tex` ficheiro tem um chamado *código de categoria* pré-atribuído a ele. Dentro do software TeX existe uma espécie de “tabela de pesquisa” que lista o código de categoria *atualmente* atribuído a cada caractere que o TeX possa ver num ficheiro de entrada .tex. Deve pensar nos códigos de categoria do TeX como atribuindo um *significado* a cada caractere individual no fluxo de entrada que o TeX tem de examinar (varrer).

Para compor tipograficamente o seu documento, um motor TeX tem de ler (varrer) cada caractere, mas o interesse imediato do TeX não são os caracteres reais (códigos de caracteres): o *código de categoria* de um caractere é de maior importância durante a leitura do texto de entrada. O *atual* código de categoria *significado atual* desse caractere *no momento em que o TeX o lê*: esse código de categoria determina como o TeX tratará/processará cada caractere — explicaremos por que dizemos “código de categoria atual” e “significado atual”. É através dos códigos de categoria que o TeX consegue filtrar a mistura de caracteres recebida para distinguir entre caracteres (conteúdo) destinados à composição tipográfica e caracteres que formam instruções a processar —*comandos* que o TeX precisa de executar.

A tabela seguinte lista esses 16 códigos de categoria: o que cada um significa, juntamente com exemplos de caracteres tipicamente atribuídos a cada categoria.

| **Código de categoria** | **Descrição**                                                              | **LATEX/TEX padrão**                                                         |
| ----------------------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| 0                       | Caractere de escape—indica ao TEX para começar a procurar um comando       | `\`                                                                          |
| 1                       | Iniciar um grupo                                                           | {                                                                            |
| 2                       | Terminar um grupo                                                          | }                                                                            |
| 3                       | Alternador matemático—entra/sai do modo matemático                         | $                                                                            |
| 4                       | Tabulação de alinhamento                                                   | &                                                                            |
| 5                       | Fim de linha                                                               | Código ASCII 13 (`\r`)                                                       |
| 6                       | Parâmetro de macro                                                         | #                                                                            |
| 7                       | Sobrescrito—para composição tipográfica de matemática: `$y=x^2$` $$y=x^2$$ | ˆ                                                                            |
| 8                       | Subscrito—para composição tipográfica de matemática: `$y=x_2$` $$y=x\_2$$  | \_                                                                           |
| 9                       | Caractere ignorado                                                         | ASCII 0 `<null>`                                                             |
| 10                      | Espaçador                                                                  | Códigos ASCII 32 (espaço) e 9 (caractere de tabulação)                       |
| 11                      | Letra                                                                      | A...Z, a...z, (e milhares de caracteres Unicode)                             |
| 12                      | Outros                                                                     | 0...9 mais ,.;?" e muitos outros                                             |
| 13                      | Caractere ativo                                                            | Código de categoria especial para criar macros de um único caractere, como ˜ |
| 14                      | Caractere de comentário—ignore tudo o que segue até o fim da linha         | %                                                                            |
| 15                      | Caractere inválido, não é permitido aparecer no arquivo de entrada .tex    | Código ASCII 127 (`DEL`)                                                     |

A utilização de códigos de categoria é o mecanismo essencial do TeX para filtrar o fluxo de caracteres recebido, dando sentido ao seu texto de entrada para determinar:

* caracteres que compõem o texto a ser composto tipograficamente;
* conteúdo delimitador que deve ser composto tipograficamente como matemática;
* sequências de caracteres que são nomes de comandos a serem processados ou executados;
* … e muitas outras operações de composição tipográfica.

Inicialmente, pode pensar que o código de categoria de cada caractere (significado) é algum tipo de atribuição fixa: imutável e permanentemente gravada nos alicerces internos do software TeX, mas não é assim. Como foi observado, o TeX mantém uma tabela interna de pesquisa para armazenar detalhes de qual código de categoria está *atualmente* atribuído a cada caractere — dizemos de propósito *atualmente atribuído* porque o código de categoria de qualquer caractere (ainda não lido) pode ser alterado usando um comando primitivo (incorporado) chamado `\catcode`. Isto traz considerável flexibilidade porque pode, se quiser, alterar completamente a forma como o TeX tratará ou interpretará o significado de qualquer caractere posteriormente lido do texto de entrada, oferecendo enorme margem para aplicações sofisticadas de composição tipográfica.

Se estiver sobretudo interessado em usar o LaTeX para “dar conta do recado”, é provável que não tenha encontrado diretamente códigos de categoria, exceto talvez através de mensagens de erro que possa ter visto. Mas fique descansado: os códigos de categoria são um componente central das operações de um motor TeX, permitindo que o LaTeX (e os pacotes LaTeX) realmente façam o trabalho de compor tipograficamente o seu documento.

Quando o seu motor TeX arranca (“[faz bootstrap](https://en.wikipedia.org/wiki/Bootstrapping)”) utilizará um conjunto de atribuições predefinidas de caracteres a códigos de categoria, mas, através do `\catcode` comando, esses padrões podem ser alterados pelo código núcleo do LaTeX (macros) e/ou pelos pacotes LaTeX que tiver carregado — ou, de facto, pelo seu próprio código ou macros TeX. No entanto, ao longo do tempo e por tradição/uso, certos caracteres atribuídos a códigos de categoria específicos tornaram-se aceites como “padrões” e a adesão a esses padrões é certamente desejável se quiser que os seus documentos sejam portáveis e facilmente partilhados com colegas ou outros utilizadores. Por exemplo, o `\` caractere de barra invertida é atribuído ao código de categoria 0 para indicar o início de um comando TeX/LaTeX — veja a [tabela acima](#tbl-0).

### Leitura (varrimento) do texto de entrada

Quando o TeX lê (varre) o próximo caractere do seu ficheiro de entrada, a primeira coisa que faz é olhar para o seu código de categoria, por isso vamos olhar mais de perto para o que acontece quando o TeX lê uma linha típica de entrada.

Suponha que temos um ficheiro .tex que contém o texto `Olá Mundo \\jobname` algures dentro de um parágrafo. Se olharmos para o `.tex` ficheiro usando um [editor hexadecimal](https://en.wikipedia.org/wiki/Hex_editor), vemos que a sequência de caracteres `Olá Mundo \\jobname` no nosso `.tex` ficheiro é apenas uma série de inteiros, ou *códigos de caracteres*, mostrados na captura de ecrã abaixo como a sequência hexadecimal:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Códigos de caracteres hexadecimais num ficheiro TeX](/files/0a9b975afc65dc6be40cb3ccbb609160ef2c4609)

Se convertermos de hexadecimal (base 16) para decimal (base 10), a sequência de códigos de caracteres é:

![Códigos de caracteres decimais num ficheiro TeX](/files/1e07f43999206f94acd5ba6a2aa43ec7e2a8fa46)

Também sabemos que, para o TeX, cada caractere tem um código de categoria correspondente; assim, com base no [tabela acima](#tbl-0) sabemos que as seguintes atribuições predefinidas de códigos de categoria (provavelmente) também estão a ser usadas:

![Códigos de categoria TeX](/files/db3e7023ecdc711a60d3640263898e46b78417a6)

Assim, para o TeX, cada caractere no ficheiro de entrada é representado por *dois* valores numéricos — o seu código de caractere e o seu código de categoria:

![Códigos de caracteres e os correspondentes códigos de categoria TeX](/files/9d1197294412403301f2e27faf5171550c41dbdf)

Neste ponto estamos apenas a considerar a primeira fase do processamento do seu ficheiro pelo TeX: a leitura dos caracteres individuais. Então, o que é que o TeX realmente faz com estes pares de códigos de caracteres e códigos de categoria? Depois de o TeX ter lido um caractere individual e procurado o seu código de categoria correspondente, como é que o TeX usa exatamente essa informação para “filtrar” os caracteres recebidos?

## Parte 2

Na parte 2, analisamos mais de perto como o TeX lê o seu texto de entrada: fingindo ser os “olhos” do TeX enquanto ele observa o seu texto de entrada, caractere a caractere.

[Parte 1](/latex/overleaf-learn-latex-pt/mais-topicos/19-how-tex-macros-actually-work-part-1.md) [Parte 2](/latex/overleaf-learn-latex-pt/mais-topicos/20-how-tex-macros-actually-work-part-2.md) [Parte 3](/latex/overleaf-learn-latex-pt/mais-topicos/21-how-tex-macros-actually-work-part-3.md) [Parte 4](/latex/overleaf-learn-latex-pt/mais-topicos/22-how-tex-macros-actually-work-part-4.md) [Parte 5](/latex/overleaf-learn-latex-pt/mais-topicos/23-how-tex-macros-actually-work-part-5.md) [Parte 6](/latex/overleaf-learn-latex-pt/mais-topicos/24-how-tex-macros-actually-work-part-6.md)


---

# 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/mais-topicos/19-how-tex-macros-actually-work-part-1.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.
