\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
他讓我們開始了一個段落。