下图显示了用文字处理器准备的文档的一部分。灰线标记表格边框,仅在编辑模式下可见(打印文档时它们不可见,但已保留作为文本布局的提示)。我的问题是如何使用 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
。中的列声明仅给出一次,因为当在数据区域中写入更多列时,\halign
TeX 能够返回到标记。&
此外,我想表明,即使使用纯 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