Con el siguiente código:
\documentclass[a4paper]{report}
\begin{document}
\begin{center}
\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\end{center}
\end{document}
Esperaría obtener la tabla simple producida \halign
centrada en la página. Sin embargo, no lo es, como muestra la siguiente imagen.
\centering
tampoco tiene ningún efecto. ¿Por qué sucede eso?
Respuesta1
Uno podría verse tentado a utilizar comandos de bajo nivel también en LaTeX; sin embargo, hay en ellos algunas sutilezas que no son fáciles de captar al principio.
Una de estas sutilezas es que \halign
es uncomando vertical, por lo que cuando se encuentra hace que se inicie el modo vertical; si TeX está en modo horizontal cuando escanea \halign
, lo abandona emitiendo \par
.
Esto se demuestra con el siguiente archivo de prueba (Plain TeX):
a\def\par{PAR\endgraf\let\par\endgraf}bc\halign{#\cr HALIGN\cr}def
\bye
que produce
La redefinición temporal de \par
tiene como objetivo demostrar que \par
se ejecuta efectivamente.
Cuando TeX está en modo vertical, simplemente apila cajas sin formar párrafos; por lo tanto \centering
(que está vigente en center
) no hace nada, porque solo influye en los párrafos. Por lo tanto, \halign
se imprimirá al mismo nivel que el margen izquierdo, ya que \tabskip
normalmente es cero. El \tabskip
pegamento vigente en el momento \halign
de escanear se agrega a la izquierda de cada cuadro formado por \halign
(un cuadro por cada fila de alineación) y entre dos celdas de alineación cualesquiera a menos que \tabskip
se especifique otra. Lea el capítulo 22 del TeXbook para obtener más información, pero no es fácil.
¿Cómo se puede formar \halign
parte de un párrafo? Ocultándolo dentro de algo que pueda y que también pueda contenerlo: \vbox
generalmente se emplea a (el dispositivo más común para centrar tablas en Plain TeX es usar $$\vbox{\halign{...}}$$
; no lo intente en LaTeX). Si bien \vbox
no inicia un párrafo por sí solo, tampoco lo interrumpe, por lo que
\begin{center}
\leavevmode\vbox{\halign{...}}
\end{center}
centrará su alineación.
Usar tabular
; estarás en el lado seguro.
Respuesta2
Los \halign
cuadros horizontales que se crean en la lista vertical circundante son insensibles \leftskip
y \rightskip
obedecidos por el generador de párrafos.
Puedes intentar centrar usando esto:
\documentclass{article}
\begin{document}
\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\tabskip 0pt plus 1000pt minus 1000pt
\halign to \hsize{\tabskip0pt\vrule \hfil # \hfil & \hfil # \hfil \vrule
\tabskip 0pt plus 1000pt minus 1000pt \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\end{document}
Sin embargo, \hrule
se extiende por todo el \hsize
ancho.
Podemos ponerlo \halign
en un \vbox
.
\bigskip
\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}