¿Cómo configuro la fuente de reserva de una manera robusta?

16

TL; DR: ¿Cuál es una manera simple de decir de manera confiable: utilizar Consolas como fuente predeterminada, FreeMono para los caracteres no compatibles con Consolas y Symbola para los caracteres no compatibles con ambos?

Como mi fuente de programación principal no cubre todos los símbolos matemáticos que necesito, inicialmente configuré la reserva de fuentes como se muestra a continuación:

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

Desafortunadamente, esto también cambió la fuente de algunos de los caracteres que admite mi fuente principal, así que la cambié a

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

Si mi comprensión es correcta, esto debería garantizar que los caracteres que Consolas no puede manejar sean manejados por FreeMono, a menos que FreeMono no los tenga, en cuyo caso deberían mostrarse usando Symbola. También tengo entendido que thace lo mismo que "fontset-default"arriba.

Desafortunadamente, todavía hubo casos en los que no se seleccionó la fuente correcta; Encontré que cambiar a

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

funcionó mejor, pero no siempre: cambiar el tamaño de fuente usando

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

causó que se ignoraran las fallas, debido a la creación de nuevos conjuntos de fuentes.

Mi solución actual es hacer

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

en cada conjunto de fuentes ( fontset-list), después de cada cambio de tamaño de fuente.

¿Cuál es la forma correcta de configurar la reserva de fuentes?

Nota : para fines de prueba, aquí hay algunos caracteres matemáticos: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Referencias : Manual de Emacs sobre conjuntos de fuentes y modificación de conjuntos de fuentes

Clemente
fuente
2
Tengo un pensamiento que realmente no resuelve su problema, pero –– si necesita los símbolos matemáticos, etc. para teoremas y documentos científicos, ¿por qué no usa TeX y AucTeX para eso? Haría innecesaria la molestia con X (o Mac o Windows, dependiendo de lo que ejecute) las fallas de fuente y le proporcionaría documentos y fragmentos de alta calidad (por ejemplo, para el modo de organización).
idea de último momento: una fuente UTF-8 con un conjunto de caracteres completo debería eliminar su problema por completo (por ejemplo, GNU Unifont), y cuando haya una opción entre una fuente elegante y los glifos requeridos, elegiría el último.
2
@kuli Eres demasiado pesimista. Ver github.com/cpitclaudel/monospacifier
Ista
No recuerdo dónde lo leí, pero creo que Eli Zaretskii respondió a una pregunta similar en alguna parte. Estás pensando de fontsetmanera incorrecta. Emacs en realidad no verifica para cada carácter que muestra si una fuente sabe cómo mostrarlo o no. Eso sería demasiado computacionalmente intensivo. Por lo tanto, no existe un mecanismo "alternativo" per se. Debe configurar su fuente predeterminada y luego modificar el conjunto de fuentes predeterminado manualmente en ciertos rangos para mostrar usando diferentes fuentes. Este procedimiento es manual o quizás el paquete unicodepueda ayudar.
GenaU
@GenaU Puedo estar malinterpretando, pero Emacs lo comprueba; simplemente no todas las fuentes, solo las que aparecen en un conjunto de fuentes.
Clément

Respuestas:

0

Para aquellos que no pueden leer la documentación de Emacs.

Selección de fuente

Antes de que Emacs pueda dibujar un personaje en una pantalla gráfica, debe seleccionar una "fuente" para ese personaje. Normalmente, Emacs elige automáticamente una fuente basada en las caras asignadas a ese carácter, específicamente, los atributos de cara ': familia', ': peso', ': inclinación' y ': ancho'. La elección de la fuente también depende del carácter que se muestre; Algunas fuentes solo pueden mostrar un conjunto limitado de caracteres. Si ninguna fuente disponible se ajusta exactamente a los requisitos, Emacs busca la "fuente coincidente más cercana". Las variables en esta sección controlan cómo Emacs realiza esta selección.

face-font-family-alternatives

Probado específicamente usando caracteres en la pregunta, verificando caracteres con
describe-character. Cada personaje usa una de las fuentes gratuitas: Consolas, FreeMono, Symbola. Configurando la fuente del marco a Consola por set-frame-font.

14 votos positivos hasta ahora, respuesta rechazada, y la ciencia de la UE todavía no puede resolver ese misterio.

Alexandr Karbivnichiy
fuente
¡Gracias! ¿Consideró publicar esto como una respuesta a mi comentario anterior, en lugar de una respuesta por separado?
Clément
1
(Debo aclarar que también probé, en Emacs 26, y su respuesta no parece funcionar: usé (setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola"))), entonces M-x set-frame-font RET Consolas RET; los personajes usan una mezcla de Consolas y Segoe UI Symbol)
Clément
Probé en Manjaro Arch Linux esta secuencia: ℕ𝓟⧺ × ≠ ≥≤ ± ¬∨∧∃∀λ⟿⟹⊥⊤⊢; No probé lo que sucede si alguna fuente no está instalada. Puede ser posible. Debido a que los nombres de fuente se ingresan manualmente, no de una lista de los existentes.
Alexandr Karbivnichiy
Probé con todas las fuentes en la lista instalada, en emacs -Q.
Clément
@ Clément emacs -Q la opción implica mucho: --no-x-resources. Tal vez el problema radica en eso. Para mí, las consolas solo comienzan con este carácter: "×". Y los dos primeros "ℕ𝓟" FreeMono y Symbola.
Alexandr Karbivnichiy
-1

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

Hay una lista que se parece a:

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

Agregue su secuencia en customizela interfaz del búfer:

("Consolas" "FreeMono" "Symbola")

Si se especifica una familia determinada pero no existe, esta variable especifica familias de fuentes alternativas para probar. Cada elemento debe tener esta forma:

 (FAMILY ALTERNATE-FAMILIES...)

Si se especifica FAMILY pero no está disponible, Emacs probará las otras familias que figuran en ALTERNATE-FAMILIES, una por una, hasta que encuentre una familia que exista.

Cómo utilizar face-font-family-alternatives:

En tu buffer: M-x set-frame-font

Elige una fuente de la lista. La fuente elegida definirá desde qué secuencia de búsqueda de fuente face-font-family-alternativesusar. En este ejemplo, Consolas .

Para verificar qué familia de fuentes se utilizó para mostrar un carácter: M-x describe-char

Alexandr Karbivnichiy
fuente
¡Gracias! Pero no creo que esto responda la pregunta. AFAICT, la configuración que sugirió utilizará FreeMono si la fuente Consolas no está disponible, pero no recurrirá a FreeMono para los caracteres no compatibles con Consolas.
Clément