為什麼沒有任何命令以 \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

使用 a 啟動水平模式的指令\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不在其中。

就我個人而言,我覺得有趣的是高德納沒有讓我們vmode+<*>vbox開始一個段落,但vmode+valign他讓我們開始了一個段落。

相關內容