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

# Como os motores TeX compõem tabelas 2

## Como os motores TeX compõem tabelas 2

## Os motores TeX referem-se às tabelas como alinhamentos

Na [documentação do código-fonte do TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth não discute a capacidade do TeX de “compor tabelas”, mas, em vez disso, descreve os algoritmos do TeX para construir os chamados *alinhamentos*. A composição de tabelas no TeX é, na prática, um processo automatizado de alinhamento de caixas: organizar caixas (células, linhas e colunas da tabela) para obter uma grelha ou matriz retangular agradável — embora, claro, sendo TeX, haja *muitas* nuances nesse processo.

O termo “alinhamento” também se reflete nos nomes dos dois comandos de composição de tabelas incorporados em todos os motores TeX:

* `\halign` (alinhamento horizontal), e
* `\valign` (alinhamento vertical).

Exploraremos ambos os comandos ao longo desta série de artigos, começando com uma visão geral mais formal do formato/estrutura dos `\halign` e `\valign` comandos para estabelecer as bases para artigos posteriores e mais aprofundados desta série.

### As tabelas do TeX são caixas e espaçamento

As células individuais de uma tabela contêm normalmente uma variedade de conteúdos, como linhas de texto, matemática ou gráficos, o que produz um conjunto de células da tabela com diferentes larguras, alturas ou profundidades de material composto. De alguma forma, o TeX precisa de trabalhar com essas células, de dimensões de conteúdo variáveis, para construir a tabela final, em que cada linha tem uma certa altura e cada coluna uma largura particular. O TeX precisa de deduzir valores apropriados para as alturas de cada linha e as larguras de cada coluna a partir da coleção de células da tabela de tamanho variável.

No entanto, o TeX não pode saber o tamanho real do conteúdo de cada célula até esse conteúdo ser composto; consequentemente, o TeX percorre a tabela inteira, compondo cada célula, para obter os dados de dimensionamento necessários para concluir a disposição da tabela. A partir desses dados de tamanho, o TeX pode determinar a altura correta de cada linha e a largura de cada coluna. O TeX também pode encontrar células vazias ou células que o utilizador pretende que se estendam por várias colunas ou várias linhas, tudo o que o TeX tem de incorporar cuidadosamente nos seus cálculos. Depois de “filtrar” este conjunto heterogéneo de dados de tamanho das células (caixas), só então o TeX consegue determinar os valores finais para as larguras das colunas num `\halign`, ou as alturas das linhas para `\valign` e usa esses valores nas fases finais dos seus algoritmos de disposição de tabelas.

Na prática, e “por baixo do capô”, a composição de tabelas no TeX consiste em várias etapas. Em linhas gerais, o TeX primeiro compõe uma versão “rascunho” ou “incompleta” da tabela enquanto capta e processa os dados de tamanho das células — e dados sobre quaisquer `\span` comandos usados na tabela. Nas etapas finais, o TeX reprocessa essa versão “incompleta” da tabela, para finalizar `\halign` as larguras das colunas ou `\valign` as alturas das linhas e alcançar a disposição final — tudo isso exploraremos nesta série de artigos.

## \halign e \valign: duas formas de construir tabelas

Todos os motores TeX fornecem dois *suporte* comandos (primitivos) concebidos para compor tabelas (alinhamentos): `\halign` e `\valign`, que partilham muitas funcionalidades essenciais mas também diferem de algumas formas fundamentais. A diferença principal entre `\halign` e `\valign` é a forma como constroem as respetivas tabelas: linha a linha ou coluna a coluna:

* `\halign`: compõe tabelas linha a linha para criar linhas individuais que são empilhadas verticalmente para produzir as colunas da tabela
* `\valign`: compõe tabelas coluna a coluna para criar colunas individuais que são empilhadas horizontalmente para produzir as linhas da tabela

### \halign

O diagrama seguinte mostra a construção de uma tabela criada por `\halign`. A tabela é composta linha a linha, com linhas individuais empilhadas verticalmente. Algumas consequências disso incluem:

* as colunas da tabela resultam do empilhamento vertical das linhas da tabela
* as quebras de página podem ocorrer entre as linhas da tabela
* material não tabular pode ser inserido entre linhas (via `\nolign`, que veremos mais tarde)

![](/files/9974aff966a6180250a5ee5d41ab8c0fee2be978)

### \valign

O diagrama seguinte mostra a construção de uma tabela criada por `\valign`. A tabela é composta coluna a coluna, com colunas individuais empilhadas horizontalmente (lado a lado). Algumas consequências disso incluem:

* as linhas da tabela resultam do empilhamento horizontal das colunas da tabela
* as quebras de linha podem ocorrer entre as colunas da tabela
* material não tabular pode ser inserido entre colunas (via `\noalign`, que veremos mais tarde)

![](/files/34f1c427221eb0c01d0758842cfd3017e72291f6)

### Exemplos

O exemplo seguinte pretende salientar a abordagem linha *vs*. coluna de \halign e \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordas da caixa ajustadas ao conteúdo
\setlength{\fboxsep}{0pt}

Aqui está uma tabela \verb|\valign|:
\begingroup
% \hsize controla as
% larguras das colunas do \valign. Também definimos
% \parindent para um valor mais pequeno
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % O preâmbulo: abordado mais tarde (em grande detalhe!)
A&B&C\cr % A primeira COLUNA desta tabela \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Nota: por razões explicadas mais tarde
% o \halign tem de ser colocado numa \vbox
Aqui está uma tabela \verb|\halign|: \fbox{%
\vbox{\halign{
#&#&#\cr % O preâmbulo: abordado mais tarde (em grande detalhe!)
A&B&C\cr % A primeira LINHA desta tabela \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída: ![](/files/646ee2e85df20d974128ba6986344110465b3a49)

O gráfico seguinte mostra uma versão anotada das tabelas produzidas pelo código acima. Mais tarde nesta série de artigos abordaremos temas como:

* o que são preâmbulos de tabelas?
* porque é que definimos `\hsize` e `\parindent` para `\valign` tabelas?

Para já, basta notar a abordagem linha vs. coluna de `\halign` *vs*. `\valign` da construção de tabelas:

![](/files/afa85729a311413a28b0e188ab08a5e3ef36ca1d)

## Forma geral de \halign e \valign

Para começar, revemos as propriedades básicas e o formato geral de `\halign` e `\valign` mas sem, por agora, entrar em quaisquer detalhes reais. [Como referido](#intro), adotamos uma visão geral ligeiramente formal da forma/estrutura dos `\halign` e `\valign` comandos para estabelecer as bases para os artigos subsequentes desta série.

A forma mais geral dos `\halign` e `\valign` comandos pode ser escrita da seguinte forma:

`\halign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ $$\langle$$⁠`corpo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ $$\langle$$⁠`corpo`⁠$$\rangle$$ }

Como pode ver, ambos `\halign` e `\valign` compreendem três secções principais:

* [$$\langle$$⁠`especificação opcional`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`preâmbulo`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`corpo`⁠$$\rangle$$](#body)

## O $$\langle$$⁠especificação opcional⁠$$\rangle$$

O tamanho/extensão predefinido de uma tabela, o seu chamado “tamanho natural”, é determinado pelo seu conteúdo — para clarificar, por tamanho/extensão estamos a referir-nos a

* o *largura* de uma tabela produzida por `\halign`, ou
* o *altura* de uma tabela produzida por `\valign`

Uma $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ pode ser usado para “substituir” o tamanho natural da tabela e assume uma de duas formas:

* **`para`** $$\langle$$**⁠`dimensão`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`dimensão`⁠**$$\rangle$$

onde

* $$\langle$$**⁠`dimensão`⁠**$$\rangle$$ é um comprimento dado em unidades que o TeX compreende, como pt, mm ou cm — o comprimento também pode ser especificado como um comando que se expande para um valor especificado nas unidades apropriadas;
* **`para`** e **`spread`** são palavras-chave do TeX que especificam o tipo de “substituição” do tamanho natural:
  * **`para`**: define o tamanho da tabela para o $$\langle$$⁠`dimensão`⁠$$\rangle$$ valor
  * **`spread`**: acrescenta o $$\langle$$⁠`dimensão`⁠$$\rangle$$ valor ao tamanho natural da tabela

O efeito de um $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ depende do tipo de tabela que está a ser composta: ajustará um `\halign` tamanho natural da tabela *largura*, ou um `\valign` tamanho natural da tabela *altura*.

Aqui estão alguns exemplos:

* `\halign **to 100pt**{...}`: define a `\halign` largura da tabela para `100pt`
* `\valign **to 50pt**{...}`: define a `\valign` altura da tabela para `30pt`
* `\halign **spread 30pt**{...}`: acrescenta 30pt à `\halign` largura natural da tabela. Em contrapartida, escrever **spread -30pt** reduziria a largura da tabela em 30pt.
* `\valign **spread 20pt**{...}`: acrescenta 20pt à `\valign` altura natural da tabela. Em contrapartida, escrever **spread -20pt** reduziria a altura da tabela em 20pt.

O código seguinte reutiliza os exemplos de tabelas acima, mas aplica um $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ a um `\valign` e `\halign` tabela:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordas da caixa ajustadas ao conteúdo
\setlength{\fboxsep}{0pt}

Aqui está uma tabela \verb|\valign|:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Aqui está uma tabela \verb|\halign|:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a saída mostrada abaixo:

![](/files/366b7f04d895acee2991ae612271dc40f7256cc9)

—mas note como o conteúdo de ambas as tabelas está “agregado”. A razão para isso é a ausência de espaçamento flexível (glue) que o TeX pode usar para esticar o conteúdo e preencher o espaço adicional fornecido por **`para`** $$\langle$$**⁠`dimensão`⁠**$$\rangle$$. Aqui vamos avançar para mencionar o `\tabskip` comando.

#### Uma introdução inicial ao comando \tabskip

A estética da disposição de uma tabela pode exigir ajustes no espaçamento entre as suas linhas ou colunas, pelo que, sem surpresa, os motores TeX fornecem um comando chamado `\tabskip` que lhe permite fazer isso. `\tabskip` é usado para definir (e variar) a quantidade de espaço flexível (“glue”) que o TeX coloca entre as colunas de um `\halign` ou as linhas de um `\valign`. Artigos posteriores explorarão `\tabskip` com muito mais detalhe.

Como exemplo introdutório, o código seguinte usa uma definição para `\tabskip` que faz com que o TeX insira algum espaço (muito) flexível entre as linhas de uma `\valign` tabela. Esse espaço flexível permite que as linhas da tabela se espalhem e preencham o espaço adicional criado pelo $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ de **`a 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{especificação opcional} \rangle\)}
\begin{document}
\pagestyle{empty}
Aqui está uma tabela \verb|\valign|:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Aqui está a mesma tabela \verb|\valign| mas com uma \optspec{} de ``\texttt{a 50pt}''. Repare como as linhas estão ``apertadas'' porque não há ``glue esticável'' disponível entre as linhas:

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Usaremos a tabela \verb|\valign| com uma \optspec{} de ``\texttt{a 50pt}'', mas forneceremos ``espaçamento flexível'' através do comando \verb|\tabskip|. Aqui, \verb|\tabskip| está a fornecer ``glue'' suficiente para permitir que as linhas da \verb|\valign| se ``estiquem'' e preencham qualquer espaço extra disponível. Aqui está a tabela \verb|\valign| ``esticada'':

\tabskip=0pt plus1fil % Isto define \tabskip como um glue muito flexível
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/ff5fffd4302f4a14cadca077e5a32a7a752b7ea3)

## Apresentando a tabela $$\langle$$⁠preâmbulo⁠$$\rangle$$ e $$\langle$$⁠corpo⁠$$\rangle$$

Esta secção fornece uma introdução ao preâmbulo da tabela $$\langle$$⁠`preâmbulo`⁠$$\rangle$$, e *brevemente* aborda o preâmbulo da tabela $$\langle$$⁠`corpo`⁠$$\rangle$$ que subsequentemente [explorado em mais detalhe](#bodydetails).

Artigos posteriores desta série explorarão o $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ e $$\langle$$⁠`corpo`⁠$$\rangle$$ com mais detalhe, em particular o uso e o processamento pelo TeX do preâmbulo da tabela $$\langle$$⁠`preâmbulo`⁠$$\rangle$$.

Como referido acima, o formato mais geral de `\halign` ou `\valign` tabelas pode ser escrito como:

`\halign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ $$\langle$$⁠`corpo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ $$\langle$$⁠`corpo`⁠$$\rangle$$ }

### O $$\langle$$⁠preâmbulo⁠$$\rangle$$

O $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ secção contém uma única $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ que é *terminada* pelo `\cr` comando; consequentemente, o $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ pode ser reescrito como:

$$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$**`\cr`**

### O $$\langle$$⁠corpo⁠$$\rangle$$

Da mesma forma, o $$\langle$$⁠corpo⁠$$\rangle$$ secção pode ser ainda dividida em uma ou mais “linhas” constituintes, mas aqui há duas opções para cada linha:

* uma linha composta por um conjunto de células que formam um `\halign` linha ou `\valign` coluna; ou
* a `\noalign` comando que “injeta” material entre as linhas de um `\halign`'s linhas ou `\valign`'s colunas.

Para já, ignoraremos o `\noalign` comando (ver [mais adiante no artigo](#noalign)) e assumiremos que cada linha do $$\langle$$⁠corpo⁠$$\rangle$$ é dados para um conjunto de células e *terminada* por `\cr` comando.

Ignorando `\noalign`, a $$\langle$$⁠`corpo`⁠$$\rangle$$ secção, que representa o conteúdo do utilizador, contém uma sequência de linhas, cada uma das quais designaremos por $$\langle$$⁠`linha do corpo`⁠$$\rangle$$ que é *terminada* pela sua correspondente `\cr` comando.

O $$\langle$$⁠`corpo`⁠$$\rangle$$ pode ser reescrito como:

$$\langle$$⁠linha do corpo$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linha do corpo$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Juntando isto, podemos reescrever o formato geral de `\halign` e `\valign` como:

`\halign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linha do corpo$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`especificação opcional`⁠$$\rangle$$ { $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linha do corpo$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Por razões que serão abordadas em artigos posteriores, a $$\langle$$⁠`preâmbulo`⁠$$\rangle$$, apenas uma única $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$, tem um formato diferente de todas as linhas da tabela $$\langle$$⁠`corpo`⁠$$\rangle$$. Também iremos [rever o `\noalign` comando](#noalign) que também pode ser usado dentro da tabela $$\langle$$⁠`corpo`⁠$$\rangle$$.

### O $$\langle$$⁠linha de preâmbulo⁠$$\rangle$$

O $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ desempenha um *vital* papel na composição de tabelas porque fornece uma espécie de “planta” usada para compor o conteúdo —`\halign` linhas ou `\valign` colunas — contidas na tabela $$\langle$$⁠`corpo`⁠$$\rangle$$. O $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ também pode conter “modelos” de células usados para construir as linhas de um `\halign` ou colunas de uma `\valign`—um tema que será explorado em detalhe.

O objetivo da $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ é duplo:

* determina o *máximo* número de células por linha de um `\halign` ou por coluna de uma `\valign`.
* guarda *modelos de células* que podem ser usados para automatizar a formatação ou a inclusão de conteúdo nas células contidas na tabela $$\langle$$⁠`corpo`⁠$$\rangle$$. Os modelos de células são opcionais e podem estar “vazios”, ou pode incluir caracteres ou comandos que o TeX inserirá automaticamente antes e/ou depois do conteúdo real de células específicas na sua tabela. Isto poupa-lhe o incómodo de ter de escrever/incluir manualmente esses caracteres ou comandos em todas as células a que os quer aplicar.

**Nota**: um `\halign` linha ou `\valign` coluna pode conter menos células do que o máximo especificado pelo $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ mas não pode conter mais do que esse máximo, caso contrário o TeX gera um erro. Para já, estamos a omitir os detalhes dos *cíclicos* preâmbulos.

Continuando com os nossos diagramas de estrutura, a $$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$ para

* um `\halign` tabela com um máximo de $$\mathrm{K}$$ células por *linha*, ou
* a `\valign` tabela com um máximo de $$\mathrm{K}$$ células por *coluna*

pode ser escrita como:

$$\langle$$⁠modelo⁠$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠modelo⁠$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠modelo⁠$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠modelo⁠$${}*\mathrm{K}$$⁠$$\rangle$$

onde `&` é o *carácter de tabulação de alinhamento* que indica o fim de uma célula e o início da seguinte. Tradicionalmente, o carácter ampersand (`&`) é usado como tabulação de alinhamento, mas qualquer carácter com [código de categoria](/latex/overleaf-learn-latex-pt/mais-topicos/43-table-of-tex-category-codes.md) 4 poderia ser usado em alternativa.

Só como lembrete, a $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ pode ser escrita $$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$**`\cr`**, ou equivalentemente

$$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠modelo⁠$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠modelo⁠$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠modelo⁠$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠modelo⁠$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Estrutura de cada célula $$\langle$$⁠modelo⁠$$\rangle$$

Cada célula $$\langle$$⁠modelo⁠$${}\_i$$⁠$$\rangle$$ pode ser escrita como:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ onde:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ é um conjunto de caracteres ou comandos (tokens) que o TeX inserirá automaticamente *antes de* conteúdo fornecido pelo utilizador para a célula $$i$$;
* $$\texttt{#}$$ é um espaço reservado, mostrando onde o conteúdo fornecido pelo utilizador deve aparecer na célula $$i$$. Mais uma vez, o `#` carácter é apenas uma *tradição*, qualquer carácter com [código de categoria](/latex/overleaf-learn-latex-pt/mais-topicos/43-table-of-tex-category-codes.md) 6 poderia ser usado em alternativa. Note que o código de categoria 6 é usado para parâmetros de macros;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ é um conjunto de caracteres ou comandos (tokens) que o TeX inserirá automaticamente *depois de* conteúdo fornecido pelo utilizador para a célula $$i$$.

Note que todos $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ e $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ estiver *opcional*: não tem de usar quaisquer caracteres ou comandos antes ou depois do conteúdo da célula.

**Completando o** $$\langle$$**⁠preâmbulo⁠**$$\rangle$$

Por fim, usando a notação acima, a $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ para

* um `\halign` tabela com um máximo de $$\mathrm{K}$$ células por *linha*, ou
* a `\valign` tabela com um máximo de $$\mathrm{K}$$ células por *coluna*

pode ser escrita como:

$$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠`linha de preâmbulo`⁠$$\rangle$$`**\cr**`

ou

$$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**O** $$\langle$$**⁠preâmbulo⁠**$$\rangle$$ **e contagem de linhas e colunas**

Uma **`\halign`** tabela com um $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ especificando $$\mathrm{K}$$ células e uma $$\langle$$⁠`corpo`⁠$$\rangle$$ contendo $$\mathrm{N}$$ $$\langle$$⁠`linhas do corpo`⁠$$\rangle$$ produzirá uma tabela com $$\mathrm{K}$$ *colunas* e $$\mathrm{N}$$ *linhas*, como mostrado no diagrama seguinte:

![](/files/1f50b35358d2f7c1c5a5c351040ee993d51cc19c)

Um **`\valign`** tabela com um $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ especificando $$\mathrm{K}$$ células e uma $$\langle$$⁠`corpo`⁠$$\rangle$$ contendo $$\mathrm{N}$$ $$\langle$$⁠`linhas do corpo`⁠$$\rangle$$ produzirá uma tabela com $$\mathrm{K}$$ *linhas* e $$\mathrm{N}$$ *colunas*, como mostrado no diagrama seguinte:

![](/files/53aea1a24386198bb5f59ac1d541dac759e86722)

### Basta de teoria, vamos a alguns exemplos!

Como veremos mais tarde em algum detalhe, quando o TeX processa o conteúdo de uma tabela — células da tabela contidas no [$$\langle$$⁠`corpo`⁠$$\rangle$$](#body)— verifica a presença de modelos de células, que foram definidos no $$\langle$$⁠`preâmbulo`⁠$$\rangle$$, porque o TeX procura quaisquer tokens de modelo a inserir antes e/ou depois do conteúdo do utilizador. Os seguintes exemplos mínimos demonstram o uso de modelos de células $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ num `\halign` e `\valign` composta.

#### Uma tabela \halign usando modelos de células

O exemplo seguinte demonstra um `\halign` tabela que usa um modelo de célula para inserir automaticamente aspas duplas à volta do conteúdo da primeira célula de cada linha: ou seja, um modelo que afeta todas as células da primeira coluna:

```latex
\documentclass{article}
\usepackage{parskip} % Defina \parindent para 0pt
% Escolha um tamanho de página convenientemente pequeno
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Espalhe as colunas do \halign
\begin{document}
\pagestyle{empty}

Aqui está uma tabela \verb|\halign| \textit{sem} modelos de células:

\halign{
% Nada antes nem depois de cada '#' no <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Aqui está a mesma tabela \verb|\halign| mas com aspas duplas adicionadas automaticamente à primeira célula de cada linha; ou seja, afeta todas as células da primeira coluna:

\halign{
% Modelos de aspas no preâmbulo:
``#''&#&#\cr % Aspas duplas antes e depois do primeiro #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/f5e2d7ff992abc36ce10c6248fbaac1f3df911f5)

O gráfico seguinte é uma versão anotada da `\halign` tabela produzida pelo exemplo acima; aqui, comparamos a estrutura “formal” de uma $$\langle$$⁠`preâmbulo`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

com a estrutura real $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ de ` ``#''&#&#**\cr** `, destacando a presença, ou ausência, de modelos de células:

![](/files/aa03b75a7053ab86f968e3d8e2c678c72d6e89b1)

#### Uma tabela \valign usando modelos de células

O exemplo seguinte demonstra uma `\valign` tabela que usa um modelo para cada célula para inserir automaticamente dígitos a envolver o conteúdo do utilizador.

```latex
\documentclass{article}
\usepackage{parskip} % Defina \parindent para 0pt
% Escolha um tamanho de página convenientemente pequeno
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Espalhe as linhas do \valign
\begin{document}
\pagestyle{empty}

Aqui está uma tabela \verb|\valign| \textit{sem} modelos de células:

\begingroup
\hsize=25pt
\valign{
% Nada antes nem depois de cada '#' em
% o <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Aqui está a mesma tabela \verb|\valign| mas usando modelos de células para inserir automaticamente dígitos em todas as células:

\begingroup
\hsize=25pt
\valign{
% Dígitos inseridos antes e depois de cada '#' em
% o <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/6bde191a7f5e920e6f9b4eb22fc25f510ee220f5)

O gráfico seguinte é uma versão anotada da `\valign` tabela produzida pelo exemplo acima; aqui, comparamos a estrutura “formal” de uma $$\langle$$⁠`preâmbulo`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

com a estrutura real $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ de `1#2&3#4&5#6**\cr**`, destacando o uso de modelos de células $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/27976139fa971f0ff5905ef0ee7cf9cbc667d270)

Repare como o modelo para a célula $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) é aplicado à $$i$$ésima célula em cada `\valign` coluna, resultando em que todas as células da $$i$$ésima *linha* sejam afetadas.

#### Estilizar texto usando modelos de células

O exemplo seguinte usa os seguintes $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ (modelos de células) para estilizar o texto contido em cada linha ou coluna:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Se compararmos isto $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ à nossa estrutura “formal” de uma tabela de três células $$\langle$$⁠`preâmbulo`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

podemos ver que:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Observe como estes modelos de célula, como `\textbf{#}` assemelham-se a macros com um único parâmetro (o conteúdo da célula).

```latex
Uma tabela \verb|\valign| com texto estilizado usando modelos de célula:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Uma tabela \verb|\halign| com texto estilizado usando modelos de célula:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/b76da3bc2391b412ed2f6a7166c1db1d183899c4)

## Mais detalhes sobre a tabela $$\langle$$⁠corpo⁠$$\rangle$$

Na seção [Apresentando a tabela $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ e $$\langle$$⁠`corpo`⁠$$\rangle$$](#preamble) vimos como, se ignorarmos temporariamente `\noalign`, a $$\langle$$⁠`corpo`⁠$$\rangle$$ de uma `\halign` ou `\valign` tabela consiste em várias linhas, cada uma designada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$, onde:

* cada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ é terminada por `\cr` comando
* cada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ de uma `\halign` é uma linha da tabela
* cada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ de uma `\valign` é uma coluna da tabela

A sequência de linhas, $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$, onde $$j=1\ldots\mathrm{N}$$, produz $$\mathrm{N}$$ linhas de uma `\halign` ou $$\mathrm{N}$$ colunas para uma `\valign`. Como resumido no diagrama a seguir, uma tabela geral $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ como

$$\langle$$⁠`preâmbulo`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

especifica modelos de célula para um máximo de $$\mathrm{K}$$ células em cada uma das $$\mathrm{N}$$ $$\langle$$⁠`linha do corpo`⁠$$\rangle$$ entradas no $$\langle$$⁠`corpo`⁠$$\rangle$$:

![](/files/4c2a90da4d00132ec7aa07678df8cdba9f5690c6)

### A estrutura de cada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$

Cada linha $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ da tabela $$\langle$$⁠corpo⁠$$\rangle$$ contém conteúdo para até $$\mathrm{K}$$ células — conforme determinado pela $$\langle$$⁠preâmbulo⁠$$\rangle$$\setlength{\tabskip}{

$$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Célula$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Célula$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Célula$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Célula$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

onde:

* $$\langle$$⁠Célula$${}\_i$$⁠$$\rangle$$ representa o conteúdo do usuário para a $$i$$ª célula em alguma $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$
* o **`&`** caractere é chamado de *tabulação de alinhamento* (o mesmo usado no $$\langle$$⁠preâmbulo⁠$$\rangle$$) que sinaliza o fim de uma célula e o início da próxima. Mais uma vez, o uso de **`&`** é apenas uma tradição (convenção), porque qualquer caractere com [código de categoria](/latex/overleaf-learn-latex-pt/mais-topicos/43-table-of-tex-category-codes.md) 4 poderia ser usado em alternativa.

Embora cada $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ possa conter um máximo $$\mathrm{K}$$ células (determinado pelo $$\langle$$⁠preâmbulo⁠$$\rangle$$) elas podem conter *menos* do que $$\mathrm{K}$$ células e qualquer $$\langle$$⁠Célula$${}\_i$$⁠$$\rangle$$ em $$\langle$$⁠linha do corpo$${}\_j$$⁠$$\rangle$$ pode ficar vazia.

O exemplo seguinte demonstra uma $$\langle$$⁠preâmbulo⁠$$\rangle$$ de `#&#&#&#&#\cr` o que prevê um máximo de 5 células por $$\langle$$⁠linha do corpo⁠$$\rangle$$; no entanto, as tabelas compostas contêm linhas com menos de 5 células:

```latex
Uma tabela \verb|\valign| com 1 a 5 células por \textit{coluna}:

\begingroup
% \hsize controla as larguras das colunas de \valign (tamanho das linhas compostas).
\hsize=40pt
\fbox{\valign{
% Use um preâmbulo que permita 5 células por coluna
% A maioria das colunas não fornece conteúdo para 5 células
#&#&#&#&#\cr% 5 células por coluna
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Nota: por razões explicadas mais tarde
% o \halign tem de ser colocado numa \vbox
Uma tabela \verb|\halign| com 1 a 5 células por \textit{linha}:

\fbox{%
\vbox{\halign{
% Use um preâmbulo que permita 5 células por linha
% A maioria das linhas não fornece conteúdo para 5 células
#&#&#&#&#\cr % 5 células por linha
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Abra este exemplo no Overleaf](/latex/overleaf-learn-latex-pt/artigos-aprofundados/15-how-do-tex-engines-typeset-tables-2.md)

Este exemplo produz a seguinte saída:

![](/files/0994f143778f5057a1fe7f59bdfdecdd944c6d66)

O próximo `\halign` exemplo demonstra um número variável de células por linha e a possibilidade de as células estarem vazias — note como as células vazias são produzidas por caracteres consecutivos **`&`** na tabela:

```latex
Uma tabela \verb|\halign| com algumas células vazias — note que há caracteres \texttt{\&} consecutivos na tabela \(\langle\texttt{body}\rangle\):

\fbox{%
\vbox{\halign{
% Use um preâmbulo que permita 5 células por linha
% A maioria das linhas não fornece conteúdo para 5 células
#&#&#&#&#\cr % 5 células por linha
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/199d9d0c01900b8ec5f6968591c591a0046b089c)

### Não há nada de especial em & e # na composição de tabelas

O uso dos caracteres por TeX `&` e `#` na composição de `\halign`- ou `\valign`-baseadas é uma tradição que se origina nas macros originais plain TeX de Knuth. É perfeitamente possível usar caracteres diferentes de `&` e `#` atribuindo os códigos de categoria apropriados às substituições de sua preferência, como demonstra o exemplo a seguir:

* substituí-lo `&` com `@` atribuindo `@` ao código de categoria 4
* substituí-lo `#` com `|` atribuindo `|` ao código de categoria 6 (que é usado para parâmetros de macro)

As alterações de categoria são mantidas locais usando `\begingroup` e `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Reintroduzindo o comando \noalign

Os motores TeX fornecem o comando embutido (primitivo) `\noalign` comando:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}`

onde $$\langle$$⁠`tokens`⁠$$\rangle$$ são caracteres e/ou comandos TeX/LaTeX. O `\noalign` comando é de uso exclusivo dentro de uma `\halign` ou `\valign` tabela: usá-lo fora delas gerará um erro.

O objetivo de `\noalign` é permitir a "inserção" de texto e comandos TeX/LaTeX *entre* as linhas de uma `\halign` tabela ou as colunas de uma `\valign` tabela. O uso mais comum de `\noalign` é a criação de regras de tabela (linhas):

* *horizontais* regras entre `\halign` linhas da tabela
* *verticais* regras entre `\valign` colunas da tabela

Observe o seguinte:

* o `\noalign` comando é ***não é terminado pelo\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*comando***
* o conjunto de comandos permitidos dentro de `\noalign{...}` depende de se está sendo usado na $$\langle$$⁠`corpo`⁠$$\rangle$$ de uma `\halign` ou `\valign` tabela (ou seja, em modo vertical ou horizontal).

Agora podemos dizer que a tabela $$\langle$$⁠`corpo`⁠$$\rangle$$ de `\halign` ou `\valign` pode consistir em linhas individuais $$\langle$$⁠linha do corpo$${}\_i$$⁠$$\rangle$$`\cr` intercaladas com `\noalign` comandos; uma das muitas possibilidades/combinações poderia ser:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}` $$\langle$$⁠linha do corpo$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linha do corpo$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`mais tokens`⁠$$\rangle$$`}` $$\langle$$⁠linha do corpo$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linha do corpo$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`outros tokens`⁠$$\rangle$$`}`

### Exemplo usando \noalign

Veremos outros casos de uso mais adiante nesta série de artigos, mas aqui está um exemplo básico para demonstrar a criação de regras de tabela por meio de `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Usando \verb|\noalign| para colocar regras horizontais entre linhas de uma tabela \verb|\halign|:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Usando \verb|\noalign| para colocar regras verticais entre colunas de uma tabela \verb|\valign|:
\vspace{6pt}

\begingroup % mantém local as alterações em \parindent e \hsize
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/24e59049dc1cdaeadf75906ab5d395ed6c6bc6ba)

## \tabskip revisitado

Vamos analisar mais de perto o `\tabskip` comando, com base na [introdução em uma seção anterior](#tabskip).

O `\tabskip` comando define o valor de uma forma especial de "espaçamento" (glue) usada *exclusivamente* na composição de tabelas: seu objetivo é fornecer espaçamento entre linhas ou colunas da tabela:

* para `\halign` tabelas: `\tabskip` o glue é inserido antes e depois da tabela (isto é, à esquerda e à direita) e entre as colunas da tabela
* para `\valign` tabelas: `\tabskip` o glue é inserido antes e depois da tabela (isto é, acima e abaixo) e entre as linhas da tabela

O valor de `\tabskip` pode ser definido usando o LaTeX `\setlength` comando:

`\setlength{\tabskip}{`$$\langle$$⁠`valor de glue`⁠$$\rangle$$`}`

onde $$\langle$$⁠`valor de glue`⁠$$\rangle$$ pode ser:

* um comprimento fixo, como `5pt`, `3mm`, ou
* um glue flexível finito, como `3pt plus 2pt minus 1pt`, ou
* um glue infinitamente flexível, como `0pt plus1fill`.

Você também pode definir diretamente `\tabskip` (contornando `\setlength`)

`\tabskip`=$$\langle$$⁠`valor de glue`⁠$$\rangle$$

No entanto, qualquer alteração no valor de `\tabskip` glue só afetará o espaçamento da tabela quando essa alteração for:

* feita *antes de* o `\halign` ou `\valign` comando seja processado, ou
* feita dentro da tabela $$\langle$$⁠`preâmbulo`⁠$$\rangle$$

As tentativas de definir `\tabskip` valores dentro do conteúdo da tabela (células na tabela $$\langle$$⁠`corpo`⁠$$\rangle$$) *não vai* não alteram o espaçamento das `\halign` colunas da tabela ou `\valign` linhas da tabela. O motivo desse comportamento de `\tabskip` pode ser atribuído ao papel desempenhado pelo $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ durante a composição da tabela — processos que exploraremos mais adiante em algum detalhe.

### Ver para crer

Para ajudar a visualizar a presença de vários tipos de espaçamento/glue usados na composição de tabelas, especialmente

* `\tabskip` cola
* `\baselineskip` cola
* ajuste manual de espaçamento entre caracteres (`\kern`)

A Overleaf preparou um projeto baseado em LuaTeX para colorir os componentes de uma tabela. LuaTeX foi escolhido porque permite o reprocessamento de baixo nível dos dados/estruturas internas de tabelas compostas, mas não exploraremos esses detalhes aqui.

Aqui estão alguns exemplos que mostram várias aplicações de `\tabskip`. Para cada exemplo, mostraremos a saída real e a versão colorida produzida por LuaTeX.

### Exemplo 1 de \tabskip

Vamos examinar o uso de `\tabskip` num `\halign` e `\valign` tabela. Mostraremos as tabelas realmente compostas, com uma borda para visualizar seu tamanho e espaçamento, juntamente com gráficos anotados contendo versões coloridas que mostram claramente o tamanho de vários glues/espaçamentos em cada tabela.

Primeiramente, o `\halign`:

```latex
% Para visualizar a extensão da tabela, colocaremos uma borda ao redor dela
\setlength{\fboxsep}{0pt} % Use bordas ajustadas ao conteúdo

% Aqui definimos \tabskip "diretamente"
\tabskip5pt % Define o valor inicial de \tabskip fora da tabela

% Para colocar uma borda ao redor da tabela, ela precisa ser salva em uma caixa TeX.
% Um \halign precisa ser colocado em uma \vbox porque \halign deve ser
% processado em "modo vertical": uma \hbox não funcionará porque
% isso é processado em "modo horizontal"

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/1413dbc176d24ee4aec1fe02e7da4cd73ca31b6c)

O próximo gráfico é uma versão maior, colorida e anotada da tabela produzida pelo exemplo anterior:

![](/files/b3a470c4659a8374268813cd1f47dc7c51f5ef77)

Há 4 ocorrências do `\tabskip` comando, cada uma correspondendo a uma localização específica de espaçamento dentro da tabela:

1. `\tabskip5pt` é usado fora da tabela e define o `\tabskip` valor aplicado antes (à esquerda) da primeira célula em cada linha.
2. `\tabskip10pt` é definido no primeiro modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço entre $$\langle$$⁠Célula$${}\_1$$⁠$$\rangle$$ e $$\langle$$⁠Célula$${}\_2$$⁠$$\rangle$$ de cada linha.
3. `\tabskip15pt` é definido no segundo modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço entre $$\langle$$⁠Célula$${}\_2$$⁠$$\rangle$$ e $$\langle$$⁠Célula$${}\_3$$⁠$$\rangle$$ de cada linha.
4. `\tabskip20pt` é definido no terceiro e último modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço adicionado após $$\langle$$⁠Célula$${}\_3$$⁠$$\rangle$$, a célula final de cada linha.

A seguir, o `\valign`

```latex
\setlength{\fboxsep}{0pt} % Use bordas ajustadas ao conteúdo
\tabskip5pt % Define o valor inicial de \tabskip fora da tabela

% Mantenha as alterações em \hsize locais (em um grupo)
\begingroup
% \hsize determina as larguras das colunas de \valign
\setlength{\hsize}{50pt}
% Como \valign pode ser colocado em uma \vbox ou \hbox, podemos usar
% \fbox diretamente
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

![](/files/f5e5ddbfb6b06fa60ffc52dfd5a6f5f8d8275a59)

Novamente, o próximo gráfico é uma versão maior, colorida e anotada da tabela produzida pelo exemplo anterior:

![](/files/b34e5663bcb95e63d3f53c19dd176737df6926f7)

Assim como no `\halign` exemplo, há 4 ocorrências do `\tabskip` comando. No entanto, com uma `\valign` tabela, o `\tabskip` é inserido entre as linhas da tabela:

1. `\tabskip5pt` é usado fora da tabela e define o `\tabskip` valor aplicado antes (acima) da primeira célula em cada coluna.
2. `\tabskip10pt` é definido no primeiro modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço entre $$\langle$$⁠Célula$${}\_1$$⁠$$\rangle$$ e $$\langle$$⁠Célula$${}\_2$$⁠$$\rangle$$ de cada coluna.
3. `\tabskip15pt` é definido no segundo modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço entre $$\langle$$⁠Célula$${}\_2$$⁠$$\rangle$$ e $$\langle$$⁠Célula$${}\_3$$⁠$$\rangle$$ de cada coluna.
4. `\tabskip20pt` é definido no terceiro e último modelo de célula da $$\langle$$⁠`preâmbulo`⁠$$\rangle$$ o que afeta o espaço adicionado após $$\langle$$⁠Célula$${}\_3$$⁠$$\rangle$$, a célula final de cada coluna.

**Resumo/conclusões**

* Em uma `\halign` tabela, o `\tabskip` o glue é colocado à esquerda e à direita de cada célula em uma linha, espaçando assim as colunas da tabela.
* Num `\valign` tabela, o `\tabskip` o glue é colocado acima e abaixo de cada célula em uma coluna, espaçando assim as linhas da tabela.

### \tabskip e \noalign

#### Usando um \halign

O seguinte `\halign` exemplo usa `\tabskip` glues e também demonstra o `\noalign` comando, usando-o para colocar regras espaçadas acima e abaixo das linhas de uma `\halign` tabela. Essas regras são compostas usando o `\hrule` comando (primitivo) juntamente com o espaço criado por `\kern`:

```latex
\setlength{\tabskip}{5pt} % Define \tabskip fora da tabela

\halign{
#&#&#&#&#\cr % O <preâmbulo>
\noalign{\hrule\kern2pt} % Regra espaçada antes da linha 1
1&2&3&4&5\cr % Linha 1
\noalign{\kern2pt\hrule\kern2pt} % Regra espaçada entre as linhas 1/2
6&7&8&9&10\cr % Linha 2
\noalign{\kern2pt\hrule\kern2pt} % Regra espaçada entre as linhas 2/3
11&12&13&14&15\cr % Linha 3
16&17&18&19&20\cr % Linha 4---sem regras entre as linhas 3/4
\noalign{\kern2pt\hrule} % Regra espaçada no final da tabela
}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Este exemplo produz a tabela mostrada abaixo, que foi ainda mais anotada para reproduzir o código (La)TeX e os números (1) a (4) para enumerar os `\noalign` comandos, contendo regras e kerns, juntamente com sua saída composta correspondente:

![](/files/d17159ff8d12e666f3ffd691daa8570711c362c7)

O gráfico a seguir mostra uma versão colorida da tabela, rotulada para mostrar os vários espaçamentos/glues na tabela:

![](/files/d132023b37da2f7c876a9e3925b745aa9ab76ad3)

Observe o seguinte:

* o uso de `\noalign` para inserir regras entre certas linhas e o uso manual de `\kern` valores para colocar algum espaço antes/depois das regras. Os motores TeX não inserem `\baselineskip` glue após uma regra composta, razão pela qual o espaço é inserido manualmente usando `\kern` (outros comandos de espaçamento poderiam ser usados);
* `\baselineskip` glue foi inserido automaticamente entre as linhas 3 e 4.

#### Usando um \valign

O seguinte `\valign` exemplo usa os mesmos dados do anterior `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a tabela mostrada abaixo, que foi ainda mais anotada para reproduzir o código (La)TeX e os números (1) a (4) para enumerar os `\noalign` comandos, contendo regras e kerns, juntamente com sua saída composta correspondente:

![](/files/3ee0db810860436bf54a7cd45f06833f45d43cf9)

![](/files/26bdab8cb68556d6d916315d5825d7a0297b70b9)

### Uma tabela \valign com linhas de texto

O próximo exemplo

```latex
\setlength{\tabskip}{5pt}
\begingroup % Mantém locais as alterações em \parindent e \hsize
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} pode compor tabelas muito complexas
tabelas.&Aqui está um pouco de conteúdo extra
texto.&E, por fim, uma linha extra
nesta coluna.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Este exemplo produz a seguinte saída:

## Definindo larguras das linhas e alturas das colunas

## Mais sobre a tabela $$\langle$$⁠preâmbulo⁠$$\rangle$$


---

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