乍一看,我理解\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
上下文中对其进行访问。<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 或纯 tex 表示。
\mbox
开始\leavevmode
一个段落,然后创建一个\hbox
没有内部内容的段落。
与所有盒子分配一样,实际存储的只是数字(可以传递给\box
或原语\setbox
)\wd
。传统上,分配例程使用\chardef
令牌来存储数字。因此,如果您只是访问令牌而不使用盒子命令作为前缀,那么您将获得\char26
当前字体编码中该插槽中的任何内容。