是否可以以某种方式\tabskip
将重复中的第一列和最后一列的胶水设置为零\halign
?
例如。
% tabskip=0pt
\halign{&#\hfil\tabskip1em plus1em minus.5em\cr
Foo&Bar&Baz\cr
\noalign{\smallskip\hrule}
}
\bye
您可以看到,最后一列后面有一个制表符跳过。
我希望序言的第一列和最后一列的 tabskip 为零。这可能吗?
答案1
您可以通过将列数加倍来实现您的愿望。
\halign{&#\tabskip0pt&#\hfil\tabskip1em plus1em minus.5em\cr
Foo&&Bar&&Baz\cr
\noalign{\smallskip\hrule}
}
如果对齐很大,而您不想&
每次都输入,则可以将额外的内容隐藏&
在前言中,并将其放在 every 之后&
。\aftergroup
但是,它需要在 each 之后删除\cr
,因此设置了。这反过来又要求我们在第一个 之后\everycr
添加一个奇怪的额外内容。\amp
\cr
\def\amp{&}
\begingroup
\def\gobbleamp\amp{} \everycr{\gobbleamp}
\halign{&#\tabskip0pt\aftergroup\amp&#\hfil\tabskip1em plus1em minus.5em\cr\amp
Foo&Bar&Baz\cr
\noalign{\smallskip\hrule}
}
\endgroup
哈!我找到了一些“更邪恶”的方法,并提供了更好的输入。
\def\amp{&}
\halign{&#\tabskip0pt&\amp#\hfil\tabskip1emplus1emminus.5em\cr
Foo&Bar&Baz\cr
\noalign{\smallskip\hrule}
}
在用户实际输入的每个内容后都\amp
添加一个。&
&
#
TeX 将单元格前导码中位于“u 部分”之前的部分称为,将位于#
“v 部分”之后的部分称为 。这里,\amp
对于偶数单元格, 位于前导码的 u 部分。当这样的单元格开始时,TeX 会扩展标记以检查 是否存在\omit
。一旦它发现(在我们的例子中)没有\omit
,TeX 就会插入 u 部分,因此是\amp
。然后它继续排版。\amp
扩展为&
,从而结束单元格。此时,插入 v 部分( )。然后 TeX 开始插入前导码\hfil
后的下一个奇数单元格。&
之前,我尝试将\amp
前导码的 v 部分放入奇数单元格中,这其实是等效的:尝试&
在每个用户提供的内容之前插入&
,而不是之后。我不完全理解为什么它不起作用。
答案2
我想不是。来自TeX 按主题分类
\tabskip
对齐之外的 值将用于第一列之前,以及所有后续列之后,除非前导码包含对 的赋值\tabskip
。对 的任何赋值都\tabskip
在 TeX 扫描前导码时执行;到达制表符时的值将用于每一行的该位置,以及所有后续列之后,除非发生进一步赋值。到达\tabskip
时的值\cr
将用于最后一列之后。
答案3
仅供记录,另一种解决方案是使用框架和多跨柱。
我们需要以下序言:
% \tabskip = 0 pt
\vrule #\strut \tabskip = 0 pt plus 1 fil
& \hfil #\hfil
& #\vrule \tabskip = 0 pt \cr
得到无限前导码(之后的第二部分& &
):
% \tabskip = 0 pt
\vrule #\strut \tabskip = 0 pt plus 1 fil
& \hfil #\hfil
& #\vrule \tabskip = 0 pt
& & #\tabskip = 0 pt plus 1 fil % same as first element without \strut and \vrule
& \hfil #\hfil
& #\vrule \tabskip = 0 pt \cr % ends with a \vrule and a 0 pt \tabskip
减少前言后,我们得到:
\tabskip = 0 pt
\everycr = {} % code executed after each \cr
\halign to \hsize { % preamble (here we are in vertical mode)
\vrule #\strut \tabskip = 0 pt plus 1 fil
& & \hfil #\hfil
& #\vrule \tabskip = 0 pt % the table always ends with this column
& #\tabskip = 0 pt plus 1 fil \cr % same as first element without \strut and \vrule
% body (here we are in vertical mode)
\noalign { \hrule } % here we are in vertical mode
& \multispan 7\hidewidth Just a table\hidewidth &\cr % 9 columns − first − last = 7 multispan
\noalign { \hrule } % No space after the argument of multispan!
& 2& & & 5& & & 8& \cr
\noalign { \hrule }
& \multispan 4\hidewidth multispan = 4\hidewidth & & & 8& \cr
\noalign { \hrule } }
我使用\hidewidth …\hidewidth
而不是\hfil …\hfil
来居中,因为居中的文本(“只是一个表格”,“multispan = 4”)是“宽”(比 TeX 预期的要宽,所以表格会很乱!)
注意:我通常不使用框架表。(而且我通常根本不使用表格!:))