現在のフォントの文字列の幅を取得できます。stringwidth
これは実際にはオフセット座標をスタックにプッシュしますが、y 値は常に役に立たないようです。ディセンダーを含む場合と含まない場合がある文字列の正確な高さを決定する方法はありますか?
3 に答える
PostScriptで文字列の高さを決定する方法でこれにすでに答えていますか?、しかしここでも役に立ちます。
ピピタスの答えに追加するだけです:
/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)を使用して、強調された大文字と「線より下」の文字を使用して、可能な限り最大のバウンディングボックスを取得します。結果は十分です。
別のアプローチは、dreamlaxcharpath
の答えから盗みます-一部のフォントは演算子をサポートしていません。
グラフィックコンテキストを保存および復元すると、現在のポイントが所定の位置に保持されるため、ドキュメントの「フロー」に影響を与えることはありません。
私が助けてくれたことを願っています。
stringwidth
、それが言うように、文字列の高さを返しません。(私が調べたすべてのケースで、実行後のスタックの 2 番目の整数stringwidth
は0
-- 水平方向に実行される文字列の場合です。) stringwidth
a を実行した後の currentpoint の相対座標を示し(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
の s で機能するわけではありません。