Висота рядка з символами unicode


23

Деякі символи Unicode призводять до того, що лінія, на якій вони відображаються, досить велика. Наприклад, могильний наголос "̀" додає близько 2,5 рядків простору над і під ним. Інші символи, що спричиняють таку поведінку, включають грецьку букву "ϕ" (phi) або підмножину "⫅". Інші символи, такі як map-to "⤇", додають лише близько 0,5 рядків з обох сторін.

Я зіткнувся з цією проблемою, читаючи джерело, julia-mode.elяке містить велику кількість таких символів для заміни LaTeX.

Чому це відбувається і чи можна це виправити?

Редагувати: я використовую Ubuntu 14.04 LTS з Emacs 24.3.1. За замовчуванням я використовую шрифт "Ubuntu Mono 13", але інколи використовуються інші шрифти для відображення символів. Я не встановив жодних пакетів для явного керування unicode, і ця проблема може бути відтворена за допомогою команди emacs -Q.


3
Це, мабуть, пов’язано з встановленими шрифтами. Використання шрифту з вбудованою пристойною підтримкою Unicode (наприклад, DejaVu Sans Mono) може допомогти.
Кріс,

Відредагуйте своє запитання та додайте інформацію про вашу ОС, версію Emacs та шрифти, які ви використовуєте для Emacs.
місячник

Також згадайте, чи використовуєте ви будь-який пакет / команду для настройки unicode. Або ви просто використовуєте все, що вийшло з коробки.
Малабарба

Погодьтеся на шрифті: я використовую DejaVu Sans Mono, а символи Unicode візуалізуються без видимої різниці у вертикальному інтервалі між рядками.
Дан

У мене фактично встановлено DejaVu Sans Mono, і він використовується для деяких символів, наприклад "ϛ". Так що , здається, вибрати інший шрифт для Phi, а саме "XFT:-невідомо-Latin Modern Math-нормальний-нормальний-обичний- -17- - - - * - 0-iso10646-1".
Патрік Стіл

Відповіді:


7

Це відбувається тому, що Emacs використовує різні шрифти для різних частин набору символів Unicode. Ви можете перевірити, який шрифт використовується, розташувавши курсор над символом та натиснувши його C-u C-x =. Наприклад, мою конфігурацію над символом ASCII я отримую nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), але над ⧺ я отримую nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(іншими словами, для деяких спеціальних символів використовується консолі ASCII та Symbola). Різні шрифти мають різну висоту, і Emacs завжди надасть достатньо місця у висоті рядка для відображення найвищого шрифту. За замовчуванням Emacs намагатиметься використовувати шрифти, що залежать від системи, які працюють, але це часто призводить до неприємних результатів.

Виявлене нами рішення проблеми висоти рядків, на жаль, досить дратує: я переживаю проблемні символи, які я знаходжу, і використовую set-fontset-fontїх для встановлення шрифту / розміру, який не впливає на висоту лінії. Код для цього є в моїй конфігурації , але він некрасивий і все ще не ідеальний. Якщо хтось має краще рішення, мені було б цікаво його почути.


1
Я думаю, що більш простим підходом може бути використання шрифтів unicode , як у моїй відповіді; це працює для вас?
Кирило

@Kirill: шрифти unicode виглядають дуже цікаво, але я не впевнений, що це вирішить цю специфічну проблему без значних налаштувань (я цього не пробував, тому можу помилитися). Основна проблема полягає в тому, що різні шрифти з однаковим розміром мають різну висоту рядків, тому кожен шрифт потрібно підлаштовувати, поки він не матиме (приблизно) однакову висоту рядка. шрифти unicode не виглядають так, що це полегшує налаштування розмірів шрифту.
shosti

Так, я думаю, що це правда, але це дозволяє легко підбирати шрифти для цілих блоків символів, тому вам не потрібно самостійно шукати окремі символи вручну.
Кирило

6

Я використовую agda-режим з великою кількістю математичних символів, і у мене була така ж проблема. Раніше єдиним реальним рішенням було таке, як пропонує @shosti: налаштування відображень шрифту. У моєму випадку мені довелося вимкнути декілька шрифтів, оскільки, хоч у мене встановлені шрифти з певними гліфами, emacs часто вибирав би неправильний (відображаючи поля). На OSX це здавалося гіршим, але я бачив це і на Linux. Тож встановлення правильних шрифтів було недостатньо.

Що я зараз роблю, - це використовувати відмінний пакет шрифтів Roland Walker від Unicode . (Я рекомендую встановити його через MELPA.) Це майже повністю усунуло проблему.

Я поміщую це у свій файл init:

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

Я використовую PragmataPro за замовчуванням, але будь-який інший шрифт з хорошим покриттям також буде працювати, і ви можете додатково налаштувати речі з пакетом, якщо потрібно.


4

Я вже мав цю проблему в іншому без відповіді питання тут . Я б очікував, що різні шрифти одного розміру мають однакову висоту, але це, мабуть, не так, тому я покажу свій спеціальний підхід до виправлення цього.

Не залишаючи акценти і зосереджуючись лише на звичайних символах, різні шрифти необхідні для відображення всіх різних символів просто тому, що деякі шрифти опускають цілі блоки символів, які є в інших шрифтах. Щоб переконатися, що нечасті символи (наприклад, "𝚫") мають принаймні один шрифт для них, встановіть такий шрифт, як Symbola, і перегляньте список шрифтів у readme пакету unicode-шрифтів .

Якщо ви встановите пакет unicode-fontsі кілька хороших шрифтів, всі символи повинні бути підтримані, але деякі з них матимуть неправильні відображені висоти в emacs.

Припустимо, Монако має неправильні висоти, але, схоже, у Symbola є правильні висоти для математичних символів (наприклад, SUBSET OF OR EQUAL TO use; використання C-x 8 RETабо insert-charтестування різних символів.) У моєму випадку недостатньо використовувати Monaco, Noto Sans Symbols та Apple Symbols; одним гарним шрифтом для мене був 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)

показав би всі погані математичні символи. Потім можна вивчити, з яким шрифтом вони відображаються, та змінити його.

У мене ОС 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)

Коли я спробував це, він не дуже спрацював (мій звіт про помилку тут ), але це також можливий підхід.


Порада про, set-fontset-fontздається, єдина необхідна насправді. Мені довелося лише оцінюватися, наприклад, (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")по створенню кадру ( window-setup-hook; щоб він працював emacs --daemon) і встановити пакет ttf-ancient-fonts із символом Symbola під Debian .
nberth

2

Це клоп; він закріплений у багажнику. Проблема спричинена поганою інформацією про висоту рядків на шрифтах TeX, які, можливо, є тими, до яких Emacs повертається, якщо він не може знайти символ.

Нитка помилок на emacs-bug має набагато більше інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.