从几乎不了解低级 TeX 排版原语的 LaTeX 用户的角度来看,这是一个好奇心驱动的问题。
LaTeXtabular
环境是如何实现的?具体来说:
- 列的宽度是如何计算的?
- 是否将每个单元格的内容存储起来,然后再进行排版?
- 哪些是底层的 TeX 机制?
\\
和的作用是什么?&
以及在 内部这些控制序列的含义是如何改变的tabular
?
答案1
LaTeXtabular
基于\halign
TeX 原语。其特点\halign
无法用简短的回答完全描述出来,所以请原谅我简化了。
\halign
语法如下(粗略地说):
\halign{<columns declaration>\cr
item & item & item \cr
item & item & item \cr}
可以<columns declaration>
使用 TeX 基元(如 等)来完成\hfil
,\kern
而 LaTeX 宏将用户声明(如“lrc”)转换为更复杂但更通用的 ,<columns declaration>
以便 理解\halign
。此外,LaTeX 表示\let\\=\cr
内部环境,因此 LaTeX 用户通常对中用作行分隔符的基元tabular
一无所知。他/她改用\cr
\halign
\\
\cr
。
该\halign
基元分为两个步骤。首先,它将所有内容保存items
到单独的框中。然后计算每列中此类框的最大自然宽度(例如 w1、w2、...、wn)。在第二步中,\halign
将行置于垂直模式(一行在第二行上方),每行都包含框,其中的项目被重新装箱为计算出的宽度 w1、w2、w3 等。\halign
第二步生成的每一行如下所示:
\hbox{\hbox to w1{<left declaration1> item1 <right declaration1>}%
\hbox to w2{<left declaration2> item2 <right declaration2>}%
...%
\hbox to wn{<left declaration-n> item-n <right declaration-n>}}
因为每行使用相同的维度 w1、w2、...、wn(在第一步中预先计算),所以列是对齐的。
所以,您说得对:表项的内容被存储并重复使用,但这是在\halign
原始算法的内部完成的。宏程序员不需要手动保存框(例如使用\setbox
)。