如何使用 \valign?

如何使用 \valign?

我刚刚碰到一个有趣的命令,叫做\valign。它似乎是 的姐妹\halign,但 TeXbook 似乎不太愿意解释它的用法。TeX by Topic 也是如此。他们只提到,与 相比,它在使用时会交换行和列的含义。\halign但给出以下示例:

\valign{&#\cr
How  & is\cr
this & supposed\cr
to   & work?\cr
}
\bye

生成的框已满;第二列仅在右边距后开始!

所以我的问题是:它应该如何使用;如何更改第二列(或第三列)的开始位置,以使其不超出页面?另外,如果您在某处有一些使用示例,那就太好了!

答案1

简短的回答是,每个条目都是在内部垂直模式下排版的,这意味着当您向其提供水平模式材料时(正如您所做的那样),您会将该材料排版为段落,从而产生宽度为 的框\hsize。因此,您注意到了过度填充。以下是示例的略微改进版本:

\valign{&\vfil\vbox{\parindent=0pt\hsize=20mm #}\vfil\cr
How  & is is is is is is is is is is is is is\cr
this & supposed\cr
to to to to to to to to to to to to to to to to  & work?\cr
}
\bye

至于实际生活中有用的例子,我还没有(除了\valign{\vfil#\vfil\cr…}TeX 书中提到的单行示例)。也许其他人会有。

答案2

这是 Herbert 示例的修改,它将每个条目放置在\hbox自然宽度中,然后\hfil通过重新定义将其插入到所有列之间\cr

\def\cr{\crcr\noalign{\hfil}}
\valign{&\hbox{\strut#}\crcr
badness  & box& boxmaxdepth& cleaders& dp& everyhbox\cr
everyvbox& hbadness& hbox& hfuzz& hrule& ht& lastbox\cr
leaders& overfullrule& prevdepth& setbox& unhbox& unhcopy& unvbox\cr
unvcopy& vbadness& vbox& vfuzz& vrule& vsplit& vtop\cr
wd& xleaders\cr}
\unskip
\bye

\crcr请注意结束对齐前言的结尾和\unskip随后的。可以\unskip删除并将结尾\cr改为\crcr

可以使用相同的技巧在列之间粘贴固定数量的空间(请注意,\tabskip此处的粘连位于行之间),或者可以使用不太知名的\hbox spread构造。这会在列之间插入额外的 em 空间。

\valign{&\hbox spread1em{\strut#\hfil}\cr
badness  & box& boxmaxdepth& cleaders& dp& everyhbox\cr
everyvbox& hbadness& hbox& hfuzz& hrule& ht& lastbox\cr
leaders& overfullrule& prevdepth& setbox& unhbox& unhcopy& unvbox\cr
unvcopy& vbadness& vbox& vfuzz& vrule& vsplit& vtop\cr
wd& xleaders\cr}
\bye

值得指出的是,通过以 开始对齐&,会导致整个前导码重复。

答案3

David Bausum 书中的一个例子

\valign{&\hbox to 1in{\vrule height9pt depth3pt width0pt#\hfil}\vfil\cr
badness  & box& boxmaxdepth& cleaders& dp& everyhbox\cr
everyvbox& hbadness& hbox& hfuzz& hrule& ht& lastbox\cr
leaders& overfullrule& prevdepth& setbox& unhbox& unhcopy& unvbox\cr
unvcopy& vbadness& vbox& vfuzz& vrule& vsplit& vtop\cr
wd& xleaders\cr}
\bye

相关内容