« ^ »

Emacsの文字とフォント

所要時間: 約 7分

Emacsは様々な事を行えるけれど、本来はテキストエディタであって、ファイルを画面に表示し、ファイルのデータを書き換える事が役目だったりする。文字の表示にはフォントのデータを使用する。当たり前の事と言えば当たり前の事だ。他のテキストエディタも、他のツールでもフォントを使用する。

しかしEmacsではフォントの変更ですらハマり込む事がある。他のツールでは、こんな所で躓く事は普通はない。この原因はどこにあるのだろう。もちろんユーザーインターフェースの問題や古い仕様を引きずっているからという事も影響しているかもしれない。ただEmacsを使っていると、その柔軟性と対応する環境の広さのようなものを感じる事がある。今回はフォントやフォントセットや文字集合などの情報を頭の中で整理しながら、この事について考えてみようと思う。

フォントをインストールする

フォントを使いたければ、既にインストールされているフォントを使うか、もしくはフォントをインストールする必要がある。私はmacOSを使っていて予めフォントはインストールされている。ただ等幅が良かったり細かな好みがあったりする。今までには以下のフォントを使っていた。最終的には白源に落ち着いた。

  • Menlo
  • Symbola
  • 游ゴシック
  • 游明朝体36ポかな
  • 源ノ等幅 (Source Han Mono)
  • 白源

白源のインストールは白源のリポジトリに記載されている1。私はmacOSを使っているのでHomeBrewでインストールした。

フォントを設定する

インストールしたフォントを使うには、使わせるための設定をする必要がある。Emacsのフォントの設定は混乱しがちで、鬼門と言われたりもする。

GUIでの設定

GUIでEmacsを使っている場合、GUI経由でフォントを設定できる。これは特に難しい事はなくて、他のGUI製のテキストエディタやツールと同じように、アプリケーションのメニューからフォントを設定する。以下のWeb記事では、GUIでのフォントの設定とEmacs Lispでのフォントの設定について紹介している。

https://aoe-tk.hatenablog.com/entry/2019/02/25/000154

ここでは、その設定方法については割愛する。必要があれば上記のWeb記事を参照すれば良いし、もし参照しなくても何となく設定できるんじゃないかなとも思う。

Emacs Lispでのフォントの設定

先程のGUIで行った設定も、結局はEmacs Lispとして保存されるのだけれど、それを直接初期化ファイルに記述する事でフォントを設定できる。まずは私が今が使っているフォント関連の設定を掲載する。

(create-fontset-from-fontset-spec "-*-HackGen Console NF-*-*-*-*-18-*-*-*-*-*-fontset-sym3")

(set-fontset-font "fontset-sym3" 'unicode "-*-HackGen Console NF-*-*-*-*-19-*-*-*-m-0-iso10646-1")
(set-fontset-font "fontset-sym3" '(#x1F300 . #xFFFFF) "-*-Apple Color Emoji-*-*-*-*-15-*-*-*-p-0-iso10646-1")
(set-fontset-font "fontset-sym3" '(#x263A . #x263A) "-*-Apple Color Emoji-*-*-*-*-20-*-*-*-*-0-iso10646-1")

(set-fontset-font "fontset-sym3" ?🀄 "-*-Apple Color Emoji-*-*-*-*-15-*-*-*-p-0-iso10646-1")

(set-frame-parameter nil 'font "fontset-sym3")
(add-to-list 'default-frame-alist '(font . "fontset-sym3"))

create-fontset-from-fontset-spec でフォントセットを作成し、 set-fontset-font で作成したフォントセットをカスタマイズしていく。そして set-frame-parameter で現在のフレームで使用するフォントセットを指定し、最後に default-frame-alist という連想リストに、フォントセットを設定する事で、新しく生成するフレームにもフォントが適応されるようにしている。

フォントには HackGen Console NFApple Color Emoji を使うように指定している。 HackGen Console NF は白源の事だ。 Apple Color Emoji はmacOSにデフォルトでインストールされているフォントで🧸 等の絵文字が収録されている。

等幅フォントを使いたい

フォントで大切な事は等幅である事じゃないかなと思う。つまり所謂半角文字の文字幅が全て同じである事、所謂全角が半角の2倍の文字幅になっている事だ。

可変幅フォントでは文字毎に文字幅が異なる。Wikipediaには次の記述がある2

ラテン文字「i」とラテン文字「w」では文字の幅が異なり、ただ並べるだけで読みやすい単語が印字できるようになっている。

wikipedia:プロポーショナルフォントを引用

"並べるだけで読みやすい単語が印字できる"らしい。本当にそうだろうか。初期のフォントはきっと固定幅だった気がする。それを見にくいと感じる人がいて、可変幅フォントが作られたんだろう。Wikipediaにもそう書いてある。正直、あまり見やすくなっているように思えないし、むしろ見にくくなっているようにも思える。これは主観的なものであって、慣れの問題だと思う。

文字毎に文字幅が同じになるフォントは等幅フォントと呼ばれる。プログラミングをするような人は等幅を使う人が多いと思う。文章をWordやExcelといったツールで記述しない事が多くて、素のファイルに直接記述する事が多い。プログラムのソースコードやドキュメントも、そうやって記述する事が多いだろう。そういったファイルでは、行頭から何文字目で整列させるといった事を良く行う。例えば次のような感じだ。

abc # 行頭から5文字目で整列させる。
de  # さらに次の行も5文字目で整列する。

a, b, c, d, eの文字の幅がそれぞれ異なると、5文字目以降で整列していた部分が崩れてしまう。だから文字の幅が均一な等幅フォントを使う。等幅フォントは文字の幅が一定だから、当然このケースでは整列される。そのためできるかぎり等幅フォントを使いたい。

表示で類似文字の違いが分かるか

文字によっては形状が似ているものがある。例えば数字の1とアルファベットの小文字のlは、似たような縦棒という形状でフォントによっては見分けが付かない。そういった文字を、きちんと見わけが付くようにしてあるフォントもあるため、そういったものを使いたい。以下の表は、見た目に違いを見るために、似たような形状の文字を羅列してある。これを見ながら、フォントを選んでいる。

類似文字
l I 1
o O 0
q 9
s S 5
x X
z Z 2
一 ―

特殊な文字の幅が合うかとorg-modeの表組みが崩れないか

等幅フォントを常に使える訳ではない。特に特殊な日本語、記号、絵文字などの文字は等幅フォントが無い事がある。また、そういった文字の中には文字幅が半角1文字の場合と2文字の場合とあり、更に文字幅の取り決めがない。Unicodeには文字幅についての明確な規定はなく、日本語圏では全角として表示している文字も、英語圏では半角の文字幅として扱っているものがある。そのため全角として扱って表組みしたテキストが、他のフォントでは表組みが崩れるといった事態になる。このあたりの帳尻を合わせるためにフォントを調整している。

org-modeは適当に表組みした後にTABキーを押すと、表内の文字数と文字幅を計算し、必要な半角空白を埋めて表を組み直す事ができる。とても便利な機能ではあるけれど、これが完全には合わなかったりする。

以下の表は、ある記事を参考に文字の表示ずれ確認用に改変して使用している3

ずれ確認用
半角40字、全角20字
AIUEOaiueoAIUEOaiueoASCII英字
12345678901234567890ASCII英字
アイウエオアイウエオアイウエオアイウエオJIS X 0201カナ
あいうえおあいうえおJIS X 0208ひらがな
アイウエオアイウエオ同カタカナ
𠀋𡈽𡌛𡑮𡢽𠀋𡈽𡌛𡑮𡢽JIS X 0213漢字
一一一一一一一一一一
――――――――――――――――――――
😃😇😍😜😸😃😇😍😜😸絵文字
🙈🐺🐰👽🐉🙈🐺🐰👽🐉
💰🏡🎅🍪🍕💰🏡🎅🍪🍕
🚀🚻💩📷📦🚀🚻💩📷📦
☺☺☺☺☺☺☺☺☺☺絵文字
🀄🀄🀄🀄🀄🀄🀄🀄🀄🀄
AAAAAAAAAA
亜亜亜亜亜亜亜亜亜亜
ABCDEABCDE同英字
亜唖娃阿哀亜唖娃阿哀同漢字
🀅🀅🀅🀅🀅🀅🀅🀅🀅🀅🀅🀅
🀅🀆🀇🀈🀅🀅🀆🀇🀈🀅

3

元は https://qiita.com/query1000/items/4b0b8db872adc1a5e2e9V から抜粋した物を改変して使っていた。残念な事に元記事は無くなってしまっていた。