2009-02-06 7 views
10

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

6

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:

Sample PostScript visualized

3

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.

+0

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

+0

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 –

4

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.

+0

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