以 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不开始一个段落,这个原始框构造将 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}

相关内容