私は何年も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
は、LaTeX コマンドではなく TeX プリミティブであり、ほとんどの LaTeX 構造と適切に反応しません。特に、環境によって中央揃えされずcenter
、段落の先頭で予期しないさまざまな動作が発生します。
ただし、リストとの具体的なやり取りについてはそこでは言及されていないため、それを提案するのではなくここで回答することは重複することになります。
LaTeX は、ラベルをボックス レジスタにタイプセットし、次の段落の先頭にラベルを挿入することで、リスト項目ラベルを実装します。\hbox
段落を開始しないので、この基本的なボックス構造は hbox を周囲の垂直リストに直接挿入するため、保存された項目ラベルは、後続のテキストが段落を開始するまで挿入されません。したがって、ラベルはボックスの後になります。
\leavevmode\hbox
したがって、これを修正するには、の代わりにを使用するだけです\hbox
(これは の定義の主要部分です\mbox
)。または、 構文を使用している場合は、\hbox to
標準的なLaTeXの同等のものを使用できます。
\makebox[1cm]{...}
これは自動的に適用され\leavevmode
、1cm 幅のボックスが構築されます。
答え2
何が起こるかというと、ラベルが\everypar
コマンドで配置されるということです。
\everypar
TeX が水平モード (インデント後) に入ると、各段落の先頭にコンテンツが挿入されます。
プリミティブ\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}