Как вы можете получить метрику высоты строки в PostScript? - PullRequest
11 голосов
/ 06 февраля 2009

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

Ответы [ 3 ]

6 голосов
/ 13 сентября 2010

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

4 голосов
/ 19 августа 2011

Я уже ответил на это в Как определить высоту строки в 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.

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

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

3 голосов
/ 10 марта 2009

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

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

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

...