我想将 halign 的宽度设置为 400pt:
\tracingonline=1
\def\tablerule{\noalign{\hrule}}
\newcount\posno\posno=1
\def\pos{\number\posno\global\advance\posno by 1}
\tabskip=3pt
\halign to 400pt{#\hfil&#\hfil&#\hfil&#\hss\cr
\tablerule
{\bf Pos.} & {\bf Anz.} & {\bf Beschreibung} & {\bf Seriennummer}\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
}
\bye
但是,尽管我使用了多个 \hfil 命令,halign 的内容仍未增长到 400pt。TeX 会警告 \hbox 未满。
TeXbook 说道:
因此,如果制表符粘连没有可伸缩性,则 '\halign to \hsize' 将不执行任何操作,只会导致 TeX 报告框未满或已满。
我觉得这里确实发生了这种情况。但我不明白为什么,因为我的模板线是可拉伸的。
答案1
在 中\halign
,对于给定的列,TeX 测量列中每个单元格的自然宽度,并以隐式方式排版单元格内容\hbox to m
内容米是该列中所有单元格的最大自然宽度。这是\hfil
和\hss
对齐序言中的在列内. 对每一列重复此过程。
因此,这些跳过部分永远不会扩展到文本主体的整个宽度。它们的可拉伸性或可收缩性仅用于填充宽度为列宽的框。d你给出的尺寸\halign to d
是在完全不同的背景下考虑的:一旦每个单元格的装箱已经完成(如前所述),每一行\halign
设置为填充宽度d。但是,已经装箱的列内容中的跳跃对此无济于事:一旦胶水被设置在盒子内部,盒子内部的跳跃就不会再伸展或收缩。因此,为了帮助\halign
填充d您需要在其他地方提供可拉伸胶水。这是\tabskip
可以提供帮助的地方。如果您允许\tabskip
拉伸,线条将具有您要求的尺寸:
\def\tablerule{\noalign{\hrule}}
\newcount\posno\posno=1
\def\pos{\number\posno\global\advance\posno by 1 } % <--- space added after 1
\tabskip=3pt plus 1fil
\halign to 400pt{#\hfil&#\hfil&#\hfil&#\hfil\cr
\tablerule
{\bf Pos.} & {\bf Anz.} & {\bf Beschreibung} & {\bf Seriennummer}\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
}
\bye
请注意,诸如{
和}
之类的位置{\bf Pos.} & {\bf Anz.} &
不是必需的,因为对齐中的每个单元格内容都隐式地设置在组内。我后面添加的空格标记\advance\posno by 1
很重要,以防后面有更多数字\pos
。它确保 〈number〉 对于 TeX 来说是终止的。
如果要删除第一列之前和最后一列之后的空格,可以修改对齐前言\tabskip
之前\halign
和内部。为了了解如何确定每个列间空间(或第一列之前或最后一列之后的空间),请考虑 TeXbook 第 238 页中的以下引文:
刚刚给出的家禽示例
\tabskip
在任何地方都使用了相同的胶水,但您可以通过\tabskip
在序言中重新设置来改变它。 TeX 读取以下\tabskip
内容时生效的胶水将在第一列之前使用;TeX 读取第一个模板后生效的胶水将在第一列和第二列之间使用;依此类推。TeX 读取最后一个模板后生效的胶水将在最后一列之后使用。{
\halign
\tabskip
&
\tabskip
\cr
因此,为了抑制第一列之前和最后一列之后的空间,同时保持列之间的空间无限可拉伸,可以这样做:
\def\tablerule{\noalign{\hrule}}
\newcount\posno\posno=1
\def\pos{\number\posno\global\advance\posno by 1 } % <--- space added after 1
\hsize=450pt % whatever
\hrule width 400pt % for comparison with the table
\vskip 5pt
\noindent\rlap{\vdots}\hskip 400pt\llap{\vdots}\par
\vskip 5pt
\begingroup
\tabskip=0pt\relax % \relax not necessary here, because \halign follows
\halign to 400pt{#\hfil \tabskip=3pt plus 1fil&
#\hfil&
#\hfil&
#\hfil \tabskip=0pt\cr
\tablerule
\bf Pos. & \bf Anz. & \bf Beschreibung & \bf Seriennummer\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr\tablerule
}
\endgroup % restore \tabskip value in force before the \begingroup
\bye
注意:出于排版原因,您可能希望使用较少的规则,并使用 在行之间添加垂直字距或跳跃\noalign
。以下是基于 LaTeX 包中的值的建议booktabs
:
\newskip\abovetopsep
\newskip\aboverulesep
\newskip\belowrulesep
\newskip\belowbottomsep
\newdimen\heavyrulewidth
\newdimen\lightrulewidth
\abovetopsep=0.0pt
\aboverulesep=1.72218pt
\belowrulesep=2.79857pt
\belowbottomsep=0.0pt
\heavyrulewidth=0.80002pt % that's what booktabs.sty does...
\lightrulewidth=0.50003pt % ditto
\def\tabletoprule{%
\noalign{\vskip\abovetopsep
\hrule height \heavyrulewidth
\vskip\belowrulesep}%
}
\def\tablemidrule{%
\noalign{\vskip\aboverulesep
\hrule height \lightrulewidth
\vskip\belowrulesep}%
}
\def\tablebottomrule{%
\noalign{\vskip\aboverulesep
\hrule height \heavyrulewidth
\vskip\belowbottomsep}%
}
\newcount\posno
\posno=1
\def\pos{\number\posno\global\advance\posno by 1 } % <--- space added after 1
\hsize=450pt % whatever
\begingroup
\tabskip=0pt\relax % \relax not necessary here, because \halign follows
\halign to 400pt{\strut
#\hfil \tabskip=3pt plus 1fil&
#\hfil&
#\hfil&
#\hfil \tabskip=0pt\cr
\tabletoprule
\bf Pos. & \bf Anz. & \bf Beschreibung & \bf Seriennummer\cr
\tablemidrule
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr
\pos & 1 St. & Abcdefg & 123/12/12-1234567\cr
\tablebottomrule
}
\endgroup % restore \tabskip value in force before the \begingroup
\bye