Time-stamp: "Nov 14 2003"

Emacs and Dictionary

Emacs の中で使用できる電子辞書の使い方・設定方法について

説明

Unix で使用されているテキストエディタ Emacs から電子辞書を引くことができます。
利点:

この電子辞書の使い方、設定方法を説明します。

扱う対象

ここで扱う電子辞書は CD-ROM の形態で販売されていたものです。

これを Red Hat Linux 7.3/Emacs21.2 の環境で使用します。 といっても実際には WindowsXP から putty というtelnet/sshソフトで Linux に接続して コンソールから使用しています。

Emacs21.3 on putty on WindowsXP

辞書のインストール

辞書を HDD に入れます。 置き場所は /home/i/local/dict 以下にしました。

1. 必要なソフトウェアをインストールする

使用するソフトウェア 8 つを列挙します。

このうち、srd-fpw はインストールする必要がありません。 ほかの 7 つのファイルはすべてインストールする必要があります。

しかしパッケージを 7 つも個別にインストールするのは私には面倒でした。 そこでソフトウェアをすべて一括して自動的に ダウンロード・rpm 作成・インストールしてしまうスクリプトを作成しました。

edict-rpmbuild.sh.txt (2003-11-12)

RedHatLinux 7.1/7.2/7.3 で確認していますが、特に難しいことはしていないので RedHatLinux 9 でも動くんではないかと思います。

使用方法:

$ sh edict-rpmbuild.sh.txt 2>&1 | tee edict.log

スクリプトの実行が終わったらうまくインストールできなかったパッケージが表示されるはずです。 そのソフトに関しては、spec ファイルを修正して rpm 作り直しとか、rpm にせずにインストールとか いろいろ対策を講じてください。

スクリプトに関する注意点

sudo できる必要がある

rpm をインストールするとき /usr/bin とかにファイルをコピーするので root 権限が必要になります。 このスクリプトはその場合 sudo を使用して 一時的に root 権限を得ています。 そのため、スクリプトを動作させるユーザは sudo を使えるようにしておいてください。 設定方法は root になってから

# visudo

を実行して ユーザ名 ALL=NOPASSWD: ALL
と書き込めば OK です。
sudo の設定なんて面倒だという場合、別の方法として このスクリプトを実行するとき root ユーザになってもうまく動作するはずです。

ユーザのホームディレクトリにファイルを作成する

ユーザのホームディレクトリに .rpmmacros というファイルと rpmdir というディレクトリを自動的に作成します。これらは、rpm をインストールし終わった後そのまま残るので、気になる場合手動で削除してください。ちなみに作成した rpmパッケージは rpmdir/RPMS/i386/ の下に置かれています。

スクリプト実行中に一度止まる

lookup パッケージを作成しているときに Select coding system (default euc-jp): と聞かれて とまります。単にエンターキーを押せば再び動きだします。 スクリプトの実行はとめたくなかったんですが、その方法がわかりませんでした。 ~/rpmdir/BUILD/lookup-1/texi/Makefile の中の emacs --batch のところで聞かれているとこまではわかったのですが。 Emacs20.7 (RedHatLinux7.2) だと止まらなかったので Emacs21 の問題のようです。

2) 辞書 CD-ROM をハードディスクにコピーしていろいろする

大辞林

この CD-ROM の中身は元々 EPWING 形式なので、CD-ROM のファイルを HDD にコピーしてそのまま使用できます。ですがここではデータを削減してみようと思います。

squeeze コマンドを使用して ファイル容量を削減します。画像・音声データなどの項目が削除されます。 削除項目の指定もできますが、特に指定せずデフォルトで問題ありません。

squeeze コマンドのマニュアルはテキストファイルになっています。rpm でインストールした場合、 $ rpm -qf `which squeeze` として squeeze が何のパッケージに含まれているか調べ (epwutil とわかります)、次に $ rpm -ql epwutil としてどこにインストールされたか調べて、そのファイルを読めばよいです。

$ mkdir -p local/dict/dgx01/dgx01/data
$ squeeze /mnt/cdrom/dgx01/data/honmon local/dict/dgx01/dgx01/data/honmon

catdump コマンドで catalogs ファイルを修正しました。これは外字の 16 ピクセル以外を削除しただけですのであまりファイルサイズ削減には役に立ちませんが。

$ cp -p /mnt/cdrom/catalogs local/dict/dgx01/
$ catdump catalogs > catalogs.txt
$ vi catalogs.txt
$ rm catalogs
$ catdump -u catalogs.txt catalogs

これで OK です。 元のファイル容量は 330M バイトくらいでしたが、117M バイトに減りました。ebzip コマンドで圧縮すればさらに減らせますが、今回はおこないません。

研究社 新英和・和英中辞典

工程は大辞林と同じです。元のファイル容量 550M バイトが 119M バイトになりました。

$ mkdir -p ~/local/dict/chujiten/chujiten/data
$ squeeze /mnt/cdrom/chujiten/data/honmon ~/local/dict/chujiten/chujiten/data/honmon
$ cp -pr /mnt/cdrom/chujiten/gaiji ~/local/dict/chujiten/
$ rm ~/local/dict/chujiten/gaiji/gai[234]*

$ catdump catalogs >l; catalogs.txt
$ vi catalogs.txt
$ rm catalogs
$ catdump -u catalogs.txt catalogs

catdump コマンドのところですが、今回の catalogs ファイルは少し複雑ですのでどこを修正したかわかる diff を載せときます。

--- catalogs.txt.org	Sun Nov  9 22:34:10 2003
+++ catalogs.txt	Sun Nov  9 22:38:22 2003
@@ -3,30 +3,15 @@
 [Catalog]
 FileName   = catalogs
 Type       = EPWING2
-Books      = 3
-BookSelect = 3
+Books      = 1
+BookSelect = 1
 
 [Book]
 BookType   = 2002 (20:英和辞典, 02:EPWING2)
 Title      = "研究社 新英和・和英中辞典"
 Directory  = "CHUJITEN"
 InfoBlock  = 0001
-ZenGaiji   = "GAI16F00GAI24F00GAI30F00GAI48F00"
-HanGaiji   = "GAI16H00GAI24H00GAI30H00GAI48H00"
+ZenGaiji   = "GAI16F00"
+HanGaiji   = "GAI16H00"
 BookFile   = "HONMON"
 Reserved1  = 000B0000
-
-[Book]
-BookType   = F002 (F0:ストリーム, 02:EPWING2)
-Title      = "「新英和・和英中辞典」紹介"
-Directory  = "GUIDE"
-StreamFile = "PLAY"
-Reserved1  = 00100000
-
-[Book]
-BookType   = F002 (F0:ストリーム, 02:EPWING2)
-Title      = "書籍選択"
-Directory  = "SCREEN"
-StreamFile = "SELECT"
-Reserved1  = 00100000
-

ランダムハウス英語辞典 (WindowsXP対応版)

この CD-ROM は EPWING 形式ではなく独自形式なので、srd-fpw を使用して EPWING 形式に変換します。

CD-ROM を iso イメージにする

EPWING 形式への変換は時間がかかるし失敗することもあるというので、CD-ROM からいったん iso イメージ形式にしておきます。

  ランダムハウス英語辞典の CD-ROM をマウントする
# mount /mnt/cdrom

  iso イメージ作成
# mkisofs -l -r -J -o randomhouse-eigo-jiten-1.5.iso /mnt/cdrom

  iso イメージをループバックマウントする
# mount /home/cdr/randomhouse-eigo-jiten-1.5.iso /mnt/cdrom -t iso9660 -o loop

  中身を見れるかチェック
# ls /mnt/cdrom/

  CD-ROM を取り出す
# eject
必要なソフトウェアの取得

上記の rpm スクリプトで唯一作成しなかった srd-fpw パッケージについて、 ここで取得します。

現在 srd-fpw 公式ページ で配付されている srd-fpw 1.1.5 は、以前出ていたランダムハウス英語辞典 (ver 1.1b) に対応しています。しかし私が 2003年11月に購入した同辞典 WindowsXP対応版 (ver1.50) では 不具合があるようです。

そこで CVS から最新版を取得します。

$ cvs -d :pserver:guest@openlab.ring.gr.jp:/circus/cvsroot login
guest
$ cvs -d :pserver:guest@openlab.ring.gr.jp:/circus/cvsroot co edict-devel/srd-fpw
srd-fpw を実行する

まず srd-fpw.conf を書き換えます。私はここで画像と音声を含まないように 設定しました。具体的には $multimedia_flag$img_flag$snd_flag の行をコメントにしました。

$ cd edict-devel/src-fpw
$ vi srd-fpw.conf

ディレクトリを作成して、そこに CD-ROM のファイルをコピーします。

$ mkdir -p source/DATA
$ cd source/DATA/
$ cabextract /mnt/cdrom/Data1.cab
$ mv Readme.txt ../
$ cd ../..

データを変換します。ここは CPU が VIA C3, 533MHz で 2時間10分ほど かかったようです。エラーもなく完了していました。

$ fpwmake 2>&1 | tee srd.log

カタログファイルも作成してインストールします。

$ fpwmake catalogs 2>&1 | tee -a srd.log
$ fpwmake install INSTALLDIR=/home/i/local/dict 2>&1 | tee -a srd.log

Emacs で使用する

X Window System での設定

lookup のマニュアル (info 形式) を読んで書いてあるとおり設定すると、 Emacs で表示できます。具体的には私の設定は以下のとおりです。 使い方は、C-xC-f で出てくる検索語句欄に入力するだけ。

;;;; lookup
;;;;
(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-pattern "lookup" nil t)
(define-key ctl-x-map "l" 'lookup)
(define-key ctl-x-map "y" 'lookup-region)
(define-key ctl-x-map "\C-y" 'lookup-pattern)

(setq lookup-search-agents
      '(
        (ndeb "~/local/dict/srd-fpw")
        (ndeb "~/local/dict/chujiten")
        (ndeb "~/local/dict/dgx01")
        ))
(setq lookup-default-dictionary-options
      '((:stemmer .  stem-english)))
(setq lookup-use-kakasi nil)

Emacs21 + X Window System だと上記の設定だけで外字も表示されます。 画像の中の、発音記号の一部などが外字です。
Emacs21.2 on X Window System

しかしコンソールで検索すると外字が表示されず以下のようになります。

UNIX [j<gaiji=ha343><gaiji=ha452>niks]
━n.
<gaiji=za260>コンピュータ<gaiji=za261>ユニックス:標準 OS の一つ;ワークス
テーションを中心にパーソナルコンピュータからメーンフレームにわたる広い範
囲の機種で使用されている.
[Uniplexed Information and Computing System]

appendix の設定

コンソールで外字を表示するために appendix という仕組みが用意されています。 外字の代わりに表示される 代替文字列 を指定できるというものです。

いくつかの辞書については appendix データ が用意されています。

私の場合、大辞林は既にあるものがそのまま使えました。

英和・和英中辞典もそのまま使用できるものがありましたが、もっと読みやすくできるのではないかと思って、このデータを元に少し改変したものを使用しています。

ランダムハウス英語辞典のものはないので私が作成しました。

作成方法は、EBライブラリのページにある ebfont と ebappendix のドキュメントを参考にしてください。

いずれのデータも全然検証していないので完成度が低いですが、置いておきます。

「ae」
本当は合字です。「え」の口の形で、舌を下の歯の裏に押しつけながらを発音する「ェァ」
「э」
本当は e が上下左右ひっくり返ったもの。あいまい母音。
「⊃」
本当は c が左右逆になったもの。たとえば boyの「オォ」。
「ц」
本当は o の上が空いている、ひらがなの「ひ」のような形。 goalとか bowl の オの音のあとの「ゥ」
「∂」
本当は 数字の 6 が左右逆になって、文字の上のほうに斜め線が入ったもの。thisの「ズ」
「a」
a の上線のないやつ。
「σ」
本当は а が上下反転したもの。
「0」
真ん中に斜め線があるゼロのようなもの。

あとは上記で示した Emacs の設定ファイルに appendix ファイルの場所も指定すれば動作します。

(setq lookup-search-agents
      '(
        ;(ndeb "~/local/dict/EDICT")
        (ndeb "~/local/dict/srd-fpw" :appendix "~/local/dict/appendix/srd-fpw")
        (ndeb "~/local/dict/chujiten" :appendix "~/local/dict/appendix/chujiten")
        (ndeb "~/local/dict/dgx01" :appendix "~/local/dict/appendix/daijirin-2.0")
        (ndeb "~/local/dict/mypaedia")
        ))

参考までに appendix 作成方法を記しておきます。

appendix の作成方法

catalogs.app の作成

まず、辞書の catalogs というファイルのあるディレクトリで ebinfo コマンドを実行します。 こんなふうに表示されます。

    disc type: EPWING
    character code: JIS X 0208
    the number of subbooks: 1

    subbook 1:
      title: ランダムハウス英語辞典
      directory: srd-fpw
      search methods: word endword menu copyright
      font sizes: 16
      narrow font characters: 0xa121 -- 0xa565
      wide font characters: 0xa121 -- 0xa271

表示された「directory:」の名前のみを catalogs.app というファイルをどこか作業用の ディレクトリに作成して書きます。私の場合「srd-fpw」だけ。

副本.app の作成

次に副本の app ファイルを同じディレクトリに作成します。 先ほどの名前をファイル名にするので srd-fpw.app というファイルになります。 その中身はマニュアル で書かれているように手書きする必要があります。

まず文字コードを指定します。

次に、先ほどの ebinfo の出力のうち、(narrow|wide) font characters の部分を書く。

begin narraw
    range-start 0xa121
    range-end   0xa565
    0xa121      'Λ
end
begin wide
    range-start 0xa121
    range-end   0xa271
end

あとは 0xa121 の行のように、外字一文字ごとに代替文字列を指定します。

外字の字形を確認するため、まず外字を画像として取り出し、それを web ブラウザで表示します。 (xbm 画像は mozilla firebird 0.7, InternetExploror6.0 では表示できました)

$ ebfont ~/local/dict/srd-fpw

とすると、srd-fpw/16/ の下に narrowwide というディレクトリが作成され、その下に外字一文字につき一つの画像ファイルが作成されます。

それを webブラウザで見るために ebfonthtml.pl という自作のスクリプトを使用して 以下のように HTML を生成します。

$ perl ebfonthtml.pl srd-fpw/16/narrow/* > narrow.html
$ perl ebfonthtml.pl srd-fpw/16/wide/* > wide.html

あとは、画像ページを webブラウザで表示させ、文字コード表 (私が使ったのは 自分のページ) と見比べて似ている文字を探して指定。

ebappendix の実行

catalogs.app と 副本.app (ここでは srd-fpw.app) のあるディレクトリで

$ ebappendix
と実行すると appendix 関連ファイルが生成されます。

itouh