Вы можете получить ширину строки в текущем шрифте с помощью stringwidth
, и хотя это фактически толкает смещенные координаты в стеке, значение y всегда кажется бесполезным. Есть ли способ определить точную высоту строки, которая может включать или не включать descenders?Как вы можете получить метрику высоты строки в PostScript?
ответ
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
Он вычисляет (напечатанный красным цветом) высота струны, и использует эту информацию, чтобы попробовать и в центре небольшой кружком (напечатанный черным цветом) в центре ограничительной рамки:
Это, кажется, работает большую часть времени:
/fontheight { currentfont /FontMatrix get 3 get } bind def
/lineheight { fontheight 1.2 mul } bind def
Он не будет работать для всех /FontType
с.
Я уже ответил на это в 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
оператор.
Сохранение и восстановление графического контекста сохраняет текущую точку на месте, поэтому она не влияет на «поток» вашего документа.
Надеюсь, что я помог.
Кроме того, вы можете использовать 'currentfont/FontBBox get' для ограничивающего прямоугольника вместо использования' charpath pathbbox', чтобы получить его ... в моем случае он отлично работал под GhostScript; однако результат не был хорошим при интерпретации принтером. –
Это также не сработает, если в матрице есть Y-сдвиг. Если '/ FontMatrix get 5 get' не равно нулю, высота глифа будет зависеть от его ширины. –
, чтобы работать с большим количеством шрифтов, вам также необходимо использовать FontBBox: http://stackoverflow.com/questions/8296322/how-to-determine-height-and-depth-of-a-postscript-font/19263342#19263342 –