Как вы можете получить метрику высоты строки в PostScript?

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

3 ответа

Решение

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

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

Образец PostScript визуализируется

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

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

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

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

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

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

Другие вопросы по тегам