Soll \c_empty_box anstelle von \mbox{} verwendet werden?

Soll \c_empty_box anstelle von \mbox{} verwendet werden?

Auf den ersten Blick habe ich es \c_empty_boxals 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_boxist es als fester Datenpunkt für die Verwendung in Beispielvergleichen vorgesehen. Es sollte nicht zugewiesen werden und sollte \box_use:Nin Kontexten aufgerufen werden, in denen a <box>nicht als „erwartet“ markiert ist.

Die expl3Sprache 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 \mboxist ein ganz anderes Konstrukt und ist für das Einfügen eines horizontalen Felds gedacht, das das angegebene Argument enthält. Intern \mboxverwendet \leavevmode, und dies verwendet \voidb@x. Die Äquivalenz von \c_empty_boxund \voidb@xhat möglicherweise zu der Verwirrung geführt.

Derzeit wird noch diskutiert, wie \leavevmodedie 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 \everypareingefügt wird, während die „klassische“ \leavevmodeDefinition das Unboxing nach den \everyparTokens belässt. (pdfTeX und LuaTeX haben \quitvmodedieselbe 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@xdefiniert durch

\newbox\voidb@x % permanently void box register

in 2e oder einfachem Text.

\mboxbeginnt \leavevmodeeinen Absatz und erstellt dann einen \hboxohne internen Inhalt.

Wie bei allen Boxzuweisungen wird tatsächlich nur die Nummer gespeichert (die an übergeben werden kann \box) \setboxoder \wdGrundelemente. Normalerweise verwenden die Zuweisungsroutinen \chardefToken, um die Nummern zu speichern. Wenn Sie also einfach auf das Token zugreifen, ohne es mit einem Boxbefehl zu versehen, erhalten Sie \char26alles, was sich in der aktuellen Schriftkodierung in diesem Steckplatz befindet.

verwandte Informationen