Як встановити надійний запас шрифту?


16

TL; DR: Який простий спосіб надійно сказати: використовувати консолі як шрифт за замовчуванням, FreeMono для символів, що не підтримуються консолями, та Symbola для символів, які не підтримуються обома?

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

(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

На жаль, це також змінило шрифт для деяких символів, які підтримує мій основний шрифт, тому я змінив його на

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

Якщо моє розуміння правильне, це повинно забезпечити, щоб символи, з якими консолі не впораються, обробляються FreeMono, якщо тільки у FreeMono їх немає, і в цьому випадку вони повинні відображатися за допомогою Symbola. Це також моє розуміння tробить те саме, що "fontset-default"вище.

На жаль, все ж були випадки, коли потрібний шрифт не був обраний; Я виявив, що змінюється на

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Symbola") nil 'append)

працювали краще, але не завжди: змінюючи розмір шрифту за допомогою

(set-face-attribute 'default nil :height some-size)

з-за створення нових наборів шрифтів.

Моє поточне рішення - це зробити

(set-fontset-font fontset 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font fontset 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font fontset 'unicode (font-spec :name "Symbola") nil 'append)

на кожному наборі шрифтів ( fontset-list), після кожної зміни розміру шрифту.

Який правильний спосіб встановити резервний шрифт?

Примітка . Для тестування тут є кілька математичних символів: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Посилання : Посібник Emacs щодо наборів шрифтів та модифікації наборів шрифтів


2
У мене є думка, яка насправді не вирішує вашу проблему, але - якщо вам потрібні математичні тощо символи для теорем і наукових документів, чому б ви не використовували TeX і AucTeX для цього? Це зробило б клопотання з X (або Mac чи Windows, залежно від того, що ви працюєте), резервні копії шрифтів непотрібні та нададуть вам високоякісні документи та фрагменти (наприклад, для режиму org).

Спочатку: шрифт UTF-8 з повним набором символів повинен повністю усунути вашу проблему (наприклад, GNU Unifont), і коли є вибір між необхідним шрифтом та необхідними гліфами, я б обрав останній.

2
@kuli Ви занадто песимістичні. Дивіться github.com/cpitclaudel/monospacifier
Ista

Я не можу пригадати, де я її читав, але я вважаю, що Елі Зарецький десь відповів на подібне запитання. Ви думаєте про fontsetнеправильний шлях. Emacs насправді не перевіряє наявність кожного символу, чи знає шрифт, як його відобразити чи ні. Це було б занадто обчислювально. Тож немає механізму "резервного" резервування. Ви повинні встановити шрифт за замовчуванням, а потім змінити набір шрифтів за замовчуванням вручну в певних діапазонах, щоб відображатись за допомогою різних шрифтів. Ця процедура є ручною або, можливо, пакет unicodeможе допомогти.
GenaU

@GenaU Я можу непорозуміти, але Emacs перевіряє; тільки не кожен шрифт, лише ті, що з’являються у наборі шрифтів.
Клімент

Відповіді:


0

Для тих, хто не в змозі прочитати документацію Emacs.

Вибір шрифту

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

face-font-family-alternatives

Спеціально перевірено за допомогою символів у питанні, перевіряючи символи за допомогою
describe-character. Кожен символ використовує один із безкоштовних шрифтів: Consolas, FreeMono, Symbola. Встановлення шрифту кадру на Consola set-frame-font.

Наразі 14 обґрунтованих відповідей, відповідь схвалено, і наука ЄС досі не може вирішити цю таємницю.


Спасибі! Чи розглядаєте ви розміщення цього повідомлення як відповідь на мій коментар вище, а не окремою відповіддю?
Клімент

1
(Я повинен уточнити, що я тестував також на Emacs 26, і ваша відповідь, здається, не працює: я (setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola")))тоді використовував M-x set-frame-font RET Consolas RET; символи використовують суміш консолей та символу інтерфейсу Segoe)
Клімент

Я перевірив на Manjaro Arch Linux цю послідовність: ℕ𝓟⧺ × ≠ ≥≤ ± ¬∨∧∃∀λ⟿⟹⊥⊤⊢; Я не перевіряв, що станеться, якщо якийсь шрифт не встановлений. Це можливо. Тому що назви шрифтів вводяться вручну, а не зі списку існуючих.
Олександр Карбівничий

Я перевірив усі шрифти зі встановленого списку, в emacs -Q.
Клімент

@ Clément emacs -Q варіант містить багато: --no-x-ресурсів. Можливо, проблема полягає в цьому. Для мене консолі починаються лише з цього символу: "×". І перші два "ℕ𝓟" FreeMono та Symbola.
Олександр Карбівничий

-1

M-x customize-variable face-font-family-alternatives

Є список, який виглядає приблизно так:

(("Monospace" "courier" "fixed")
 ("Monospace Serif" "Courier 10 Pitch" "Consolas" "Courier Std" "FreeMono" "courier" "fixed")
 ("courier" "CMU Typewriter Text" "fixed")
 ("Sans Serif" "helv" "helvetica" "arial" "fixed")
 ("helv" "helvetica" "arial" "fixed"))

Додайте свою послідовність у customizeбуферний інтерфейс:

("Consolas" "FreeMono" "Symbola")

Якщо задане сімейство вказане, але не існує, ця змінна визначає альтернативні сім'ї шрифтів, які слід спробувати. Кожен елемент повинен мати таку форму:

 (FAMILY ALTERNATE-FAMILIES...)

Якщо FAMILY вказана, але вона недоступна, Emacs спробує інші сім'ї, подані в ALTERNATE-FAMILIES, по черзі, поки не знайде сім'ю, яка існує.

Як користуватися face-font-family-alternatives:

У вашому буфері: M-x set-frame-font

Виберіть шрифт зі списку. Обраний шрифт визначатиме послідовність пошуку шрифту face-font-family-alternativesдля використання. У цьому прикладі консолі .

Щоб перевірити, яка сім'я шрифтів використовується для відображення символу: M-x describe-char


Спасибі! Але я не думаю, що це відповідає на питання. AFAICT, запропонована вами конфігурація використовуватиме FreeMono, якщо шрифт Consolas недоступний, але він не повернеться до FreeMono для символів, не підтримуваних Consolas.
Клімент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.