我可以假设 strutbox 的 \ht+\dp == \baselineskip 吗?

我可以假设 strutbox 的 \ht+\dp == \baselineskip 吗?

在 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 的做法来设置符合大小的\strutboxes,我的建议是在做出假设之前先检查代码。我个人的观点是,如果\strutbox没有提供这样的 es,而我不得不使用该样式,那么我会重写代码来提供它们。

关于 OTF 中的字体元数据,我的猜测是,这取决于设计字体指标的人的想法。抱歉,我无法提供链接,但也许@KhaledHosny(字体xits和其他人的实现者)可以解决这个问题。

相关内容