Auf den ersten Blick habe ich es \c_empty_box
als Ersatz für verstanden \mbox{}
, aber das folgende MWE (das auf ein seltsames Verhalten von hinweist \c_empty_box
: es wird durch „æ“ ersetzt) gibt mir ernsthafte Zweifel.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_foo_tl%
\tl_new:N \l_bar_tl%
\tl_set:Nn \l_foo_tl {%
\mbox{} \hfill Foo
}
\tl_set:Nn \l_bar_tl {%
\c_empty_box \hfill Bar
}
\NewDocumentCommand{\baz}{ }
{
\l_foo_tl
\par
\l_bar_tl
}%
\ExplSyntaxOff
\begin{document}
\baz
\end{document}
Antwort1
Wie bei anderen konstanten Variablen \c_empty_box
ist es als fester Datenpunkt für die Verwendung in Beispielvergleichen vorgesehen. Es sollte nicht zugewiesen werden und sollte \box_use:N
in Kontexten aufgerufen werden, in denen a <box>
nicht als „erwartet“ markiert ist.
Die expl3
Sprache ist für die Programmierung auf niedrigerem Niveau gedacht und daher sollte man nicht erwarten, dass sie Äquivalente für jeden LaTeX2e-Dokumentbefehl hat. Gleichzeitig gibt es noch Bereiche, die entwickelt werden müssen. Das hochrangige LaTeX2e \mbox
ist ein ganz anderes Konstrukt und ist für das Einfügen eines horizontalen Felds gedacht, das das angegebene Argument enthält. Intern \mbox
verwendet \leavevmode
, und dies verwendet \voidb@x
. Die Äquivalenz von \c_empty_box
und \voidb@x
hat möglicherweise zu der Verwirrung geführt.
Derzeit wird noch diskutiert, wie \leavevmode
die Funktionalität am besten gehandhabt werden soll. Fast sicher ist, dass sie mit dem Äquivalent von
\protected\def\leavevmode{%
\ifvmode
\expandafter\indent
\fi
}
anstatt einer Unbox-Operation. Dies liegt daran, dass die obige Konstruktion in den horizontalen Modus wechselt, sodass dies abgeschlossen ist, bevor \everypar
eingefügt wird, während die „klassische“ \leavevmode
Definition das Unboxing nach den \everypar
Tokens belässt. (pdfTeX und LuaTeX haben \quitvmode
dieselbe Wirkung wie die „verbesserte“ Definition oben, aber XeTeX fehlt dies und in jedem Fall gibt es keinen Vorteil durch das zusätzliche Primitiv.)
Antwort2
Nein, wie der Name schon sagt, braucht es kein Argument. Es ist in der Tat
> \c_empty_box=\char"1A.
l.5 \show\c_empty_box
> \box26=void
das ist es ist es ist wie \voidb@x
definiert durch
\newbox\voidb@x % permanently void box register
in 2e oder einfachem Text.
\mbox
beginnt \leavevmode
einen Absatz und erstellt dann einen \hbox
ohne internen Inhalt.
Wie bei allen Boxzuweisungen wird tatsächlich nur die Nummer gespeichert (die an übergeben werden kann \box
) \setbox
oder \wd
Grundelemente. Normalerweise verwenden die Zuweisungsroutinen \chardef
Token, um die Nummern zu speichern. Wenn Sie also einfach auf das Token zugreifen, ohne es mit einem Boxbefehl zu versehen, erhalten Sie \char26
alles, was sich in der aktuellen Schriftkodierung in diesem Steckplatz befindet.