对准没有生长

对准没有生长

我想将 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

在此处输入图片描述

相关内容