Làm cách nào để thiết lập dự phòng phông chữ một cách mạnh mẽ?


16

TL; DR: Cách đơn giản để nói một cách đáng tin cậy: sử dụng Consolas làm phông chữ mặc định, FreeMono cho các ký tự không được Consolas hỗ trợ và Symbola cho các ký tự không được cả hai hỗ trợ?

Vì phông chữ lập trình chính của tôi không bao gồm tất cả các ký hiệu toán học tôi cần, nên ban đầu tôi thiết lập dự phòng phông chữ như dưới đây:

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

Thật không may, điều này cũng thay đổi phông chữ cho một số ký tự mà phông chữ chính của tôi hỗ trợ, vì vậy tôi đã thay đổi nó thành

(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)

Nếu sự hiểu biết của tôi là chính xác, điều này sẽ đảm bảo rằng các ký tự mà Consolas không thể xử lý được FreeMono xử lý, trừ khi FreeMono không có chúng, trong trường hợp đó chúng sẽ được hiển thị bằng Symbola. Đó cũng là sự hiểu biết của tôi mà tlàm như "fontset-default"trên.

Thật không may, vẫn có trường hợp phông chữ bên phải không được chọn; Tôi thấy rằng thay đổi thành

(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)

hoạt động tốt hơn, nhưng không phải lúc nào cũng: thay đổi kích thước phông chữ bằng cách sử dụng

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

gây ra các dự phòng bị bỏ qua, do các phông chữ mới được tạo ra.

Giải pháp hiện tại của tôi là làm

(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)

trên mỗi fontset-listphông chữ ( ), sau mỗi thay đổi kích thước phông chữ.

Cách thích hợp để đặt dự phòng phông chữ là gì?

Lưu ý : cho mục đích thử nghiệm, dưới đây là một vài ký tự toán học: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Tài liệu tham khảo : Hướng dẫn sử dụng Emacs trên các phông chữsửa đổi các phông chữ


2
Tôi có một suy nghĩ không thực sự giải quyết được vấn đề của bạn, nhưng (Giá) nếu bạn cần các ký hiệu toán học v.v. cho các lý thuyết và tài liệu khoa học, tại sao bạn không sử dụng TeX và AucTeX cho điều đó? Nó sẽ gây rắc rối với X (hoặc Mac hoặc Windows, tùy thuộc vào những gì bạn chạy) dự phòng phông chữ không cần thiết và cung cấp cho bạn các tài liệu và đoạn trích chất lượng cao (ví dụ: cho chế độ org).

suy nghĩ lại: một phông chữ UTF-8 với một bộ ký tự đầy đủ sẽ loại bỏ hoàn toàn vấn đề của bạn (ví dụ: GNU Unifont) và khi có sự lựa chọn giữa phông chữ ưa thích và glyphs cần thiết, tôi sẽ chọn cái sau.

2
@kuli Bạn quá bi quan. Xem github.com/cpitclaudel/monospacifier
Ista

Tôi không thể nhớ mình đã đọc nó ở đâu, nhưng tôi tin Eli Zaretskii đã trả lời một câu hỏi tương tự ở đâu đó. Bạn đang nghĩ về fontsetmột cách sai lầm. Emacs không thực sự kiểm tra mọi ký tự mà nó hiển thị cho dù một phông chữ có biết cách hiển thị hay không. Điều đó sẽ quá chuyên sâu tính toán. Vì vậy, không có cơ chế "dự phòng" mỗi se. Bạn nên đặt phông chữ mặc định và sau đó sửa đổi phông chữ mặc định theo cách thủ công trong các phạm vi nhất định để hiển thị bằng các phông chữ khác nhau. Thủ tục này là thủ công hoặc có thể gói unicodecó thể giúp đỡ.
GenaU

@GenaU Tôi có thể hiểu nhầm, nhưng Emacs không kiểm tra; không phải mọi phông chữ, chỉ những cái xuất hiện trong một phông chữ.
Clément

Câu trả lời:


0

Đối với những người không thể đọc tài liệu của Emacs.

Lựa chọn phông chữ

Trước khi Emacs có thể vẽ một ký tự trên màn hình đồ họa, nó phải chọn một phông chữ xóa phông cho một ký tự đó. Thông thường, Emacs tự động chọn một phông chữ dựa trên các khuôn mặt được gán cho nhân vật đó, đặc biệt là các thuộc tính khuôn mặt ': gia đình', ': trọng lượng', ': nghiêng' và ': chiều rộng'. Việc lựa chọn phông chữ cũng phụ thuộc vào ký tự được hiển thị; một số phông chữ chỉ có thể hiển thị một bộ ký tự giới hạn. Nếu không có phông chữ khả dụng nào phù hợp chính xác với các yêu cầu, Emacs tìm kiếm phông chữ phù hợp gần nhất với cộng đồng. Các biến trong phần này kiểm soát cách Emacs thực hiện lựa chọn này.

face-font-family-alternatives

Kiểm tra cụ thể bằng cách sử dụng các ký tự trong câu hỏi, kiểm tra các ký tự với
describe-character. Mỗi nhân vật sử dụng một trong các phông chữ miễn phí: Consolas, FreeMono, Symbola. Đặt phông chữ khung cho Consola bằng set-frame-font.

Cho đến nay, 14 câu trả lời, trả lời bị bỏ qua, và khoa học EU vẫn không thể giải quyết được sự nhầm lẫn đó.


Cảm ơn! Bạn có xem việc đăng bài này như một phản hồi cho nhận xét của tôi ở trên, thay vào đó là một câu trả lời riêng biệt?
Clément

1
(Tôi nên làm rõ rằng tôi đã kiểm tra quá, trên Emacs 26, và câu trả lời của bạn dường như không làm việc: Tôi đã sử dụng (setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola"))), sau đó M-x set-frame-font RET Consolas RET; các nhân vật sử dụng một kết hợp của Consolas và Segoe UI Symbol)
Clément

Tôi đã thử nghiệm trên Manjaro Arch Linux trình tự này: ℕ𝓟⧺ × ≠ ±; Tôi đã không kiểm tra những gì xảy ra nếu một số phông chữ không được cài đặt. Nó có thể là có thể. Bởi vì tên phông chữ được nhập thủ công, không phải từ danh sách các tên hiện có.
Alexandr Karbivnichiy

Tôi đã thử nghiệm với tất cả các phông chữ trong danh sách được cài đặt, trong emacs -Q.
Clément

@ Clément emacs -Q tùy chọn áp đặt rất nhiều: --no-x-resource. Có lẽ vấn đề nằm ở nó. Đối với tôi, Consolas chỉ bắt đầu từ char này: "×". Và hai "ℕ𝓟" FreeMono và Symbola đầu tiên.
Alexandr Karbivnichiy

-1

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

Có một danh sách trông giống như:

(("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"))

Thêm trình tự của bạn trong customizegiao diện bộ đệm:

("Consolas" "FreeMono" "Symbola")

Nếu một họ nhất định được chỉ định nhưng không tồn tại, biến này chỉ định các họ phông chữ thay thế để thử. Mỗi yếu tố nên có dạng này:

 (FAMILY ALTERNATE-FAMILIES...)

Nếu GIA ĐÌNH được chỉ định nhưng không có sẵn, Emacs sẽ thử các gia đình khác được đưa ra trong ALTERNATE-FAMILIES, từng người một, cho đến khi tìm thấy một gia đình tồn tại.

Cách sử dụng face-font-family-alternatives :

Trong bộ đệm của bạn: M-x set-frame-font

Chọn một phông chữ từ danh sách. Phông chữ được chọn sẽ xác định trình tự tìm kiếm phông chữ nào face-font-family-alternativessẽ được sử dụng. Trong ví dụ này Consolas .

Để kiểm tra họ phông chữ nào đã được sử dụng để hiển thị một ký tự: M-x describe-char


Cảm ơn! Nhưng tôi không nghĩ rằng điều này trả lời câu hỏi. AFAICT, cấu hình bạn đề xuất sẽ sử dụng FreeMono nếu phông chữ Consolas không khả dụng, nhưng nó sẽ không trở thành FreeMono cho các ký tự không được Consolas hỗ trợ.
Clément
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.