\vbox
wechselt nicht die Modi und \hbox
wechselt nicht die Modi, wie die folgenden beiden Beispielgruppen zeigen.
Die folgenden beiden Beispiele erzeugen identische Ausgaben:
\hbox{A}
\end
\noindent A
\end
Auch die folgenden beiden Beispiele erzeugen die gleiche Ausgabe:
\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end
Außerdem wechselt leerer Inhalt den Modus von vertikal zu horizontal, wie in \unhbox\voidb@x
. Derselbe leere Inhalt kann über erhalten werden \unvbox\voidb@x
. Aber die Verwendung von hier wechselt den Modus nicht von vertikal zu horizontal (siehe die folgenden zwei Beispiele). Warum?
\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end
(Hier im ersten Beispiel wird eine Einrückung hinzugefügt, im zweiten nicht.)
\vbox
kann innerhalb eines Absatzes stehen, wie \hbox
. Welche Steuersequenz kann verwendet werden, um \vbox
sowohl in der Mitte als auch am Anfang eines Absatzes ein zu erstellen?
Antwort1
Der Befehl zum Starten des Horizontalmodus mit a \vbox
lautet \leavevmode
. Warum brauchen Sie etwas anderes?
Ich fürchte, Ihre Annahme ist falsch: Es sind nicht „leere Inhalte“, die den Moduswechsel auslösen. Es sindgenau \unhbox
das tut.
Im Gegensatz zu \box
und ist es ein horizontaler Befehl, der den horizontalen Modus auslöst, wenn TeX im vertikalen Modus ist. Das Makro verwendet , damit der horizontalen Liste nichts angehängt wird (nachdem sie möglicherweise gestartet wurde).\copy
\unhbox
\leavevmode
\voidb@x
Der analoge Befehl \unvbox
ist ein vertikaler Befehl undendetein Absatz.
\catcode`@=11
\def\leavehmode{\unvbox\voidb@x}
\catcode`@=12
\everypar{PAR}% to show a paragraph has started
abc\leavehmode def
\bye
Antwort2
Ich weiß nicht, ob das klar ist oder nicht, aber lassen Sie es uns explizit sagen (aus dem TeXbook):
|\leavevmode| is an abbreviation for `|\unhbox\voidbox|',
where |\voidbox| is a permanently empty box register.
Was macht es nun \unhbox\voidbox
eigentlich? Werfen wir einen Blick intex.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;
Wie Sie sehen, beginnt jede dieser Kombinationen aus Modus und etwas anderem einen Absatz, vmode+un_vbox
ist aber nicht darunter.
Persönlich finde ich es interessant, dass Knuth keinen vmode+<*>vbox
Absatz beginnen ließ, sondern vmode+valign
dies tut.