hbox で始まるアイテムはどうなっているのでしょうか?

hbox で始まるアイテムはどうなっているのでしょうか?

私は何年もLaTeXを使ってきましたが、こんなことは初めてです。もし項目(enumerate)が で始まる場合\hbox、 が\hbox配置されます。前にラベル!

\documentclass[12pt]{article}

\def\Blank#1{\relax{\hbox to 1in{\hrulefill\textsl{#1}\hrulefill}}}

\begin{document}

\section{Example}

Here's a list:
\begin{enumerate}
\item
\Blank{test}, plus stuff after.

\item{}
\Blank{test}, plus stuff after.

\item\relax
\Blank{test}, plus stuff after.

\item{ }
\Blank{test}, plus stuff after.

\item{ }\relax
\hbox to 1in{\hrulefill\textsl{test}\hrulefill}, plus stuff after.

\item{ X }
\Blank{test}, plus stuff after.

% etc.

\end{enumerate}

\end{document}

最後の項目を除いて、結果は予想外です。 ラベルの前にテキストが表示されます

空白、実際のテキスト以外では、後方へ移動する\relaxことを妨げるものは何もありません。\hbox

何が間違っているのでしょうか?

答え1

で説明したように

\hbox と \mbox の違い

\hboxは、LaTeX コマンドではなく TeX プリミティブであり、ほとんどの LaTeX 構造と適切に反応しません。特に、環境によって中央揃えされずcenter、段落の先頭で予期しないさまざまな動作が発生します。

ただし、リストとの具体的なやり取りについてはそこでは言及されていないため、それを提案するのではなくここで回答することは重複することになります。

LaTeX は、ラベルをボックス レジスタにタイプセットし、次の段落の先頭にラベルを挿入することで、リスト項目ラベルを実装します。\hbox段落を開始しないので、この基本的なボックス構造は hbox を周囲の垂直リストに直接挿入するため、保存された項目ラベルは、後続のテキストが段落を開始するまで挿入されません。したがって、ラベルはボックスの後になります。

\leavevmode\hboxしたがって、これを修正するには、の代わりにを使用するだけです\hbox(これは の定義の主要部分です\mbox)。または、 構文を使用している場合は、\hbox to標準的なLaTeXの同等のものを使用できます。

\makebox[1cm]{...}

これは自動的に適用され\leavevmode、1cm 幅のボックスが構築されます。

答え2

何が起こるかというと、ラベルが\everyparコマンドで配置されるということです。

\everyparTeX が水平モード (インデント後) に入ると、各段落の先頭にコンテンツが挿入されます。

プリミティブ\hboxは新しい段落を開始しません。つまり、垂直リストに追加されるので、ラベルは新しい段落を開始する追加の要素 ( ,OP 内のカンマ) を待機します。

これを見て質問

ECCM について

\documentclass{article}

\def\myitem{\setbox0=\hbox{\textbullet\quad}\everypar{\unhbox0\everypar{}}}

\begin{document}
\myitem foo bar.

\myitem you see.

\myitem \mbox{OK. here} every thing is good.

\myitem \hbox {No!} but not here.
\end{document}

ECCM について

\documentclass{article}

\begin{document}
\begingroup
\everypar{\textbf{Foo} }
yes

\mbox{yes} again

\hbox{what's} now
\endgroup
\end{document}

関連情報