\c_empty_box deve ser usado em vez de \mbox{}

\c_empty_box deve ser usado em vez de \mbox{}

À primeira vista, entendi \c_empty_boxcomo 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_boxpretende 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:Nem contextos onde a <box>não está marcado como 'esperado'.

A expl3linguagem é 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, \mboxusa \leavevmode, e isso usa \voidb@x. A equivalência de \c_empty_boxe \voidb@xpode ter levado à confusão.

No momento, ainda há discussão sobre a melhor forma de lidar com \leavevmodea 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 \everyparser inserido, enquanto a definição 'clássica' \leavevmodedeixa o unboxing após os \everypartokens. (pdfTeX e LuaTeX têm \quitvmodeo 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@xdefinido por

\newbox\voidb@x % permanently void box register

em 2e ou texto simples.

\mboxfaz \leavevmodepara iniciar um parágrafo e depois faz um \hboxsem conteúdo interno.

como todas as alocações de caixa, o que é realmente armazenado é apenas o número (que pode ser passado para \box, \setboxou \wdprimitivos. Convencionalmente, as rotinas de alocação usam \chardeftokens para armazenar os números. Portanto, se você apenas acessar o token sem prefixar com um comando de caixa, obterá \char26então, o que quer que esteja nesse slot na codificação de fonte atual.

informação relacionada