使用以下代码:
\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}
我期望生成一个位于\halign
页面中央的简单表格。然而,事实并非如此,如下图所示。
\centering
也没有效果。为什么会这样?
答案1
人们可能也想在 LaTeX 中使用低级命令;但是其中的一些细微差别一开始并不容易掌握。
其中一个微妙之处\halign
是垂直命令,因此当找到时,它会启动垂直模式;如果 TeX 在扫描时处于水平模式\halign
,它会通过发出来退出\par
。
以下测试文件(Plain TeX)证明了这一点:
a\def\par{PAR\endgraf\let\par\endgraf}bc\halign{#\cr HALIGN\cr}def
\bye
输出
暂时重新定义\par
是为了表明\par
已有效执行。
当 TeX 处于垂直模式时,它只是堆叠框而不创建段落;因此\centering
(在 中有效center
)不执行任何操作,因为它只影响段落。因此,您的\halign
将与左边距齐平打印,因为\tabskip
通常为零。扫描\tabskip
时有效的胶水\halign
添加到由(每个对齐行一个框)形成的每个框的左侧\halign
以及任何两个对齐单元之间,除非另有\tabskip
指定。阅读 TeXbook 中的第 22 章了解更多信息,但这并不容易。
如何才能使其成为\halign
段落的一部分?通过将其隐藏在可以包含它的内容中:\vbox
通常使用 a(在 Plain TeX 中居中表格的最常见设备是使用$$\vbox{\halign{...}}$$
;不要在 LaTeX 中尝试它)。虽然它\vbox
本身不会开始一个段落,但它也不会中断它,因此
\begin{center}
\leavevmode\vbox{\halign{...}}
\end{center}
将使对齐居中。
使用tabular
;你会很安全的。
答案2
构建\halign
水平框,并将其放置在周围的垂直列表中,这些框对段落构建器不敏感\leftskip
并\rightskip
遵循段落构建器的规定。
您可以尝试使用以下方法居中:
\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}
然而,\hrule
延伸了整个\hsize
宽度。
我们可以把 放在\halign
中\vbox
。
\bigskip
\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}