是否打算用 \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旨在作為固定資料點用於比較等。不應分配它,並且應在 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所以當前字體編碼中該插槽中的任何內容。

相關內容