> 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/14-how-do-tex-engines-typeset-tables.md).

# Como os motores TeX compõem tabelas

## Como é que os motores TeX compõem tabelas

## Introdução: O que abrange esta série?

Produzir tabelas esteticamente agradáveis pode ser uma tarefa morosa — quer esteja a usar uma ferramenta de composição visual, LaTeX ou uma linguagem de marcação como HTML ou markdown. Para utilizadores de LaTeX em particular, compor tabelas ocupa um lugar de destaque na lista de “pontos fracos” de muitas pessoas, talvez evidenciado pelo facto de “tabelas” ser um dos tópicos mais [tópicos mais marcados no tex.stackexchange](https://tex.stackexchange.com/tags).

Para além das respostas e exemplos no tex.stackexchange, mesmo uma análise superficial do apoio disponível sobre a composição de tabelas com LaTeX revela vários recursos de informação relacionados com tabelas:

* Da Overleaf [páginas de ajuda](https://www.overleaf.com/learn/latex/tables) e outros sites como [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* O CTAN, a Comprehensive TeX Network, lista mais de [70 pacotes TeX/LaTeX](https://ctan.org/topic/table) relacionados com a criação de tabelas
* um livro inteiro sobre [a composição de tabelas usando LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* um excelente [gerador de tabelas LaTeX online](https://www.tablesgenerator.com/latex_tables)

Uma simples pesquisa no Google por [tabelas LaTeX](https://www.google.com/search?q=latex+tables) produz um enorme número de resultados, listando muitos sites que oferecem ajuda, conselhos, exemplos e explicações.

### TeX, não LaTeX

Dada a riqueza de literatura disponível sobre a composição de tabelas usando LaTeX, haverá ainda algo mais a escrever sobre elas — mais exemplos de tabelas e enumeração/demonstração de comandos de pacotes? Há uma forma de abordar o tema da composição de tabelas que extraia ou se foque nos princípios e conceitos fundamentais da composição de tabelas? Há, mas exige descascar a cebola do LaTeX…

Decidimos produzir uma série de artigos que procura fornecer aos leitores informação de contexto e explicações sobre a *mecânica* da composição de tabelas baseada em TeX. Em vez de nos focarmos na composição de tabelas usando macros/pacotes específicos de LaTeX, vamos explorar o *comportamento subjacente* dos motores TeX: explorando a maquinaria de composição de baixo nível que fornece os alicerces sobre os quais os comandos de macros LaTeX são construídos. O objetivo final é identificar e explicar os métodos e algoritmos centrais da composição de tabelas baseada em TeX — esperando, com isso, ajudar leitores/utilizadores a compreender melhor por que motivo as tabelas se comportam como se comportam. Uma consequência inevitável desta abordagem, ao retirar as camadas protetoras do isolamento das macros LaTeX, é a exposição a detalhes confusos de baixo nível dos quais os utilizadores normalmente (e com gosto) estão protegidos por camadas de código de macros LaTeX.

Levou muito tempo a investigar, escrever e ilustrar estes artigos, por isso esperamos que sejam uma adição válida à literatura, fornecendo material que informará os leitores e os ajudará a compreender melhor esta área complexa da composição tipográfica em TeX. Devemos salientar que esta série de artigos irá *contém* entrar no campo de discutir *a estética* do design de tabelas — esse é um tópico repleto de preferências subjetivas e cujos argumentos terão de ser tratados noutro lugar…

### Explorar a mecânica das tabelas TeX: Como é que se faz isso?

Para explorar e depois escrever sobre os mecanismos e processos de nível inferior que decorrem no interior dos motores TeX, como a composição de tabelas, a Overleaf construiu versões “debug” compiladas do motor TeX de Knuth usando o [processo Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Tradicionalmente, construir TeX envolve um processo chamado Web2C, usado no TeX Live, que gera código C ao converter o código-fonte Pascal original de TeX no seu equivalente em C. Esse processo gera código C que nunca foi destinado a ser lido por humanos, apenas por compiladores C. O código C gerado mecanicamente é *excecionalmente* difícil de ler ou de modificar para fins de experimentação.

Em contraste, o Web2W produz código-fonte C (disponível [aqui](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) que é *ordens de grandeza* mais legível do que o código produzido pelo Web2C. Consequentemente, o código-fonte C do Web2W é muito mais fácil de modificar para fins de aprendizagem/experimentação.

O Web2W produz uma versão de TeX (“CTeX”) que é *extremamente* próxima do programa original de Knuth: “CTeX” não inclui as muitas alterações e melhorias introduzidas pelo processo Web2C — como SyncTeX, o processamento da linha de comandos e a pesquisa de ficheiros via Kpathsea. Embora se percam essas valiosas melhorias, o código C resultante (Web2W) é relativamente fácil de navegar usando o código-fonte TeX publicado por Knuth, mesmo sendo o TeX escrito em Pascal.

* **Uma nota sobre os nomes:** Estritamente falando, o nome “TeX” deve referir-se apenas ao software original escrito e publicado por Donald Knuth. Quaisquer modificações ao seu software têm de usar um nome diferente para o software de composição tipográfica baseado em TeX resultante. Aqui, usamos o processo Web2W para construir um motor que ainda é, na prática, o software original de Knuth. No entanto, para evitar dúvidas, usaremos o termo “CTeX” para designar a versão específica construída com Web2W, mas também usaremos “TeX” para designar quer o motor original de Knuth quer um termo genérico para a linguagem de composição tipográfica baseada nos princípios do TeX de Knuth. Esperamos que os leitores nos perdoem quaisquer deslizes ocasionais na aplicação/utilização rigorosa da terminologia estritamente correta: esperamos que o significado/intenção seja transmitido pelo contexto.

A versão de depuração do CTeX foi executada usando o [IDE Eclipse](https://www.eclipse.org/downloads/packages/), tornando possível observar em tempo real o processamento do código C que implementa os comandos primitivos (integrados) de TeX e os algoritmos, concebidos por Knuth para suportar a composição de tabelas.

O seguinte vídeo curto (cerca de 90 segundos) demonstra o motor CTeX em funcionamento dentro do [IDE Eclipse](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

Para além do CTeX, também compilámos o e-TeX para aceder a alguns primitivos adicionais que não estão presentes no software original de Knuth. Embora o CTeX e o e-TeX sejam, hoje em dia, motores antigos baseados em TeX, continuam a ser adequados como base para explorar a mecânica da composição de tabelas porque esses princípios subjacentes ainda se aplicam a todos os motores de composição baseados em TeX.

### Por que usar um motor TeX mais antigo para explorar tabelas?

Em primeiro lugar, o livro impresso, [TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), que lista e explica o código-fonte do TeX, continua a ser um guia extremamente conveniente para as águas turvas do funcionamento interno do TeX, apesar de ter sido publicado há mais de 30 anos (1986). Claro que pode compor tipograficamente a documentação do código-fonte do TeX por si próprio; por exemplo, veja o projeto Overleaf [Compor tipograficamente a documentação do código-fonte de TeX, e-TeX ou pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Desde a publicação de TeX: The Program em 1986, surgiram novos motores TeX, incluindo pdfTeX, XeTeX e LuaTeX, introduzindo todos eles funcionalidades e comandos que não estão documentados em TeX: The Program simplesmente porque não estavam presentes no software original de Knuth.

Para muitos processos centrais, como a composição de tabelas de TeX, o código documentado em TeX: The Program continua relevante como base de estudo — mesmo que o código-fonte de TeX esteja escrito em Pascal. Além disso, o TeX de Knuth é comparativamente fácil, e rápido, de compilar — especialmente através do extremamente útil [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) processo desenvolvido por Martin Ruckert. A facilidade/velocidade de compilação torna muito mais conveniente modificar o TeX de formas simples — como a criação de gráficos SVG usados mais tarde nesta série de artigos.

### Compreender a diferença entre TeX e LaTeX

Muitos leitores já saberão que o LaTeX não é, na verdade, um *executável* programa de composição tipográfica, mas sim uma grande coleção de comandos (*macros*) que são, em última análise, escritos numa linguagem de composição/programação de nível inferior chamada TeX. O seu código LaTeX só produz saída composta tipograficamente depois de ter sido processado por um programa executável chamado a *motor TeX*—o software que fica entre o seu código LaTeX (documento) e o PDF composto tipograficamente. Hoje, os utilizadores podem escolher entre vários motores TeX para compor tipograficamente o seu código LaTeX, incluindo pdfTeX, XeTeX e variantes de LuaTeX.

Os que são novos no ecossistema TeX/LaTeX ficam muitas vezes, e compreensivelmente, perplexos com a multiplicidade de nomes de aparência críptica usados para as ferramentas que encontram: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX e LuaLaTeX. Se sente o mesmo, a ajuda está à mão no artigo da Overleaf [O Que Há num Nome: Um Guia para os Muitos Sabores de TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) que explica a origem e o significado de todos esses termos.

#### Dialetos e primitivas TeX

Cada motor TeX tem um conjunto de comandos integrados chamados *primitivos* que, em conjunto, compõem o “dialeto” desse motor da linguagem de composição tipográfica TeX, refletindo as capacidades integradas em cada motor. Aqui, o termo “primitiva” usado para descrever os comandos integrados dos motores TeX não *contém* significa que esses comandos sejam básicos ou simplistas, mas sim que são fundamentais e indivisíveis: não construídos a partir de outros comandos (ao contrário das macros). Todos os motores TeX partilham um grande conjunto central de primitivas, mas alguns contêm primitivas específicas desse motor — dando origem à noção de um “dialeto” de TeX.

Independentemente do motor TeX usado para compor tipograficamente o seu documento LaTeX, a sua função é processar (“executar”) o conjunto de comandos LaTeX (isto é, macros) usados para escrever e construir o seu documento. Na prática, o motor TeX “converte” o seu código LaTeX (macros) *de volta em* os seus comandos primitivos constituintes do motor TeX, que o motor pode executar para realizar a composição tipográfica propriamente dita. Não precisa de *tem* usar comandos LaTeX para compor documentos com motores TeX — você *poderia* optar por construir os seus documentos inteiramente com primitivas TeX, ou seja, diretamente na *linguagem de programação TeX* incorporada nos motores TeX. No entanto, pelos padrões atuais, a linguagem TeX é bastante arcana e geralmente considerada difícil para programar — também pode exigir um grande número de primitivas integradas para alcançar o seu objetivo de composição tipográfica, o que resulta numa tarefa de programação propensa a erros e potencialmente repetitiva.

Para evitar ter de escrever diretamente na linguagem TeX, ou de voltar a introduzir constantemente a mesma série de comandos, os motores TeX permitem-lhe criar “atalhos” chamados *macros*. Ao criar macros, define os seus próprios comandos que empacotam sequências potencialmente longas e complexas de primitivas da linguagem TeX (ou outras macros) num único comando “de nível superior”. Os programadores de TeX podem escrever macros muito sofisticadas que encapsulam uma grande quantidade de funcionalidade num único comando — como os comandos fornecidos pelo LaTeX. Ao usar pacotes de macros, como LaTeX (ou [ConTeXt](https://wiki.contextgarden.net/Main_Page)), os autores de documentos estão (na maior parte) protegidos de muitos detalhes tediosos, permitindo-lhes concentrar-se na escrita e na composição tipográfica em vez de lidarem constantemente com as complexidades e nuances da linguagem TeX.

## No início...

Além de conceber algoritmos para a composição tipográfica de matemática e para a quebra de linha sofisticada, Knuth enfrentou o desafio de programar o seu software TeX para compor tabelas. Claramente, qualquer algoritmo(s) de construção de tabelas não deve ser indevidamente restritivo, porque isso frustraria os utilizadores que precisam da liberdade de criar uma gama quase infinita de esquemas de tabelas. Além disso, as células das tabelas podem conter uma ampla variedade de conteúdos, incluindo matemática, gráficos e pedaços de texto divididos em linhas bem compostas tipograficamente — na verdade, tudo aquilo que o TeX é capaz de compor. Oferecer esta flexibilidade requer que os algoritmos de construção de tabelas do TeX trabalhem em estreita colaboração com outras partes da maquinaria de composição tipográfica do TeX.

No entanto, os motores TeX cobram um preço pela flexibilidade proporcionada pelas suas capacidades de construção de tabelas: numerosas subtilezas e nuances no comportamento de baixo nível dos comandos integrados (primitivos) de composição de tabelas, dos quais existem 9:

* **`\halign`**, **`\valign`**: comandos centrais de construção de tabelas
* **`\tabskip`**: cola colocada entre colunas \halign ou linhas \valign
* **`\cr`**: terminador obrigatório de “retorno de carro” para todas as linhas numa tabela
* **`\noalign`**: injeta material entre linhas \halign ou colunas \valign
* **`\everycr`**: comandos (registo de tokens) a ler após detetar \cr
* **`\span`**: um comando de dupla função: \span cria células que se estendem por colunas ou linhas, ou expande comandos no preâmbulo da tabela (vamos considerar isso em detalhe)
* **`\omit`**: omitir os modelos para uma célula específica
* **`\crcr`**: usado em macros para evitar erros se os utilizadores se esquecerem de um \cr obrigatório

Iremos encontrar estes comandos na nossa viagem pela construção de tabelas.

### Ecos distantes dos desafios

Enterrado no [código-fonte do TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) encontra-se uma introdução um tanto intimidante ao tema da implementação dos comandos de baixo nível \halign e \valign, concebidos para compor tabelas:

> “É quase um milagre sempre que \halign e \valign funcionam, porque atravessam tantas estruturas de controlo do TeX. Portanto, a página atual provavelmente não é o melhor lugar para um principiante começar a ler este programa; é melhor dominar primeiro tudo o resto.”

Knuth prossegue dizendo

> “Note-se que, à medida que \halign está a ser processado, entregamos sem medo o controlo ao resto do TeX. Em momentos críticos, uma rotina de alinhamento é chamada para intervir e fazer alguma pequena ação, mas na maior parte do tempo estas rotinas apenas permanecem em segundo plano. É algo como uma sugestão pós-hipnótica.”

Destes comentários, parece razoável concluir que, mesmo para Knuth, implementar a composição de tabelas do TeX foi “um verdadeiro desafio” — fornecer controlo e flexibilidade ao utilizador, assegurando simultaneamente que os algoritmos automatizados de construção de tabelas do TeX estavam bem orquestrados com os processos centrais de composição tipográfica do TeX.

O autor atesta prontamente a complexidade do código e dos algoritmos por trás das capacidades de composição de tabelas do TeX, mas também admira a enorme quantidade de capacidade contida numa quantidade relativamente pequena, embora densa, de código Pascal (ou C).


---

# 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/14-how-do-tex-engines-typeset-tables.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.
