11

現在のフォントの文字列の幅を取得できます。stringwidthこれは実際にはオフセット座標をスタックにプッシュしますが、y 値は常に役に立たないようです。ディセンダーを含む場合と含まない場合がある文字列の正確な高さを決定する方法はありますか?

4

3 に答える 3

5

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の答えから盗みます-一部のフォントは演算子をサポートしていません。

グラフィックコンテキストを保存および復元すると、現在のポイントが所定の位置に保持されるため、ドキュメントの「フロー」に影響を与えることはありません。

私が助けてくれたことを願っています。

于 2011-08-19T14:08:37.343 に答える
5

stringwidth、それが言うように、文字列の高さを返しません。(私が調べたすべてのケースで、実行後のスタックの 2 番目の整数stringwidth0-- 水平方向に実行される文字列の場合です。) stringwidtha を実行した後の currentpoint の相対座標を示し(string) showます。

PLRM は次のように述べていstringwidthます。

stringwidthによって返される幅は、現在のポイントの移動として定義されることに注意してください。グリフのアウトラインの寸法とは関係ありません。

では、文字列の高さを考慮に入れるにはどうすればよいでしょうか? PRLM で読むべき魔法の言葉はcharpathpathbboxです。これを試して:

%!
/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 の可視化

于 2010-09-13T15:10:37.293 に答える
3

これはほとんどの場合うまくいくようです:

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

すべて/FontTypeの s で機能するわけではありません。

于 2009-03-09T21:41:45.747 に答える