> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/es/articulos-en-profundidad/15-how-do-tex-engines-typeset-tables-2.md).

# Cómo componen tablas los motores TeX 2

## Cómo componen tablas los motores TeX 2

## Los motores TeX se refieren a las tablas como alineaciones

Dentro de la [documentación del código fuente de TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth no analiza la capacidad de TeX para «componer tablas», sino que describe, en cambio, los algoritmos de TeX para construir las llamadas *alineaciones*. La composición de tablas en TeX es, en efecto, un proceso automatizado de alineación de cajas: ordenar cajas (celdas, filas y columnas de una tabla) para lograr una cuadrícula o matriz rectangular agradable; aunque, por supuesto, siendo TeX hay *muchas* matices en ese proceso.

El término «alineación» también se refleja en los nombres de los dos comandos de composición de tablas incorporados en todos los motores TeX:

* `\halign` (alineación horizontal), y
* `\valign` (alineación vertical).

Exploraremos ambos comandos a lo largo de esta serie de artículos, comenzando con una visión general más formal del formato/estructura de los `\halign` y `\valign` comandos para sentar las bases de los artículos posteriores y más profundos de esta serie.

### Las tablas de TeX son cajas y espaciado

Las celdas individuales de una tabla suelen contener una variedad de contenido, como líneas de texto, matemáticas o gráficos, lo que produce un conjunto de celdas de tabla con distintos anchos, alturas o profundidades de material compuesto. De algún modo, TeX necesita trabajar con esas celdas, de dimensiones de contenido variables, para construir la tabla final en la que cada fila tiene una cierta altura y cada columna un ancho determinado. TeX necesita deducir valores apropiados para las alturas de cada fila y los anchos de cada columna a partir del conjunto de celdas de tabla de tamaño variable.

Sin embargo, TeX no puede conocer el tamaño real del contenido de cada celda hasta que ese contenido se compone; en consecuencia, TeX recorre toda la tabla, componiendo cada celda, para obtener los datos de tamaño necesarios para completar el diseño de la tabla. A partir de esos datos de tamaño, TeX puede determinar la altura correcta de cada fila y el ancho de cada columna. TeX también puede encontrarse con celdas vacías o celdas que el usuario quiere que abarquen varias columnas o varias filas, todo lo cual TeX debe tener cuidadosamente en cuenta en sus cálculos. Después de “filtrar” esta diversa colección de datos de tamaño de celdas (cajas), solo entonces TeX puede determinar los valores finales de anchura de las columnas en un `\halign`, o las alturas de las filas para `\valign` y utiliza esos valores en las etapas finales de sus algoritmos de diseño de tablas.

En la práctica, y «bajo el capó», la composición de tablas de TeX consta de varios pasos. A grandes rasgos, TeX primero compone una versión «borrador» o «incompleta» de la tabla mientras captura y procesa los datos de tamaño de las celdas —y los datos sobre cualquier `\span` comando usado en la tabla. `\halign` anchos de columna o `\valign` alturas de fila y lograr el diseño final; todo lo cual exploraremos en esta serie de artículos.

## \halign y \valign: dos maneras de construir tablas

Todos los motores TeX proporcionan dos *incorporado* comandos (primitivas) diseñados para la composición de tablas (alineaciones): `\halign` y `\valign`, que comparten muchas características básicas pero también difieren en algunos aspectos fundamentales. La diferencia clave entre `\halign` y `\valign` es cómo construyen sus respectivas tablas: fila por fila o columna por columna:

* `\halign`: compone tablas fila por fila para crear filas individuales que se apilan verticalmente para producir las columnas de la tabla
* `\valign`: compone tablas columna por columna para crear columnas individuales que se apilan horizontalmente para producir las filas de la tabla

### \halign

El siguiente diagrama muestra la construcción de una tabla creada por `\halign`. La tabla se compone fila por fila con filas individuales apiladas verticalmente. Algunas consecuencias de esto incluyen:

* las columnas de la tabla surgen del apilamiento vertical de las filas de la tabla
* los saltos de página pueden producirse entre las filas de la tabla
* se puede insertar material no tabular entre filas (mediante `\nolign`, que veremos más adelante)

![](/files/2f9fbe59e1bdaf6be9db370ce5e7c22325c02725)

### \valign

El siguiente diagrama muestra la construcción de una tabla creada por `\valign`. La tabla se compone columna por columna con columnas individuales apiladas horizontalmente (una al lado de la otra). Algunas consecuencias de esto incluyen:

* las filas de la tabla surgen del apilamiento horizontal de las columnas de la tabla
* los saltos de línea pueden producirse entre las columnas de la tabla
* se puede insertar material no tabular entre columnas (mediante `\noalign`, que veremos más adelante)

![](/files/91948cee1f3be26b2dd378bc4f4f462963a4663f)

### Ejemplos

El siguiente ejemplo pretende resaltar el enfoque de fila *frente a*. por columna de \halign y \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordes de caja ajustados
\setlength{\fboxsep}{0pt}

Aquí hay una tabla \verb|\valign|:
\begingroup
% \hsize controla la \valign
% anchura de las columnas. También establecemos
% \parindent a un valor menor
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % El preámbulo: cubierto más adelante (¡con todo detalle!)
A&B&C\cr % La primera COLUMNA de esta tabla \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Nota: por razones que se explicarán más adelante
% la \halign tiene que colocarse en una \vbox
Aquí hay una tabla \verb|\halign|: \fbox{%
\vbox{\halign{
#&#&#\cr % El preámbulo: cubierto más adelante (¡con todo detalle!)
A&B&C\cr % La primera FILA de esta tabla \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida: ![](/files/aff8f697da3ee031fe55c5a62591df6cb1a54822)

El siguiente gráfico muestra una versión anotada de las tablas producidas por el código anterior. Más adelante en esta serie de artículos abordaremos temas como:

* ¿qué son los preámbulos de las tablas?
* ¿por qué establecemos `\hsize` y `\parindent` para `\valign` tablas?

A efectos del momento, fíjate solo en el enfoque de fila frente a columna de `\halign` *frente a*. `\valign` la construcción de tablas:

![](/files/9bf243b89e48c08ad13235432588a2f5cd33dfe7)

## Forma general de \halign y \valign

Para empezar revisaremos las propiedades básicas y el formato general de `\halign` y `\valign` pero sin entrar todavía en ningún detalle real. [Como se señaló](#intro), adoptamos una visión general ligeramente formal de la forma/estructura de los `\halign` y `\valign` comandos para sentar las bases de los artículos posteriores de esta serie.

La forma más general de los `\halign` y `\valign` comandos puede escribirse así:

`\halign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`preámbulo`⁠$$\rangle$$ $$\langle$$⁠`cuerpo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`preámbulo`⁠$$\rangle$$ $$\langle$$⁠`cuerpo`⁠$$\rangle$$ }

Como puedes ver, ambos `\halign` y `\valign` comprenden tres secciones principales:

* [$$\langle$$⁠`especificación opcional`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`preámbulo`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`cuerpo`⁠$$\rangle$$](#body)

## El $$\langle$$⁠especificación opcional⁠$$\rangle$$

El tamaño/extensión predeterminado de una tabla, su llamado «tamaño natural», viene determinado por su contenido; solo para aclarar, con tamaño/extensión nos referimos a

* la *el ancho* de una tabla producida por `\halign`, o
* la *alto* de una tabla producida por `\valign`

Un $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ puede usarse para «anular» el tamaño natural de la tabla y adopta una de dos formas:

* **`a`** $$\langle$$**⁠`dimensión`⁠**$$\rangle$$
* **`extensión`** $$\langle$$**⁠`dimensión`⁠**$$\rangle$$

donde

* $$\langle$$**⁠`dimensión`⁠**$$\rangle$$ es una longitud dada en unidades que TeX entiende, como pt, mm o cm; la longitud también puede especificarse como un comando que se expande a un valor especificado en unidades adecuadas;
* **`a`** y **`extensión`** son palabras clave de TeX que especifican el tipo de «anulación» del tamaño natural:
  * **`a`**: establece el tamaño de la tabla en la $$\langle$$⁠`dimensión`⁠$$\rangle$$ valor
  * **`extensión`**: añade la $$\langle$$⁠`dimensión`⁠$$\rangle$$ valor al tamaño natural de la tabla

El efecto de una $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ depende del tipo de tabla que se esté componiendo: ajustará un `\halign` tamaño natural de la tabla *el ancho*, o una `\valign` tamaño natural de la tabla *alto*.

Aquí hay algunos ejemplos:

* `\halign **to 100pt**{...}`: establece el `\halign` ancho de la tabla en `100pt`
* `\valign **to 50pt**{...}`: establece el `\valign` la altura de la tabla en `30pt`
* `\halign **spread 30pt**{...}`: añade 30pt al `\halign` ancho natural de la tabla. Por el contrario, escribir **spread -30pt** reduciría el ancho de la tabla en 30pt.
* `\valign **spread 20pt**{...}`: añade 20pt a la `\valign` altura natural de la tabla. Por el contrario, escribir **spread -20pt** reduciría la altura de la tabla en 20pt.

El siguiente código reutiliza los ejemplos de tabla anteriores, pero aplica una $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ a una `\valign` y `\halign` tabla:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Bordes de caja ajustados
\setlength{\fboxsep}{0pt}

Aquí hay una tabla \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

Aquí hay una tabla \verb|\halign|:
\fbox{
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Abre este ejemplo en 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 ejemplo produce la salida que se muestra a continuación:

![](/files/a3a087e6f698385831165fa6ffbea99753bfc9f9)

—pero observa cómo el contenido de ambas tablas está «apelotonado». La razón es la ausencia de espaciado flexible (glue) que TeX pueda usar para estirar el contenido y llenar el espacio adicional proporcionado por **`a`** $$\langle$$**⁠`dimensión`⁠**$$\rangle$$. Aquí nos adelantaremos para mencionar el `\tabskip` comando.

#### Una introducción inicial al comando \tabskip

La estética del diseño de una tabla puede requerir ajustes en el espaciado entre sus filas o columnas, así que, como era de esperar, los motores TeX proporcionan un comando llamado `\tabskip` que te permite hacer eso. `\tabskip` se usa para establecer (y variar) la cantidad de espacio flexible («glue») que TeX coloca entre las columnas de una `\halign` o entre las filas de una `\valign`. Artículos posteriores explorarán `\tabskip` con mucho más detalle.

Como ejemplo introductorio, el siguiente código usa un ajuste para `\tabskip` que hace que TeX inserte algo de espacio (muy) flexible entre las filas de una `\valign` tabla. Ese espacio flexible permite que las filas de la tabla se dispersen y llenen el espacio adicional creado por la $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ de **`a 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{especificación opcional} \rangle\)}
\begin{document}
\pagestyle{empty}
Aquí hay una tabla \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}

Aquí está la misma tabla \verb|\valign| pero con una \optspec{} de ``\texttt{to 50pt}''. Observa cómo las filas están ``apelotonadas'' porque no hay ``glue extensible'' disponible entre las filas:

\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 la tabla \verb|\valign| con una \optspec{} de ``\texttt{to 50pt}'', pero proporcionaremos ``espaciado flexible'' mediante el comando \verb|\tabskip|. Aquí, \verb|\tabskip| está proporcionando suficiente ``glue'' para permitir que las filas de \verb|\valign| se ``estiren'' y llenen cualquier espacio extra disponible. Aquí está la tabla \verb|\valign| ``estirada'':

\tabskip=0pt plus1fil % Esto establece \tabskip en un glue muy flexible
\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}
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/6745b8228371624a1f7c37fccf5ab300c569c20f)

## Introducción a la tabla $$\langle$$⁠preámbulo⁠$$\rangle$$ y $$\langle$$⁠cuerpo⁠$$\rangle$$

Esta sección ofrece una introducción al $$\langle$$⁠`preámbulo`⁠$$\rangle$$y *brevemente* aborda brevemente el $$\langle$$⁠`cuerpo`⁠$$\rangle$$ que posteriormente es [explorado con más detalle](#bodydetails).

Artículos posteriores de esta serie explorarán el $$\langle$$⁠`preámbulo`⁠$$\rangle$$ y $$\langle$$⁠`cuerpo`⁠$$\rangle$$ con más detalle, en particular el uso y procesamiento que TeX hace del $$\langle$$⁠`preámbulo`⁠$$\rangle$$.

Como se señaló arriba, el formato más general de `\halign` o `\valign` las tablas puede escribirse así:

`\halign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`preámbulo`⁠$$\rangle$$ $$\langle$$⁠`cuerpo`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`preámbulo`⁠$$\rangle$$ $$\langle$$⁠`cuerpo`⁠$$\rangle$$ }

### El $$\langle$$⁠preámbulo⁠$$\rangle$$

El $$\langle$$⁠`preámbulo`⁠$$\rangle$$ sección contiene una sola $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ que está *terminada* por el `\cr` comando; en consecuencia, el $$\langle$$⁠`preámbulo`⁠$$\rangle$$ puede reescribirse como:

$$\langle$$⁠`preámbulo`⁠$$\rangle$$=$$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$**`\cr`**

### El $$\langle$$⁠cuerpo⁠$$\rangle$$

Del mismo modo, el $$\langle$$⁠cuerpo⁠$$\rangle$$ sección puede desglosarse además en una o más «líneas» constituyentes, pero aquí hay dos opciones para cada línea:

* una línea consistente en un conjunto de celdas que forman una `\halign` fila o `\valign` columna; o
* a `\noalign` comando que «inyecta» material entre las `\halign`filas o `\valign`columnas de la

A efectos actuales ignoraremos el `\noalign` comando (véase [más adelante en el artículo](#noalign)) y supondremos que cada línea del $$\langle$$⁠cuerpo⁠$$\rangle$$ es datos para un conjunto de celdas y *terminada* por `\cr` comando.

Ignorando `\noalign`, la $$\langle$$⁠`cuerpo`⁠$$\rangle$$ sección, que representa el contenido del usuario, contiene una secuencia de líneas, cada una de las cuales nos referiremos como una $$\langle$$⁠`línea de cuerpo`⁠$$\rangle$$ que está *terminada* por su correspondiente `\cr` comando.

El $$\langle$$⁠`cuerpo`⁠$$\rangle$$ puede reescribirse como:

$$\langle$$⁠línea de cuerpo⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠línea de cuerpo⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Uniendo esto, podemos reescribir el formato general de `\halign` y `\valign` como:

`\halign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠línea de cuerpo⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`especificación opcional`⁠$$\rangle$$ { $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠línea de cuerpo⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Por razones que se abordarán en artículos posteriores, la $$\langle$$⁠`preámbulo`⁠$$\rangle$$, solo una sola $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$, tiene un formato diferente al de todas las líneas de la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$. También [volveremos a visitar el `\noalign` comando](#noalign) que también puede usarse dentro de la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$.

### El $$\langle$$⁠línea de preámbulo⁠$$\rangle$$

El $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ desempeña un *papel vital* papel en la composición de tablas porque proporciona una especie de «plano» utilizado para componer el contenido—`\halign` filas o `\valign` columnas—contenidas en la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$. El $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ también puede contener «plantillas» de celdas usadas para construir las filas de una `\halign` o las columnas de una `\valign`—un tema que se explorará en detalle.

El propósito del $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ es doble:

* determina el *máximo* número de celdas por fila de una `\halign` o por columna de una `\valign`.
* almacena *plantillas de celdas* que pueden usarse para automatizar el formato o la inclusión de contenido dentro de las celdas contenidas en la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$. Las plantillas de celdas son opcionales y pueden estar «vacías», o puedes incluir caracteres o comandos que TeX insertará automáticamente antes y/o después del contenido real de celdas específicas de tu tabla. Esto te ahorra la molestia de tener que escribir/incluir manualmente esos caracteres o comandos en cada celda a la que quieras que se apliquen.

**Nota**: una `\halign` fila o `\valign` columna puede contener menos celdas que el máximo especificado por el $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ pero no puede contener más que ese máximo; de lo contrario TeX genera un error. A efectos actuales estamos omitiendo detalles de *cíclicos* preámbulos.

Continuando con nuestros diagramas de estructura, el $$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$ para

* una `\halign` tabla con un máximo de $$\mathrm{K}$$ celdas por *fila*, o
* a `\valign` tabla con un máximo de $$\mathrm{K}$$ celdas por *columna*

puede escribirse así:

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

donde `&` es el *carácter de tabulación de alineación* que indica el final de una celda y el inicio de la siguiente. Tradicionalmente, el carácter ampersand (`&`) [código de categoría](/latex/es/mas-temas/43-table-of-tex-category-codes.md) 4 podría usarse en su lugar.

Solo como recordatorio, el $$\langle$$⁠`preámbulo`⁠$$\rangle$$ puede escribirse $$\langle$$⁠`preámbulo`⁠$$\rangle$$=$$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$**`\cr`**, o equivalentemente

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

#### Estructura de cada celda $$\langle$$⁠plantilla⁠$$\rangle$$

Cada celda $$\langle$$⁠plantilla$${}\_i$$⁠$$\rangle$$ puede escribirse así:

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

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ es un conjunto de caracteres o comandos (tokens) que TeX insertará automáticamente *antes de que* contenido proporcionado por el usuario para la celda $$i$$;
* $$\texttt{#}$$ es un marcador de posición que muestra dónde debe aparecer el contenido proporcionado por el usuario en la celda $$i$$. De nuevo, el `#` carácter es solo una *tradición*, cualquier carácter con [código de categoría](/latex/es/mas-temas/43-table-of-tex-category-codes.md) 6 podría usarse en su lugar. Ten en cuenta que el código de categoría 6 se usa para parámetros de macros;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ es un conjunto de caracteres o comandos (tokens) que TeX insertará automáticamente *después de* contenido proporcionado por el usuario para la celda $$i$$.

Ten en cuenta que todas las $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ y $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ puedes *conjunto de parámetros*: no tienes que usar ningún carácter o comando antes o después del contenido de la celda.

**Completando el** $$\langle$$**⁠preámbulo⁠**$$\rangle$$

Por último, usando la notación anterior, el $$\langle$$⁠`preámbulo`⁠$$\rangle$$ para

* una `\halign` tabla con un máximo de $$\mathrm{K}$$ celdas por *fila*, o
* a `\valign` tabla con un máximo de $$\mathrm{K}$$ celdas por *columna*

puede escribirse así:

$$\langle$$⁠`preámbulo`⁠$$\rangle$$=$$\langle$$⁠`línea de preámbulo`⁠$$\rangle$$`**\cr**`

o

$$\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**`

**El** $$\langle$$**⁠preámbulo⁠**$$\rangle$$ **y el conteo de filas y columnas**

Un **`\halign`** tabla con una $$\langle$$⁠`preámbulo`⁠$$\rangle$$ que especifica $$\mathrm{K}$$ celdas y una $$\langle$$⁠`cuerpo`⁠$$\rangle$$ que contiene $$\mathrm{N}$$ $$\langle$$⁠`líneas de cuerpo`⁠$$\rangle$$ producirá una tabla con $$\mathrm{K}$$ *columnas* y $$\mathrm{N}$$ *filas*, como se muestra en el siguiente diagrama:

![](/files/ec6d3bd2890f00eb7f8a617c6188da9af70ea3ac)

A **`\valign`** tabla con una $$\langle$$⁠`preámbulo`⁠$$\rangle$$ que especifica $$\mathrm{K}$$ celdas y una $$\langle$$⁠`cuerpo`⁠$$\rangle$$ que contiene $$\mathrm{N}$$ $$\langle$$⁠`líneas de cuerpo`⁠$$\rangle$$ producirá una tabla con $$\mathrm{K}$$ *filas* y $$\mathrm{N}$$ *columnas*, como se muestra en el siguiente diagrama:

![](/files/c6a6763025625c4c2152960f89d0bb3135d921d3)

### ¡Basta de teoría, algunos ejemplos!

Como veremos más adelante con cierto detalle, cuando TeX procesa el contenido de una tabla —las celdas contenidas en el [$$\langle$$⁠`cuerpo`⁠$$\rangle$$](#body)—comprueba la presencia de plantillas de celdas, que fueron definidas en el $$\langle$$⁠`preámbulo`⁠$$\rangle$$porque TeX busca cualquier token de plantilla que deba insertarse antes y/o después del contenido del usuario. Los siguientes ejemplos mínimos demuestran el uso de plantillas de celdas $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ en una `\halign` y `\valign` tabla.

#### Una tabla \halign usando plantillas de celdas

El siguiente ejemplo demuestra una `\halign` tabla que usa una plantilla de celda para insertar automáticamente comillas dobles alrededor del contenido de la primera celda de cada fila: es decir, una plantilla que afecta a cada celda de la primera columna:

```latex
\documentclass{article}
\usepackage{parskip} % Establecer \parindent en 0pt
% Elige un tamaño de página convenientemente pequeño
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Separar las columnas de \halign
\begin{document}
\pagestyle{empty}

Aquí hay una tabla \verb|\halign| \textit{sin} plantillas de celdas:

\halign{
% Nada antes ni después de cada '#' en el <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Aquí está la misma tabla \verb|\halign| pero con comillas dobles añadidas automáticamente a la primera celda de cada fila; es decir, afecta a cada celda de la primera columna:

\halign{
% Plantillas de comillas en el preámbulo:
``#''&#&#\cr % Comillas dobles antes y después del primer #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/4c1a624d95250054c412497fd6b7fa43426b0de9)

El siguiente gráfico es una versión anotada de la `\halign` tabla producida por el ejemplo anterior; aquí, comparamos la estructura «formal» de una $$\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**`

de tres celdas con la real $$\langle$$⁠`preámbulo`⁠$$\rangle$$ de ` ``#''&#&#**\cr** `, destacando la presencia o ausencia de plantillas de celdas:

![](/files/1c1c4ae78c8cc457d403f9184fbece0722c802bb)

#### Una tabla \valign usando plantillas de celdas

El siguiente ejemplo demuestra una `\valign` tabla que usa una plantilla para cada celda para insertar automáticamente dígitos que rodean el contenido del usuario.

```latex
\documentclass{article}
\usepackage{parskip} % Establecer \parindent en 0pt
% Elige un tamaño de página convenientemente pequeño
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Separar las filas de \valign
\begin{document}
\pagestyle{empty}

Aquí hay una tabla \verb|\valign| \textit{sin} plantillas de celdas:

\begingroup
\hsize=25pt
\valign{
% Nada antes ni después de cada '#' en
% el <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Aquí está la misma tabla \verb|\valign| pero usando plantillas de celdas para insertar automáticamente dígitos en cada celda:

\begingroup
\hsize=25pt
\valign{
% Dígitos insertados antes y después de cada '#' en
% el <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/75035659c07ddad55b41558b8fa72a5c0ba6a11d)

El siguiente gráfico es una versión anotada de la `\valign` tabla producida por el ejemplo anterior; aquí, comparamos la estructura «formal» de una $$\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**`

de tres celdas con la real $$\langle$$⁠`preámbulo`⁠$$\rangle$$ de `1#2&3#4&5#6**\cr**`, destacando el uso de plantillas de celdas $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/2412dcc2a2554eaa8ff4165b33df4d0641d6a6f3)

Observa cómo la plantilla de la celda $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) se aplica a la $$i$$ª celda en cada `\valign` columna, lo que da como resultado que todas las celdas de la $$i$$ª *fila* se vean afectadas.

#### Dar estilo al texto usando plantillas de celdas

El siguiente ejemplo usa lo siguiente $$\langle$$⁠`preámbulo`⁠$$\rangle$$ (plantillas de celda) para dar estilo al texto contenido en cada fila o columna:

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

Si comparamos esto $$\langle$$⁠`preámbulo`⁠$$\rangle$$ a nuestra estructura "formal" de tres celdas $$\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$$=`}`

Observa cómo estas plantillas de celda, como `\textbf{#}` se parecen a macros con un único parámetro (el contenido de la celda).

```latex
Una tabla \verb|\valign| con texto estilizado mediante plantillas de celda:

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

Una tabla \verb|\halign| con texto estilizado mediante plantillas de celda:

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

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/3f15c0b072445e89420eb23c6684d9cf8e069312)

## Más detalles sobre la tabla $$\langle$$⁠cuerpo⁠$$\rangle$$

En la sección [Introducción a la tabla $$\langle$$⁠`preámbulo`⁠$$\rangle$$ y $$\langle$$⁠`cuerpo`⁠$$\rangle$$](#preamble) vimos cómo, si temporalmente ignoramos `\noalign`, la $$\langle$$⁠`cuerpo`⁠$$\rangle$$ de un `\halign` o `\valign` la tabla consiste en varias líneas, cada una designada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$, donde:

* cada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ termina con el `\cr` comando
* cada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ de un `\halign` es una fila de tabla
* cada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ de una `\valign` es una columna de tabla

La secuencia de líneas, $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$, donde $$j=1\ldots\mathrm{N}$$, produce $$\mathrm{N}$$ filas de una `\halign` o $$\mathrm{N}$$ columnas para una `\valign`. Como se resume en el siguiente diagrama, una estructura general $$\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 plantillas de celda para un máximo de $$\mathrm{K}$$ celdas en cada una de las $$\mathrm{N}$$ $$\langle$$⁠`línea de cuerpo`⁠$$\rangle$$ entradas en la $$\langle$$⁠`cuerpo`⁠$$\rangle$$:

![](/files/97bd591f7e6c92bc5fcb1ab51f9b4a7811c6ff9f)

### La estructura de cada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$

Cada línea $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ de la tabla $$\langle$$⁠cuerpo⁠$$\rangle$$ contiene contenido para hasta $$\mathrm{K}$$ celdas—según lo determine la tabla $$\langle$$⁠preámbulo⁠$$\rangle$$—y tiene la forma general:

$$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Celda$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Celda$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Celda$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Celda$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

donde:

* $$\langle$$⁠Celda$${}\_i$$⁠$$\rangle$$ representa el contenido del usuario para la $$i$$enésima celda en alguna $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$
* la **`&`** carácter se llama el *tabulador de alineación* (el mismo que se usa en la $$\langle$$⁠preámbulo⁠$$\rangle$$) que señala el final de una celda y el inicio de la siguiente. Una vez más, el uso de **`&`** es solo una tradición (convención) porque cualquier carácter con [código de categoría](/latex/es/mas-temas/43-table-of-tex-category-codes.md) 4 podría usarse en su lugar.

Aunque cada $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ puede contener un máximo $$\mathrm{K}$$ celdas (determinado por la $$\langle$$⁠preámbulo⁠$$\rangle$$) pueden contener *menos* de $$\mathrm{K}$$ celdas y cualquier $$\langle$$⁠Celda$${}\_i$$⁠$$\rangle$$ en $$\langle$$⁠línea de cuerpo⁠$${}\_j$$⁠$$\rangle$$ puede estar vacía.

El siguiente ejemplo demuestra una $$\langle$$⁠preámbulo⁠$$\rangle$$ de `#&#&#&#&#\cr` lo que proporciona un máximo de 5 celdas por $$\langle$$⁠línea del cuerpo⁠$$\rangle$$; sin embargo, las tablas maquetadas contienen líneas con menos de 5 celdas:

```latex
Una tabla \verb|\valign| con 1 a 5 celdas por \textit{columna}:

\begingroup
% \hsize controla los anchos de columna de \valign (tamaño de las líneas maquetadas).
\hsize=40pt
\fbox{\valign{
% Usa un preámbulo que permita 5 celdas por columna
% La mayoría de las columnas no proporcionan contenido para 5 celdas
#&#&#&#&#\cr% 5 celdas por columna
\(\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 razones que se explicarán más adelante
% la \halign tiene que colocarse en una \vbox
Una tabla \verb|\halign| con 1 a 5 celdas por \textit{fila}:

\fbox{
\vbox{\halign{
% Usa un preámbulo que permita 5 celdas por fila
% La mayoría de las filas no proporcionan contenido para 5 celdas
#&#&#&#&#\cr % 5 celdas por fila
\(\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
}}}
```

[Abre este ejemplo en Overleaf](/latex/es/articulos-en-profundidad/15-how-do-tex-engines-typeset-tables-2.md)

Este ejemplo produce la siguiente salida:

![](/files/6ac6bd4e00afc3791feb9ce6d6796ba6ba50d083)

El siguiente `\halign` ejemplo demuestra un número variable de celdas por fila y la capacidad de que las celdas estén vacías—observa cómo las celdas vacías se producen mediante consecutivos **`&`** caracteres en la tabla:

```latex
Una tabla \verb|\halign| con algunas celdas vacías---observa que hay caracteres \texttt{\&} consecutivos en la tabla \(\langle\texttt{body}\rangle\):

\fbox{
\vbox{\halign{
% Usa un preámbulo que permita 5 celdas por fila
% La mayoría de las filas no proporcionan contenido para 5 celdas
#&#&#&#&#\cr % 5 celdas por fila
\(\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
}}}
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/bf86d1a4e89059afa48e085687fc09a44ae5c1c6)

### No hay nada especial en & y # en la composición de tablas

El uso que hace TeX de los caracteres `&` y `#` dentro de la composición de `\halign`- o `\valign`-basadas en tablas es una tradición que se origina en las macros originales de plain TeX. Es perfectamente posible usar caracteres distintos de `&` y `#` asignando los códigos de categoría apropiados a los reemplazos que prefieras, como demuestra el siguiente ejemplo:

* reemplazar `&` con `@` asignando `@` al código de categoría 4
* reemplazar `#` con `|` asignando `|` al código de categoría 6 (que se usa para parámetros de macro)

Los cambios de categoría se mantienen locales usando `\begingroup` y `\endgroup`:

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

[Abre este ejemplo en 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)

## Reintroducción del comando \noalign

Los motores TeX proporcionan el comando integrado (primitivo) `\noalign` comando:

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

donde $$\langle$$⁠`tokens`⁠$$\rangle$$ son caracteres y/o comandos TeX/LaTeX. El `\noalign` comando se usa exclusivamente dentro de una `\halign` o `\valign` tabla: usarlo fuera de ellas generará un error.

El propósito de `\noalign` es permitir la "inserción" de texto y comandos TeX/LaTeX *entre* las filas de una `\halign` tabla o las columnas de una `\valign` tabla. El uso más común de `\noalign` es la creación de reglas de tabla (líneas):

* *horizontal* reglas entre `\halign` filas de la tabla
* *vertical* reglas entre `\valign` columnas de la tabla

Nótese lo siguiente:

* la `\noalign` comando es ***no terminado por el\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*comando***
* el conjunto de comandos permitidos dentro de `\noalign{...}` depende de si se está usando en la $$\langle$$⁠`cuerpo`⁠$$\rangle$$ de un `\halign` o `\valign` tabla (es decir, en modo vertical u horizontal).

Ahora podemos decir que la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$ de `\halign` o `\valign` puede consistir en líneas individuales $$\langle$$⁠línea de cuerpo⁠$${}\_i$$⁠$$\rangle$$`\cr` intercaladas con `\noalign` comandos; una de las muchas posibilidades/combinaciones podría ser:

`\noalign{`$$\langle$$⁠`tokens`⁠$$\rangle$$`}` $$\langle$$⁠línea de cuerpo⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠línea de cuerpo⁠$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`más tokens`⁠$$\rangle$$`}` $$\langle$$⁠línea de cuerpo⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠línea de cuerpo⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`otros tokens`⁠$$\rangle$$`}`

### Ejemplo usando \noalign

Veremos otros casos de uso más adelante en esta serie de artículos, pero aquí hay un ejemplo básico para demostrar la creación de reglas de tabla mediante `\noalign`:

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

Uso de \verb|\noalign| para colocar reglas horizontales entre las filas de una tabla \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}
}

Uso de \verb|\noalign| para colocar reglas verticales entre las columnas de una tabla \verb|\valign|:
\vspace{6pt}

\begingroup % mantener locales los cambios en \parindent y \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
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/1e95ccd437b93c65e4c6dae2f03d54ad38e8d610)

## Tabskip revisitado

Analizaremos más de cerca el `\tabskip` comando, ampliando la [introducción de una sección anterior](#tabskip).

El `\tabskip` comando establece el valor de una forma especial de "espaciado" (glue) usada *exclusivamente* en la composición de tablas: su propósito es proporcionar espacio entre las filas o columnas de la tabla:

* para `\halign` tablas: `\tabskip` el glue se inserta antes y después de la tabla (es decir, a la izquierda y a la derecha) y entre las columnas de la tabla
* para `\valign` tablas: `\tabskip` el glue se inserta antes y después de la tabla (es decir, arriba y abajo) y entre las filas de la tabla

El valor de `\tabskip` puede establecerse usando el comando LaTeX `\setlength` comando:

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

donde $$\langle$$⁠`valor de glue`⁠$$\rangle$$ puede ser:

* una longitud fija como `5pt`, `3mm`, o
* un glue flexible finito como `3pt plus 2pt minus 1pt`, o
* un glue infinitamente flexible como `0pt plus1fill`.

También puedes establecer directamente `\tabskip` (omitiendo `\setlength`) escribiendo

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

Sin embargo, cualquier cambio en el valor de `\tabskip` el glue solo afectará al espaciado de la tabla cuando ese cambio:

* se haga *antes de que* la `\halign` o `\valign` se procese el comando, o
* se haga dentro de la tabla $$\langle$$⁠`preámbulo`⁠$$\rangle$$

Los intentos de establecer `\tabskip` valores dentro del contenido de la tabla (celdas en la tabla $$\langle$$⁠`cuerpo`⁠$$\rangle$$) *no* cambiarán el espaciado de `\halign` las columnas de la tabla o `\valign` las filas de la tabla. La razón de este comportamiento de `\tabskip` puede atribuirse al papel desempeñado por el $$\langle$$⁠`preámbulo`⁠$$\rangle$$ durante la composición de tablas—procesos que exploraremos más adelante con cierto detalle.

### Ver para creer

Para ayudar a visualizar la presencia de varios tipos de espaciado/glue usados en la composición de tablas, especialmente

* `\tabskip` pegamento
* `\baselineskip` pegamento
* el kerning manual (`\kern`)

Overleaf preparó un proyecto basado en LuaTeX para colorear los componentes de una tabla. Se eligió LuaTeX porque permite un reprocesamiento de bajo nivel de los datos/estructuras internas de las tablas compuestas tipográficamente, pero no exploraremos esos detalles aquí.

Aquí hay algunos ejemplos que muestran diversas aplicaciones de `\tabskip`. Para cada ejemplo mostraremos el resultado real y la versión coloreada producida por LuaTeX.

### Ejemplo 1 de \tabskip

Examinemos el uso de `\tabskip` en una `\halign` y `\valign` tabla. Mostraremos las tablas maquetadas reales, con un borde para visualizar su tamaño y espaciado, junto con gráficos anotados que contienen versiones coloreadas que muestran claramente el tamaño de varios glue/espaciados en cada tabla.

En primer lugar, el `\halign`:

```latex
% Para visualizar la extensión de la tabla, pondremos un borde alrededor
\setlength{\fboxsep}{0pt} % Usa bordes ajustados

% Aquí establecemos \tabskip "directamente"
\tabskip5pt % Establece el valor inicial de \tabskip fuera de la tabla

% Para poner un borde alrededor de la tabla, esta debe guardarse en una caja TeX.
% Una \halign debe colocarse en una \vbox porque \halign debe estar
% procesada en un "modo vertical": una \hbox no funcionará porque
% eso se procesa en un "modo horizontal"

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

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/57ec890a76f496b577d66914027fc71d67f780a6)

El siguiente gráfico es una versión más grande, coloreada y anotada de la tabla producida por el ejemplo anterior:

![](/files/a9429552d60df96901fa8388ebf1b9eb95d642a0)

Hay 4 instancias del `\tabskip` comando, cada una corresponde a una ubicación concreta de espaciado dentro de la tabla:

1. `\tabskip5pt` se usa fuera de la tabla y establece el `\tabskip` valor aplicado antes (a la izquierda) de la primera celda en cada fila.
2. `\tabskip10pt` se establece en la primera plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio entre $$\langle$$⁠Celda$${}\_1$$⁠$$\rangle$$ y $$\langle$$⁠Celda$${}\_2$$⁠$$\rangle$$ de cada fila.
3. `\tabskip15pt` se establece en la segunda plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio entre $$\langle$$⁠Celda$${}\_2$$⁠$$\rangle$$ y $$\langle$$⁠Celda$${}\_3$$⁠$$\rangle$$ de cada fila.
4. `\tabskip20pt` se establece en la tercera y última plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio añadido después de $$\langle$$⁠Celda$${}\_3$$⁠$$\rangle$$, la celda final de cada fila.

A continuación, el `\valign`

```latex
\setlength{\fboxsep}{0pt} % Usa bordes ajustados
\tabskip5pt % Establece el valor inicial de \tabskip fuera de la tabla

% Mantén locales los cambios en \hsize (en un grupo)
\begingroup
% \hsize determina los anchos de columna de \valign
\setlength{\hsize}{50pt}
% Como \valign puede colocarse en una \vbox o \hbox, podemos usar
% \fbox directamente
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

![](/files/cadddb49d2394cb2f130c514c737ac4f4918b788)

De nuevo, el siguiente gráfico es una versión más grande, coloreada y anotada de la tabla producida por el ejemplo anterior:

![](/files/7ca0b5fee730a8321c484fc25e2e35b599364980)

Al igual que con el `\halign` ejemplo, hay 4 instancias del `\tabskip` comando. Sin embargo, con una `\valign` tabla, el `\tabskip` se inserta entre las filas de la tabla:

1. `\tabskip5pt` se usa fuera de la tabla y establece el `\tabskip` valor aplicado antes (encima) de la primera celda en cada columna.
2. `\tabskip10pt` se establece en la primera plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio entre $$\langle$$⁠Celda$${}\_1$$⁠$$\rangle$$ y $$\langle$$⁠Celda$${}\_2$$⁠$$\rangle$$ de cada columna.
3. `\tabskip15pt` se establece en la segunda plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio entre $$\langle$$⁠Celda$${}\_2$$⁠$$\rangle$$ y $$\langle$$⁠Celda$${}\_3$$⁠$$\rangle$$ de cada columna.
4. `\tabskip20pt` se establece en la tercera y última plantilla de celda de la $$\langle$$⁠`preámbulo`⁠$$\rangle$$ lo que afecta al espacio añadido después de $$\langle$$⁠Celda$${}\_3$$⁠$$\rangle$$, la celda final de cada columna.

**Resumen/conclusiones**

* En una `\halign` tabla, el `\tabskip` el glue se coloca a la izquierda y a la derecha de cada celda en una fila, separando así las columnas de la tabla.
* En un `\valign` tabla, el `\tabskip` el glue se coloca arriba y abajo de cada celda en una columna, separando así las filas de la tabla.

### \tabskip y \noalign

#### Usando una \halign

El siguiente `\halign` ejemplo usa `\tabskip` glues y también demuestra el `\noalign` comando, usándolo para colocar reglas espaciadas arriba y abajo de las filas de una `\halign` tabla. Esas reglas se componen usando el comando `\hrule` comando (primitivo) junto con el espacio creado por `\kern`:

```latex
\setlength{\tabskip}{5pt} % Establece \tabskip fuera de la tabla

\halign{
#&#&#&#&#\cr % El <preámbulo>
\noalign{\hrule\kern2pt} % Regla espaciada antes de la fila 1
1&2&3&4&5\cr % Fila 1
\noalign{\kern2pt\hrule\kern2pt} % Regla espaciada entre las filas 1/2
6&7&8&9&10\cr % Fila 2
\noalign{\kern2pt\hrule\kern2pt} % Regla espaciada entre las filas 2/3
11&12&13&14&15\cr % Fila 3
16&17&18&19&20\cr % Fila 4---sin reglas entre las filas 3/4
\noalign{\kern2pt\hrule} % Regla espaciada al final de la tabla
}
```

[Abre este ejemplo en 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 ejemplo produce la tabla que se muestra abajo, la cual ha sido anotada adicionalmente para reproducir el código (La)TeX y los números (1) a (4) para enumerar los `\noalign` comandos, que contienen reglas y kerns, junto con su correspondiente salida maquetada:

![](/files/3ebe1bc7999e145f36444899561a14950b43d220)

El siguiente gráfico muestra una versión coloreada de la tabla etiquetada para mostrar los distintos espaciados/glues en la tabla:

![](/files/73f7dc4d6001665bb3f9ed7f29cb8931e84be320)

Nótese lo siguiente:

* el uso de `\noalign` para insertar reglas entre ciertas filas y el uso manual de `\kern` valores para poner algo de espacio antes/después de las reglas. Los motores TeX no insertan `\baselineskip` glue después de una regla maquetada, por lo que el espacio se inserta manualmente usando `\kern` (podrían usarse otros comandos de espaciado);
* `\baselineskip` el glue se insertó automáticamente entre las filas 3 y 4.

#### Uso de una \valign

El siguiente `\valign` ejemplo usa los mismos datos que el 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
```

[Abre este ejemplo en 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 ejemplo produce la tabla que se muestra abajo, la cual ha sido anotada adicionalmente para reproducir el código (La)TeX y los números (1) a (4) para enumerar los `\noalign` comandos, que contienen reglas y kerns, junto con su correspondiente salida maquetada:

![](/files/1ae53a10305ab86528ebfbe9eb338bd7de19831c)

![](/files/654e09f47434ab8a5ae7742c108ec9fe046c583e)

### Una tabla \valign con líneas de texto

El siguiente ejemplo

```latex
\setlength{\tabskip}{5pt}
\begingroup % Mantén locales los cambios en \parindent y \hsize
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} puede componer muy complejas
tablas.&Aquí hay un poco de texto
texto.&Y, por último, una línea adicional
en esta columna.\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
```

[Abre este ejemplo en 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 ejemplo produce la siguiente salida:

## Establecimiento de anchos de fila y alturas de columna

## Más sobre la tabla $$\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/es/articulos-en-profundidad/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.
