\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上下文中对其进行访问。<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当前字体编码中该插槽中的任何内容。

相关内容