TL; DR: Qual é uma maneira simples de dizer com segurança: use o Consolas como a fonte padrão, o FreeMono para os caracteres não suportados pelo Consolas e o Symbola para os caracteres não suportados pelos dois?
Como minha fonte principal de programação não cobre todos os símbolos matemáticos de que preciso, configurei inicialmente o fallback da fonte, como mostrado abaixo:
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
Infelizmente, isso também mudou a fonte de alguns dos caracteres que minha fonte principal suporta, então mudei para
(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)
Se meu entendimento estiver correto, isso deve garantir que os caracteres que Consolas não podem manipular sejam manipulados pelo FreeMono, a menos que o FreeMono não os possua, caso em que devem ser exibidos usando o Symbola. Também entendo que t
faz o mesmo que "fontset-default"
acima.
Infelizmente, ainda havia casos em que a fonte correta não foi selecionada; Eu descobri que mudar para
(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)
funcionou melhor, mas nem sempre: alterar o tamanho da fonte usando
(set-face-attribute 'default nil :height some-size)
fez com que os fallbacks fossem ignorados devido à criação de novos conjuntos de fontes.
Minha solução atual é fazer
(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)
em cada conjunto de fontes ( fontset-list
), após cada alteração no tamanho da fonte.
Qual é a maneira correta de definir fallback de fonte?
Nota : para fins de teste, aqui estão alguns caracteres matemáticos: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Referências : Manual do Emacs sobre conjuntos de fontes e modificação de conjuntos de fontes
fontset
da maneira errada. O Emacs, na verdade, não verifica cada caractere exibido, se uma fonte sabe como exibi-lo ou não. Isso seria muito computacionalmente intensivo. Portanto, não existe um mecanismo de "fallback" em si. Você deve definir sua fonte padrão e modificar o conjunto de fontes padrão manualmente em determinados intervalos para exibir usando fontes diferentes. Este procedimento é manual ou talvez o pacoteunicode
possa ajudar.Respostas:
Para quem não consegue ler a documentação do Emacs.
Seleção de fonte
face-font-family-alternatives
Testado especificamente usando caracteres na pergunta, verificando caracteres com
describe-character
. Cada personagem usa uma das fontes gratuitas: Consolas, FreeMono, Symbola. Definindo a fonte do quadro como Consola porset-frame-font
.Até o momento, 14 votos positivos, resposta com votos negativos, e a ciência da UE ainda não consegue resolver esse mistério.
fonte
(setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola")))
entãoM-x set-frame-font RET Consolas RET
; os personagens usam uma mistura de símbolo de interface do usuário do console e do Segoe)emacs -Q
.M-x customize-variable
face-font-family-alternatives
Há uma lista que se parece com:
Adicione sua sequência na
customize
interface do buffer:Como usar
face-font-family-alternatives
:No seu buffer: M-x set-frame-font
Escolha uma fonte da lista. A fonte escolhida definirá qual sequência de pesquisa de fontes
face-font-family-alternatives
usar. Neste exemplo, Consolas .Para verificar qual família de fontes foi usada para exibir um caractere: M-x describe-char
fonte