Linuxでハルムを使う

人工言語アルカでは、表記のために、専用の文字であるハルム(hacm)を使う。ハルムのフォントとWindows用キーボードレイアウトが作者のブログで公開されており、PC上でハルムを扱えるようになっている。同等のことをLinuxで実現してみたので、手順を紹介する。

環境

何をすればよいか

必要なことは大体以下の通り。

これで、とりあえず支障なくローカルでハルムを使うことができるようになる。

文字コードの割り当て

ハルムはUnicodeその他の広く使われている文字集合に登録されていないので、なんらかの方法で独自にコードを割り当てる必要がある。配布されているフォント「明朝taphac」では、半角カタカナ、jisx0208の記号・漢字の一部、ASCIIの0x5c(バックスラッシュ)にハルムを割り当てている。これをそのまま用いることもでき、以下の利点がある。

一方、この方法の問題点は次の通り。

別の割り当てを使う場合、Unicodeの私用領域に割り当てるのが楽だろう。まとまった大きさの私用領域は、U+E000〜U+F8FFとU+F0000〜U+10FFFFの二箇所である。

フォント

フォントを用意する方法には大体次の三つの選択肢がある。

三番目の方法を自動化するためにhacm.fontforgeというfontforgeスクリプトを書いた。これは次のようにして使う。

$ fontforge hacm.fontforge -m mapfile -s taphac.ttf -b base.ttf -o out.ttf -f myhacm -n myhacm

ここでmapfileは文字コードとキーの割り当てを記述した対応ファイルで、サンプルを用意した。このコマンドを実行すると、base.ttfを元に、taphac.ttfからハルム部分を移植されたTTFフォントファイルがout.ttfという名前で生成され、このフォントのファミリー名とフォント名はmyhacmになる。-bオプションを指定しなければハルムだけを含んだフォントができる。

キーボードレイアウト

キーボードレイアウトの設定にはxkbのsymbolsファイルを使う。詳しくはAn Unreliable Guide to XKB Configurationアラビア文字 の入力; Linux でアラビア語を使うが参考になる。

gen_symbols.plは対応ファイルからsymbolsファイルを生成するPerlスクリプトである。使いかたは以下の通り。

$ perl gen_symbols.pl < mapfile > symbolsfile

こうしてできたsymbolsファイルを/usr/share/X11/xkb/symbols内に適当な名前(ここでは「arka」とする)で置き、次のコマンドを打てば、ハルムが入力できるようになる。

$ setxkbmap -symbols "pc+jp(latin)+arka:2+level3(ralt_switch)+group(alt_shift_toggle)"

ここで、「level3(ralt_switch)」の部分は、ハルムのレイアウトで特定のキーに割り当てられた四つの文字を打ち分ける際に、Shiftと右Altを使うことを指定している。右Altの代わりに左Altを使うなら、「level3(lalt_switch)」とすれば良い。他にも、menu_switch、lwin_switch、rwin_switchなどが利用できる。詳しくは/usr/share/X11/xkb/symbols/level3中のコメントを参照。

「group(alt_shift_toggle)」の部分はローマ字入力とハルム入力の切り替えの方法を指定している。この場合はAlt+Shiftで切り替えができる。ここでも他のキーの組み合わせを選ぶことができる。これについては/usr/share/X11/xkb/symbols/groupに記述がある。

上記のsetxkbmapコマンドはXを起動するたびに毎回実行する必要がある。~/.xinitrcなどを使って自動化しても良いが、/etc/X11/xorg.confに同等のことを書くこともできる。InputDeviceセクションのひとつにキーボードについての項目があって、次のような感じになっているはず。

Section "InputDevice"
	Identifier  "Keyboard1"
	Driver      "kbd"
	Option      "AutoRepeat" "500 30"

	Option      "XkbModel" "jp106"
	Option      "XkbLayout" "jp"
EndSection

これを、setxkmbap -printの出力を参考に、次のように書き換える。

Section "InputDevice"
	Identifier  "Keyboard1"
	Driver      "kbd"
	Option      "AutoRepeat" "500 30"

	Option      "XkbKeycodes" "xfree86(jp106)+aliases(qwerty)"
	Option      "XkbTypes" "complete"
	Option      "XkbCompat" "complete+japan"
	Option      "XkbSymbols" "pc+jp(latin)+arka:2+level3(ralt_switch)+group(alt_shift_toggle)"
	Option      "XkbGeometry" "pc(jp106)"
EndSection

文字幅の設定

ここまでの作業で、通常のGUIアプリケーションでハルムを使うことができるようになったはずだ。しかし、ターミナルエミュレータなどの固定幅表示を行うアプリケーションで利用するためには、文字幅(つまり、全角・半角の区別)を正しく指定する必要がある。

明朝taphacのコード割り当てをそのまま使った場合、特に調整は必要ない。一方、私用領域を使った場合や、デフォルトの全角・半角の区別に反する割り当てをした場合、設定変更が必要になる。

文字幅はロケール情報のひとつとして扱われている。文字幅の情報は/usr/share/i18n/charmaps/以下のファイルにあり、locale-genコマンドでロケールを生成する際に使われる。そのため、これを編集してからロケールを再生成することで、ロケールの文字幅を変更することができる。

/usr/share/i18n/charmaps/ディレクトリには、文字コードごとに分けられて、gzip圧縮されたテキストファイルが置かれている。中身のうち、問題になるのは「WIDTH」という行から「END WIDTH」という行までの部分で、例としてUTF-8.gzでは次のようになっている。

WIDTH
<U0300>...<U034F>       0
<U0360>...<U036F>       0
<U0483>...<U0486>       0
<U0488>...<U0489>       0
<U0591>...<U05A1>       0
(中略)
<U0001D1AA>...<U0001D1AD>       0
<U00020000>...<U0002A6D6>       2
<U0002F800>...<U0002FA1D>       2
<U000E0001>                     0
<U000E0020>...<U000E007F>       0
END WIDTH

つまり、左側にコードポイントの範囲、右側にその文字幅(0:幅なし、2:全角)が書かれている訳である。これを適当に編集し、例えばUTF-8-HACM.gzという名前で/usr/share/i18n/charmapsディレクトリに置く。

(略)
<U0001D1AA>...<U0001D1AD>       0
<U00020000>...<U0002A6D6>       2
<U0002F800>...<U0002FA1D>       2
<U000E0001>                     0
<U000E0020>...<U000E007F>       0
<U000F2740>...<U000F27e6>       2
END WIDTH

/etc/locale.genでは、ロケールの生成規則が次のようになっている。

ja_JP.UTF-8 UTF-8

これを、次のようにファイル名にあわせて書き直す。

ja_JP.UTF-8 UTF-8-HACM

あとは、locale-genコマンドを実行すれば、文字幅の変更されたロケールが使えるようになる。

# locale-gen

おまけ

テキストファイルの文字コード割り当てを変換するPerlスクリプトconvert.pl

$ perl convert.pl old_map new_map < source.txt > dest.txt

スクリーンショット