13

ポストスクリプトで文字列の高さ(指定されたスケールとフォント)を決定する必要があります。

/Helvetic-Oblique findfont
10 scalefont
setfont
10 10 1 0 360 arc fill
10 10 moveto (test) dup stringwidth pop 2 div neg 0 rmoveto show

テストを水平方向(まだ垂直方向ではない)の(10,10)の中央に印刷します。(これを確認するために、10,10に小さな円も表示します)。また、テキストを垂直方向に中央揃えにするために文字列の高さを決定する必要がありますが、そのための関数が見つかりません。

4

4 に答える 4

8

使用しているPostScriptコードに精通していますか?それとも、どこかから盲目的にコピーして貼り付けただけですか?それを理解したい場合は、「PostScript言語リファレンス」または「レッドブック」または「PLRM」をグーグルで検索する必要があります。これらのリソースは、AdobeからPDFとして入手できます。

PostScriptスニペットは次の手順を使用します。

  1. (test)文字列「test」をスタックの一番上に配置します。
  2. dupスタックの一番上のアイテムを複製します。(これで、スタックに文字列が2回表示されます。)
  3. stringwidth。この演算子が実行された後、最上位の「テスト」文字列が消費され、代わりに2つの値がスタックに追加されます。文字列の高さ(最上部)と文字列の幅(上から2番目)です。[更新: 実際には、「文字列の高さ」は完全には正しくありません。文字列の描画が終了した後の現在のポイントの垂直方向のオフセットです... ]
  4. 次に、を使用しますpop。これは、スタックの最上位の値を削除するだけです。これで、文字列の幅だけがスタックの一番上に残ります。
  5. 2 divその値を2で除算し、結果(文字列幅の半分)を残します。
  6. negスタックの最上位の値を無効にします。これで、負の値がスタックの最上位になります。
  7. 0値「0」をスタックの一番上に配置します。
  8. rmoveto次に、スタックの一番上の2つの値を消費し、現在のポイントをその距離(文字列の幅の半分)だけ左に移動します。
  9. showスタックの一番下に常に残っている最初の「テスト」文字列を消費し、それを「表示」します。

では、弦の高さを考慮に入れるにはどうすればよいでしょうか。最後の行として試してください:

200 700 moveto (test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"

私の変更を理解するには、The Red Bookで、、、、、および演算子のcharpath意味を調べてくださいdivexchpathbboxrollsub

このコマンドは、Ghostscriptを使用して、コードからWindows上にPDFファイルを作成します(結果の表示と確認が簡単です)。

 gswin32c.exe ^
      -o my.pdf ^
      -sDEVICE=pdfwrite ^
      -c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"

Linuxの使用:

 gs \
      -o my.pdf \
      -sDEVICE=pdfwrite \
      -c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"

より読みやすいフォームは次のとおりです。

  gswin32c ^
     -o my.pdf ^
     -sDEVICE=pdfwrite ^
     -c "/Helvetic-Oblique findfont 10 scalefont setfont" ^
     -c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup" ^
     -c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll" ^
     -c "sub 2 div exch 200 700 moveto rmoveto show"

  gs \
     -o my.pdf \
     -sDEVICE=pdfwrite \
     -c "/Helvetic-Oblique findfont 10 scalefont setfont" \
     -c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup" \
     -c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll" \
     -c "sub 2 div exch 200 700 moveto rmoveto show"
于 2010-09-06T23:23:17.480 に答える
7

ピピタスの答えに追加するだけです:

/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の答えから盗みます-一部のフォントは演算子をサポートしていません。(PostScriptで文字列の高さメトリックを取得するにはどうすればよいですか?を参照してください) 。

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

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

于 2011-08-19T13:31:20.390 に答える
4

これは、pipitasの詳細な説明を補足するための、追い詰められた答えです。

この手順では、指定されたポイントを中心に文字列を配置して表示します。

/ceshow { % (string) fontsize fontname x y
    gsave
        moveto findfont exch scalefont setfont % s
        gsave
            dup false charpath flattenpath pathbbox % s x0 y0 x1 y1
        grestore
        3 -1 roll sub % s x0 x1 dy
        3 1 roll sub % s dy -dx
        2 div exch % s -dx/2 dy
        -2 div % s -dx/2 -dy/2
        rmoveto show
    grestore
} bind def
于 2011-09-15T03:04:25.290 に答える
2

上記の手順を絵記号フォントで使用するとひどい結果になりましたが、テキストが実際に現在の時点から始まると想定していることに気付きました。これは、場合によっては非常に不正確です。

私のソリューションも幅と高さの計算に依存しpathbboxていますが、そもそも原点に到達するためにX0とY0も使用しています。

%-- to make things nicer
/hmoveto { 0 rmoveto } def
/vmoveto { 0 exch rmoveto } def
%-- cshow means something else...
/ccshow {
    dup %-- charpath consumes the string
    gsave
    newpath %-- else there's a strange line somewhere
    0 0 moveto
    true charpath flattenpath pathbbox
    grestore
    2 index sub -2 div vmoveto
    2 index sub -2 div hmoveto
    neg vmoveto
    neg hmoveto
    show
} def
于 2016-05-29T23:18:05.380 に答える