Możesz uzyskać szerokość łańcucha w bieżącej czcionce za pomocą stringwidth
i chociaż to faktycznie przesuwa współrzędne przesunięcia na stosie, wartość y zawsze wydaje się być bezużyteczna. Czy istnieje sposób na określenie dokładnej wysokości struny, która może, ale nie musi zawierać spękań?Jak uzyskać metrykę wysokości napisu w PostScript?
Odpowiedz
stringwidth
, jak to się mówi, nie zwraca wysokości napisu. (We wszystkich przypadkach, na które patrzyłem, druga liczba całkowita na stosie po wykonaniu stringwidth
była 0
- dla łańcuchów, które biegną w kierunku poziomym.) stringwidth
podaje względne współrzędne bieżącego punktu po wykonaniu (string) show
.
PLRM ma to znaczy o stringwidth
:
Należy zauważyć, że szerokość zwrócony przez stringwidth definiuje się jako ruch obecnego punkcie. Nie ma to nic wspólnego z wymiarami konturów glifów.
Co więc należy zrobić, aby wziąć pod uwagę wysokość sznurka? Magiczne słowa, o których można przeczytać w PRLM to: charpath
i pathbbox
. Spróbuj tego:
%!
/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
Oblicza (wydrukowanego na czerwono) wysokość napisu i wykorzystuje te informacje, aby spróbować i centrum małego wypełniony okrąg (drukowany w czerni) do centrum jego obwiedni:
To wydaje się działać większość czasu:
/fontheight { currentfont /FontMatrix get 3 get } bind def
/lineheight { fontheight 1.2 mul } bind def
To nie będzie działać dla wszystkich /FontType
s.
Odpowiedziałem już na to w How to determine string height in PostScript?, ale jest to przydatne również tutaj.
Wystarczy dodanie do pipitas odpowiedź:
/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
Sposób spodziewa się, że niektóre czcionki jest już ustawiony. Działa na wybranej czcionce (setfont
) i jej rozmiarze (scalefont
).
Używam (HÍpg), aby uzyskać największe pole graniczne możliwe, używając podkreślonych wielkich liter i znaków "poniżej linii". Wynik jest wystarczająco dobry.
Alternatywne podejście kradnie odpowiedź od dreamlax - niektóre czcionki nie obsługują operatora charpath
.
Zapisywanie i przywracanie kontekstu graficznego utrzymuje bieżący punkt w miejscu, więc nie ma wpływu na "przepływ" dokumentu.
Mam nadzieję, że pomogłem.
Dodatkowo można użyć 'currentfont/FontBBox get' dla ramki ograniczającej, zamiast używać' charpath pathbbox', aby ją pobrać ... w moim przypadku działało idealnie pod GhostScript; jednak wynik nie był dobry, gdy został zinterpretowany przez drukarkę. –
To również nie zadziała, jeśli w matrycy występuje jakiekolwiek przecięcie Y. Jeśli '/ FontMatrix get 5 get' nie jest zero, to wysokość glifu będzie zależeć od jego szerokości. –
do pracy na więcej typów czcionek, musisz również użyć FontBBox: http://stackoverflow.com/questions/8296322/how-to-determine-height-and-depth-of-a-postscript-font/19263342#19263342 –