Wysokość linii ze znakami Unicode


23

Niektóre znaki Unicode powodują, że linia, na której są wyświetlane, jest dość duża. Na przykład poważny akcent „̀” dodaje około 2,5 linii przestrzeni powyżej i poniżej. Inne znaki, które powodują takie zachowanie, to grecka litera „ϕ” (phi) lub równa podzbiór „⫅”. Inne znaki, takie jak map-to „⤇”, dodają tylko około 0,5 wiersza po każdej stronie.

Natknąłem się na ten problem podczas czytania źródła, julia-mode.elktóre zawiera dużą liczbę takich znaków do podstawienia LaTeX.

Dlaczego tak się dzieje i czy można to naprawić?

Edycja: Używam Ubuntu 14.04 LTS z Emacsem 24.3.1. Domyślnie używam czcionki „Ubuntu Mono 13”, ale czasami inne czcionki są używane do wyświetlania znaków. Nie zainstalowałem żadnych pakietów, aby jawnie zarządzać Unicode, a ten problem można odtworzyć za pomocą polecenia emacs -Q.


3
Jest to prawdopodobnie związane z zainstalowanymi czcionkami. Pomocne może być użycie czcionki z przyzwoitą obsługą Unicode (np. DejaVu Sans Mono).
Chris

Edytuj pytanie i dodaj informacje o systemie operacyjnym, wersji Emacsa i czcionkach używanych w Emacsie.
lunaryorn

Wspomnij także, czy używasz dowolnego pakietu / polecenia do skonfigurowania Unicode. Lub po prostu używasz tego, co wyszło z pudełka.
Malabarba

Zgadzam się na czcionkę: używam DejaVu Sans Mono, a znaki Unicode są renderowane bez widocznych różnic w pionowych odstępach między wierszami.
Dan

Właściwie mam zainstalowany DejaVu Sans Mono i jest on używany do niektórych postaci, np. „Ϛ”. Wydaje się więc, że wybiera inną czcionkę dla Phi, a mianowicie „xft: -unknown-Latin Modern Math-normal-normal-normal- -17- - - - * - 0-iso10646-1”.
Patrick Steele,

Odpowiedzi:


7

Dzieje się tak, ponieważ Emacs używa różnych czcionek dla różnych części zestawu znaków Unicode. Możesz sprawdzić, która czcionka jest używana, ustawiając kursor nad znakiem i naciskając C-u C-x =. Na przykład, gdy mam konfigurację nad postacią ASCII, dostaję nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), ale dostaję ponad ⧺ nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(innymi słowy, używa Consolas dla ASCII i Symbola dla niektórych znaków specjalnych). Różne czcionki mają różne wysokości, a Emacs zawsze zapewnia wystarczająco dużo miejsca na wysokości linii, aby wyświetlić najwyższą czcionkę. Domyślnie Emacs spróbuje użyć czcionek zależnych od systemu, które działają, ale często prowadzi to do brzydkich rezultatów.

Rozwiązanie problemu wysokości linii, które znalazłem, jest niestety dość denerwujące: przeglądam problematyczne znaki, które znajduję, i używam set-fontset-fontich do ustawienia czcionki / rozmiaru, który nie wpływa na wysokość linii. Kod do tego jest dostępny w mojej konfiguracji , ale jest brzydki i wciąż nie jest idealny. Jeśli ktoś ma lepsze rozwiązanie, chciałbym go usłyszeć.


1
Myślę, że prostszym podejściem może być użycie czcionek Unicode , jak w mojej odpowiedzi; Czy to Ci pasuje?
Kirill,

@Kirill: czcionki Unicode wyglądają naprawdę interesująco, ale nie jestem pewien, czy rozwiąże ten konkretny problem bez znacznego ulepszenia (nie próbowałem, więc mogłem się mylić). Problem polega na tym, że różne czcionki o tym samym rozmiarze mają różne wysokości linii, więc każda czcionka musi być dostosowywana, aż osiągnie (w przybliżeniu) tę samą wysokość linii. Czcionki Unicode nie wyglądają na takie, które ułatwiają dostosowywanie rozmiarów czcionek.
shosti

Tak, myślę, że to prawda, ale ułatwia wybór czcionek dla całych bloków znaków, więc nie musisz samodzielnie ręcznie wyszukiwać poszczególnych znaków.
Kirill,

6

Używam trybu agda z wieloma symbolami matematycznymi i miałem ten sam problem. Kiedyś było to jedyne prawdziwe rozwiązanie, jak sugeruje @shosti: dostosowywanie mapowań czcionek. W moim przypadku musiałem wyłączyć wiele czcionek, ponieważ chociaż miałem czcionki zainstalowane ze zdefiniowanymi konkretnymi glifami, emacs często wybierał niewłaściwy (wyświetlanie pól). Wydawało się gorzej na OSX, ale widziałem to również na Linuksie. Tak więc zainstalowanie odpowiednich czcionek nie wystarczyło.

Teraz używam doskonałego pakietu czcionek Unicode firmy Roland Walker . (Polecam zainstalować go za pośrednictwem MELPA.) To prawie całkowicie wyeliminowało problem.

Umieszczam to w moim pliku init:

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

Domyślnie używam PragmataPro, ale każda inna czcionka z dobrym pokryciem również będzie działać, a jeśli zajdzie taka potrzeba, możesz dodatkowo dostosować pakiet za pomocą pakietu.


4

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-fontsi 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-chardo 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-fontsużywania Monako, dodając go do unicode-fonts-skip-fonts; każda wybrana czcionka może mieć odpowiednią wysokość. Alternatywnie możesz nakazać unicode-fontsuż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-fontsjest 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-fontkaż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-alistaby 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.


set-fontset-fontWydaje się, że rada jest jedyną faktycznie potrzebną. Musiałem tylko ewaluować np. (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")Tworzenie ramek ( window-setup-hook; aby działało emacs --daemon) i zainstalować pakiet ttf-ancient-fonts z Symbolą pod Debianem .
nberth

2

To jest błąd; jest zamocowany w bagażniku. Problem jest spowodowany złą informacją o wysokości linii dla czcionek TeX, które są tymi, do których wraca Emacs, jeśli nie może znaleźć znaku.

Wątek błędu w emacs-bug zawiera znacznie więcej informacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.