在 Context 中,只要通过适当的接口设置了行间空间,就可以安全地假设(tex.box.strutbox.height + tex.box.strutbox.depth) == tex.baselineskip.width
。当复制 strutbox 以将空行添加到某些 vlist 时,此关系很重要。
然而,我正在清楚的目前,没有这样的接口。Knuth 在他的例子中独立于 strutbox 设置基线跳跃,而且他使用绝对点值。此外,他定义了多个 strutbox具有不同的高度/深度比在gkpmac.tex
和其他地方。然而,在
manmac.tex
(和附录 E,第 414f 页)中,bodyfont 开关(等)包括适当的 strutbox,其+等于。不幸\tenpoint
的是,我没有经验,无法判断这是普通用户的惯例还是仅仅是 Knuth 的惯例。\ninepoint
\ht
\dp
\baselineskip
所以我的问题是:是否可以合理安全地假设,为 Plain TeX 定义字体开关的人也会处理 strutbox?如果我遇到一个 strutbox,其高度和深度的总和与本地 baselineskip 不匹配,是否可以安全地重新计算这些尺寸并覆盖当前 strutbox?是否有一些关于正确的高度/深度比率的约定?它可能是字体元数据 (OTF) 的一部分吗?(好的链接可获得加分:我似乎无法在 Google 上搜索该主题,否则我的搜索结果会充斥着源文件。)
供参考,当其尺寸与baselineskip不匹配时,重新创建strutbox的一些代码。
local strutbox = texbox.strutbox
local get_strut = function ()
local strutht, strutdp = strutbox.height, strutbox.depth
local struthtdp = strutht + strutdp
local texbaselineskip = tex.baselineskip.width
local newstrut = node.copy_list(tex.box.strutbox)
strutht = (strutht / struthtdp) * texbaselineskip
strutdp = (strutdp / struthtdp) * texbaselineskip
newstrut.height, newstrut.list.height = strutht, strutht
newstrut.depth, newstrut.list.depth = strutdp, strutdp
return newstrut
end
local my_strut = get_strut()
print(string.format("strutbox ht %.4f, dp %.4f, htdp %.2f factor %.2f",
strutbox.height / 2^16,
strutbox.depth / 2^16,
(strutbox.height + strutbox.depth) / 2^16,
(strutbox.height / strutbox.depth)))
print(string.format("my_strut ht %.4f, dp %.4f, htdp %.2f factor %.2f",
my_strut.height / 2^16,
my_strut.depth / 2^16,
(my_strut.height + my_strut.depth) / 2^16,
(my_strut.height / my_strut.depth)))
print(strutbox)
print(strutbox.list.height/2^16)
tex.box.strutbox = my_strut
(类似主题,但据我所知,指定的 ht/dp 比率不适用于普通 https://tex.stackexchange.com/a/21834/14066)
答案1
许多普通用户会遵循 knuth 的约定来表示支柱的高度和深度,如manmac.tex
。他在那里定义了三个基本尺寸,每个尺寸都有自己的值\strutbox
:
\def\tenpoint{\def\rm{\fam0\tenrm}%
<...>
\normalbaselineskip=12pt
<...>
\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}%
\normalbaselines\rm}
\def\ninepoint{\def\rm{\fam0\ninerm}%
<...>
\normalbaselineskip=11pt
<...>
\setbox\strutbox=\hbox{\vrule height8pt depth3pt width\z@}%
\normalbaselines\rm}
\def\eightpoint{\def\rm{\fam0\eightrm}%
<...>
\normalbaselineskip=9pt
<...>
\setbox\strutbox=\hbox{\vrule height7pt depth2pt width\z@}%
\normalbaselines\rm}
可以看出,高度+深度\strutbox
做等于\normalbaselineskip
,高度和深度大于大写字母高度和下降部深度,且成比例;并非所有的“超出部分”都在上方或下方。(其他普通格式也遵循这一原则;ams-tex
例如,就是这样。)但我不想保证这种做法是普遍的。
请注意,这\mathstrut
是不同的——它的定义是plain.tex
:
\def\mathstrut{\vphantom(}
因此它只有当前字体中括号的高度和深度,并且不应该更大。 (对于不是为数学设计的字体来说,这可能是一个陷阱;tex 字体具有垂直对称的括号,在数学轴的上方和下方具有相同的范围。仅考虑文本设置而设计的字体可能根本没有明确定义的数学轴,因此“您的里程可能会有所不同”。检查!然后,如有必要,将定义为\mathstrut
两个\vphantom
字符,一个具有在由字母+数字+标点符号组成的集合中找到的最大高度,另一个具有最大深度。)
作为众多特定于文档的纯文本样式的设计者,包括拖船,我忠实地遵守这一manmac
原则;它确保了毫不费力的一致性,因此只需要注意特殊情况。
gkpmac.tex
是这是一个例外。它是为一本特定的书设计的,具体数学,没有不同的块主要的不同大小的文本。相反,它有控制良好的“插入”(在本讨论中包括标题和小边距“涂鸦”),其字体大小和大小\baselineskip
是单独设置的,因此在这些情况下不需要支柱。高度+深度\strutbox
等于\baselineskip
正文的13pt。这些设置的理由在knuth的拖船文章《排版具体数学》。
关于纯 tex 样式的设计者是否会遵循 knuth 的做法来设置符合大小的\strutbox
es,我的建议是在做出假设之前先检查代码。我个人的观点是,如果\strutbox
没有提供这样的 es,而我不得不使用该样式,那么我会重写代码来提供它们。
关于 OTF 中的字体元数据,我的猜测是,这取决于设计字体指标的人的想法。抱歉,我无法提供链接,但也许@KhaledHosny(字体xits
和其他人的实现者)可以解决这个问题。