У меня уже была эта проблема в другом вопросе без ответа здесь . Я ожидаю, что разные шрифты одинакового размера будут иметь одинаковую высоту, но, похоже, это не так, поэтому я покажу свой специальный подход к решению этой проблемы.
Оставляя в стороне акценты и фокусируясь только на простых символах, разные шрифты необходимы для отображения всех разных символов просто потому, что некоторые шрифты пропускают целые блоки символов, которые присутствуют в других шрифтах. Чтобы убедиться, что у необычных символов (таких как «𝚫») есть хотя бы один шрифт, установите такой шрифт, как Symbola, и просмотрите список шрифтов в файле readme пакета unicode-fonts .
Если вы установите пакет unicode-fonts
и несколько хороших шрифтов, все символы должны поддерживаться, но некоторые из них будут иметь неверную высоту отображения в emacs.
Предположим, что Монако имеет неверную высоту, но символьные символы имеют правильную высоту для математических символов (например, ПОДВОД ИЛИ РАВНО В; используйте C-x 8 RETили insert-char
для проверки различных символов.). В моем случае было недостаточно использовать Монако, символы Noto Sans и символы Apple; один хороший шрифт для меня был DejaVu Sans Mono.
Во-первых, вы можете запретить unicode-fonts
использование Монако, добавив его в unicode-fonts-skip-fonts
; какой бы шрифт он ни выбрал, следующий может иметь правильную высоту. В качестве альтернативы, вы можете указать unicode-fonts
использовать определенный шрифт для блока Unicode (например, «Математические операторы; вот список всех блоков» ), изменив запись в unicode-fonts-block-font-mapping
.
Во-вторых, вы можете легко сделать это вручную для очень точного набора символов с помощью set-fontset-font
. Если Symbola является хорошим шрифтом для математических символов (в данном случае это диапазон 0x2100..0x23ff
), должно работать следующее:
(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"))))
Другие диапазоны , которые я должен изменить себя были 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Наконец, нет необходимости искать неправильно настроенные символы вручную. Предполагая, unicode-fonts
что установлена, следующая функция сгенерирует список всех символов с неправильной высотой:
(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))))
Например:
M-: (debug-unicode-heights 'all-math)
а потом
M-: (debug-unicode-heights 'all-greek)
покажет все плохие математические символы. Затем вы можете проверить, с каким шрифтом они отображаются, и изменить его.
У меня OS X 10.9.5, поэтому мои настройки шрифта, вероятно, будут отличаться от ваших. Не нужно устанавливать unicode-fonts
; Вы можете вручную указать предпочитаемый шрифт, set-fontset-font
если обнаружите, что настройки по умолчанию в emacs не работают.
PS Есть альтернатива: когда шрифт постоянно слишком велик / мал, вы можете добавить запись, чтобы face-font-rescale-alist
emacs всегда умножал размер этого шрифта на коэффициент, скажем, 0,95, например, так:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Когда я попробовал это, это не совсем сработало (мой отчет об ошибках здесь ), но это также возможный подход.