![为什么没有任何命令可以用 \vbox 开始一个段落?](https://linux22.com/image/405438/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B2%A1%E6%9C%89%E4%BB%BB%E4%BD%95%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E7%94%A8%20%5Cvbox%20%E5%BC%80%E5%A7%8B%E4%B8%80%E4%B8%AA%E6%AE%B5%E8%90%BD%EF%BC%9F.png)
\vbox
不切换模式和\hbox
不切换模式,如以下两组例子所示。
以下两个示例产生相同的输出:
\hbox{A}
\end
\noindent A
\end
以下两个示例也产生相同的输出:
\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end
此外,空内容会将模式从垂直切换为水平,如\unhbox\voidb@x
。可以通过 获得相同的空内容\unvbox\voidb@x
。但使用 不会将模式从垂直切换为水平(参见以下两个示例)。为什么?
\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end
(第一个例子中添加了缩进,而第二个例子中没有添加。)
\vbox
可以在段落内,例如\hbox
。可以使用什么控制序列\vbox
在段落中间以及段落开头创建 ?
答案1
启动水平模式的命令是\vbox
。\leavevmode
为什么还需要其他命令呢?
恐怕你的假设是错误的:触发模式改变的不是“空内容”。而是恰恰 \unhbox
确实如此。
\box
与和不同\copy
,\unhbox
是水平命令,因此如果 TeX 处于垂直模式,它会触发水平模式。该宏\leavevmode
使用\voidb@x
,因此不会将任何内容附加到水平列表中(可能在启动它之后)。
模拟命令\unvbox
是垂直命令,结束一个段落。
\catcode`@=11
\def\leavehmode{\unvbox\voidb@x}
\catcode`@=12
\everypar{PAR}% to show a paragraph has started
abc\leavehmode def
\bye
答案2
我不知道这是否清楚,但让我们明确地说明一下(来自 TeXbook):
|\leavevmode| is an abbreviation for `|\unhbox\voidbox|',
where |\voidbox| is a permanently empty box register.
那么它\unhbox\voidbox
到底起什么作用呢?让我们来看看tex.web
:
@ @<Cases of |main_control| that build...@>=
vmode+start_par: new_graf(cur_chr>0);
vmode+letter,vmode+other_char,vmode+char_num,vmode+char_given,
vmode+math_shift,vmode+un_hbox,vmode+vrule,
vmode+accent,vmode+discretionary,vmode+hskip,vmode+valign,
vmode+ex_space,vmode+no_boundary:@t@>@;@/
begin back_input; new_graf(true);
end;
正如您所见,任何模式和其他内容的组合都可以开始一个段落,但vmode+un_vbox
不在其中。
就我个人而言,我发现有趣的是 Knuth 没有让它vmode+<*>vbox
开始一个段落但却vmode+valign
这样做了。