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
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:
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.
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.
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. –
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. –
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 –