类似表格的环境是如何实现的?

类似表格的环境是如何实现的?

从几乎不了解低级 TeX 排版原语的 LaTeX 用户的角度来看,这是一个好奇心驱动的问题。

LaTeXtabular环境是如何实现的?具体来说:

  • 列的宽度是如何计算的?
  • 是否将每个单元格的内容存储起来,然后再进行排版?
  • 哪些是底层的 TeX 机制?
  • \\和的作用是什么?&以及在 内部这些控制序列的含义是如何改变的 tabular

答案1

LaTeXtabular基于\halignTeX 原语。其特点\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)。

相关内容