views:

276

answers:

2

You can obtain the width of a string in the current font with stringwidth and although this actually pushes offset coordinates on the stack, the y-value always seems to be useless. Is there a way to determine the exact height of a string, that may or may not include descenders?

+1  A: 

This seems to work most of the time:

/fontheight { currentfont /FontMatrix get 3 get } bind def
/lineheight { fontheight 1.2 mul } bind def

It won't work for all /FontTypes.

dreamlax
A: 

stringwidth, as it says, doesn't return string's height. (In all cases I looked at, the second integer on the stack after executing stringwidth was 0 -- for strings that run in horizontal direction.) stringwidth gives the relative coordinates of the currentpoint after executing a (string) show.

The PLRM has this to say about stringwidth:

Note that the width returned by stringwidth is defined as movement of the current point. It has nothing to do with the dimensions of the glyph outlines.

So what would work to take into account the string's height? The magic words to read up about in PRLM are charpath and pathbbox. Try this:

%!
/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 
200 700 moveto rmoveto show showpage

It calculates the string's height and uses that info to try and center a small filled circle into the center of its bounding box.

pipitas