Por que a altura da fonte muda quando está em negrito?

9

É tão irritante...

Quando qualquer texto em uma linha tem seu rosto alterado para que o texto fique em negrito, a altura da linha aumenta (presumo) um único pixel. É melhor mostrado com uma imagem:

insira a descrição da imagem aqui

Por que é isso? Como evito isso?


Conforme solicitado, informações na plataforma:

  • Debian GNU / Linux sid (instável) em amd64
  • O Emacs usa libgtk-3.so.0 (gtk 3.14.5), no XFCE 4.12

Eu tentei as seguintes fontes nos 8pt, 9pt, 10pt e 11pt:

  • DejaVu Sans Mono
  • DejaVu Sans
  • DejaVu Serif
  • Droid Sans Mono
  • Liberation Mono

O problema ocorre apenas com o DejaVu Sans Mono e o DejaVu Sans, e apenas nos 9 e 10. (A imagem acima mostra DejaVu Sans Mono-9.)

edam
fonte
2
Você deve observar os atributos de face do exemplo de desfuncionamento antes de colocar um espaço e, em seguida, novamente em cada palavra depois de colocar um espaço entre desfuncionar e exemplo . Isso é feito colocando o cursor no ponto desejado e digitando C-u C-x =. Você provavelmente descobrirá que o rosto que afeta o desfecho ou o exemplo que afeta o rosto têm atributos diferentes que são responsáveis ​​pelo comportamento que você vê - por exemplo, além da cor básica do primeiro plano. Os atributos de face podem ser personalizados pelo usuário.
lawlist
Você poderia adicionar seu sistema operacional e gerenciador de janelas à sua pergunta e algumas informações sobre qual GUI seu Emacs usa (por exemplo, Gtk2, Gtk3, etc.)?
lunaryorn
@lawlist: obrigado cara. Com o espaço, ele tem a fonte-lock-function-name-face aplicada, que possui uma altura não especificada (portanto, presumo o padrão?). Sem o espaço, não há rosto aplicado (então, novamente, presumo o padrão?) O padrão é definido no meu tema para :height 90(9pt).
Edam
@lawlist: mais algumas investigações .... no tema, se eu remover / adicionar / remover / adicionar o :weight boldde font-lock-function-name-face(e executar novamente o custom-theme-set-facescomando do tema ), posso ver a altura da defunlinha mudar em 1px! É definitivamente o atributo arrojado que está causando isso, eu acho.
21815
Meu palpite, com base nos seus comentários, seria que a família de fontes que você escolheu possui uma altura diferente para atributos em negrito, de modo que não poderá ser alterada a menos que você a reduza manualmente - tentativa e erro, reduzindo lentamente o tamanho do ponto. Como alternativa, escolha uma família que não mude de altura quando o negrito for aplicado. Pessoalmente, não uso mais negrito ou sublinhado em nenhum dos meus temas personalizados por vários motivos relacionados aos efeitos visuais no buffer - quando crio um sublinhado para a linha atual, ele é feito com uma sobreposição. Para negrito, eu simplesmente usar cores fortes - por exemplo, magenta, amarelo, ...
lawlist

Respostas:

2

A altura da fonte é alterada no DejaVu nesse tamanho de ponto, porque as informações de altura da fonte entre as duas fontes normal e negrito são diferentes quando devem ser as mesmas.

A fonte DejaVu Sans Mono 10 que eu uso não altera a altura da fonte entre o peso normal e o negrito. Coloquei isso no meu .emacs com(set-frame-font "DejaVu Sans Mono-10")

Então você tem algo para comparar, as informações da fonte "DejaVu Sans 10" via (info-fonte no Emacs 25):

(font-info "DejaVu Sans Mono-10")
["-unknown-DejaVu Sans Mono-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1" 
"DejaVu Sans Mono:pixelsize=13:foundry=unknown:weight=normal:slant=normal:
width=normal:spacing=100:scalable=true" 13 17 0 0 0 8 13 4 8 8 
"/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf" (opentype ((DFLT ...) )))]

EDIT com base em informações subsequentes:

Nas informações da fonte acima, mostro uma altura de fonte 17 e você relata uma altura de 15 (normal) ou 16 (negrito). No emacs 25, há informações adicionais sobre a fonte após esses 3 0, em particular a descida da fonte é 4.

Embora eu não tenha problemas no Emacs 24 ou 25 com o DejaVu Sans Mono e a variante Negrito, a coisa mais simples é usar uma fonte e um tamanho que não alterem a largura (como mostrado pelas informações da fonte) entre normal e negrito ou algo diferente do DejaVu.

Quanto ao que está causando isso, pode ser uma das suas bibliotecas (meu gtk é libgtk-x11-2.0.so.0), mas duvido que seja essa biblioteca específica. Também duvide que seja o arquivo ou pacote ttf. O mais provável é a renderização do tipo livre (eu tenho libfreetype.so.6). Como o DejaVu é dimensionado, assim como as outras fontes que funcionam para você, um erro de computação associado à maneira como o DejaVu foi escrito explicaria por que eles funcionam em alguns tamanhos, mas não em outros.

Para verificar se o problema é específico do Emacs ou não, você pode abrir duas janelas de terminal, uma com um prompt em negrito e outra sem e comparar o espaçamento entre as linhas. Se for diferente do Emacs, isso tem a ver com a renderização e / ou fonte.

Se você compilou o emacs, pode haver algo acontecendo lá.

rochoso
fonte
Isso não funcionou ... (eu estava usando o DejaVu Sans Mono-9BTW). Eu vou atualizar a descrição acima ...
edam
A fonte da linha de modo é a mesma. Mono 10 exibe o mesmo comportamento, mas 8 e 11pr não! Deve haver algo a ver com a renderização da fonte e uma altura de linha diferente sendo retornada para normal e negrito. O Emacs usa o fontconfig?
Edam
11
O Emacs não utiliza fontconfig e geralmente é único quando se trata de seleção de glifos.
wasamasa
(font-info "DejaVu Sans Mono-10")me dá ["-unknown-DejaVu Sans Mono-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1" "DejaVu Sans Mono:pixelsize=13:foundry=unknown:weight=normal:slant=normal:width=normal:spacing=100:scalable=true" 13 15 0 0 0]. Eu também tenho fonts-dejavu-coreinstalado, e também ttf-dejavu-core. Ambos fornecem um DejaVuSansMono.ttf(em diretórios diferentes, mas são arquivos idênticos, então não vejo que isso importe). Também recebo Height: 98da cara (ao usar o DajaVu Sans Mono-10, que exibe o problema acima). Estou aberto a mais sugestões! :)
edam
Observe que alguns dos parâmetros de informações da fonte são diferentes. Eu tenho "13 17 ..." enquanto você tem "13 15 ..". E se você receber informações sobre a fonte de ajuda para a função, verá que a primeira diferença 17 (eu) versus 15 (você) é a altura. Portanto, tente alterar a altura para 17. #
30815 rochoso