我刚刚碰到一个有趣的命令,叫做\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