Eu já tive esse problema em uma pergunta não respondida diferente aqui . Eu esperaria que fontes diferentes do mesmo tamanho tivessem as mesmas alturas, mas isso não parece ser o caso, então mostrarei minha abordagem ad-hoc para corrigir isso.
Deixando de lado os acentos e concentrando-se apenas em caracteres simples, são necessárias fontes diferentes para exibir todos os caracteres diferentes, simplesmente porque algumas fontes omitem blocos inteiros de caracteres presentes em outras fontes. Para garantir que caracteres incomuns (como "𝚫") tenham pelo menos uma fonte para eles, instale uma fonte como Symbola e consulte a lista de fontes no leia-me do pacote unicode-fonts .
Se você instalar o pacote unicode-fonts
e várias fontes boas, todos os caracteres deverão ser suportados, mas alguns terão alturas de exibição incorretas no emacs.
Suponha que Mônaco tenha alturas incorretas, mas Symbola pareça ter alturas corretas para símbolos matemáticos (como SUBSET DE OU IGUAL A ⊆; use C-x 8 RETou insert-char
para testar caracteres diferentes.). No meu caso, não usar Mônaco, Noto Sans Symbols e Apple Symbols foi suficiente; uma boa fonte para mim foi o DejaVu Sans Mono.
A primeira coisa é que você pode proibir o unicode-fonts
uso do Mônaco adicionando-o ao unicode-fonts-skip-fonts
; qualquer fonte que selecionar a seguir pode ter a altura certa. Como alternativa, você pode dizer unicode-fonts
para usar uma fonte específica para um bloco Unicode (como Operadores Matemáticos; aqui está uma lista de todos os blocos ) modificando uma entrada de unicode-fonts-block-font-mapping
.
A segunda é que você pode fazer isso facilmente manualmente para obter um conjunto muito preciso de caracteres usando set-fontset-font
. Se Symbola é uma boa fonte para símbolos matemáticos (nesse caso, o intervalo 0x2100..0x23ff
), o seguinte deve funcionar:
(set-fontset-font t '(#x2100 . #x23ff)
;; this should throw an error if there is no such font
(font-xlfd-name (find-font (font-spec :family "Symbola"))))
Outras faixas que eu precisava modificar me foram 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Por fim, não é necessário procurar caracteres mal configurados manualmente. Supondo que unicode-fonts
esteja instalado, a seguinte função gerará uma lista de todos os caracteres com alturas incorretas:
(defun debug-unicode-heights (&optional block-name)
"Find all characters in a given block that have incorrect heights.
BLOCK-NAME can be anything that
`unicode-fonts-debug-insert-block' accepts, such as `'all-math',
or a string naming a Unicode block."
(interactive "sBlock name:")
(unless block-name (setq block-name 'all-math))
(let ((buffer (generate-new-buffer (format "debug-unicode-heights:%s" block-name)))
expected-height
bad-characters)
(pop-to-buffer buffer)
(with-current-buffer buffer
(unicode-fonts-debug-insert-block block-name)
(goto-char (point-min))
(setq expected-height (line-pixel-height))
;; (message "Expected height %d" expected-height)
(while (< (point) (point-max))
(if (or (= (line-pixel-height) expected-height)
;; Some characters are invalid, they have no name
;; (their name is just their hex code), and their
;; heights do not matter to us.
(looking-at-p "^.[^\"]*\"#"))
(delete-region (line-beginning-position)
(1+ (line-end-position)))
(push (char-after (line-beginning-position)) bad-characters)
(forward-line))))
;; (display-message-or-buffer buffer)
(apply #'string (reverse bad-characters))))
Por exemplo:
M-: (debug-unicode-heights 'all-math)
e depois
M-: (debug-unicode-heights 'all-greek)
mostraria todos os maus símbolos matemáticos. Você pode examinar com qual fonte eles são exibidos e alterá-lo.
Eu tenho o OS X 10.9.5, então minhas configurações de fonte provavelmente serão diferentes das suas. Não é necessário instalar unicode-fonts
; é possível especificar manualmente suas opções de fonte preferidas inteiramente, set-fontset-font
sempre que você achar que as opções padrão do emacs não funcionam bem.
PS Existe uma alternativa: quando uma fonte é consistentemente muito grande / pequena, você pode adicionar uma entrada face-font-rescale-alist
para informar ao emacs para sempre multiplicar o tamanho dessa fonte por um fator de, por exemplo, 0,95, da seguinte forma:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Quando tentei isso, não funcionou direito (meu relatório de erros está aqui ), mas essa também é uma abordagem possível.