使用以下程式碼:
\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
形成的每個框的左側以及任何兩個對齊單元之間,除非另有指定。請閱讀 TeXbook 中的第 22 章以獲取更多信息,但這並不容易。\halign
\tabskip
如何構成\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}
}}