Come si può ottenere la metrica altezza di una stringa in PostScript?
-
21-08-2019 - |
Domanda
È possibile ottenere la larghezza di una stringa del font corrente con stringwidth
e anche se questo effettivamente spinge compensato coordinate in pila, il valore y sembra sempre essere inutile. C'è un modo per determinare l'altezza esatta di una stringa, che può o non può includere discendenti?
Soluzione
stringwidth
, come si dice, non restituisce l'altezza della stringa. (In ogni caso ho guardato, il secondo intero in pila dopo l'esecuzione 0
era (string) show
-. Stringhe che corrono in direzione orizzontale) charpath
dà le coordinate relative del currentpoint dopo l'esecuzione di un pathbbox
.
Il PLRM ha questo da dire su <=>:
Si noti che la larghezza restituito da stringwidth è definito come il movimento della corrente punto. Non ha nulla a che fare con le dimensioni dei contorni dei glifi.
Quindi, quello che avrebbe funzionato per tenere conto l'altezza della corda? Le parole magiche di leggere circa in PRLM sono <=> e <=>. Prova questo:
%!
/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
Si calcola della stringa (stampati nel colore rosso) di altezza e usa queste informazioni per cercare di centro di un piccolo cerchio pieno (stampato in nero) nel centro del suo rettangolo di selezione:
Altri suggerimenti
Ho già risposto a questa in Come determinare l'altezza stringa nel PostScript? , ma è utile anche qui.
Basta aggiungere a pipitas Risposta:
/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
Il metodo si aspetta che qualche tipo di carattere è già impostato. Funziona sopra il font selezionato (setfont
) e le sue dimensioni (scalefont
).
Io uso (HÍpg) per ottenere il più grande riquadro possibile, utilizzando caratteri maiuscoli accentuati e caratteri "sotto la linea". Il risultato è abbastanza buono.
L'approccio alternativo ruba da dreamlax 's risposta -. Alcuni font non supportano charpath
operatore
Salvataggio e ripristino del contesto grafico mantiene il punto corrente a posto, quindi non ha alcun impatto sul "flusso" del documento.
Speranza ho aiutato.
Questo sembra funzionare la maggior parte del tempo:
/fontheight { currentfont /FontMatrix get 3 get } bind def
/lineheight { fontheight 1.2 mul } bind def
Non funzionerà per tutti i /FontType
s.