答案1
\hbox
是 TeX 原语,并且\mbox
是通过以下方式定义的 LaTeX 宏
\long\def\mbox#1{\leavevmode\hbox{#1}}
意思\leavevmode
是它开始一个段落,比较一下:
\hbox{one}
\hbox{two}
three
和
\mbox{one}
\mbox{two}
three
另一个区别是,该参数被解析为一个普通的宏参数,因此例如可以工作并且与而\mbox a
相同是语法错误。会导致错误但会将逐字装入框。\mbox{a}
\hbox a
\mbox{\verb|{|}
\hbox{\verb|{|}
{
如果您确实使用括号组作为参数,则它必须是明确的{}
(或具有 catcode 1 和 2 的其他字符),但\hbox
可以使用隐式括号,例如\hbox\bgroup
... \egroup
(特别是您可以在一个宏中开始一个框并在另一个宏中结束它)。
不要\hbox
在 LaTeX 文档中使用(尽管您经常会在内部包代码中看到它)。
根据要求,以下是一些进一步的详细信息\leavevmode
:
\documentclass{article}
\begin{document}
compare
\hbox{one}
\hbox{two}
three
with
\mbox{one}
\mbox{two}
three
see?
compare
zero
\hbox{one}
\hbox{two}
three
with
zero
\mbox{one}
\mbox{two}
three
see?
\end{document}
第一个段落之后compare
是段落分隔符,因此 TeX 会进入垂直的模式。在垂直模式下,框垂直堆叠。接下来的两个框是\hbox
带有 和 的one
,two
因此它们垂直附加到当前垂直列表中。然后是字母t
;three
字母在垂直模式下是不允许的,因此 TeX 将其推回到输入中,而是开始一个新段落,添加段落缩进,然后three
在水平模式下再次看到 。
在第一个段落之后,with
又出现了一个段落中断,但这次 TeX 看到了\leavevmode
(或者更确切地说,看到了\unhbox
它的定义中的),因此它开始了一个新段落,添加了缩进,并且然后\hbox{one}
在水平模式下可见。\leavevmode
在 h 模式下不执行任何操作,因此在行尾字符导致的单词空格的粘连之后,TeX 会\hbox{two}
看到水平之后one
,并three
跟在同一段落中。
在第二个 之后compare
,TeX 再次处于垂直模式,但这次段落以 开头zero
,因此 TeX 在看到 之前就已经处于水平模式\hbox
,所以\hbox
和 的\mbox
行为相同。
基本上 LaTeX 会尽力绝不暴露原始的 TeX 盒子行为:所有 LaTeX 盒子都以 开头,\leavevmode
因此它们的行为类似于\mbox
而不是。(区别基本上与 (LaTeX) 和(TeX) 以及(LaTeX) 和(TeX)\hbox
之间的区别相同。)\parbox
\vbox
\rule
\hrule