我正在寻找PostScript代码来估计PostScript字体的高度(上升空间)和深度(下降空间).字体的边界框(FontBBox)可以用于此吗?`
以下是我的问题的一些背景:字体的字形位于基线上.显然,具有下行的字形将达到基线以下,我想知道基线下降器可以到达多远,以便我可以在布局中提供足够的空间.
我见过PostScript代码,它呈现给定字符串以检查其维度.我对给定字体的一般答案很感兴趣.
好吧,你已经发现了两个"快捷方式".FontBBox给出了叠加在一起的字体中所有字形的边界框.false charpath flattenpath pathbbox给出指定字符串的框.
对于Type 3(用户定义的)字体,这是您可以完全期望的; 但对于更流行的Type 1字体,有丰富的公制信息中的字体,并在"指标"文件(用于其他应用程序).
但这是我不太清楚的部分.所以我要阅读(在Adobe Type 1手册中)并稍后扩展这个答案.
编辑:实际上,看起来这些可能是最好的方式.
存在是垂直取向值的类型1的字体的阵列,在/专用字典,名称/ BlueValues下; 但不能保证字体能够尊重它们.阵列中的第一个数字是基线过冲 ; 这是像'O'这样的字母的底边,它低于基线.并且阵列中的最大值将是上升高度过冲或上限过冲(以较高者为准).但是可以在不考虑这些值的情况下绘制任何单个字符(因此,不能保证).
另一方面,FontBBox本身可以反映字体中存在的任何"特殊"字符的边界框,无论它们是否可以通过编码向量访问(即,您不能使用show它们,但必须使用glyphshow它们).
因此,最好的选择可能是获取pathbbox您打算使用的所有字符的字符串.这将忽略可能存在但与您的目的无关的任何其他角色的贡献.并且不要忘记flattenpath从曲线中移除控制点(可能远远超出"真实"边界框).
luser droog的答案看起来相当完整,毫无疑问比我更强大,但我不满意这是确定标准字体的可用垂直空间的最简单方法,这使得我可以创建一个可行的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
Run Code Online (Sandbox Code Playgroud)
运行它的结果gs test.ps:

一天后,再次看到这一点,并意识到OP希望分别对待上升器和下降器.所以这里只是使用下降器的例子:
%!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
Run Code Online (Sandbox Code Playgroud)
以及结果gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps:
