\vbox で段落を開始するコマンドがないのはなぜですか?

\vbox で段落を開始するコマンドがないのはなぜですか?

\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

関連情報