我正在寻找估算PostScript字体高度(上升空间)和深度(下降空间)的PostScript代码。可以使用字体的边界框({{1}})吗?`
以下是我的问题的一些背景:字体的字形位于基线上。显然,具有下行的字形将达到基线以下,我想知道基线下降器可以到达多远,以便我可以在布局中提供足够的空间。
我见过PostScript code that renders a given string to check its dimension。我对给定字体的一般答案很感兴趣。
答案 0 :(得分:8)
嗯,你已经发现了两个“快捷方式”。 FontBBox给出了叠加在一起的字体中所有字形的边界框。 false charpath flattenpath pathbbox
给出了指定字符串的框。
对于Type 3(用户定义)字体,这是您可以完全期望的;但是对于更受欢迎的Type 1字体, in 字体和“metrics”文件(对于其他应用程序)都有大量的度量信息。
但这是我不太清楚的部分。所以我要阅读(在Adobe Type 1手册中)并稍后扩展这个答案。
编辑:实际上,看起来这些可能是最好的方法。
是一个垂直对齐值的数组,在Type 1字体中,在/ Private字典中,名称为/ BlueValues;但不能保证字体能够尊重它们。数组中的第一个数字是基线过冲;这是像'O'这样的字母的底边,它低于基线。并且阵列中的最大值将是上升高度过冲或上限高度过冲(以较高者为准)。但是可以绘制任何单个字符而不考虑这些值(因此,不能保证)。
另一方面,FontBBox本身可以反映字体中存在的任何“特殊”字符的边界框,无论它们是否可以通过编码向量访问(即,你不能show
他们,但必须glyphshow
他们。)
因此,最好的选择可能是获取您打算使用的所有字符的字符串的pathbbox
。这将忽略可能存在但与您的目的无关的任何其他角色的贡献。并且不要忘记flattenpath
从曲线中移除控制点(可能远远超出“真实”边界框)。
答案 1 :(得分:5)
luser droog的答案看起来相当完整,毫无疑问比我的更强大,但我不满意这是确定标准字体的可用垂直空间的最简单方法,它允许我创建一个可行的{{1} }。这是我想出的:
newline
使用%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 10 selectfont
1 inch 10 inch moveto
/fontheight currentfont dup /FontBBox get dup 3 get % top
exch 1 get sub % top - bottom
exch /FontMatrix get 3 get mul def % adjusted by height multiplier
/lineheight fontheight 1.2 mul def % add 20% for line spacing
/newline {0 lineheight neg rmoveto} bind def % negate height to move downwards
gsave (lineheight: ) show lineheight 20 string cvs show grestore
newline gsave (that worked!) show grestore
showpage
运行它的结果:
一天后,再次看到这一点,并意识到OP希望分别对待上升器和下降器。所以这里只是使用下降器的例子:
gs test.ps
以及%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 30 selectfont
1 inch 2 inch moveto
/descender currentfont dup /FontBBox get 1 get % bottom (negative number!)
exch /FontMatrix get 3 get mul def % adjusted by height multiplier
% first draw a gray line at base of text
gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore
gsave (descender: ) show descender 20 string cvs show ( pixels) show grestore
gsave 0 descender 1 sub rmoveto % one pixel below lowest descender
7.5 inch 0 rlineto 0 setgray stroke grestore
showpage
的结果: