¿Por qué el centro no centra \halign?

¿Por qué el centro no centra \halign?

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 \haligncentrada en la página. Sin embargo, no lo es, como muestra la siguiente imagen.

ingrese la descripción de la imagen aquí

\centeringtampoco 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 \halignes 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

ingrese la descripción de la imagen aquí

La redefinición temporal de \partiene como objetivo demostrar que \parse 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, \halignse imprimirá al mismo nivel que el margen izquierdo, ya que \tabskipnormalmente es cero. El \tabskippegamento vigente en el momento \halignde 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 \tabskipse 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 \halignparte de un párrafo? Ocultándolo dentro de algo que pueda y que también pueda contenerlo: \vboxgeneralmente 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 \vboxno 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 \haligncuadros horizontales que se crean en la lista vertical circundante son insensibles \leftskipy \rightskipobedecidos 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, \hrulese extiende por todo el \hsizeancho.

alinear

Podemos ponerlo \halignen un \vbox.

\bigskip

\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}

alinear en una caja

información relacionada