-

Carbon Emacsの(脱carbon-font)フォント設定

Carbon Emacs Package で carbon-font.el を使わずフォントをいろいろ試したメモです。

なぜ carbon-font を使わないかというと

  • carbon-font (+ fixed-width-fontset) では、文字幅が漢字がASCIIの2文字分を取るようになるが、日本語とASCIIで高さが合わなくなる。(日本語がある行*だけ*行間が高くなる。間延びに見えたりちぐはぐに見えたりする。)
  • 個人的には ASCII:漢字 = 1:2 にそこまでこだわる必要はないと思っている。プログラムではあんまり日本語書かない。
  • M+ OUTLINE FONTS がなぜか使えなかった

Macemacsjp-MLで、「行の高さをそろえたければ fixed-width-set-default-fontset は使わない方がよい」というのを目にしたので取りかかってみた。
(が、ムズい。書くために調べること多杉。)

いろいろ調べるために使う関数(説明は C-h f で調べる):

  • x-list-fonts
  • x-font-family-list
  • describe-fontset
  • list-fontsets
  • list-character-sets

*scratch* で書いては試し、の繰り返しで組み立てていきます。

以下に、コード書き向けの設定をいくつか。
(japanese-jisx0208とkatakana-jisx0201以外の文字集合での指定は必要になったらする。たぶん必要にならない。)

以下のスクリーンショットでは mac-allow-anti-aliasing は t。

Consolas + ヒラギノ角ゴ

ASCII:漢字 は 1:2 ではない。

  ;; fontset-consolas
  (create-fontset-from-mac-roman-font
   "-apple-consolas-medium-r-normal--14-*-*-*-m-0-mac-roman" nil "consolas")
  (set-fontset-font "fontset-consolas" 'japanese-jisx0208
                    '("ヒラギノ角ゴ pro w3" . "jisx0208.1983"))
  (set-fontset-font "fontset-consolas" 'katakana-jisx0201
                    '("ヒラギノ角ゴ pro w3" . "jisx0201.1976"))


Bitstream Vera Sans Mono + ヒラギノ角ゴ

  ;; fontset-bitstream
  (create-fontset-from-mac-roman-font
   "-apple-bitstream vera sans mono-medium-r-normal--13-*-*-*-*-*-iso10646-1" nil "bitstream")
  (set-fontset-font "fontset-bitstream" 'japanese-jisx0208
                    '("ヒラギノ角ゴ pro w3" . "jisx0208.1983"))
  (set-fontset-font "fontset-bitstream" 'katakana-jisx0201
                    '("ヒラギノ角ゴ pro w3" . "jisx0201.1976"))

ASCII:漢字 は 1:2 ではない。


Monaco + ヒラギノ角ゴ

  (create-fontset-from-mac-roman-font
   "-apple-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1" nil "monaco")
  (set-fontset-font "fontset-monaco" 'japanese-jisx0208
                    '("ヒラギノ角ゴ pro w3" . "jisx0208.1983"))
  (set-fontset-font "fontset-monaco" 'katakana-jisx0201
                    '("ヒラギノ角ゴ pro w3" . "jisx0201.1976"))

ASCII:漢字 は 1:2 ではない。(この組合せで幅の比を 1:2 にしたかったら carbon-font で。)


M+ 1m light + 漢字はヒラギノ角ゴ

  (create-fontset-from-mac-roman-font
   "-apple-m+ 1m-medium-r-normal--14-*-*-*-*-*-iso10646-1" nil "mplus")
  (set-fontset-font "fontset-mplus" 'japanese-jisx0208
                    '("m+ 1m light" . "iso10646"))
  (set-fontset-font "fontset-mplus" (cons (make-char 'japanese-jisx0208 #x30 #x20)
                                          (make-char 'japanese-jisx0208 #x74 #x7f))
                    '("ヒラギノ角ゴ pro w3" . "jisx0208.1983"))
  (set-fontset-font "fontset-mplus" 'katakana-jisx0201
                    '("m+ 1m light" . "iso10646"))

ASCII:漢字 は 1:2。


  • japanese-jisx0208 の m+ 1m light の指定で、素直に '("m+ 1m light" . "jisx0208.1983") と書くと、全角文字が半角の幅になってしまい文字どうしが重なって乱れる。(これはFirefoxでM+を指定しても同じ現象になる。)"iso10646" にしたら幅が正しくなる。
  • JIS X 0208のM+にない範囲(漢字)は、明示的に別のを指定すると、boldも使える。漢字の範囲を特に指定しなくても、自動で合成されて漢字の表示はできるが、テキストがboldになったとき、ひらがなやカタカナだけが太字になって汚い。
  • M+で表示される文字とヒラギノ角ゴで表示される文字で、文字の下のラインがずれて多少でこぼこしている。ぎりぎり許容範囲か。文字を大きくすると目立つ。(下のスクリーンショットを参照)


ASCIIだけ M+ 1m

  ;; fontset-asciimplus
  (create-fontset-from-mac-roman-font
   "-apple-m+ 1m-medium-r-normal--14-*-*-*-*-*-iso10646-1" nil "asciimplus")
  (set-fontset-font "fontset-asciimplus" 'japanese-jisx0208
                    '("ヒラギノ角ゴ pro w3" . "jisx0208.1983"))
  (set-fontset-font "fontset-asciimplus" 'katakana-jisx0201
                    '("ヒラギノ角ゴ pro w3" . "jisx0201.1976"))

ASCII:漢字 は 1:2。


作ったfontsetを使う

default-frame-alist に fontset を指定する。M-xで使えるような関数にしてみた。

  (defun my-set-default-fontset (fontset)
    (interactive                        ; borrowed from describe-fontset code
     (if (not (and window-system (fboundp 'fontset-list)))
         (error "No fontsets being used")
       (let ((fontset-list (nconc
                            (fontset-list)
                            (mapcar 'cdr fontset-alias-alist)))
             (completion-ignore-case t))
         (list (completing-read
                "Fontset: "
                fontset-list nil t "fontset-")))))
    (let ((old (assoc 'font default-frame-alist)))
      (if old (setcdr old fontset)
        (add-to-list 'default-frame-alist (cons 'font fontset))))
    (set-frame-font fontset))

上の関数を使って、実際に使うfontsetを指定するには次のように書くか、 M-x my-set-default-fontset を実行する。

  (my-set-default-fontset "fontset-mplus")

M+ outline font が癒し系なので、基本はこれで行くことにしてみた。まあ、どれでも、プログラムを書くのには十分見やすい感じなので、上の設定は全部書いて、気分で変えたりしている。

Lisp

役に立った本。

Emacs 辞典 (DESKTOP REFERENCE)

Emacs 辞典 (DESKTOP REFERENCE)

文字コード・フォントに1章ぶんがまるまる使われている。その前のLisp入門の章も、見たことのある関数に一通り解説があるのでざっと目を通していると、 elisp が分かってくる気がする。(ちょっと誤植が目立つ気も)
最近、目がカッコに慣れてきた気がする。