Com o seguinte 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}
Eu esperaria obter a tabela simples produzida \halign
centralizada na página. Porém, não é, como mostra a imagem abaixo.
\centering
também não tem efeito. Por que isso acontece?
Responder1
Alguém pode ficar tentado a usar comandos de baixo nível também em LaTeX; no entanto, existem algumas sutilezas neles que não são fáceis de entender no início.
Uma dessas sutilezas é que \halign
é umcomando vertical, então, quando encontrado, ele inicia o modo vertical; se o TeX estiver no modo horizontal quando fizer a varredura \halign
, ele será encerrado emitindo \par
.
Isto é comprovado pelo seguinte arquivo de teste (Plain TeX):
a\def\par{PAR\endgraf\let\par\endgraf}bc\halign{#\cr HALIGN\cr}def
\bye
que produz
A redefinição temporária de \par
visa mostrar que \par
é efetivamente executado.
Quando o TeX está no modo vertical, ele simplesmente empilha caixas sem formar parágrafos; portanto \centering
(que está em vigor em center
) não faz nada, porque apenas influencia os parágrafos. Assim o seu \halign
será impresso alinhado com a margem esquerda, já que \tabskip
normalmente é zero. A \tabskip
cola em vigor no momento \halign
da digitalização é adicionada à esquerda de cada caixa formada por \halign
(uma caixa para cada linha de alinhamento) e entre quaisquer duas células de alinhamento, a menos que outra \tabskip
seja especificada. Leia o capítulo 22 do TeXbook para obter mais informações, mas não é fácil.
Como alguém pode fazer \halign
parte de um parágrafo? Escondendo-o dentro de algo que pode e que também pode contê-lo: a \vbox
é geralmente empregado (o dispositivo mais comum para centralizar tabelas no Plain TeX é usar $$\vbox{\halign{...}}$$
; não tente fazer isso no LaTeX). Embora \vbox
não inicie um parágrafo por si só, também não o interrompe, então
\begin{center}
\leavevmode\vbox{\halign{...}}
\end{center}
centralizará seu alinhamento.
Usar tabular
; você estará do lado seguro.
Responder2
As \halign
caixas horizontais de construção que são colocadas na lista vertical circundante são insensíveis \leftskip
e \rightskip
obedecidas pelo construtor de parágrafos.
Você pode tentar centralizar usando isto:
\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}
No entanto, o \hrule
estende-se por toda a \hsize
largura.
Podemos colocar \halign
em um \vbox
.
\bigskip
\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}