你可以使用
stringwidth
获取当前字体下字符串的宽度,虽然这实际上会在堆栈上推入偏移坐标,但 y 值似乎总是没有用处。有没有办法确定字符串的精确高度,可能包括下降部分?stringwidth
获取当前字体下字符串的宽度,虽然这实际上会在堆栈上推入偏移坐标,但 y 值似乎总是没有用处。有没有办法确定字符串的精确高度,可能包括下降部分?/textheight {
gsave % save graphic context
{
100 100 moveto % move to some point
(HÍpg) true charpath pathbbox % gets text path bounding box (LLx LLy URx URy)
exch pop 3 -1 roll pop % keeps LLy and URy
exch sub % URy - LLy
}
stopped % did the last block fail?
{
pop pop % get rid of "stopped" junk
currentfont /FontMatrix get 3 get % gets alternative text height
}
if
grestore % restore graphic context
} bind def
/jumpTextLine {
textheight 1.25 mul % gets textheight and adds 1/4
0 exch neg rmoveto % move down only in Y axis
} bind def
setfont
)和其大小(scalefont
)上操作。charpath
运算符。stringwidth
,如其名,不返回字符串的高度。(在我查看的所有情况中,在执行 stringwidth
后栈上第二个整数是 0
,对于水平方向运行的字符串来说。)stringwidth
给出执行 (string) show
后当前点的相对坐标。
PLRM 对 stringwidth
有这样的说明:
请注意,stringwidth 返回的宽度被定义为当前点的移动。它与字形轮廓的尺寸无关。
那么,考虑字符串的高度应该怎么做呢?在 PLRM 中需要了解的魔法词汇是 charpath
和 pathbbox
。试试这个:
%!
/Helvetica findfont 60 scalefont setfont
200 700 4 0 360 arc fill
200 700 moveto (test test) dup
true charpath pathbbox
3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch
1 0 0 setrgbcolor
200 700 moveto rmoveto show showpage
这似乎大多数时间都有效:
/fontheight { currentfont /FontMatrix get 3 get } bind def
/lineheight { fontheight 1.2 mul } bind def
这并非适用于所有的 /FontType
。
currentfont /FontBBox get
来获取边界框,而不是使用charpath pathbbox
来获取它... 在我的情况下,在 GhostScript 下它完美地工作;然而,当打印机解释时结果并不好。 - Ricardo Nolde