为什么 center 不居中 \halign?

为什么 center 不居中 \halign?

使用以下代码:

\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}
}}

装在盒子里

相关内容