以 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是一個 TeX 原語而不是 LaTeX 命令,並且與大多數 LaTeX 結構反應不佳,特別是它不以center環境為中心,並且在段落開頭有各種可能意想不到的行為。

那裡沒有提到與列表的具體交互,所以在這裡回答而不是暗示這是重複的。

LaTeX 透過將標籤排版到框寄存器中,然後將標籤插入到下一段的開頭來實現清單項目標籤。\hbox不開始段落,此原始框結構將水平框直接插入周圍的垂直清單中,因此在某些後續文字開始段落之前,不會插入已儲存的項目標籤。所以標籤在盒子之後。

因此,您可以透過使用\leavevmode\hbox而不是簡單地\hbox(這是 定義的主要部分\mbox)來解決此問題,或者當您使用語法時,\hbox to您可以使用標準乳膠等效項,即

\makebox[1cm]{...}

它將自動應用\leavevmode並建造 1 厘米寬的盒子。

答案2

發生的情況是標籤是用\everypar命令放置的。

\everypar當 TeX 進入水平模式時(縮排後),內容被插入到每個段落的開頭。

\hbox語不會開始一個新段落,即它被添加到垂直列表中,因此標籤將等待開始新段落的其他內容(,OP 中的逗號)。

看到這個問題

細胞外基質

\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}

細胞外基質

\documentclass{article}

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

\mbox{yes} again

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

相關內容