\vbox
\hbox
次の 2 つの例のグループで示されているように、モードは切り替わりません。
次の 2 つの例では、同じ出力が生成されます。
\hbox{A}
\end
\noindent A
\end
次の 2 つの例でも同じ出力が生成されます。
\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end
また、空のコンテンツは、 のように、モードを垂直から水平に切り替えます\unhbox\voidb@x
。 同じ空のコンテンツは を介して取得できます\unvbox\voidb@x
。 ただし、これを使用しても、モードは垂直から水平に切り替わりません (次の 2 つの例を参照)。 なぜでしょうか。
\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end
(ここでは最初の例ではインデントが追加され、2 番目の例では追加されません。)
\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
その中には含まれていません。
個人的には、クヌースが let ではvmode+<*>vbox
なく let で段落を始めているのが興味深いと思いますvmode+valign
。