2011-11-28 14 views
5

私はPostScriptフォントの高さ(高さのための部屋)と深さ(ディケンダーのための部屋)を推定するPostScriptコードを探しています。これにはフォントの境界ボックス(FontBBox)を使用できますか? 'PostScriptフォントの高さと奥行きを調べる方法は?

ここでは、私の質問の背景です。フォントのグリフがベースライン上にあります。明らかに、ディセンダを持つグリフはベースラインの下に届き、ベースラインのディセンダがどこまで到達できるかを知りたいので、レイアウトに十分なスペースを確保できます。

私はPostScript code that renders a given string to check its dimensionを見ました。むしろ、あるフォントの一般的な答えに興味があります。

答えて

7

まあ、すでに2つの「ショートカット」が見つかりました。 FontBBoxは、フォント内のすべてのグリフの境界ボックスを重ねて表示します。 false charpath flattenpath pathbboxは、指定された文字列のボックスを与えます。

タイプ3(ユーザー定義)フォントの場合、これはあなたが期待することができるすべてです。より一般的なタイプ1フォントでは、のフォントと「メトリック」ファイル(他のアプリケーションの場合)のメトリック情報が豊富に用意されています。

これは私があまりよく知らない部分です。ですから、私は(Adobe Type 1のマニュアルで)読み上げて、この回答を後で展開します。

編集:実際には、これらは一般的に最良の方法であるようです。

です。/ Privateディクショナリの/ BlueValuesという名前のタイプ1フォントの垂直配置値の配列です。フォントがそれらを尊重する保証はありません。アレイの最初の番号はベースラインオーバーシュートです。これはベースラインの下に落ちる「O」のような文字の下端です。アレイの最大値は、昇順のオーバーシュートまたはのキャップのオーバーシュート(どちらか高い方の値)のいずれかになります。しかし、これらの値に関係なく、個々の文字をプロットすることができます(したがって、保証はありません)。

一方、FontBBox自体は、エンコーディングベクターを介してアクセスできるかどうかにかかわらず、フォント内に存在する「特殊」文字の境界ボックスを反映することがあります(つまり、showそれらはglyphshowでなければなりません)。

おそらく、使用する予定のすべての文字の文字列をpathbboxとすることをお勧めします。これは存在するかもしれないがあなたの目的に無関係な他の文字の貢献を無視するでしょう。 flattenpathを忘れずに(実際の境界ボックスの外にある可能性がある)カーブからコントロールポイントを削除してください。

4

luser droogの答えはかなり丈夫で、私よりも堅牢だとは思えませんでしたが、標準フォントで使用可能な垂直スペースを決定する最も簡単な方法であるとは思えませんでした。newlineを作成できました。ここで私が思い付いたものです:gs test.psでそれを実行しているの

%!ps-nonconforming 
/inch {72 mul} bind def 
/Helvetica 10 selectfont 
1 inch 10 inch moveto 
/fontheight currentfont dup /FontBBox get dup 3 get % top 
exch 1 get sub % top - bottom 
exch /FontMatrix get 3 get mul def % adjusted by height multiplier 
/lineheight fontheight 1.2 mul def % add 20% for line spacing 
/newline {0 lineheight neg rmoveto} bind def % negate height to move downwards 
gsave (lineheight:) show lineheight 20 string cvs show grestore 
newline gsave (that worked!) show grestore 
showpage 

結果:、日後

ghostscript rendering of test.ps


再びこれを見て、とはOPを治療したかっ実現上昇と下降を別々に行う。ので、ここだけのディセンダーを使用しての実例です:

%!ps-nonconforming 
/inch {72 mul} bind def 
/Helvetica 30 selectfont 
1 inch 2 inch moveto 
/descender currentfont dup /FontBBox get 1 get % bottom (negative number!) 
exch /FontMatrix get 3 get mul def % adjusted by height multiplier 
% first draw a gray line at base of text 
gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore 
gsave (descender:) show descender 20 string cvs show (pixels) show grestore 
gsave 0 descender 1 sub rmoveto % one pixel below lowest descender 
7.5 inch 0 rlineto 0 setgray stroke grestore 
showpage 

gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.psの結果: line under lowest descender

関連する問題