フォントフォールバックを堅牢な方法で設定するにはどうすればよいですか?


16

TL; DR:確実に言う簡単な方法は何ですか:Consolasをデフォルトのフォントとして使用し、FreeMonoをConsolasでサポートされていない文字に、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)

私の理解が正しければ、これにより、Consolasが処理できない文字が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
イスタ

どこで読んだか思い出せませんが、Eli Zaretskiiはどこかで同様の質問に答えたと思います。あなたはfontset間違った方法で考えています。Emacsは、フォントが表示方法を知っているかどうかにかかわらず、実際に表示するすべての文字をチェックしません。それは計算集約的すぎるでしょう。したがって、「フォールバック」メカニズム自体はありません。デフォルトのフォントを設定してから、特定の範囲でデフォルトのフォントセットを手動で変更して、異なるフォントを使用して表示する必要があります。この手順は手動で行うか、パッケージunicodeが役立つ場合があります。
GenaU

@GenaU私は誤解しているかもしれませんが、Emacsはチェックします。すべてのフォントではなく、フォントセットに表示されるフォントのみです。
クレメント

回答:


0

Emacsのドキュメントを読むことができない人のために。

フォント選択

Emacsはグラフィカルディスプレイにキャラクターを描画する前に、そのキャラクターの「フォント」を選択する必要があります。通常、Emacsはそのキャラクターに割り当てられた顔、特に顔属性「:family」、「:weight」、「:slant」、「:width」に基づいてフォントを自動的に選択します。 フォントの選択は、表示される文字にも依存します。一部のフォントは、限られた文字セットのみを表示できます。使用可能なフォントが要件に完全に適合しない場合、Emacsは「最も近い一致フォント」を探します。 このセクションの変数は、Emacsがこの選択を行う方法を制御します。

face-font-family-alternatives

質問内の文字を使用して具体的にテストし、で文字をチェックし
describe-characterます。各キャラクターは、Consolas、FreeMono、Symbolaのいずれかのフリーフォントを使用します。でフレームフォントをConsolaに設定しset-frame-fontます。

これまでに14の賛成票があり、反対票を投じると答えますが、EUの科学はまだその謎を解決できません。


ありがとう!これを上記の私のコメントに対する回答として投稿することを検討しましたか?
クレマン

1
(私はEmacsの26日に、あまりにもテストすることを明確にすべき、とあなたの答えは動作していないよう:私が使用し(setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola")))、その後、M-x set-frame-font RET Consolas RET;文字がConsolasとのSegoe UI記号の組み合わせを使用)
クレマン

Manjaro Arch Linuxでこのシーケンスをテストしました::×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢; 一部のフォントがインストールされていない場合の動作をテストしませんでした。それは可能です。フォント名は既存のもののリストからではなく、手動で入力されるためです。
アレクサンダー

リストにあるすべてのフォントをインストールしてテストしましたemacs -Q
クレマン

@Clémentemacs -Qオプションは、-no-x-resourcesという多くの意味を含んでいます。問題はそこにあるのかもしれません。私にとって、Consolasはこの文字「×」からのみ始まります。そして、最初の2つの「ℕ𝓟」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で指定された他のファミリーを、存在するファミリーが見つかるまで1つずつ試します。

使用方法face-font-family-alternatives

バッファリング中: M-x set-frame-font

リストからフォントを選択します。選択したフォントは、使用するフォント検索シーケンスを定義face-font-family-alternativesします。この例では、Consolasです。

文字の表示に使用されたフォントファミリを確認するには: M-x describe-char


ありがとう!しかし、私はこれが質問に答えるとは思わない。AFAICT、Consolasフォントが利用できない場合、提案した構成はFreeMonoを使用しますが、Consolasでサポートされていない文字についてはFreeMonoにフォールバックしません。
クレマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.