À primeira vista, entendi \c_empty_box
como uma substituição de \mbox{}
mas o seguinte MWE (que aponta um comportamento estranho de \c_empty_box
: é substituído por "æ") me dá sérias dúvidas.
\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}
Responder1
Tal como acontece com outras variáveis constantes, \c_empty_box
pretende ser um ponto de dados fixo para uso, por exemplo, em comparações. Ele não deve ser atribuído e deve ser acessado \box_use:N
em contextos onde a <box>
não está marcado como 'esperado'.
A expl3
linguagem é destinada à programação de nível inferior e, portanto, não se deve esperar que tenha equivalentes a todos os comandos de documentos do LaTeX2e e, ao mesmo tempo, ainda há áreas a serem desenvolvidas. O LaTeX2e de alto nível \mbox
é uma construção muito diferente e destina-se a inserir uma caixa horizontal contendo o argumento fornecido. Internamente, \mbox
usa \leavevmode
, e isso usa \voidb@x
. A equivalência de \c_empty_box
e \voidb@x
pode ter levado à confusão.
No momento, ainda há discussão sobre a melhor forma de lidar com \leavevmode
a funcionalidade. O que é quase certo é que será implementado utilizando o equivalente a
\protected\def\leavevmode{%
\ifvmode
\expandafter\indent
\fi
}
em vez de uma operação unbox. Isso ocorre porque a construção acima muda para o modo horizontal de forma que seja concluído antes de \everypar
ser inserido, enquanto a definição 'clássica' \leavevmode
deixa o unboxing após os \everypar
tokens. (pdfTeX e LuaTeX têm \quitvmode
o mesmo efeito que a definição 'melhorada' acima, mas XeTeX não possui isso e, em qualquer caso, não há ganho com a primitiva adicional.)
Responder2
Não, como o próprio nome indica, não é preciso argumentar. É de fato
> \c_empty_box=\char"1A.
l.5 \show\c_empty_box
> \box26=void
é isso é como \voidb@x
definido por
\newbox\voidb@x % permanently void box register
em 2e ou texto simples.
\mbox
faz \leavevmode
para iniciar um parágrafo e depois faz um \hbox
sem conteúdo interno.
como todas as alocações de caixa, o que é realmente armazenado é apenas o número (que pode ser passado para \box
, \setbox
ou \wd
primitivos. Convencionalmente, as rotinas de alocação usam \chardef
tokens para armazenar os números. Portanto, se você apenas acessar o token sem prefixar com um comando de caixa, obterá \char26
então, o que quer que esteja nesse slot na codificação de fonte atual.