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