Ghostscript / Postscriptでフォントディセンダーのサイズをポイント単位で探しますか?

Ghostscript / Postscriptでフォントディセンダーのサイズをポイント単位で探しますか?

いくつかのテキストのすぐ下に水平線を配置したいと思います。 Ghostscriptで与えられたフォントのベースラインと最も低いディセンダとの間の距離を決定することは可能ですか?それとも、ディセンダの長さは特定の文字の属性にすぎず、オフセットは目でしか見つかりませんか?

次の例では、movetoコマンドはグラフィックの上端から20ポイントのテキストを移動し、20ポイントの垂直線(比較のために含まれている)がフォントのベースラインに対応するように見えます。

gs -q -o test.pdf -sDEVICE=pdfwrite -dDEVICEWIDTHPOINTS=200 -dDEVICEHEIGHTPOINTS=100 -c "newpath 27 80 moveto 27 100 lineto 0.5 setlinewidth ストローク /Helvetica findlet ) ディスプレイページの表示」

答え1

指定された文字列の下降部分の下に線を描画するには、pathbbox質問コメントにRidgyによって提供されたリンクを使用できますが、ベースラインから一定の距離を維持するには、フォント境界FontBBoxボックスを使用する必要があります。これは、フォントの長方形のすべての文字を囲むことです。

フォントサイズに合わせてサイズを変更する必要がありますFontMatrix。これを行うコードはここにあります。スタックオーバーフローjcomeau_ictxの答えが以下にコピーされました。 PostScriptコードの先頭に次の定義を追加します。

/descender { currentfont dup /FontBBox get           % [llx lly urx ury]
             1 get                                   % lower-left-y
             exch /FontMatrix get                    % [...]
             3 get                                   % yscale
             mul } def

演算子の後に使用してくださいshow。ベースラインからフォント境界ボックスの下端までのy距離をスタックに配置します。ここに線画コードを追加するだけです。たとえば、次のようになります。

descender 0 exch  rmoveto  -100 0 rlineto  stroke

関連情報