简短速成课程\halign

简短速成课程\halign

下图显示了用文字处理器准备的文档的一部分。灰线标记表格边框,仅在编辑模式下可见(打印文档时它们不可见,但已保留作为文本布局的提示)。我的问题是如何使用 TeX(最好是纯 TeX)准备类似的布局(两列文本)。

在此处输入图片描述

答案1

如果你想让它居中,

$$
\vbox{\tabskip=0pt
\halign{\tabskip=4cm #\hfil&#\hfil\tabskip=0pt \cr
Date:\cr
Gr.& Declarant\cr}}
$$

看看如果没有$$居中会发生什么:

$$
\vbox{\tabskip=0pt
\halign{\tabskip=4cm #\hfil&#\hfil\tabskip=0pt \cr
Date:\cr
Gr.& Declarant\cr}}
$$

\bigskip

\noindent X\vbox{\tabskip=0pt
\halign{\tabskip=4cm #\hfil&#\hfil\tabskip=0pt \cr
Date:\cr
Gr.& Declarant\cr}}X

\bye

在此处输入图片描述

如果您希望列占据线宽的一半,请按以下步骤操作:

$$
\vbox{\tabskip=0pt
\halign{\hbox to .5\hsize{#\hfil}&\hbox to .5\hsize{#\hfil}\cr
Date:\cr
Gr.& Declarant\cr}}
$$

如果省略$$,则\noindent在前面添加\vbox;但这不会在表格上方和下方留出空间。

如果你想要换行,\hbox to .5\hsize{#\hfil}改为

\vbox{\hsize=.5\hsize\strut#\strut}

用于底部对齐或\vtop用于顶部对齐。当然,这不会在两个盒子之间留下空间。这可以通过减少\hsize两个盒子的内部并\tabskip在它们之间添加一些胶水来实现。

有关 Plain TeX 中表格的更多信息,请参阅 TeX by Topic(texdoc texbytopic在 TeX Live 上)或此链接

答案2

简短速成课程\halign

使用的命令及其含义

类别代码 4 个字符(默认值:' &')
    列分隔符
    而且,如果在序言中使用,中继器标记
类别代码 6 个字符(默认值:' #')
    标记序言中输入的位置
\strut
    高度为 8.5pt、深度为 3.5pt、宽度为 0pt 的盒子
\tabskip
    在柱子之间添加胶水
\hfil
    具有“一阶无穷”拉伸的胶水(\hskip 0pt plus 1fil
\cr
    标记行尾(“回车”的缩写)
\crcr
\cr与上面相同,但如果之前    有一个,它什么也不做

水平对齐方式如下

\halign{#\hfil\strut\tabskip=2em && #\hfil\crcr
  Some& short& text\cr
  going& on& for\cr
  some& rows\cr
}

其‘扩展’如下(简化):

\hbox to<widest_cell_in_column>{Some\hfil\strut}\hskip 2em
\hbox to<widest_cell_in_column>{short\hfil\strut}\hskip 2em
% ...

但是,如果要在单元格内包含更长的文本,您可以将单元格内容放在\vtop(或\vbox,或\vcenter,取决于您希望它们如何对齐[请注意,\vcenter需要处于数学模式])中:

\halign{& \vtop{\hsize=.3\hsize\noindent\strut #\strut}\tabskip=2em \crcr
  Now for some quite much longer text inside the table cell.&
  Aand, another table cell to show how these vboxes are inside the horizontal
  alignment command's preamble.\cr
}

其‘扩展’如下:

\hbox to.3\hsize{\vtop{\hsize=.3\hsize\noindent\strut ...\strut}}\hskip 2em
\hbox to.3\hsize{\vtop{\hsize=.3\hsize\noindent\strut ...\strut}}\hskip 2em

谎言!

实际上我撒了谎;给出了如下的对齐:

\halign to.5\hsize{& \strut#\hfil\tabskip=2em plus\hsize \crcr
  Some& short& text\cr
  going& on& for\cr
  some& rows\cr
}

它的‘扩展’更像是:

\hbox to.5\hsize{\hbox to<widest_cell_in_column>{\strut Some\hfil}\hskip 2em plus\hsize
                 \hbox to<widest_cell_in_column>{\strut short\hfil}\hskip 2em plus\hsize
                 \hbox to<widest_cell_in_column>{\strut text\hfil}\hskip 2em plus\hsize
                }
\hbox to.5\hsize{\hbox to<widest_cell_in_column>{\strut going\hfil}\hskip 2em plus\hsize
                 \hbox to<widest_cell_in_column>{\strut on\hfil}\hskip 2em plus\hsize
                % ...
                }
% ...

结论

所以,如你所见,到处都是盒子。除了盒子和胶水什么也没有。

答案3

这是一个用纯 TeX 编写的简单表格:

\halign{\hfil # & # \hfil \cr
{\it Aa} & {\it Bb} \cr
bb & cc \cr
ff & ggg \cr}

\bye

在此处输入图片描述

了解更多详细信息。

答案4

我怀疑(从问题中的图片来看)\vtop长数据会出现这种行为。所以我的解决方案添加了此功能。请注意,\unskip之所以\strut使用第二个,是因为用户可以在&或之前写入空格\cr。中的列声明仅给出一次,因为当在数据区域中写入更多列时,\halignTeX 能够返回到标记。&

此外,我想表明,即使使用纯 TeX,宏代码也不必与数据混合。宏\Table {2c,.5w}定义后,将在文档中使用。您可以Table {3c,.33w}用类似的方式定义。

\def\Table #1{\csname Table:#1\endcsname}
\def\sdef#1{\expandafter\def\csname#1\endcsname}

\sdef{Table:2c,.5w}{\par
   \halign\bgroup &\vtop{\hsize=.5\hsize\settingpar\strut##\unskip\strut}\cr
}
\def\settingpar{\raggedright \leftskip=.5em \advance\rightskip by.5em
                \parindent=0pt \emergencystretch=2em }
\def\eTable{\crcr\egroup}

\Table {2c,.5w}
ahu ssgh dh da duia dxue ei eyerr dcew eyr ruiebr cui ueir & uha \cr
gsum bym & ryu duewb \cr
\eTable

\bye

这里不使用的主要特性,\halign因为表格中所有项目的宽度都是恒定的。因此,还有另一种不使用 的解决方案\halign

\def\settingpar{\raggedright \leftskip=.5em \advance\rightskip by.5em
                \parindent=0pt \emergencystretch=2em }
\def\twocline #1|#2|{\par\line{%
   \vtop{\hsize=.5\hsize\settingpar\strut\ignorespaces#1\unskip\strut}\hss
   \vtop{\hsize=.5\hsize\settingpar\strut\ignorespaces#2\unskip\strut}}
}

\twocline ahu ssgh dh da duia dxue ei eyerr dcew eyr ruiebr cui ueir | uha |
\twocline gsum bym | ryu duewb |

\bye

相关内容