Jun 07, 2010

Emacsでの全Xフォントの表示を画像化してみた

Emacsで使える色々なX Windowのフォントを、実際にEmacsで表示したらどうなるかを一覧形式で見てみたくなって、自動的にフォントを切り替えながらウィンドウイメージを画像ファイルに保存するEmacs Lispのコードを作った。

コード(elisp)
結果の抜粋
 "tt-数字"の先はTrueType(要xft、Emacs23で表示したもの)
 "tt-noaa"とあるのはTrueTypeの中のアンチエイリアスされないフォント(xft不要、Emacs22で表示したもの)
 それ以外はビットマップフォント

上記コードを実行して、


本日は晴天で酷暑あるいは氷雪でブリザードなり。

のようなバッファを表示した状態でM-x captureなどとして実行すると、次々にフォントが切り替わって画像ファイルに保存されていく。ウィンドウイメージのキャプチャーにはImageMagickのimportコマンドを使用している。
キャプチャー画像からサンプル文字列だけを抜き出すのは、同じくImageMagickのconvertコマンドを使って、シェルスクリプトで一括変換した。
例:
foreach i (*.tif)
convert -crop 700x80+60+30 $i -trim `basename $i .tif`.png
end

Trim(autocrop)できる範囲を切り出せるように、文字列部分の上下左右にたっぷりと余白を取っておくのがコツである。

キャプチャー画像を.tifで保存しているのは、convertで-trimする時に画像圧縮によるノイズに邪魔されないようにするためである。もう少しがんばって、elispで文字列の表示位置を特定してそこだけキャプチャーするようにできればかなりいい感じなのだが、そこまでするためのelispの関数を調べ切れなかった。(というか、なんとなく不可能な気がする。文字列部分を特定して切り出すImageMagickのコマンドをelispに埋め込む方が有望かも)

See more ...

Posted at 00:34 in UNIX | WriteBacks (0)
WriteBacks

Jun 06, 2010

(FreeBSD 7.3) Emacsで多言語フォント表示

FreeBSD 7.3のpackagesの
・ar-ae_fonts1_ttf-1.1_2
・gnu-unifont-ttf-20080907
・indic-ttf-fonts-0.5.6
・junicode-0.6.17
をインストールし、.emacs.elにて

(set-fontset-font (frame-parameter nil 'font)
'ethiopic
(font-spec :family "Goha\-Tibeb Zemen"))

することにより、Emacs23でM-x view-hello-fileすると
HELLO in various languages
ここまで表示されるようになった。

See more ...

Posted at 00:21 in UNIX | WriteBacks (0)
WriteBacks

Jun 02, 2010

EmacsのX Windowフォントの設定方法(3)

次に、X resourcesでEmacsのフォントセットの定義を行ってみる。
今回は、Emacs22用の定義を~/.Xdefaultsに書いた。~/.Xresourcesでも良い。筆者の環境では.XdefaultsはEmacs起動の度に、.XresourcesはXセッション起動時のみ読み込まれ、両方ある場合は.Xdefaultsが無視される。全ユーザー共通の設定なら/usr/X11R6/lib/X11/app-defaults/以下のファイルに書いても良い。それらを以下、リソースファイルと呼ぶ。

説明の前に、リソースファイルでのEmacsのフォントセットの定義の例を示す。(ascii文字は東雲(しののめ)フォント、日本語は東風(こち)フォントにする例)

Emacs.Fontset-0: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-kochi16g,\
katakana-jisx0201:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*,\
japanese-jisx0208:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*
Emacs.Fontset-1: -shinonome-mincho-medium-r-normal--16-*-*-*-*-*-fontset-kochi16m,\
japanese-jisx0208:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*,\
katakana-jisx0201:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*

1つのフォントセットの定義は次のようなフォーマットで書く。
Emacs.Fontset-[n]: (asciiのフォント名)-fontset-(フォントセット名),\
 (文字セット名): (フォント名),\
 (文字セット名): (フォント名)...

まずフォント名であるが、筆者のFreeBSD 7.3のEmacs22はxftをサポートしていないので、フォント名は全て、ハイフンで区切られた14個のフィールドからなる、XLFD(X Logical Font Definition)表記である。XftをサポートしているEmacsではxftのフォント名を用いた別の書き方があるのかも知れないが、筆者は今の所知らない。Xftをサポートしている筆者のEmacs23でも、elispのx-list-fontsを実行するとEmacsで使用可能なフォントのリストがXLFD形式で得られるので、X Window上のEmacsのフォント設定において、XLFDと縁が切れることは当分無いと思う。
幸いにして、フォント指定時はXLFDのほとんどのフィールドにワイルドカードが使えるので、全てのフィールドを理解する必要は無い。大体、
-(フォント名)-(ファミリー)-(medium/bold)-(r/i)-normal-*-(サイズ)-*-*-*-*-*-(文字セット名)-(Encoding)
で十分と思う。mediumは通常、boldは太字、rは通常、iは斜体(Italic)である。文字セット名以降の部分は、iso8859-1ならそのまま(1がEncodingの部分)だが、jisx0208の場合はjisx0208.1983-0のようにjisx0208の後にピリオドとさらなる情報があり、さらにEncodingが0だったり1だったり2だったりするので、面倒ならjisx0208.*-*と指定するのが良い。

1行目の[n]の部分は、0から始まる連番でなければならない。Emacs.Fontset-1以上しか無ければ1つも有効にならないし、0,1,2と4以上しか無ければ0,1,2の分しか有効にならない。(過去には連番でなくてもいい方法があったような気がするが、Emacs22のInfoには見つけられなかった)

1行目のasciiのフォント名の部分は、"iso8859-1"の代わりに"fontset-(フォントセット名)"と書く。これにより、新たなフォントセットが定義される。実際のasciiのフォントは、"fontset-(フォントセット名)"の部分を"iso8859-1"に置換されたものが使われる。
iso8859-1に限らず、"fontset-(フォントセット名)"の部分を*-*にして該当する全ての(Emacsがサポートする)文字セットのフォントが、そのフォントセットのデフォルトとして使われるようである。例えば、

Emacs.Fontset-2: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-shinonome16

と書くと、iso-8859-1のみでなく、jisx0208やjisx0201についても東雲フォントが使われるようになる。
従って、1行目のasciiのフォント設定だけで足りることもある。その場合は、2行目以降と1行目のカンマ以降は不要である。

最初の例(東雲フォントと東風フォントの例)のように、特定の文字セットに対してasciiのフォントとは別のフォントを指定する時は、"(文字セット名): (フォント名)"という形式で、カンマで区切って書く。次の行に書く場合は(XLFDなら普通次の行に書くであろう)、行末に"\"(バックスラッシュ)を置いて次の行に書く。
Emacsがサポートする文字セット名は、M-x list-character-setsとすると調べられる(Emacs22以前ならM-x describe-fontsetの出力でもわかる)。
同じ行の\の後(改行コードの前)には何も書いてはいけない(直後の改行文字をエスケープするためのものであるため)。カンマの前にはスペースを入れてはいけないが、カンマの後ろなら良い。コロンも同様である。

リソースファイルへのフォントセットの定義が済んだら、それが読み込まれる状態で(自動的に読み込まれないならXを再起動するなりxrdb -mergeするなりして)Emacsを起動して確認する。最初からデフォルトのフォントを定義したフォントセットにするのは、フォントセットの定義に誤りがあるとEmacsが起動しないことがあるので、避けた方がいいと思う。
Emacsのウィンドウ上でShift+左クリックでポップアップメニューを開き、"Fontset"のメニューに定義したフォントセットが出てこなければ失敗である。
Fontsetメニューに出てきて選択可能でも、成功しているとは限らない。定義に問題があると、フォントが切り替わっても、フォントセットの定義がそのまま使われず、自動的にフォントセットが再構築されてしまうことがある。定義通りになっているかどうかは、そのフォントセットに切り替え、定義に関係する全文字セットの最低1文字ずつを含むファイルを開いた後、M-x describe-fontsetして確認する。もし、1行目に出てくるフォントセット名が、定義した名前でなく"fontset-default"や"fontset-auto??"となっていると、失敗している可能性が高い。そこはクリアしていても、一部の文字セットのフォントが正しく読まれていないかも知れないので、[]内のワイルドカードが展開されたフォント名をそれぞれ確認すると良いと思う。

1行目のmedium/bold、r/iの別は、フォントセット名と共に、フォントセットを区別する情報として用いられる。同じフォントセット名に対して、medium-r, bold-r, medium-i, bold-iのそれぞれのフォントセットを定義することが可能であり、そのようにすると、同じバッファにレギュラー体とイタリック体、細字と太字が混在する時も、それらの全てのフォントセットを設定することができる(1つのバッファに指定できるフォントセット名は1つであり、そのフォントセット名のmedium-rのフォントとかbold-rのフォントとかが使われる)。
残念ながら、medium/boldやr/iの部分を*にして、(medium/bold)-(r/i)の4通りのフォントセットを1つのEmacs.Fontset-[n]にまとめて定義することはできないようである。従って、同じフォントセット名で(medium/bold)-(r/i)の4通りを定義するには、Emacs.Fontset-[n]が4つ必要になる。
例:

Emacs.Fontset-20: -kappa-*-medium-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-21: -kappa-*-medium-i-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-22: -kappa-*-bold-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-23: -kappa-*-bold-i-normal--20-*-*-*-*-*-fontset-kappa

今回、筆者がFreeBSD 7.3のpackagesで手当り次第に日本語のフォントをインストールして、Emacs22で使えそうなフォントを、リソースファイルにフォントセット定義として色々登録してみたものを、参考までに添付する。
リソースファイルへの記述例
Emacs.Fontset-0〜3は、intlfontsというパッケージに含まれるサンプルをそのまま使用したものである。それ以降は、筆者が主に16〜20ドットを使うので、その範囲のサイズを重点的に定義している。

参考:Emacs InfoのDefining fontsetsの章

See more ...

Posted at 22:39 in UNIX | WriteBacks (0)
WriteBacks