\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現在のフォント エンコーディングでそのスロットにあるものがすべて取得されます。

関連情報