2009-02-06 14 views
10

Sie können die Breite eines Strings in der aktuellen Schriftart mit stringwidth erhalten und obwohl dies Offset-Koordinaten tatsächlich auf dem Stapel verschiebt, scheint der y-Wert immer nutzlos. Gibt es eine Möglichkeit, die genaue Höhe einer Schnur zu bestimmen, die Unterlängen enthalten kann oder nicht?Wie können Sie die Höhe einer Zeichenfolge in PostScript erhalten?

Antwort

6

stringwidth, wie es heißt, gibt die Stringhöhe nicht zurück. (In allen Fällen sah ich, die zweite Ganzzahl auf dem Stapel nach der Ausführung stringwidth war 0 - für Zeichenfolgen, die in horizontaler Richtung laufen.) stringwidth gibt die relativen Koordinaten des aktuellen Punkts nach der Ausführung einer (string) show.

Die PLRM hat folgendes zu sagen über stringwidth:

anzumerken, dass die Breite von stringwidth zurück als Bewegung des aktuellen Punkt definiert ist. Es hat nichts mit den Dimensionen der Glyphenumrisse zu tun.

Also was würde funktionieren, um die Höhe der Zeichenfolge zu berücksichtigen? Die magischen Wörter in PRLM sind charpath und pathbbox. Versuchen Sie folgendes:

%! 
/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 

Es liegt in dem String berechnet (rot markierten) Höhe und verwendet diese Informationen, um zu versuchen und in der Mitte einen kleinen gefüllten Kreis (in schwarz gedruckt) in die Mitte des Begrenzungsrahmens:

Sample PostScript visualized

3

Dies scheint die meiste Zeit zu arbeiten:

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

Es wird nicht für alle /FontType s zu arbeiten.

+0

Dies funktioniert auch nicht, wenn Y-Schere in der Matrix ist. Wenn '/ FontMatrix get 5 get 'nicht Null ist, hängt die Höhe eines Glyphs von seiner Breite ab. –

+0

für mehr Schriftart Arten arbeiten müssen Sie auch FontBBox verwenden: http://StackOverflow.com/Questions/8296322/How-To-Determine-Height-and-Depth-of-Apostscript-Font/19263342#19263342 –

4

Ich habe dies bereits in How to determine string height in PostScript? beantwortet, aber es ist auch hier nützlich.

gerade hinzufügen zu pipitas Antwort:

/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 

Das Verfahren geht davon aus, dass einige Schriftarten bereits gesetzt sind. Es funktioniert über die ausgewählte Schriftart (setfont) und ihre Größe (scalefont).

Ich benutze (HÍpg), um die größtmögliche Bounding-Box zu bekommen, mit akzentuierten Großbuchstaben und "Unterstrich" -Zeichen. Das Ergebnis ist gut genug.

Der alternative Ansatz stiehlt von dreamlax 's Antwort - einige Schriftarten unterstützen charpath Operator nicht.

Durch das Speichern und Wiederherstellen des Grafikkontexts bleibt der aktuelle Punkt erhalten, sodass er keinen Einfluss auf den "Fluss" Ihres Dokuments hat.

Ich hoffe, ich habe geholfen.

+0

Zusätzlich können Sie 'currentfont/FontBBox get' für die Bounding Box verwenden, anstatt die' charpath pathbbox' zu verwenden, um sie zu bekommen ... in meinem Fall funktionierte es perfekt unter GhostScript; Das Ergebnis war jedoch nicht gut, wenn es vom Drucker interpretiert wurde. –