我已经使用 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
不开始一个段落,这个原始框构造将 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}