2009-02-06 7 views
10

Вы можете получить ширину строки в текущем шрифте с помощью stringwidth, и хотя это фактически толкает смещенные координаты в стеке, значение y всегда кажется бесполезным. Есть ли способ определить точную высоту строки, которая может включать или не включать descenders?Как вы можете получить метрику высоты строки в PostScript?

ответ

6

stringwidth, как говорится, не возвращает высоту строки. (Во всех случаях я смотрел, второе целое в стеке после выполнения stringwidth было 0 - для строк, которые работают в горизонтальном направлении.) stringwidth дает относительные координаты текущей точки после выполнения (string) show.

PLRM есть это, чтобы сказать о stringwidth:

Обратите внимание, что ширина возвращаемый stringwidth определяется как движение текущей точки. Он не имеет ничего общего с размерами контуров глифа.

Так что будет работать, чтобы учесть высоту строки? Волшебные слова для чтения в PRLM: 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 

Он вычисляет (напечатанный красным цветом) высота струны, и использует эту информацию, чтобы попробовать и в центре небольшой кружком (напечатанный черным цветом) в центре ограничительной рамки:

Sample PostScript visualized

3

Это, кажется, работает большую часть времени:

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

Он не будет работать для всех /FontType с.

+0

Это также не сработает, если в матрице есть Y-сдвиг. Если '/ FontMatrix get 5 get' не равно нулю, высота глифа будет зависеть от его ширины. –

+0

, чтобы работать с большим количеством шрифтов, вам также необходимо использовать FontBBox: http://stackoverflow.com/questions/8296322/how-to-determine-height-and-depth-of-a-postscript-font/19263342#19263342 –

4

Я уже ответил на это в How to determine string height in PostScript?, но он также полезен здесь.

Просто добавив к pipitas ответа:

/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).

Я использую (HÍpg), чтобы получить самый большой ограничивающий прямоугольник, используя подчеркнутые прописные буквы и символы «ниже строки». Результат достаточно хорош.

Альтернативный подход украл у dreamlax ответ - некоторые шрифты не поддерживают charpath оператор.

Сохранение и восстановление графического контекста сохраняет текущую точку на месте, поэтому она не влияет на «поток» вашего документа.

Надеюсь, что я помог.

+0

Кроме того, вы можете использовать 'currentfont/FontBBox get' для ограничивающего прямоугольника вместо использования' charpath pathbbox', чтобы получить его ... в моем случае он отлично работал под GhostScript; однако результат не был хорошим при интерпретации принтером. –