Miałem już ten problem w innym pytaniu bez odpowiedzi tutaj . Spodziewałbym się, że różne czcionki o tym samym rozmiarze będą miały tę samą wysokość, ale wydaje się, że tak nie jest, więc pokażę moje ad hoc podejście do rozwiązania tego problemu.
Pomijając akcenty i skupiając się tylko na zwykłych znakach, różne czcionki są konieczne do wyświetlenia wszystkich różnych znaków po prostu dlatego, że niektóre czcionki pomijają całe bloki znaków obecnych w innych czcionkach. Aby upewnić się, że nietypowe znaki (takie jak „𝚫”) mają dla nich co najmniej jedną czcionkę, zainstaluj czcionkę taką jak Symbola i zobacz listę czcionek w pliku Readme pakietu czcionek Unicode .
Jeśli zainstalujesz pakiet unicode-fonts
i kilka dobrych czcionek, wszystkie znaki powinny być obsługiwane, ale niektóre będą miały nieprawidłowo wyświetlane wysokości w emacs.
Załóżmy, że Monako ma nieprawidłowe wysokości, ale wydaje się, że Symbola ma prawidłowe wysokości dla symboli matematycznych (takich jak SUBSET OF OR EQUAL TO ⊆; użyj C-x 8 RETlub insert-char
do testowania różnych znaków.). W moim przypadku niewystarczające było użycie Monako, symboli Noto Sans i symboli Apple; jedną dobrą czcionką dla mnie była DejaVu Sans Mono.
Pierwszą rzeczą jest to, że możesz zabronić unicode-fonts
używania Monako, dodając go do unicode-fonts-skip-fonts
; każda wybrana czcionka może mieć odpowiednią wysokość. Alternatywnie możesz nakazać unicode-fonts
użycie określonej czcionki dla bloku Unicode (takiego jak Operatory matematyczne; tutaj jest lista wszystkich bloków ) poprzez modyfikację wpisu unicode-fonts-block-font-mapping
.
Po drugie, możesz łatwo to zrobić ręcznie, używając bardzo precyzyjnego zestawu znaków set-fontset-font
. Jeśli Symbola jest dobrą czcionką dla symboli matematycznych (w tym przypadku zakres 0x2100..0x23ff
), powinny działać:
(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"))))
Inne zakresy musiałem zmodyfikować sobie były 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Wreszcie nie trzeba ręcznie wyszukiwać źle skonfigurowanych znaków. Zakładając, że unicode-fonts
jest zainstalowany, następująca funkcja wygeneruje listę wszystkich znaków o nieprawidłowej wysokości:
(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))))
Na przykład:
M-: (debug-unicode-heights 'all-math)
i wtedy
M-: (debug-unicode-heights 'all-greek)
pokaże wszystkie złe symbole matematyczne. Następnie możesz sprawdzić, za pomocą której czcionki są wyświetlane, i zmienić ją.
Mam OS X 10.9.5, więc moje ustawienia czcionek prawdopodobnie będą inne niż twoje. Instalacja nie jest konieczna unicode-fonts
; możliwe jest ręczne ręczne wybranie preferowanych czcionek za set-fontset-font
każdym razem, gdy okaże się, że domyślne wybory emacsa nie działają dobrze.
PS Istnieje alternatywa: gdy czcionka jest stale zbyt duża / mała, możesz dodać wpis, face-font-rescale-alist
aby powiedzieć emacsowi, aby zawsze pomnożył rozmiar tej czcionki przez, powiedzmy, 0,95, tak jak:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Kiedy spróbowałem, nie działało to dobrze (mój raport o błędach jest tutaj ), ale jest to również możliwe podejście.