Предполагается ли использование \c_empty_box вместо \mbox{}?

Предполагается ли использование \c_empty_box вместо \mbox{}?

На первый взгляд я понял, \c_empty_boxчто это замена, \mbox{}но следующее MWE (указывающее на странное поведение \c_empty_box: он заменяется на «æ») вызывает у меня серьезные сомнения.

\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}

решение1

Как и другие постоянные переменные, \c_empty_boxпредназначена как фиксированная точка данных для использования, например, в сравнениях. Она не должна назначаться и должна быть доступна с использованием \box_use:Nв контекстах, где a <box>не отмечено как «ожидаемое».

Язык expl3предназначен для низкоуровневого программирования, поэтому не следует ожидать, что он будет иметь эквиваленты каждой команды документа LaTeX2e, и в то же время есть еще области, которые нужно развивать. Высокоуровневый LaTeX2e \mbox— это совершенно другая конструкция, предназначенная для вставки горизонтального блока, содержащего заданный аргумент. Внутри \mboxсебя использует \leavevmode, а это использует \voidb@x. Эквивалентность \c_empty_boxи \voidb@xмогла привести к путанице.

В настоящее время все еще ведутся дискуссии о том, как лучше всего управлять \leavevmodeфункциональностью. Почти наверняка это будет реализовано с использованием эквивалента

\protected\def\leavevmode{%
  \ifvmode
    \expandafter\indent
  \fi
}

а не операция распаковки. Это происходит потому, что конструкция выше переключается в горизонтальный режим, так что это завершается до \everyparвставки, тогда как «классическое» \leavevmodeопределение оставляет распаковку после \everyparтокенов. (pdfTeX и LuaTeX имеют \quitvmodeтот же эффект, что и «улучшенное» определение выше, но XeTeX этого не имеет, и в любом случае нет никакого выигрыша от дополнительного примитива.)

решение2

Нет, как видно из названия, он не принимает аргументов. На самом деле, это

> \c_empty_box=\char"1A.
l.5 \show\c_empty_box

> \box26=void

то есть это как бы \voidb@xопределено

\newbox\voidb@x % permanently void box register

в 2e или обычном тексте.

\mboxделает \leavevmode, чтобы начать абзац, а затем создает \hboxбез внутреннего содержания.

как и при всех распределениях box, на самом деле хранится только число (которое может быть передано \box, \setboxили \wdпримитивы. Традиционно процедуры распределения используют \chardefтокены для хранения чисел. Поэтому, если вы просто обращаетесь к токену без префикса с помощью команды box, то вы получаете \char26то, что находится в этом слоте в текущей кодировке шрифта.

Связанный контент