Ich hatte dieses Problem bereits in einer anderen unbeantworteten Frage hier . Ich würde erwarten, dass verschiedene Schriftarten bei gleicher Größe die gleiche Höhe haben, aber dies scheint nicht der Fall zu sein, daher werde ich meinen Ad-hoc-Ansatz zeigen, um dies zu beheben.
Abgesehen von Akzenten und der Konzentration auf einfache Zeichen sind unterschiedliche Schriftarten erforderlich, um alle unterschiedlichen Zeichen anzuzeigen, da bei einigen Schriftarten ganze Zeichenblöcke weggelassen werden, die in anderen Schriftarten vorhanden sind. Installieren Sie eine Schriftart wie Symbola und lesen Sie die Liste der Schriftarten in der Readme-Datei des Unicode-Fonts- Pakets, um sicherzustellen, dass für ungewöhnliche Zeichen (z. B. "𝚫") mindestens eine Schriftart vorhanden ist .
Wenn Sie das Paket unicode-fonts
und eine Reihe guter Schriftarten installieren , sollten alle Zeichen unterstützt werden, aber einige haben in Emacs falsche Anzeigehöhen.
Angenommen, Monaco hat falsche Höhen, aber Symbola scheint die richtigen Höhen für mathematische Symbole zu haben (z. B. SUBSET OF C-x 8 REToder EQUAL TO; verwenden Sie oder insert-char
, um verschiedene Zeichen zu testen.). In meinem Fall waren Noto Sans Symbols und Apple Symbols ausreichend, wenn Monaco nicht verwendet wurde. Eine gute Schriftart für mich war DejaVu Sans Mono.
Das erste ist, dass Sie die unicode-fonts
Verwendung von Monaco verbieten können, indem Sie es hinzufügen unicode-fonts-skip-fonts
. Welche Schriftart auch immer als nächstes ausgewählt wird, sie hat möglicherweise die richtige Höhe. Alternativ können Sie festlegen unicode-fonts
, dass für einen Unicode-Block eine bestimmte Schriftart verwendet werden soll (z. B. Mathematische Operatoren; hier ist eine Liste aller Blöcke ), indem Sie einen Eintrag von ändern unicode-fonts-block-font-mapping
.
Das zweite ist, dass Sie dies einfach manuell für einen sehr präzisen Zeichensatz tun können, indem Sie verwenden set-fontset-font
. Wenn Symbola eine gute Schriftart für mathematische Symbole ist (in diesem Fall der Bereich 0x2100..0x23ff
), sollte Folgendes funktionieren:
(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"))))
Andere Bereiche musste ich mich ändern waren 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Schließlich ist es nicht erforderlich, von Hand nach falsch konfigurierten Zeichen zu suchen. Vorausgesetzt, dass unicode-fonts
installiert ist, generiert die folgende Funktion eine Liste aller Zeichen mit falschen Höhen:
(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))))
Beispielsweise:
M-: (debug-unicode-heights 'all-math)
und dann
M-: (debug-unicode-heights 'all-greek)
würde alle schlechten mathematischen Symbole zeigen. Sie können dann überprüfen, mit welcher Schriftart sie angezeigt werden, und sie ändern.
Ich habe OS X 10.9.5, daher würden sich meine Schrifteinstellungen wahrscheinlich von Ihren unterscheiden. Es ist nicht erforderlich, zu installieren unicode-fonts
; Sie können Ihre bevorzugten Schriftarten auch manuell festlegen, set-fontset-font
wenn Sie feststellen, dass die Standardeinstellungen von emacs nicht gut funktionieren.
PS Es gibt eine Alternative: Wenn eine Schrift durchweg zu groß / klein ist, können Sie einen Eintrag hinzufügen face-font-rescale-alist
, um Emacs anzuweisen, die Schriftgröße immer mit einem Faktor von beispielsweise 0,95 zu multiplizieren:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Als ich das ausprobiert habe, hat es nicht ganz richtig funktioniert (mein Fehlerbericht ist hier ), aber dies ist auch ein möglicher Ansatz.