Encontrando o tamanho (em pontos) do descendente de uma fonte no Ghostscript / Postscript?

1

Eu gostaria de colocar uma linha horizontal logo abaixo de algum texto. É possível determinar a distância entre a linha de base e o menor descendente de uma determinada fonte no Ghostscript, ou o comprimento descendente é apenas uma propriedade de certos caracteres e o deslocamento só pode ser encontrado a olho nu?

No meu exemplo abaixo, o comando moveto desloca o texto 20pt para 20 pontos a partir da borda superior da figura, e uma linha vertical de comprimento 20 pontos (inclusa para comparação) parece corresponder à linha de base da fonte.

gs -q -o test.pdf -sDEVICE=pdfwrite -dDEVICEWIDTHPOINTS=200 -dDEVICEHEIGHTPOINTS=100 -c "newpath 27 80 moveto 27 100 lineto 0.5 setlinewidth stroke /Helvetica findfont 20 scalefont setfont 3 80 moveto (gijlpqy) show showpage"

    
por Chris 01.01.2018 / 10:19

1 resposta

0

Se você quiser desenhar a linha logo abaixo dos descendentes de uma determinada string, você pode usar pathbbox como no link fornecido por ridgy nos comentários da sua pergunta, mas se você quiser uma distância constante da linha de base, use a caixa delimitadora de fontes FontBBox , que é um retângulo que inclui todos os caracteres da fonte.

Você precisa dimensionar isso pela FontMatrix da fonte. Você pode encontrar o código para fazer isso nesta resposta stackoverflow de jcomeau_ictx e copiado abaixo. Adicione esta definição ao início do seu código PostScript:

/descender { currentfont dup /FontBBox get           % [llx lly urx ury]
             1 get                                   % lower-left-y
             exch /FontMatrix get                    % [...]
             3 get                                   % yscale
             mul } def

e use-o depois do operador show . Ele colocará a distância y da linha de base na borda inferior da caixa delimitadora de fontes na pilha. Basta adicionar seu código de desenho de linha, por exemplo:

descender 0 exch  rmoveto  -100 0 rlineto  stroke
    
por 01.01.2018 / 20:38