Zeilenhöhe mit Unicode-Zeichen


23

Bei einigen Unicode-Zeichen ist die Zeile, in der sie angezeigt werden, sehr groß. Zum Beispiel fügt ein schwerwiegender Akzent "̀" etwa 2,5 Zeilen darüber und darunter hinzu. Andere Zeichen, die dieses Verhalten verursachen, umfassen den griechischen Buchstaben "ϕ" (Phi) oder die Teilmenge "⫅". Andere Zeichen wie "Zuordnen" zu "⤇" fügen auf beiden Seiten nur etwa 0,5 Zeilen hinzu.

Ich bin auf dieses Problem gestoßen, als ich die Quelle gelesen habe, die julia-mode.eleine große Anzahl solcher Zeichen für die LaTeX-Ersetzung enthält.

Warum tritt das auf und kann es behoben werden?

Edit: Ich benutze Ubuntu 14.04 LTS mit Emacs 24.3.1. Standardmäßig verwende ich die Schriftart "Ubuntu Mono 13", aber manchmal werden andere Schriftarten zum Anzeigen von Zeichen verwendet. Ich habe keine Pakete installiert, um Unicode explizit zu verwalten, und dieses Problem kann mit dem Befehl reproduziert werden emacs -Q.


3
Dies hängt wahrscheinlich mit den installierten Schriftarten zusammen. Die Verwendung einer Schriftart mit angemessener Unicode-Unterstützung (z. B. DejaVu Sans Mono) kann hilfreich sein.
Chris

Bitte bearbeiten Sie Ihre Frage und fügen Sie Informationen zu Ihrem Betriebssystem, Ihrer Emacs-Version und den für Emacs verwendeten Schriftarten hinzu.
Lunaryorn

Erwähnen Sie auch, ob Sie ein Paket / einen Befehl zum Einrichten von Unicode verwenden. Oder Sie verwenden nur das, was aus der Verpackung stammt.
Malabarba

Stimmen Sie der Schriftart zu: Ich verwende DejaVu Sans Mono und die Unicode-Zeichen werden ohne sichtbaren Unterschied im vertikalen Zeilenabstand gerendert.
Dan

Ich habe tatsächlich DejaVu Sans Mono installiert, und es wird für einige Zeichen verwendet, z. B. "ϛ". Es scheint also eine andere Schriftart für Phi auszuwählen, nämlich "xft: -unknown-Latin Modern Math-normal-normal-normal- 17- - - - * - 0-iso10646-1".
Patrick Steele

Antworten:


7

Dies liegt daran, dass Emacs unterschiedliche Schriftarten für verschiedene Teile des Unicode-Zeichensatzes verwendet. Sie können überprüfen, welche Schriftart verwendet wird, indem Sie den Cursor über ein Zeichen bewegen und auf drücken C-u C-x =. Zum Beispiel mit meiner Konfiguration über ein ASCII-Zeichen, das ich erhalte nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), aber über ein ⧺, das ich erhalte nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(mit anderen Worten, es verwendet Consolas für ASCII und Symbola für einige Sonderzeichen). Unterschiedliche Schriftarten haben unterschiedliche Höhen, und Emacs lässt in der Zeilenhöhe immer genügend Platz, um die höchste Schrift anzuzeigen. Standardmäßig versucht Emacs, systemabhängige Schriftarten zu verwenden, die funktionieren. Dies führt jedoch häufig zu hässlichen Ergebnissen.

Die Lösung, die ich für das Problem mit der Zeilenhöhe gefunden habe, ist leider ziemlich ärgerlich: Ich gehe die problematischen Zeichen durch, die ich finde, und set-fontset-fontstelle sie auf eine Schriftgröße ein, die die Zeilenhöhe nicht beeinflusst. Der Code dafür ist in meiner Konfiguration verfügbar , aber hässlich und immer noch nicht perfekt. Wenn jemand eine bessere Lösung hat, wäre ich daran interessiert, sie zu hören.


1
Ich denke, ein einfacherer Ansatz könnte darin bestehen, Unicode-Schriften zu verwenden , wie in meiner Antwort; Funktioniert das für dich?
Kirill

@Kirill: Unicode-Schriften sehen wirklich interessant aus, aber ich bin mir nicht sicher, ob sie dieses spezielle Problem lösen werden, ohne dass es zu erheblichen Optimierungen kommt (ich habe es nicht ausprobiert, also könnte ich mich irren). Das Grundproblem besteht darin, dass verschiedene Schriftarten mit derselben Größe unterschiedliche Zeilenhöhen haben. Daher muss jede Schriftart so lange optimiert werden, bis sie (ungefähr) dieselbe Zeilenhöhe hat. Unicode-Schriftarten sehen nicht so aus, als ob es einfach ist, die Schriftgrößen zu ändern.
Shosti

Ja, ich denke, das ist wahr, aber es macht es einfach, Schriften für ganze Zeichenblöcke auszuwählen, sodass Sie einzelne Zeichen nicht vollständig manuell durchsuchen müssen.
Kirill

6

Ich benutze den Agda-Modus mit vielen mathematischen Symbolen und hatte das gleiche Problem. Früher war die einzige echte Lösung, wie @shosti vorschlägt: Anpassen der Schriftzuordnungen. In meinem Fall musste ich eine Reihe von Schriftarten deaktivieren, da Emacs, obwohl bestimmte Glyphen installiert waren, häufig die falsche auswählten (Anzeigefelder). Unter OSX schien es schlimmer zu sein, aber ich habe es auch unter Linux gesehen. Es reichte also nicht aus, nur die richtigen Schriftarten zu installieren.

Was ich jetzt mache, ist das exzellente Unicode-Font- Paket von Roland Walker . (Ich würde empfehlen, es über MELPA zu installieren.) Dies hat das Problem so gut wie vollständig beseitigt.

Ich füge dies in meine Init-Datei ein:

(unicode-fonts-setup)
(set-frame-font "PragmataPro 12")

Ich verwende standardmäßig PragmataPro, aber jede andere Schriftart mit guter Abdeckung funktioniert auch, und Sie können die Dinge bei Bedarf mit dem Paket weiter anpassen.


4

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-fontsund 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-fontsVerwendung 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-fontsinstalliert 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-fontwenn 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.


Der Rat über set-fontset-fontscheint der einzige zu sein, der tatsächlich benötigt wird. Ich musste zum Beispiel nur (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")bei der Frame-Erstellung auswerten ( window-setup-hook; damit es funktioniert emacs --daemon) und das Paket ttf-ancient-fonts mit Symbola unter Debian installieren .
6.

2

Das ist ein Fehler; es ist im Kofferraum befestigt. Das Problem wird durch falsche Zeilenhöheninformationen bei TeX-Schriftarten verursacht, auf die Emacs zurückgreift, wenn kein Zeichen gefunden wird.

Der Bug-Thread auf Emacs-Bug hat eine Menge mehr Infos.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.