![以 hbox 開頭的項目發生了什麼事?](https://rvso.com/image/399852/%E4%BB%A5%20hbox%20%E9%96%8B%E9%A0%AD%E7%9A%84%E9%A0%85%E7%9B%AE%E7%99%BC%E7%94%9F%E4%BA%86%E4%BB%80%E9%BA%BC%E4%BA%8B%EF%BC%9F.png)
我已經使用 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
是一個 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}