为什么没有任何命令可以用 \vbox 开始一个段落?

为什么没有任何命令可以用 \vbox 开始一个段落?

\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这样做了。

相关内容