¿Se pretende utilizar \c_empty_box en lugar de \mbox{}?

¿Se pretende utilizar \c_empty_box en lugar de \mbox{}?

A primera vista lo entendí \c_empty_boxcomo 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_boxestá 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:Nen contextos donde a <box>no esté marcado como "esperado".

El expl3lenguaje 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 \mboxes una construcción muy diferente y está destinado a insertar un cuadro horizontal que contiene el argumento dado. Internamente, \mboxusa \leavevmodey este usa \voidb@x. La equivalencia de \c_empty_boxy \voidb@xpuede haber llevado a la confusión.

En la actualidad, todavía hay debates sobre cuál es la mejor manera de manejar \leavevmodela 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 \everyparinsertarse, mientras que la \leavevmodedefinición "clásica" deja el unboxing después de los \everypartokens. (pdfTeX y LuaTeX tienen \quitvmodeel 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@xdefinido por

\newbox\voidb@x % permanently void box register

en 2e o tex simple.

\mboxhace \leavevmodepara comenzar un párrafo y luego crea uno \hboxsin contenido interno.

como todas las asignaciones de cuadro, lo que realmente se almacena es solo el número (que se puede pasar a \box, \setboxo \wdprimitivas. Convencionalmente, las rutinas de asignación usan \chardeftokens para almacenar los números. Entonces, si simplemente accede al token sin anteponer un comando de cuadro, obtendrá \char26entonces, lo que sea que esté en esa ranura en la codificación de fuente actual.

información relacionada