为什么盒子里必须有括号?

为什么盒子里必须有括号?

\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 什么应该被装箱,不是吗?

实际上,显式括号不是强制性的:它们可以被\bgroupand替换\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(像上面列出的类似原语一样)执行扩展以找到tospread左括号。

通过你提出的重新定义,\hbox你可以说

\hbox a

以破坏很多东西为代价;例如,会突然停止工作。计算出现在和中\hbox to <dimen>{...}的次数\hb@xt@latex.ltx在哪里

相关内容