乍一看,我理解\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
旨在作為固定資料點用於比較等。不應分配它,並且應在 a未標記為“預期”的\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 或純文字。
\mbox
確實\leavevmode
開始一個段落,然後創建一個\hbox
沒有內部內容的段落。
與所有盒子分配一樣,實際存儲的只是數字(可以傳遞給\box
,\setbox
或\wd
原語。傳統上,分配例程使用\chardef
令牌來存儲數字。因此,如果您只是訪問令牌而不用盒子命令作為前綴,那麼您會得到\char26
所以當前字體編碼中該插槽中的任何內容。