A primera vista lo entendí \c_empty_box
como un reemplazo de \mbox{}
pero el siguiente MWE (que señala un comportamiento extraño de \c_empty_box
: se reemplaza por "æ") me da serias dudas.
\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}
Respuesta1
Al igual que con otras variables constantes, \c_empty_box
está pensado como un punto de datos fijo para usar, por ejemplo, en comparaciones. No se debe asignar y se debe acceder a él \box_use:N
en contextos donde a <box>
no esté marcado como "esperado".
El expl3
lenguaje está pensado para programación de nivel inferior y, por lo tanto, no se debe esperar que tenga equivalentes de cada comando de documento LaTeX2e y, al mismo tiempo, todavía quedan áreas por desarrollar. El LaTeX2e de alto nivel \mbox
es una construcción muy diferente y está destinado a insertar un cuadro horizontal que contiene el argumento dado. Internamente, \mbox
usa \leavevmode
y este usa \voidb@x
. La equivalencia de \c_empty_box
y \voidb@x
puede haber llevado a la confusión.
En la actualidad, todavía hay debates sobre cuál es la mejor manera de manejar \leavevmode
la funcionalidad. Lo que es casi seguro es que se implementará utilizando el equivalente a
\protected\def\leavevmode{%
\ifvmode
\expandafter\indent
\fi
}
en lugar de una operación de desempaquetado. Esto se debe a que la construcción anterior cambia al modo horizontal, de modo que se completa antes de \everypar
insertarse, mientras que la \leavevmode
definición "clásica" deja el unboxing después de los \everypar
tokens. (pdfTeX y LuaTeX tienen \quitvmode
el mismo efecto que la definición 'mejorada' anterior, pero XeTeX carece de esto y, en cualquier caso, no se obtiene ninguna ganancia con la primitiva adicional).
Respuesta2
No, como su nombre indica no requiere argumento. es de hecho
> \c_empty_box=\char"1A.
l.5 \show\c_empty_box
> \box26=void
eso es es como está \voidb@x
definido por
\newbox\voidb@x % permanently void box register
en 2e o tex simple.
\mbox
hace \leavevmode
para comenzar un párrafo y luego crea uno \hbox
sin contenido interno.
como todas las asignaciones de cuadro, lo que realmente se almacena es solo el número (que se puede pasar a \box
, \setbox
o \wd
primitivas. Convencionalmente, las rutinas de asignación usan \chardef
tokens para almacenar los números. Entonces, si simplemente accede al token sin anteponer un comando de cuadro, obtendrá \char26
entonces, lo que sea que esté en esa ranura en la codificación de fuente actual.