有人能向我解释一下这个宏的细节吗\strut
?为什么这个框\copy
在数学模式下是 ied,但\unhcopy
在其他情况下是 ied?
% latex.ltx, line 484, but identical in plainTeX
\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
TeXBook指出(例如第 120 页),拆箱宏会取消设置盒子外层的任何胶水,但是里面没有胶水\strutbox
,是吗?
据我所知,这\strutbox
实际上是一个空框,其高度(.7\baselineskip
约为\baselineskip
字体大小的 1.2 倍)和深度(.3\baselineskip
),但宽度为零:
% latex.ltx, line 2357, inside the `\set@fontsize` macro
\setbox\strutbox\hbox{%
\vrule\@height.7\baselineskip
\@depth.3\baselineskip
\@width\z@}%
我认为使用盒子比重复使用更有效\vrule
。您还可以使用\ht\strutbox
和\dp\strutbox
访问高度和深度作为尺寸。这允许您编写.5\ht\strutbox
而.5*.7\baselineskip
需要 eTeX\dimexpr
或时间分配。
我真的很想更好地理解 TeX 的细微差别。
答案1
你不能\unhcopy
在数学模式下创建一个水平盒子,这很简单!确实
$\unhcopy\strutbox$
给出
! Incompatible list can't be unboxed.
<*> $\unhcopy\strutbox
$
该命令\unhcopy
在数学模式之外使用,原因有二:
- 它启动水平模式;
- 它删除了一层的装箱,避免了“太深”的嵌套。
类似的定义是\leavevmode
:
\def\leavevmode{\unhbox\voidb@x}
其中是一个应始终保持无效的盒子寄存器。和\voidb@x
之间的区别在于前者会破坏盒子寄存器的内容,而后者只会生成一份副本并保持寄存器完好无损。\unhbox
\unhcopy
的职责之一\fontsize
是提供一个方便的\strut
;支柱的高度和深度始终是基线跳跃的 7/10 和 3/10,由 的第二个参数设置\fontsize
。因此,当执行诸如的命令时\large
,支柱也会改变;当组结束或执行另一个命令(可能是隐式的)时,它将恢复\fontsize
。
(就其余部分而言你是对的。)
笔记。
寄存器\voidb@x
可用于确保盒子寄存器为空,即\setbox\mybox=\box\voidb@x
,这会破坏的内容\mybox
,并且比等效的更有效{\setbox0=\box\mybox}
。