在重复的 \halign 序言中设置 \tabskip

在重复的 \halign 序言中设置 \tabskip

是否可以以某种方式\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 预期的要宽,所以表格会很乱!)

注意:我通常不使用框架表。(而且我通常根本不使用表格!:))

相关内容