На первый взгляд я понял, \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
то, что находится в этом слоте в текущей кодировке шрифта.