\hbox
和(以及类似的框命令)都\vbox
明确要求将其内容括在花括号内,因此它们的行为与宏不同。此规范的原因是什么?
如果我将其重新定义\hbox
为宏,会出现什么问题吗?
\let\orihbox\hbox
\def\hbox#1{\orihbox{#1}}
答案1
\hbox
并且\vbox
是具有以下语法的原语:
\hbox {horizontal list}
or
\hbox to dimen {horizontal list}
or
\hbox spread dimen {horizontal list}
TeX 组在水平列表的开头打开\hbox {horizontal list}
,在列表的结尾关闭。这意味着语法中需要括号,这是非常自然的。
答案2
你想告诉 TeX 什么应该被装箱,不是吗?
实际上,显式括号不是强制性的:它们可以被\bgroup
and替换\egroup
(这对于宏的参数来说是不可能的)。
正如 Skillmon 在评论中指出的那样,你可以定义
\def\starthbox{\hbox\bgroup}
\def\finishhbox{\egroup}
和
\starthbox abc\finishhbox
会框起来abc
。这可能与 不太相关\hbox
,但对于行为类似的和来说\vbox
,这是相关的。您可以这样做\vtop
\halign
\def\starthboxregister#1{\setbox#1=\hbox\bgroup}
\def\finishhboxregister{\egroup}
并做
\starthboxregister{0}abc\finishhboxregister
相当于
\setbox0=\hbox{abc}
同样,可能对 不太有用\hbox
,但是,例如\begin{tabular}
LaTeX 最终会
\halign\bgroup
并\end{tabular}
发出匹配的\egroup
。
顺便说一句,如果你这样做
\hbox\relax{abc}`
那么结果将是 box abc
,因为\hbox
忽略了 TeXbook 所称的 ⟨filler⟩。
并且\hbox
(像上面列出的类似原语一样)执行扩展以找到to
或spread
左括号。
通过你提出的重新定义,\hbox
你可以说
\hbox a
以破坏很多东西为代价;例如,会突然停止工作。计算出现在和中\hbox to <dimen>{...}
的次数\hb@xt@
latex.ltx
在哪里。