Как вы можете получить метрику высоты строки в 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?, но это полезно и здесь.
Просто добавив к ответу 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
Это не будет работать для всех /FontType
s.