Warum gibt es keinen Befehl, um einen Absatz mit \vbox zu beginnen?

Warum gibt es keinen Befehl, um einen Absatz mit \vbox zu beginnen?

\vboxwechselt nicht die Modi und \hboxwechselt 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.)

\vboxkann innerhalb eines Absatzes stehen, wie \hbox. Welche Steuersequenz kann verwendet werden, um \vboxsowohl in der Mitte als auch am Anfang eines Absatzes ein zu erstellen?

Antwort1

Der Befehl zum Starten des Horizontalmodus mit a \vboxlautet \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 \unhboxdas tut.

Im Gegensatz zu \boxund 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 \unvboxist 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

Bildbeschreibung hier eingeben

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\voidboxeigentlich? 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_vboxist aber nicht darunter.

Persönlich finde ich es interessant, dass Knuth keinen vmode+<*>vboxAbsatz beginnen ließ, sondern vmode+valigndies tut.

verwandte Informationen