日曜大工の最近のブログ記事

お隣のお婆さんが亡くなった。うるさいお婆さんだったが,亡くなると寂しいものである。つい先日,ウチがゴミ当番だった朝,「網が掛かってないからカラスが散らかしているじゃないの」とこのお婆さんにお叱りを受け,そそくさともう一度網を掛け直しにゴミ捨て場に出,彼女と挨拶したばかりなのに。合掌。ご主人もいつも叱られていたような気がする。敷かれる尻がなくなっても元気でいてほしいと思う。

* * *

OldSlav-1.2 を公開した。Windows CP1251 などの代表的なキリルエンコーディングによる入力方式を追加した。ドキュメントも改訂した。

* * *

IBM ThinkPad X40 FreeBSD-6.2 Release に ptexlive 最新版をインストールした。私の環境はディスクの空きがわずか 1.5GB しかなく,texlive に必要な 5, 6GB を確保できず,公開サーバの NFS 領域にインストールすることにした。ところが NFS マウントのオプションに -maproot=root を付けていないので,ptexlive の make install でエラーのオンパレードになってしまった。公開サーバなのでシャットダウンするのも憚られ,root ではなく一般ユーザの権限でインストールした。ちょっと環境を壊すリスクが高いけれども,まあよい。

ptexlive-20091009 ではまだ,texlive に添付された UTF-8 の新しいハイフネーションパターンがサポートされていないようである。fmtutil --byfmt platex で,添付の language.dat を読み込ませると,昔懐かしい bad pattern エラーが頻発してフォーマット生成が失敗する。しようがないので,旧 ptetex3 環境からハイフネーションパターンファイル一式をコピーして再実行したらうまく行った。

texlive は各プラットフォーム用のバイナリが install-tl コマンド一発でインストールできるようになっている。LaTeX パッケージも Teubner や CJK,unicode,cm-super などがはじめから組み込まれていて,めっちゃラクである。ただし,CJK パッケージの日本語タイプセット用に TFM を生成しようと ttf2tfm コマンドを実行したら,ライブラリのリンクでエラーとなった。ソースからビルドすればこんなことにはならないはずである(もちろんコンパイルなど別の面倒が発生するのだけど)。UNIX ユーザ向けにバイナリを配布するのは,こういう問題があるからやめたほうがよいと思うのだが。でもまあ,主要なコマンドは元気に動いているのでよしとする。いちおう,土村さんの ptexlive サイトに動作報告をあげておいた。

ptexlive で OldSlav を試験したが問題なさそうである。公開したバージョン 1.2 に ptexenc オプションを追加しておいた。やっていることは 1.1 の ptetex と同じだけど,土村さんの提言に従うことにしたのである。

※ 1.10 付記
ttf2tfm ライブラリ問題について,ptexlive.cfg にある conf_option --without-cjkutils をコメントアウトすれば,ソースからビルドするようになると,土村さんからご教示いただいた。さすが,考え抜かれているなー。Babel ハイフネーションパターンも対応中とのこと,楽しみである。

OldSlav 教会スラヴ語 LaTeX パッケージの 8 ビット・キリル・エンコード対応作業を行っている。OldSlav の従来バージョンでは SlavTeX オリジナルのエンコード CP866 キリル・コードでオリジナルの記法そのままに入力できるような設計になっていたのだが,8 ビット文字の分類コードなどを不用意に変更すると,韓国語 UTF-8 inputenc との併用で問題を来すことがわかり,1.1 では CP866 サポートをやめてしまっていた。それなら inputenc.sty のキリル・サポートに乗っかって,広く行われているキリル 8 ビット・コードを使えるようにするのが次の課題になった。

とはいえ,すでに教会スラヴ語環境内で \CYRA などの inputenc.sty の命令を読み替えることにより T2D, T2A, X2, XS エンコーディングを使えるようにしていたので,じつは 1.1 でも \usepackage[koi8-r]{inputenc} とするだけで KOI8-R の原稿でも基本的に動作する。ただし,これだと などの SlavTeX がサポートしていた,キリル文字からなる命令(主にアクセント命令)が使えないし,特殊なアクセント位置調整も効かない。今日はこの不足を補うマクロを書いた訳である。babel \languageattribute で指定するオプションに代表的なキリル文字コード Windows CP1251, KOI8-R, ISO 8859-5, CP866 を指定できるようにした。それぞれ,cp1251koi8-riso88595cp866 を書けばよい( inputenc.sty と同じ)。ただし,もちろんこの場合, latexpdflatex による組版が前提である。これで SlavTeX との互換性も満足できそうである。ロシア人が使うには必須の機能かも知れない(彼らがよく使う MiKTeX に私はほとんどまったく馴染みがないのだけれど)。

試験をしていたら,長大な原稿で何度も言語切替えを行うと Save size スタックのオーバーフローエラーが起きた。げげ,こんなのはじめて,またつまらない潜在バグ!と我ながら呆れた。キリル命令・他パッケージの命令と教会スラヴ語命令との切替えにおいて,頻繁にバックアップ/リストアを \let 命令で繰り返しているとこれが発生するという訳だった。とりあえずバックアップ処理のタイミングを一度に限定することでこの問題対処とした。

これらの対応版は一応できたけれども,ドキュメントがこれから。さっさと改訂して 1.2 としてサーバに置くつもりである。仕事もはじまり,なかなか時間が取れそうもないんだけど。極々関心のある方限定で oldslav-1.2rc.zip をお試しください。

OlsSlav for Old Church Slavonic LaTeX package Ver. 1.1 対応の英文ドキュメントをやっと公開した。ヘタクソな英文でも,ないよりはマシ。巧遅拙速に如かず。世のビジネスでは品質よりも納期優先じゃ。それでも,メールで付き合いのある外国人に,おいおいチェックしてもらうつもりでいる。

これで三が日が費やされてしまった。 ああ,でも今年の正月休みは家族水入らず,ホントのどかなよい寝正月だった。

御用納めとなり,2009 年も残すところ二日となってしまった。先頃,今年を象徴する漢字は「新」ということが清水の舞台から公にされたが,それぞれ皆,各々の今年の一文字があるかと思う。私の場合,不況でまったくつまらない今日この頃,「暇」であった。また死ぬほど顧客に虐められ,トラブルで火を噴く現場の喧噪に包まれたい,という思いも無い訳ではない。

妻にせっつかれてやっと年賀状を作った。娘の描いた虎の画をスキャンして,Mac OS,Adobe Photoshop で加工し,Illustrator で文字周りをぺぺっとレイアウトして 30 分で完了。とりあえず 50 枚印刷。

公開したばかりの OldSlav について,奥村先生のサイト TeX フォーラムにおいて,観点鋭くかつ学術性にも配慮した指摘をいただいた。自分の用途に足りるレベルで作ったものを公開しているに過ぎないのだけれど,ハイレベルな反応をもらうとなんともうれしくてたまらなくなる。教会スラヴ語日付様式の典拠,韓国語 inputenc との共存など,重い課題が多くて,システマチックにその指摘に対応するのは難しいところがあり,いま手元にある文献や試験環境でできる範囲で設計を見直し,訂正して,今日公開した。SlavTeX オリジナル CP866 コード入力での互換性は inputenc との絡みで今回犠牲にした。だいたい今や誰も使わないエンコードに拘っても意味がない。ダウンロード頁から oldslav-1.1.{tar.gz, zip} を落としてお使いください。

明日は我が家の大掃除。ここのところ仕事から帰宅したあと OldSlav の改造に夢中になってしまい,妻から家事を手伝わないと責めまくられている。

* * *

アンナ・アフマートワの詩集『ヴェーチェル(夕べ)』を工藤正廣訳(未知谷刊)で読む。ロシア詩のスタンザ毎に短歌として訳した珍しい翻訳である。工藤先生も健在だなあ,という思いがこの書を手にしたそもそもの理由である。

アンナ・アフマートワは 20 世紀ソヴィエトの女流詩人。彼女の詩は,至る所に死の匂いが染み付いている。己の死後の現実の感触を透視し聞きとろうとする心の闇がある。「あまりにも生を望みしそのわれの冷たき屍手おくひとなし」(p. 115)。スターリンの大粛正で夫(第一級の詩人ニコライ・グミリョフ)が銃殺され,わが子がシベリヤ送りとなったこの天才にあって,死の日常性が事物に取り憑いてさりげなく漂うのは,文学的衒いでもなんでもないのである。

夢おそく不眠の窓にまた白くご機嫌ようと白きカーテン(p. 15)
氷結し狭き運河の流れずにおゝ新しきこともなき地よ(p. 49)
太陽の記憶こころに弱まれば闇のこの夜にまさに冬来る(p. 50)
日没に針葉の森消えゆくを見つつ聞きおりきみに似し声(p. 110)
酩酊の葡萄匂える遠景にわれ惜むなしきみ虚無の声(p. 164)
 
夕べ―ヴェーチェル
アンナ・アフマートワ
工藤正廣・短歌訳
未知谷

今日は家族でクリスマス・パーティ。妻の作ったホウレンソウのクリーム・スープが旨かった。ケーキを食べながらプレゼント交換した。自分ではまず絶対買わないような気の利いたアイテムを貰う。私は子供たちに CD と本を与えた。上の息子のために,セロニアス・モンクの名盤 "Thelonious Himself"(1957)を選んだ。渋すぎたかも。娘にはジョージ・ウィンストンの "Winter Into Spring"。

できたてホヤホヤの教会スラヴ語 LaTeX パッケージ OldSlav を使ったメッセージをラベルシールに印刷し,プレゼントのパッケージに貼付けた。教会スラヴ語で「2009 年クリスマス,XXXへ,父より」というもの。ウケた。
 

oldslavxmas.jpg
 

セロニアス・ヒムセルフ+1
セロニアス・モンク
ユニバーサル ミュージック クラシック (2007-09-19)

息子の誕生日,クリスマス,ということで,今日は家族でロシア料理を食した。子供たちにはこれまでこんな贅沢はさせなかった。たまにはコース料理も食べさせてやろうということに。場所は,新宿西口にあるロシア料理店「スンガリー」。サーモンのブリヌイも,ボルシチも,シャシリクも旨かった。ロシア紅茶といっしょに出てきた薔薇瓣・木苺・チェリーのジャムはなかなかのものだった。ロシア製のジャムを味わうと,ジャム観が変わるはずである。日本製がただの子供のおやつに思われてくる。Балтика 3 番,6 番(それぞれラガー,スタウト)ビールは,甘ったるくてちょっと嗜好に合わなかった。アルメニアのコニャック «Арарат» を品書に見いだし,食指が動いたが今日は止めにした。

先日,爆笑問題が話題の学者の研究内容を紹介する NHK テレビ番組『ニッポンの教養』で,ロシア文学者亀山郁夫と爆笑問題がロシア料理店でドストエフスキイについて語り合うものがあった。妻によれば,今日行った店は,そのロケーションになった店の支店だったようである。

亀山先生といえば,私にとってフレーブニコフの専門家というイメージがかつては強かった。でも,いまやドストエフスキイの現代性を論じて,最近メディアでつとにお名前を目にするようになった。番組で私がもっとも感銘を受けたのは,インターネット時代の孤独な人間が PC の前に座ったときに捕われる「全能感」の問題提起である。亀山先生の言葉に私はどきりとした。人間は誰しも世界の片隅しか支配できない。ところが,インターネットで様々な情報を居ながらに得,匿名で偉そうな書き込みをしているうちに,なにか世界を手中にしたかのような幻想に捕われる。これを,ひとごとだと思ってはいけない。ロシア文学に全霊をかけて取り組んだ人は一種独特の文明批評に富んでいる,と改めて納得した。情報を知性ではなく魂で受けとめようとするのである。

聞き役の爆笑問題も,亀山先生を相手に堂々と会話を成り立たせているところ,また,タルコフスキイの『惑星ソラリス』が描いた未来世界のエコロジーについて語るところ,ただ者ではない。最近,高学歴お笑い芸人が話題になっているけれども,そういう「ただの優等生」とは決定的に違う風格を,太田は備えている。

* * *

Utf82TeX-0912 を公開した。以前からあった -h オプション(^^16進形式変換)に変換対象としてキリル文字・ギリシア文字を追加した。ptetex3 がこの形式だと欧文で処理するという話に触発されたのである(昨日の記事に書いた Perl コード十数行で十分なのだけど)。あと,問題を訂正した。

今日帰宅して,昨夜公開した OldSlav のドキュメントを眺めていたら,ロシア語の т がぼろぼろ脱落していて慌てた。литературалиераура となっていてマヌケなんである。OldSlav のとんでもないバグだとまずは考えた。今回 \russiantext 命令を結構いじっている。しかし,旧バージョンに戻して組版しても再現する。ドキュメント旧版を確認するときちんと出力されている。頭が煮詰まって来た。

なんで小文字の т だけが抜けるのか。うまく出ている原稿とダメな原稿を落ち着いてよく比べてようやく原因が判った。ダメ版ではいつものサボリ根性から T2A のキリル文字を簡単にマークアップするために \def\cyrt{\fontencoding{T2A}\selectfont} というマクロを書いていた。バカみたいなバグである。\cyrt は T2A 小文字の т の出力命令と同じ名前であって,これをつぶしていた訳である。フォント切替えなのでエラーとならず,見過ごしてしまった。

教訓は,サボルな,ではなくて,マクロの名前はよく考えよ。特定の文字の問題はマクロ名の重複を疑え。よく見るとほかにもいただけない瑕疵があり,類似見直しをした。ドキュメントを訂正して差し替えた。

* * *

奥村先生の TeX サイトで土村さんの ptetex3 の後継,ptexlive が出ていることを今ごろ知った。もう着いて行けてません。それなら OldSlav の改造は ptexlive でやったほうが皆のためだったかも知れない。まあ,そのうち時間が取れれば ptexlive 対応にも取り組みたいと思う。

また,ptetex3,ptexlive とも,環境変数 PTEX_IN_FILTER として原稿ファイルの出口ルーチンを登録できるということも知るところとなった。ptetex3 では互換性を重視して JISX-0208 に定義されているキリル文字,ギリシア文字を和文として扱う仕様になっており,ロシア語・ギリシア語の UTF-8 テキストを欧文として処理したいユーザーには少し物足りないところは否めない。旧 pTeX でロシア文字を JIS コードで入力していた人にはまったく影響がないのでそういう選択をしたということのようである。それでも,文字を ^^十六進形式にすれば,欧文として扱うとのことを土村さんから教えていただいた。そしてその変換を行うフィルタを PTEX_IN_FILTER に登録すればよい,という話であった。

Utf82TeX を改造して試したら,たしかにばっちりロシア語が出た。でも ^^十六進形式にするのは,大げさなプログラムは不要で,次のような Perl コードですんでしまう。

#!/usr/bin/perl
# -*- coding: utf-8; mode: cperl; -*-
# Cyrillic and Greek to ^^HEX format
use utf8;
binmode(STDIN, ":utf8"); binmode(STDOUT,":utf8");
while (<STDIN>) {
    utf8::decode($_);
    foreach my $chr (split(//, $_)) {
        if ((($chr ge "\x{0400}") && ($chr le "\x{04ff}")) || # Cyrillic
            (($chr ge "\x{0370}") && ($chr le "\x{03ff}")) || # Greek
            (($chr ge "\x{1f00}") && ($chr le "\x{1fff}"))) { # Greek Ext
            my $uchr = $chr;
            utf8::encode($uchr); # UTF-8 encode
            foreach my $bchr (split(//, $uchr)) {
                print(sprintf("^^%x", ord($bchr)));
            }
        } else {
            print($chr);
        }
    }
}

UTF-8 で書いた TeX ファイルをこれ(myfilter.pl とでもしておこう)で前処理すれば,キリル文字とギリシア文字(拡張領域含む)だけが ^^十六進形式に変換される。ただし,PTEX_IN_FILTER を通すと,あらゆるマクロファイルをこれに掛けるためか,platex のコンパイルが眼に見えて遅くなる。面倒でも,次のようなスクリプト(u8platex とでもしておこう)を書いてドライブしたほうが高速である。u8platex hoge とすると hoge.pdf までができる。

#!/bin/sh
BN=`basename $1 .tex`
myfilter.pl < $BN.tex > $BN.utf
platex --kanji=utf8 $BN.utf && dvipdfmx $BN.dvi

教会スラヴ語 LaTeX パッケージ OldSlav ver. 1.1 を公開した。UTF-8 サポートと文字追加・入れ替えを反映した。私は Mac OS X upLaTeX,FreeBSD ptetex3-euc 環境で試験したが,Windows SJIS 環境でも問題ないと思う。ドキュメントも訂正してある。oldslav-1.1.tar.gz,もしくは oldslav-1.1.zip をダウンロードしてお使いください。

英文か露文のドキュメントの要望も受けている。時間がとれれば,英文マニュアルを書かないといけない。

1900 年刊行の教会スラヴ語聖書を眺めていて,SlavTeX フォントにない文字付略号符(буквенное титло)を見つけた。ч の文字にハットを冠したもので,私の見たことのないものだった。これは教会スラヴ語教科書にもない。教会スラヴ語 LaTeX パッケージ OldSlav の Unicode 対応をするなかで,どうしてもこの略号符を出力できるようにしたいと思った。

マクロで重ね打ちするなどの手段を考えたが,やはりフォントを作ることにした。SlavTeX フォントはもともと METAFONT で作成されており,フォントソースが添付されている。これを流用して буквенное титло ч を作ってみた。また,従来の SlavTeX フォントでは,ハイフネーションの文字はハイフン(-)だった訳だが,この聖書ではアンダースコア(_)が使用されていた。こちらのほうがそれらしいと思ったものだが,SlavTeX フォントにはアンダースコアがない。ついでにこいつも追加することにした。

私にとって METAFONT への取り組みは Izhitsa 教会スラヴ語パッケージの日本語対応以来である。METAFONT はタイポグラフィによほど関心のない限りなかなかとっつきにくいものがある。それでも,クヌース教授による『METAFONT ブック』を参照しながら,既存のソースを流用してなんとか作成することができた。

METAFONT フォント作成のメモを簡単にしるしておく。 .mf ファイルに描画命令を記述する。今回 exslav10.mf として別フォントとして生成することにした。適当なエリアで文字を割当て,フォントを生成しておき,仮想フォントで目的とするエリアにマッピングすればよい。参考までに今回作成した .mf のうち, буквенное титло ч の描画部分だけをあげておく。

% буквенное титло ч
beginchar(100,9u#,small#,0);
  % titlo hat function (slav.mac)
  hat(1,0);
  % titlo character
  r:=22/10u; s:=7/2u;
  % right vertical line
  z.u=(s+r+1/8u,small+6u);
  z.d=(s+r,small+2u);
  z.m=(s+r,small+10/3u);
  pickup penrazor scaled 4/5u;
  pp:=flex(z.u,z.m,z.d);
  draw pp;
  labels(u,m,d);
  % curve from left upper to right vertical line
  z2.2=(s+r+1/10u, small+21/5u);
  z2.1l=(s,small+6u);
  penpos2.1(4/5u,0);
  penpos2.2(3/10u,90);
  penstroke z2.1e{down}..tension 0.75..{right}z2.2e;
  penlabels(2.1,2.2);
endchar;

exslav10.mf ができたら,mf ユーティリティで処理し,gftodvi ユーティリティでゲラ刷り DVI ファイル(下図)を作成する。これを確認しながら,METAFONT の記述を修正しつつ,満足のゆくものができるまで文字のデザインを調整する。クヌース教授は,smoke モードで生成した DVI を紙に印刷して壁に貼り,後ろに下がって眺めるとよい,と勧めておられる。tex testfont を実行するとフォントチャートが得られる。それとともに tfm 及び pk フォントのファイルが生成される。
 

mfgera.jpg

これでできたフォントは tfm と pk である。tfm は LaTeX で組版するときに必要となる。しかしながら,pk フォントは,紙に印刷すると暖かみのあるものだと私は思うけれども,いわゆるビットマップフォントであり,PDF などに埋め込むにはあまり推奨されない。そこで mftracet1binary の両プログラムを用いて PostScript Type1 アウトラインフォントに変換した。DVIWARE にフォントを拾ってもらうための map ファイルも作成する必要がある。

以上の一連の流れのコマンドラインを以下に示す。私は Mac OS X で行ったが,FreeBSD, Linux, Windows でも手順はそれほど変わらないと思う。

% mf exslav10
% gftodvi exslav10.2602gf
% tex testfont
...
Name of the font to test = exslav10
...
*\table
 
*\end
...
% mftrace --magnification=4000 --encoding=tex256.enc exslav10
% t1binary exslav10.pfa exslav10.pfb
% cat > oldslavex.map
exslav10 exslav10 <exslav10.pfb
(control-D)
%

さて,exslav10.tfmexslav10.pfboldslavex.map までできたけれども,これだけでは OldSlav の組版でフォントが使用できる訳ではない。OldSlav の仮想フォントのしかるべきエリアに,作成したフォントをマッピングしなければならない。既存の OldSlav 仮想フォント・ソース fslavrm.vplexslav10.vpl の当該文字定義を反映する。この定義の元ネタ vpl ファイルを tftopl ユティリティで生成し,MAPFONT 命令で exslav10 のエントリを追加するとともに,буквенное титло ч の文字定義を fslavrm の空きエリア 6 番に,アンダースコアをハイフンの位置 45 番に(ハイフンの代わりとして使うので)MAP 命令でマッピングする。定義が終われば,vf と tfm を vptovf ユティリティで生成する。仮想フォントの作成は面倒だが,以前 OldSlav 用 vf を作成したとき,メモを残しておいたのが役に立った。いまこうして書きしるすのも,自分のためである。

以上できた tfm, vf, map, pfb ファイルを TDS に従った場所にコピーし,mktexlsrupdmap-sys --enable Map=oldslavex.map を実行する。これでやっと追加フォントが使用できるようになった。

% tftopl exslav10.tfm exslav10.vpl
% emacs fslavrm.vpl exslav10.vpl &
(ターゲットの fslavrm.vpl を編集し,exslav10.vpl 定義を反映する)
% vptovf -verbose fslavrm.vpl
% su -m
# setenv TEXDIR /usr/local/teTeX/share/texmf-local
# cp fslavrm.vf $TEXDIR/fonts/vf/oldslav/
# cp fslavrm.tfm exslav10.tfm $TEXDIR/fonts/tfm/oldslav/
# cp exslav10.pfb $TEXDIR/fonts/type1/oldslav/
# cp oldslavex.map $TEXDIR/fonts/map/dvips/oldslav/
# mktexlsr
# updmap-sys --enable Map=oldslavex.map
# exit

OldSlav に буквенное титло ч アクセント命令(\ttlh)を追加して,早速組んでみた。実際の文献でも文字付略号符は虫眼鏡でみないと判別できないくらいのシロモノだけど,まあできた,できた。ハイフネーションも聖書のマナーを再現できて満足。今回の成果を含めなるべくはやく UTF-8 対応版パッケージを整理して公開したいと思う。
 

ocstitlo.jpg
 

教会スラヴ語聖書を手に入れてから,このところ教会スラヴ語 LaTeX パッケージ OldSlav の UTF-8 対応に血道をあげている。先日はまだアクセント付加文字をグルーピングすると不具合が発生する状況だったが,今日その課題が解決した。

この OldSlav utf8 モードは土村さんの pLaTeX UTF-8 対応では使用できない。土村さんの ptetex はキリル文字を JISX-0208 に化かしてしまうので,もとよりロシア語も欧文として取り扱うことができず,日本語フォントにあるキリル文字が組まれてしまう。utf8 モードで教会スラヴ語を組みたい場合,ttk さんの upLaTeX か,もしくは pdfLaTeX(これは欧文純正なので日本語混在組版は CJK パッケージを使う)の環境が必要である。角藤先生配布のパッケージにも upLaTeX が含まれているので Windows ユーザにも使えるはずである(試験はしていない)。

教会スラヴ語聖書を眺めていて,SlavTeX フォントにはない略号符(титло という。単語の綴りの一部を省略することを示す記号。頻出する語でよく用いられた)を見つけた。それは ч の文字 титло。UTF-8 対応パッケージを公開したら,次は METAFONT でこのアクセント文字を自作して,SlavTeX フォントに組み入れようかと考えている。

※ 12/24 追記: OldSlav UTF-8 その後のその後

ptetex3 では UTF-8 キリル文字が欧文として使用できない,ということについて作者である土村さんから指摘があった。原稿に書いたキリル文字,ギリシア文字はそのままでは欧文として扱われないのは,互換性維持というポリシーでそうせざるを得なかった,欧文としてキリル文字・ギリシア文字を取り扱いたければ ^^十六進形式にすればよい,とのことだった。この場を借りて訂正しておく。

Utf82TeX-0912 で -h オプションを指定すればキリル文字・ギリシア文字を^^十六進形式に変換するようにしたので,utf82tex -h 原稿.tex > 原稿.utf; platex --kanji=utf8 原稿.utf とでもすれば,ptetex3 でもキリル文字・ギリシア文字がきちんと欧文として処理される。OldSlav に関しても inhibitslavactive, utf8, ptetex 3 オプションを併記すれば,ptetex3 でも UTF-8 で組めるようにした。

この休日,教会スラヴ語 LaTeX パッケージ OldSlav の UTF-8 対応作業をしていた。久しぶりの LaTeX マクロへの取り組みだったので,現状の作りを思い出すのに苦労した。とりあえず,SlavTeX オリジナル記法と互換性を確保しつつ,Unicode 古スラブ文字を直截原稿に記述できる拡張まで漕ぎ着けた。いまのところ,Babel スタイルのみの対応である。また,アクティブアクセントモード(アクセント命令を \ なしで記述できるモード)の試験のみ。いまのところ問題はなさそうである。

OldSlav UTF-8 対応の方式設計の基本は,使用する UTF-8 キリル文字の第一オクテット X"D0",X"D1",X"D2" をアクティブ(catcode 13)に設定し,第二オクテットを引数として取る命令として定義する点である。第二オクテットになりうる文字コード 128--191 の分類コードを通常文字(catcode 11)に変更する。第二オクテットで文字を特定でき,それに応じて教会スラヴ語の文字に置き換えてゆく。Dominique Unruh 氏によるめっちゃトリッキーな Unicode パッケージ utf8x.def との共存で苦労した。これと併用できないと,他の言語,例えば古典ギリシア語の直截入力と混在できないことを意味する。ゆえに utf8x.def 共存は OldSlav にとってぜひとも解決の必要な課題だったのである。このため,OldSlav 環境を抜けるとき,utf8x.def がローディングされている場合,キリル文字第二オクテット文字の分類コードを 13 に設定しなおす必要があった。

そのうち,ドキュメントを含めパッケージを整理して公開する予定である。IR 版(本パッケージはこの先ずっとβ版だろうけど,それ以下ということ)を置いておくので,すでに OldSlav をお使いでかつ興味のある方のみ,次の二つのファイルをダウンロードして既存ファイルに上書きして試してほしい。ocscommon.def, oldchurchslavonic.ldf

SlavTeX オリジナル記法が使い方の基本である。さらに ѧ і ї ѣ є ѡ ѿ などの古スラヴ文字を使うことができる。いまのところアクセント引数のグルーピングにバグがある('{ѣ} などとするとうまく動作しない。 と書く必要がある。ただし,教会スラヴ語では複数文字をグルーピングすることにより引数を指定する局面はないはずである)。原稿例(ギリシア語,ロシア語混在試験)とその出力は以下のとおり。教会スラヴ語テキストはヨハネ福音書の冒頭である。uplatex が必要である。原稿では inputenc.styutf8x オプション付が指定されているが,これはロシア語,古典ギリシア語の直截入力のためであり,OldSlav だけならこれがなくても UTF-8 入力が可能である。
 

% -*- coding: utf-8; -*-
% OldSlav UTF-8 対応試験 
\documentclass[b5paper,uplatex,papersize]{jsarticle}
\usepackage[T1,T2A]{fontenc}
\usepackage[utf8x]{inputenc}% ロシア語・ギリシア語向け。OldSlav は不要
\usepackage[polutonikogreek,oldchurchslavonic,russian]{babel}
\languageattribute{oldchurchslavonic}{utf8}% OldSlav UTF-8
\pagestyle{empty}
\kcatcode`б=15\relax% Cyrillic U+0400--U+04FF
\kcatcode`ς=15\relax% Greek U+0370--U+03FF
\kcatcode`Ἄ=15\relax% Greek Extended U+1F00--U+1FFF
\parindent=0pt\relax
\begin{document}
\selectlanguage{oldchurchslavonic}
\parbox[t]{100mm}{%
Въ нач'алѣ б`ѣ сл'ово, \и сл'ово б`ѣ къ б_гу, \и б_гъ б`ѣ сл'ово.
С'ей б`ѣ ^искон`и къ б_гу:
вс^ѧ т'ѣмъ б'ыша, \и без\ъ нег`ѡ ничт'оже б'ысть, "єже б'ысть.
Въ т'омъ жив'отъ б`ѣ, \и жив'отъ б`ѣ св'ѣтъ челов'ѣкѡмъ:
\и св'ѣтъ во тм`ѣ св'ѣтитсѧ, \и тм`а <єг`ѡ не <ѡб\ъ'ѧтъ.
Б'ысть челов'ѣкъ п'осланъ ѿ б_га, "имя <єм`у <іѡ'аннъ:
с'ей прї'иде во свид'ѣтелство, да свид'ѣтелствуетъ 
<ѡ св'ѣтѣ, да вс`и в'ѣру "имутъ <єм`у.
Не б`ѣ т'ой св'ѣтъ, но да свид'ѣтелствуетъ <ѡ св'етѣ:
б`ѣ св'ѣтъ "истинный, "иже просвѣщ'аетъ вс'ѧкаго челов'ѣка 
гряд'ущаго въ м'іръ:
въ м'ірѣ б`ѣ, \и м'іръ т'ѣмъ б'ысть, \и м'іръ <єг`ѡ не позн`а:
}%
 
\vspace{2em}
\selectlanguage{polutonikogreek}
\parbox[t]{100mm}{%
Ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον, ὃς μάλα πολλὰ\\
πλάγχθη, ἐπεὶ Τροίης ἱερόν πτολίεθρον ἔπερσε.\\
πολλῶν δ'' ἀνθρώπων ἴδεν ἄστεα καὶ νόον ἔγνω,\\
πολλὰ δ'' ὅ γ᾽ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θῡμόν,\\
ἀρνύμενος ἥν τε ψῡχὴν καὶ νόστον ἑταίρων.\\
ἀλλ'' οὐδ'' ὧς ἑτάρους ἐρρύσατο, ἱέμενός περ;\\
}%
 
\vspace{2em}
\selectlanguage{russian}
\selectruencoding{T2A}%
\parbox[t]{100mm}{%
Прежде всего откроем тайну которую 
Мастер не пожелал открыть Иванушке.
Возлюбленную его звали Маргаритою Николаевной.
Все, что Мастер говорил о ней, 
было сущей правдой.
Он описал свою возлюбленную верно.
Она была красива и умна.
}%
\end{document}
 
ocsutf8test.jpg

Usconcord ロシア語テクスト・コンコーダンス・パッケージの説明ページを改訂した。これまでは,単語条件式の説明が少し不親切だった。例を入れて詳しくしたのである。

Usconcord は主にロシア語テクストの KWIC(keyword in context)を自動生成するための Web サーバ・ツール・キットである。解析したいコーパス(文学テクストの電子ファイル)をサーバにアップロードし,単語条件式を入力し,解析を指示すると,条件に適合する単語のコーパスにおける出現度数・前後コンテキストからなる KWIC を表示する。コンコーダンス・サイトを運用したいひとはダウンロードサービスから usconcord-1.6.tar.gz アーカイブを取得してインストールできる。コンコーダンス解析オペレーションは Windows で稼働するブラウザから可能であるが,Usconcord サーバ運用は UNIX 環境(FreeBSD,Linux 等のオペレーティングシステムとその周辺ソフトウェア)が必要である(FreeBSD で開発したが,Linux gcc 4 でもコンパイルが通るようにしてある)。Windows ではサーバ・ソフトウェアが動作しない。

もっぱらスラヴ研究者向けに 2001 年にこのプログラムを書いた。とはいえ,対象テクスト処理の内部エンコーディング前提を X11 CTEXT(X Window System Compound Text)多言語形式としている関係で,X11 CTEXT,UTF-8 でコード化されたファイルであれば,フランス語,ドイツ語,スペイン語,ポーランド語,スウェーデン語などなど,だいたいの西欧・東欧・北欧語も処理可能である。正確には国際標準文字集合 ISO 8859-1, ISO 8859-2, ISO 8859-5 で記述できる言語を取り扱うことができる。日本文の解析は未対応である(日本語形態素解析ツール「茶筌」などを用いて予め分かち書きした日本語テクストであれば,処理できないことはない)。

コンコーダンスはある作家,作品群においてことばの用例,単語,フレーズの使われ方を総覧するのに絶大な威力を発揮する。昔からシェークスピア,聖書のコンコーダンスが出版されており,近年,ロシア文学研究文献についてもプーシキン『大尉の娘』,ドストエフスキイ『罪と罰』等のインデックスが刊行されている。しかしながら,手作業で KWIC インデックスを作るのは膨大な労力が必要であり,そのような古典,大作家以外のコンコーダンスはまず入手不可能である。自分の研究する文学作品のコンコーダンス生成,しかも論理条件指定に基づく必要語彙に特化した KWIC 生成を,個人で手軽に実行できる,というのが Usconcord の目的である。

私もプーシキン『エヴゲーニイ・オネーギン』論を書いたとき,Usconcord の元になったツール(弊サイト「プーシキン作品コンコーダンス・サービス」)を用いて,単語の用例・頻度調査を行い,悩ましい論証でブレークスルーを得た。ことばは複数の語義を有することが多いが,作家の用例をつぶさに見ると,単語を使う傾向がわかり,テクスト解釈が争われる論点においてその語義を特定するための根拠にできることがある。私の場合,語の色彩的印影の特定のため共起分析の際に,コンコーダンスを活用した。

文学研究者には Usconcord をぜひ活用いただきたいと願っている。Usconcord はユーザーが自分の Web サーバにインストールして運用するキットである。でもそんな面倒を抜きにして使いたい方は,弊サイトの「ロシア語電子コンコーダンス・サービス」を利用することができる。

Mac OS X Tiger 10.4.11,X11 環境の GNU Emacs(22.0.50)において,ロシア語テキストの flyspell-mode(単語入力と同時にスペルチェックし,ミスがあると修飾表示してくれるモード)設定をしたところ,"Symbol's function definition is void: ispell-maybe-find-aspell-dictionaries" というエラーが出てスペルチェックができない。ispell-buffer などは OK である。調べたところ,どうも Emacs の新しい版では訂正されているとのことであった。そこで,意を決して久々に CVS から Emacs を構築することにした。バージョンは 23.1.50.2(ChangeLog 最新日付は 2009.8.15)。

ところが,Mac OS X でのコンパイル,起動確認は厄介だった。オープンソース・プログラムの構築では,ユーザーの環境により様々な問題が出る可能性があり,一様ではないだろうけれども,私と同じ問題に遭遇した人のために,その問題と対処メモをしるしておく。

まずは Emacs CVS リポジトリ http://savannah.gnu.org/cvs/?group=emacs からローカル・ワークにチェックアウトする。続いて,configure スクリプトを実行し,make。

% cd ~/tmp
% setenv CVS_RSH ssh
% cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
% ./configure --with-x
% make bootstrap

ftfont.c のコンパイルで問題が出た。'FC_WEIGHT_REGULAR' undeclared や 'FC_WIDTH' undeclared といったエラーが出て停止する。これは GTK+2 ライブラリがないために出るようである。Version-23 から GTK+2 を使うようになったらしい。そこで,このライブラリをインストールした。今回は source tar ball からではなく,EasyPackage インストーラで Tiger 用バイナリを導入した。x11-toolkits 分類から gtk+2 をダブルクリックするだけ。いとも簡単。これで再度 make をしてコンパイルは完了した。sudo make install でインストールは終了。

次にいよいよ Emacs を起動したところ,次のようなエラーで Emacs が abort した。

Error reading Pango modules file
 
(emacs:24574): Pango-CRITICAL **: _pango_engine_shape_shape: assertion
`PANGO_IS_FONT (font)' failed
 
Pango-ERROR **: file shape.c: line 75 (pango_shape): assertion failed: 
(glyphs->num_glyphs > 0)
aborting...

Pango ってなんじゃ? これはフォントのレンダリングでアンチエイリアス表示をする仕組みのようである。こんなんいらんのにと,configure オプションを調べなおしたりしたが,抑止できるオプションがなさそうであった。でも /usr/local/lib,/opt/local/lib の下を確認すると,libpango* のライブラリがすでにインストールされており,設定の問題らしいことがわかった。Google で検索した結果,pango.modules の設定がよろしくない。これを作りなおすコマンド pango-querymodules を実行すればうまくいった。

# cd /usr/local/etc/pango
# pango-querymodules > pango.modules

Emacs のコンパイルでトラブルは毎度のこと。どうしてこんなに面倒なのか。FreeBSD ports や Mac Carbon-Emacs dmg,Mac Darwin ports を利用して構築することを強く推奨する。こんなことで時間を浪費するのは,スキ者に任せておくべきである。

flyspell もばっちり OK になった。これを契機にロシア語スペルチェック環境を改善した。ロシアの KOSTAFEY 氏によるブログ "KOSTAFEY'S BLOG" 2009.7.28 日の記事 Emacs, Aspell и одновременное использование словарей を参考に .emacs から以下の elisp を読込むようにした(つまり (load-file "~/elisp/aspell.el") を追加した)。これは text mode で自動的にロシア語用 flyspell が起動し,カーソル上の単語にスペルミスがあれば赤色・下線付きで強調表示してくれる。C-F1 キーで ispell-word 関数(カーソル上の単語チェック),C-F2 キーで ispell-region 関数(指定範囲のチェック),C-F3 キーで ispell-buffer 関数(バッファ全体のチェック)が起動し,スペルチェックが出来る。flyspell-english 関数と flyspell-russian 関数によって,英語とロシア語の切替えが出来るようになっている。ispell-change-dictionary 関数で辞書を切替えてもよい。辞書はデフォルトをロシア語にしてある。もちろん,GNU Aspell とロシア語辞書を予めインストールしておく必要がある。ru-yeyo とは,е(イェ)と ё(イョ)どちらの綴りにも対応したロシア語辞書指定である。

;; -*- coding: utf-8; -*-
;; aspell.el
;;
;; Настройка проверки правописания Ispell
;; From http://kostafey.blogspot.com/2009/07/emacs-aspell.html
;;
;; .emacs に (load-file "hoge/aspell.el") を指定して読み込ませる。
;;
 
(require 'flyspell)
(require 'ispell)
(setq
 ispell-program-name "/usr/local/lib/aspell-0.60/ispell" ;; aspell path
 ispell-dictionary-alist 
 '(("english"                       ; English
    "[a-zA-Z]" 
    "[^a-zA-Z]" 
    "[']" nil ("-d" "en") nil iso-8859-1)
   ("russian"                       ; Russian
    "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[-]" nil ("-d" "ru-yeyo") nil utf-8)
   (nil                             ; Default
    "[A-Za-z]"
    "[^A-Za-z]"
    "[']" nil ("-C") nil iso-8859-1)
   )
 ispell-russian-dictionary "russian"
 ispell-english-dictionary "english"
 flyspell-default-dictionary ispell-russian-dictionary
 ispell-dictionary ispell-russian-dictionary
 ispell-local-dictionary ispell-russian-dictionary
 ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8") ;; added
)
 
;; Russian
(defun flyspell-russian ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-russian-dictionary)
  (flyspell-buffer)
  (message "Russian dictionary - Spell Checking completed."))
 
;; English
(defun flyspell-english ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-english-dictionary)
  (flyspell-buffer)
  (message "English dictionary - Spell Checking completed."))
 
;; ハイライト表示フェース
(setq ispell-highlight-face 'flyspell-incorrect)
;; テキスト編集モードで flyspell 自動起動
(add-hook 'text-mode-hook 'flyspell-mode)
;; check 前にウェイト 1 秒
(setq flyspell-delay 1)
 
;; short hands
(global-set-key [(control f1)] 'ispell-word)
(global-set-key [(control f2)] 'ispell-region)
(global-set-key [(control f3)] 'ispell-buffer)

Cygwin 環境で Aspell を組込めば,これとほぼ同じ設定で Windows Meadow-3.01dev においても,flyspell,ispell-buffer,ispell-region,ispell-word が動作する(修正点は aspell のパス)。ただし,Meadow Netinstall で ispell パッケージを組み込んでいる場合,%MEADOW%\packages\pkginfo\ispell フォルダに格納される auto-autoloads.el の定義が上記 aspell 用 elisp との相性が悪く(おそらく,この auto-autoloads.el は英単語チェックしか考慮していない設定になっていて,上記 aspell.el 設定と矛盾するためだろう),ispell-buffer と ispell-region がうまく動作しない。対策として ispell フォルダを pkginfo から外す必要があるので注意。(さらにもうひとつ。Windows Cygwin 環境でも aspell 辞書をインストールするには,アーカイブを解凍してできる辞書データを aspell 辞書フォルダにコピーするだけでは不十分である。必ず,./configure; make; make install オペレーションを実施して,*.rws ファイルをインストールする。)

Windows Meadow で aspell を使う場合,もう一点,注意事項がある。スペルチェック中綴誤りのある単語について aspell が問い合わせを行うバッファ・フレームのモードラインのロシア語が,デフォルト状態では「豆腐」で出力されてしまう。これは inactive なモード行のフォント設定がデフォルト・フォントであるために,キリル文字が表示できない事情による。Meadow 多言語フォント・パッケージ mule-fonts を導入しているなら,M-x set-face-font RET modeline-inactive RET mule-fonts16 RET として,mule-fonts16 に fontset をインターラクティブに変更するか,mule-fonts パッケージの auto-autoloads.el の最後に (set-face-font 'modeline-inactive "mule-fonts16") を追加する。キリル文字を含む多言語用の fontset を Meadow に定義しているなら,mule-fonts16 でなくその fontset 名を代わりに指定してもよい。

Emacs の苦労多き構築作業が終わったあとになって,flyspell の訂正版が出ていることが判明。なにも Emacs-CVS の追っかけをやる必要はなかったのだった。Manuel Serrano 氏の flyspell ページから flyspell-1.7o.el をダウンロードし,FreeBSD の Emacs 22.0.90 lisp/textmodes/flyspell.el をこれに入れ替えたら,きちんと動作するようになった。トホホ。

でも Emacs-23 にバージョンアップしてよかった点がひとつある。Unicode 文字合成機能(文字にアクセント記号を後置すると合成して表示する。タイ語などでは必須の機能)がやっとサポートされたことである。

※ 2010/01/11 付記
Emacs の最新 trunk は,2009 年末,ここでしるしている cvs から bzr (bazaar) にバージョン管理が変更された。もう cvs は適用できないので注意。

今日,自宅の Windows XP に JIS X 0213:2004(所謂 JIS 2004)対応のMS明朝,MSゴシックのフォント,さらにメイリオ・フォントを導入した。ずいぶん前に,JIS X 0213 について書いたとき,なによりもこの規格でなされた 168 字の字体変更をこき下ろした。けれども,Utf82TeX CJK 統合漢字拡張 B 対応を行ったこともあり,「標準」に追随して行かざるをえないなあという気持ちが強くなったのである。たとえ愚かな君主の決めた愚かな法律・標準であっても,発効すれば文句を言いながらも従うしかありません。「標準」とはそのようなものである。

IE 7 で葛原妙子の「葛」は,もと 葛 だったのが 葛正字体 になった。これはこれで正しい。

しかし,考えれば考えるほど,この JIS 2004 の字体変更の理屈が理解できない。この変更は,国語審議会の答申「表外漢字字体表」に示されている「印刷標準字体」に合わせたものである。それはそれで立派な理由かも知れないが,いまさら国語審議会の尻馬に乗ってどうする,という疑問も否めないのである。この表外漢字字体で「印刷標準字体」として認定された文字は新聞等の出現度数調査に基づいているとのことである。でも,文字の構成要素を度外視した原理・原則(一貫性)がいまひとつよくわからないのである。でもって JIS 2004 字体変更の「必然性」がどうも納得できないのだ。

「疼」は 疼疼正字体 に変えたのに,「冬」はなぜ 冬 のままで 冬正字体 にしないのか。「辻」について,辻 さんは結構いるのに 辻正字体 が標準というのは常識的に解せない。「辻」,「逢」を二点しんにょうにするなら,「道」,「遠」なども正字体にしたらどうかね。などなど。

「冬」,「道」,「遠」はこれが「印刷標準字体」ということなので変更しない訳である。でも,上例のとおり一貫性に欠ける。確かに,「標準」に一貫性が必要であるという訳ではない。だとしても,いままでの文字形を否定する(「変更」は過去の否定なのである)ほどの必然性があるとはとても思われない。

通常,ものごとの取り決めというものは,いったん決定されると,それ自体に不良(目的とする仕様に適合しない事象)が見いだされない限り,なかなか「変更」されないものである。新しい要請に対しては,「追加・拡張」がなされるのが通例だろう。JIS もこれらの変更後の字体を「追加」すればよかったのではないだろうか。なぜなら,「変更」は過去の規範に則っていた者が自らの資産も「変更」を強いられる一方,「追加・拡張」ならば己の事情によってそれを無視できるからである。

この JIS の愚かな自己否定のおかげで企業・官公庁・自治体のシステムは,本当は別のサービス向上の機能追加をしなければならないのに,文字の取り扱いについて「本当に」余計な改修を強いられているのである。この不況のなか全国津々浦々で進行中のこういう「塵も積もれば山となる」調達は,誰からも税金のムダ遣いと言われないのが面白い。しかも、このシステム改造は,JIS 2004 の恩恵を活かすというのではなく,JIS 2004 文字(文字コードなんかになんの頓着もないユーザは Windows Vista の新 IME で知らず知らず入力してしまうのである)がシステムに入って来ないようにブロックするものが大半である。笑ってしまう。JIS が足を引っ張っているのは明らかなのだ。「どうする? 企業情報システムの『JIS X 0213:2004』対応:ITpro」などを参照のこと。

JIS の字体変更は JIS 2004 にはじまった訳ではなく,JIS 83 においてすでに前例がある。どうも JIS は自己否定が好きなようである。これを見ていると,戦後間もないころの国語・国字改革の自己否定(現代仮名遣い,漢字制限)を連想させ,ほんと,日本国の標準策定というものの懲りない性格に呆れてしまうのである(私は現代仮名遣いを否定している訳ではありません)。そのうち,4 年くらいしたら,JIS はまた面白い改訂をしてくれるだろう。こんなことをしていたら,Unicode コンソーシアムが独自に CJK 漢字標準を整備し,日本国の JIS 標準が置いて行かれる --- これがいちばん起こりそうなことだと思う。

自己否定 --- これは,地震ですべてが崩壊し,すべてを一から作り直そうとしてしまう,地震国のお国柄なのだろうか。

私は個人的には文書作成を LaTeX で行う。LaTeX では,JIS X 0208(所謂 JIS 第一・第二水準)で足りない文字を Adobe_Japan1 コードに準拠して出力する方式が,広く浸透している。JIS 2004 の字体変更も Adobe_Japan1 の CID コードのおかげで cmap をちょちょいと変えて対応できる。JIS などの多様な意見を取りまとめなければならないお役所仕事よりも,Adobe という企業が印刷現場の要請に基づき一貫したポリシー(商業印刷の現場でほしいと思う文字を「追加」して行くポリシーだと思う)で作り上げた「標準」のほうが,よっぽど有用だと思う次第である。

※ 以上のとおり,さんざんぱら,JIS 2004 を批判しているのだけど,そうはいっても JIS の活動全般に懐疑を示すものではもちろんない。JIS はわが国のインダストリアル・スタンダードを決める責任ある機関である。上記のような問題は,その功績に比べると誠に微々たる話である。JIS で活動している研究者,企業人はわが国の斯界の権威であり,真に尊敬に値する人達である。私の軽口を大目に見てください。

* * *

上記字体変更の例で使用した文字の画像は LaTeX で出力した文字を,dvips, Ghostscript で png に変換したものである。コマンドラインから文字画像を生成するシェルスクリプトを書いた。以下に掲載しておくので,同じような課題がある場合にお使いください。OTF パッケージが必要。

#!/bin/sh
# tex2image: convert LaTeX command to image file
# コマンドラインの LaTeX 命令を画像(png, eps)出力する。
#                         coded by isao yasuda, July 27 2009.
 
if [ $# -lt 3 ]; then
    echo "usage: `basename $0` -e|-p out-file-base 'LaTeX fragment'"
    exit 1
fi
 
case $1 in
    # アウトライン EPS
    -e) CONV="gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=epswrite \
              -r9600 -sOutputFile=$2.eps $2-wk.eps"
        echo "Outlined EPS file genetation to $2.eps"
        break;;
    # PNG 
    -p) CONV="gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha \
              -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \
              -sOutputFile=$2.png $2-wk.eps"
        echo "PNG file genetation to $2.png"
        break;;
    # それ以外はエラー
     *) echo "$1 unknown option."
        exit 1;;
esac
 
echo "% 文字画像生成テンプレート
\documentclass[12pt]{jsarticle}
\usepackage[dvips]{graphicx,color}
\usepackage[multi,deluxe,expert]{otf}
\pagestyle{empty}
\begin{document}
\parindent=0pt
$3% こいつを LaTeX 処理
\end{document}" > $2.tex
 
# pLaTeX UTF-8 処理
platex --kanji=utf8 $2.tex
if [ $? -ne 0 ]; then
    echo "LaTeX error $2.tex."
    exit 1
fi
 
# dvips でまず普通の EPS にする
dvips -E -D 9600 $2.dvi -o $2-wk.eps
if [ $? -ne 0 ]; then
    echo "dvips error $2.dvi."
    exit 1
fi
 
# 画像変換
$CONV
 
# 後始末
rm -f $2-wk.eps $2.dvi $2.log $2.aux $2.tex
echo "done."

これを例えば tex2image というファイル名で,パスの通ったことろに UTF-8 エンコードで格納し,実行属性を付与する(chmod +x tex2image)。

tex2image -p ファイルベース名 'LaTeXコマンド'

とすると,LaTeXコマンド を処理した文字列が ファイルベース名.png という名の png 画像で生成される。LaTeXコマンド に前後のアポストロフィを付加しないと,特殊文字,空白文字を記述できないので注意。

png 画像はアルファ・チャンネルをもつ透過画像なので,背景色に追従可能である。文字そのものを着色したければ,LaTeX コマンドに "\textcolor{色名}{文字}" を指定すればよい。オプションを -e とすると文字のアウトラインを取った EPS 画像で出力する。ベクトル画像なので,Illustrator などで拡大編集してもギザギザで汚れはしないはずである。独自に必要な LaTeX スタイルがあれば,テンプレートに \usepackage 命令などを追加してほしい。dvips,Ghostscript がアウトラインフォントを拾える環境でないと動作しない(要するに,PK ビットマップフォントが混入しているとエラーになる)ので注意。

「葛」の JIS 2004 字体の画像: 葛正字体 の出力は,次のとおりとした。

tex2image -p 1kuzu '\LARGE\CID{7652}'

とあるロシア通の方と LaTeX や Meadow についてメールをやりとりする機会があった。その方は Windows Meadow 3 を使っておられるのだが,ロシア語を編集する際,24 ドットフォントが利用できないとのことであった。

私は普段 X11 でしか Emacs を使わず,BDF フォントの設定で 14, 16, 24 の各サイズで多言語表示できるようにしている。また,24 ドットフォントだと Emacs の画面サイズが巨大になり,かなりの高解像度でモニターを使用していないと煩い。16 ドットフォントが使えれば十分だと私は思っていた。そういう事情で,私には彼の悩みがいまひとつ解らなかった。私の Windows Meadow 環境で確認したところ,Meadow 3.00 の BDF フォントパッケージ mule-fonts では,たしかに 16 ドット表示しかできない設定になっていた。Meadow のフォント設定は UNIX X11 Emacs とはまったく違う。

mule-fonts パッケージ添付の elisp,BDF フォントのリストを確認し,これに足りない BDF ファイルを補い,elisp コードを追加することにより,24 ドットでも編集できるようにしてみた。件の方に差し上げたところ,24 ドットの大きい文字が使えるようになったとよろこんでくれた。同じ問題で困っている方もあるかと思い,せっかくなので,ここにもそのメモをしるしておく。Meadow Netintall インストーラでもって,mule-fonts パッケージがすでに組込まれていることが前提である。

  1. mule-fonts は intlfonts, /efont/, cdacfonts などのさまざまな多言語 BDF フォントを纏めた便利なパッケージである。しかし,/efont/ Unicode 24 ドットフォントを添付していない。まず,24 ドットフォントを追加するため,efont-unicode-bdf-0.4.2.tar.bz2 をダウンロードし,適当なフォルダで解凍する。.tar.bz2(tar のアーカイブを bzip2 で圧縮したもの)を取り扱うことの出来る Windows 用アーカイバ(lhaplus 等)が必要である。
  2. 数ある /efont/ フォントから,b24*.bdf(b24.bdf, b24_b.bdf, b24_i.bdf, b24_bi.bdf)4 ファイル%MEADOW%\packages\fonts\efonts フォルダの下にコピーする。%MEADOW% は Meadow をインストールしたフォルダ名に読み替える。
  3. mule-fonts には初期設定 elisp: auto-autoloads.el が添付されている。Meadow を起動すると自動的にこれが読込まれて,"mule-fonts16" という名のフォントセットが設定される仕組みになっている。これに 24 ドット用のフォントセット "intlefonts-24" を追加した私の版 auto-autoloads.el を用意した。これをダウンロードし,%MEADOW%\packages\pkginfo\mule-fonts\auto-autoloads.el に上書きコピーする。その際,必ずオリジナル auto-autoloads.el のバックアップを取得しておいてほしい。
  4. Meadow を再起動すれば,「Shift + 左クリック」で Font Menue に "intlefonts-24" が追加されているはずである。これを選択すると 24 ドットフォントで編集ができるようになる。/efont/ b24*.bdf は Unicode のラージフォントであり,ロシア語のみならず,古スラヴ語・教会スラヴ語,古典ギリシア語,ヴェトナム語,CJK 統合漢字等々を含んでいる。
  5. いつも 24 ドットを使いたい訳でなく,必要になった時点で設定したい場合は,次のようにすることもできる。intl_efonts_24.el を適当な場所において,M-x load-file RTN 適当な場所/intl_efonts_24.el RTN とすれば,同様に "intlefonts-24" フォントセットが追加される。ただし,この elisp は auto-autoloads.el がすでに読込まれていることが必要なので,.emacs に記述できない(auto-autoloads.el は .emacs のあとで処理されるため)ことに注意してほしい。

自作のコンコーダンス・ソフトウェアを Lemmatizer C++ クラスライブラリによって見出語でも解析できるようにしようとしている。Lemmatizer についてはふたつのバージョンについて,すでにここで書いた。AOT で公開されている版(「ロシア語形態素解析 lemmatizer」参照)と,lemmtizer.org で公開されている版(「Lemmatizer UTF-8 対応ライブラリ」参照)である。

AOT 版は解析できるロシア語テキストのエンコーディングが Windows CP1251 のみであるのに対し,lemmatizer.org 版はさらに UTF-8 をサポートしている。私は UTF-8 が扱えるということで後者を自作プログラムで使おうと検討していた。しかし,いまひとつ仕様のドキュメントがきちんとしていない。辞書のソースコードを丹念に読むと,なんとなくわかって来るけれども,どうしても不明点が残る。サイト管理者に問い合わせても,なしのつぶてである。その点,AOT 版はロシア語の文法構造について品詞,性・数・格,活動体・不活動体,時制などの解析結果出力仕様が明確である。

さらに AOT 版は,形態素解析ツール Lemmatizer のほか,統辞解析ツール Synan,語彙素抽出ツール Graphan(要するに Tokenizer)をも提供していて,私の知る限り,ロシア語自然言語解析のための最強のツールセットともいえるのである。私のコンコーダンス・ソフトの設計に関しても,UTF-8 でテキストを受入れて,見出語を Lemmatizer から取得するときに iconv ライブラリによって CP1251 にコード変換し,再び UTF-8 に戻せばよい,と考えるようになった。

これらについて調べるうち,じつはコンコーダンス生成ツール DDC(DWDS/Dialing Concordance)をも AOT が提供していることがわかった。ロシア語,英語,ドイツ語(ISO-8859-1)のコンコーダンス解析が可能である。そこで,これらすべてのツール(ここでは 「AOT ツール」と総称する)を FreeBSD にインストールして使ってみた。Linux ならおそらく苦もなく組込みができるのだろうが,BSD ユーザにとってはじつに面倒なので,私の失敗を踏まえたインストール・メモをしるしておく。コマンドラインは tcsh シェルである。

  1. AOT ツールのコンパイルには以下のソフトが必要である。バージョンが古かったり,インストールされていなければ追加導入しておく。最新の FreeBSD なら PCRE 以外ははじめから整備されているはずなので,ここでの説明は割愛する。PCRE については「ロシア語形態素解析 lemmatizer」を参照。( )内に私の試験環境をしるしておく。
  2. - gcc C/C++ コンパイラ 3.2 以上(4.2.1)
    - PCRE C/C++ 正規表現ライブラリ 6.4 以上(7.7 with UTF-8 options)
    - bison 構文解析器 1.875 以上(2.3)
    - flex 字句解析器 2.5.4 以上(2.5.4)
    - gmake GNU Make(3.81)

  3. 以下のアーカイブを AOT скачать 頁からダウンロードする。DDC についてのみ SorceForge から取得する。面倒だが,すべてダウンロードする。DDC を 1.74-1 と 1.80 の 2 版取得するのは,後者にはコンパイル用シェルスクリプトが添付されておらず,直近の古い版のそれを利用するためである(これについては,アーカイブになんの説明もなく,配布がちょっと杜撰ではないかと思う)。そして以下の順に同じディレクトリにおいて解凍する(いろいろややこしい)。ここではインストール・ディレクトリを /usr/local/lib/RML として説明する。
  4. - concord-1.74-1.tar.gz DDC-1.74-1
    - concord-1.80.tar.gz DDC-1.80
    - lemmatizer.tar.gz Lemmatizer
    - rus-src-morph.tar.gz 形態素解析辞書(露)
    - ger-src-morph.tar.gz 形態素解析辞書(独)
    - eng-src-morph.tar.gz 形態素解析辞書(英)
    - graphan.tar.gz Graphan
    - graphan_dicts.tar.gz 語彙素辞書
    - synan.tar.gz Synan
    - rus-syn-dicts.tar.gz 統辞解析用辞書(露)
    - ger-syn-dicts.tar.gz 統辞解析用辞書(独)

  5. 以下のように RML などの環境変数をセットする。これはインストールのみならず,実行時にも必要である。
  6. # setenv RML /usr/local/lib/RML
    # setenv RML_PCRE_LIB /usr/local/lib
    # setenv RML_PCRE_INCLUDE /usr/local/include
    

  7. DDC のアーカイブ concord-1.80 のディレクトリが $RML/ddc-1.8_kai として解凍されているはずである。この直下のファイルをすべて同じディレクトリ構成で $RML/Source の下に上書きコピーする。
  8. # cd $RML/ddc-1.8_kai
    # tar cf - . | ( cd ../Source; tar xvf - )
    

  9. 次にコンパイル用シェルスクリプトの修正を行う。FreeBSD では gmake は /usr/local/bin 下にあるが,AOT ツールのシェルスクリプトは /usr/bin/gmake を指しているので,これを訂正する。FreeBSD の gmake を /usr/bin/gmake にシンボリックリンクしてもよい。
  10. # cd $RML
    # mkdir shwork
    # foreach i (*.sh)
    foreach? cp $i shwork/$i.bak
    foreach? sed 's|/usr/bin/gmake|/usr/local/bin/gmake|' $i > shwork/$i
    foreach? mv $shwork/$i $i
    foreach? end
    #
    

  11. generete_syn_bin.sh 中の 26 行目 Language=`expr substr $i 1 3`Language=`expr $i : '\(...\)'` に書き換える。
  12. $RML/Source/ConcordDaemon/Main.cpp 及び $RML/Source/SynanDaemon/Main.cpp のファイル先頭に以下を追加する。あるいは,私の作ったパッチ bsdpatch$RML 直下に格納して patch -p1 < bsdpatch で適用してもよい。
  13. #include <sys/types.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <signal.h>
    

  14. いよいよ全 AOT ツールのコンパイル,辞書生成を行う。以下,順次添付シェルスクリプトを実行する。長い道のり...
  15. # cd $RML
    # ./compile_morph.sh
    # ./generate_morph_bin.sh Russian
    # ./generate_morph_bin.sh German
    # ./generate_morph_bin.sh English
    # ./gen_graphan_bin.sh Russian
    # ./gen_graphan_bin.sh German
    # ./compile_and_check_graphan.sh Russian
    # ./compile_and_check_graphan.sh German
    # ./compile_synan.sh
    # ./generate_syn_bin.sh Russian
    # ./generate_syn_bin.sh German
    # ./compile_concord.sh
    # ./check_concord.sh Russian
    # ./check_concord.sh German
    # ./check_concord.sh English
    

  16. 上記のそれぞれの実行後,エラーなくコンパイルが終了していることを確認する。synan(統辞解析ツール)のドイツ語チェック("./generate_syn_bin.sh German")でコンペア・エラーが出ても,$RML/test.tmp にドイツ語解析結果が出力されていれば問題ない。私の遭遇した問題からいえば,もしかすると,$RML/Source/SimpleGrammerLib 配下のモジュール・コンパイルで,s_qlex.cpp.tmp に文法不正があるとのエラーが発生するかも知れない。そのときは $RML/Source/SimpleGrammerLib/s_qlex.cpp.tmp をエディタで開いて,251--2 行目を確認し,以下のとおりに修正して,停止したシェルスクリプトから再実行してみてほしい。
  17. #include <FlexLexer.h>  // <-- 次行と繋がっている場合,改行を挿入する。
    int yyFlexLexer::yylex()
    

  18. ヘッダファイル,ライブラリをわかり易い場所にコピーしておく。AOT ツールのライブラリを使った自作プログラムをコンパイルするとき,-I/usr/local/include/RML-L/usr/local/lib/RML を指定すればよい。
  19. # cd $RML/Source
    # foreach i (*)
    foreach? mkdir -p /usr/local/include/RML/$i
    foreach? cp -p $i/*.h /usr/local/include/RML/$i
    foreach? end
    # find . -name "*.a" | xargs -J % cp % $RML
    

以上でインストールは完了である。ライブラリの利用,テストプログラムの実行が可能となる。日を改めて,Synan,DDC など,AOT ツールの簡単な使い方を紹介したいと思う。

ロシア語形態素解析器 Lemmatizer ライブラリ(Лемматизатор европейских языков)を利用した試験プログラムを書いてみた。Lemmatizer はロシア単語の文法構造と見出し語を解析する。このライブラリは C/C++ のアプリケーションから利用できる。UTF-8 テキストを解析できる点で,多国語混在テクスト中のロシア語解析にも応用可能である。このパッケージは先日紹介したものを少し拡張したもののようである。私は FreeBSD で試験したが,Linux,Mac OS X でも動くと思う。Lemmatizer の各ライブラリは静的ライブラリなので,アプリのプログラム・サイズが大きくなってしまうところが残念である。

【インストール】

インストールには CMake が必要である。FreeBSD なら "cd /usr/ports/devel/cmake && make install clean" で導入可能である。次に Lemmatizer の次の三つのライブラリ・アーカイブをダウンロードページから取得して展開する:libMAFSA-0.2.tar.gz, libturglem-0.2.tar.gz, turglem-russian-0.2.tar.gz。それぞれの展開ディレクトリ直下において,"cmake . ; make; sudo make install" を実行するだけの簡単なものである。turglem-russian-0.2 の make は辞書生成のため,かなりの時間と 100MB 以上のメモリを要するので注意。オペレーションは以下のとおり。

% cd libMAFSA-0.2
% cmake .
% make
% sudo make install
% cd ../libturglem-0.2
% cmake .
% make
% sudo make install
% cd ../turglem-russian-0.2
% cmake .
% make
% sudo make install

【試験プログラム】

Lemmatizer 利用アプリケーション・プログラムの流れは,tl::lemmatizer クラスを生成し,辞書・文法ルールをロードし,解析したい語に対して lemmatize<russian_utf8_adapter> を呼び出す。UTF-8 文字列もそのまま char* に入れればよい(UTF-16 にした wchar_t* などを期待しない)ので面倒がない。解析結果は tl::lem_result クラスに格納されるので,必要な情報をこのクラスから取り出して活用する。サンプルプログラムを参考に私が作成したテストプログラムを,以下に示す。テキストファイルを読込んで,単語を分割し,Lemmatizer に解析させる。単語リストの作成にはもう少しきちんとした(句読点を考慮した)tokenizer が必要だが,ここでは,指定文字で語分割するごく単純な自前の split 関数ですませている。

// -*- coding: utf-8; -*-
// lemtest.cpp: Lemmatizer test programm.
//                                    2009 (c) isao yasuda.
 
#include <turglem/lemmatizer.hpp>
#include <turglem/russian/charset_adapters.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdio.h>
 
using namespace std;
 
// Lemmatizer
void lem_analyze(const tl::lemmatizer &lem, const char *s)
{
    tl::lem_result lr;  // instance for result of lemmatizer analyze.
    size_t sz_lem = lem.lemmatize<russian_utf8_adapter>(s, lr);
 
    if (sz_lem) {
        printf("(lemmatize results: %u)\n", sz_lem);
        for (size_t i = 0; i < sz_lem; i++) {
            printf("    ** %u: paradigm/form = %04d/%02d", i,
                    lem.get_paradigm(lr, i),
                    lem.get_src_form(lr, i)
                );
            string nform = lem.get_text<russian_utf8_adapter>(lr, i, 0);
            printf("\t\t\t\tNormal Form: '%s'\n", nform.c_str());
        }
    } else {
        cout << "Empty result! Check your text." << endl;
    }
}
 
// split 関数: 指定文字で文字列を分割
void split(const string &s, char c, vector<string> &v) {
    string::size_type i = 0;
    string::size_type j = s.find(c);
 
    while (j != string::npos) {
        v.push_back(s.substr(i, j-i));
        i = ++j; j = s.find(c, j);
        if (j == string::npos)
            v.push_back(s.substr(i, s.length()));
    }
}
 
// main
int main(int argc, char **argv)
{
    tl::lemmatizer lem;  // lemmatizer instance
    string buffer;
    ifstream in(argv[1]);
 
    if (!in) {
        cerr << "usage: " << argv[0] << " file-name" << endl;
        return 1;
    }
    // load dict, etc.
    try {
        lem.load_lemmatizer(
            "/usr/local/share/turglem/russian/dict_russian.auto",
            "/usr/local/share/turglem/russian/paradigms_russian.bin",
            "/usr/local/share/turglem/russian/prediction_russian.auto"
            );
    }
    catch (const exception &e) {
        cerr << "Error: " << e.what() << endl;
    }
 
    while (!in.eof()) {
        vector<string> v;
        getline(in, buffer, '\n');
        if (!buffer.c_str()) continue;
        split(buffer, ' ', v);
        cout << buffer << endl;
 
        for (int i = 0; i < v.size(); i++) {
            cout << "  " << i << " input word: " << v[i] << ' ';
            // lemmatizer analyze.
            try {
                if (v[i].c_str()) lem_analyze(lem, v[i].c_str());
            }
            catch (const exception &e) {
                cerr << "Error: " << e.what() << endl;
            }
        }
    }
    return 0;
}

コンパイルは以下のようにする。ライブラリの指定順序が違うとリンクでエラーとなる。

% g++ -I/usr/local/include -L/usr/local/lib -o lemtest lemtest.cpp \
    -lturglem -lturglem-russian -lMAFSA

"lemtest 入力ファイル" で実行する。入力と実行結果を以下に示す。

入力:

Я люблю вас
Саша прочитал книгу на русском языке

実行結果:

Я люблю вас
  0 input word: Я (lemmatize results: 1)
    ** 0: paradigm/form = 2297/00               Normal Form: 'Я'
  1 input word: люблю (lemmatize results: 1)
    ** 0: paradigm/form = 0913/01               Normal Form: 'ЛЮБИТЬ'
  2 input word: вас (lemmatize results: 3)
    ** 0: paradigm/form = 0742/01               Normal Form: 'ВЫ'
    ** 1: paradigm/form = 0742/03               Normal Form: 'ВЫ'
    ** 2: paradigm/form = 0742/05               Normal Form: 'ВЫ'
Саша прочитал книгу на русском языке
  0 input word: Саша (lemmatize results: 1)
    ** 0: paradigm/form = 2485/00               Normal Form: 'САША'
  1 input word: прочитал (lemmatize results: 1)
    ** 0: paradigm/form = 0440/01               Normal Form: 'ПРОЧИТАТЬ'
  2 input word: книгу (lemmatize results: 1)
    ** 0: paradigm/form = 0088/03               Normal Form: 'КНИГА'
  3 input word: на (lemmatize results: 1)
    ** 0: paradigm/form = 0026/00               Normal Form: 'НА'
  4 input word: русском (lemmatize results: 3)
    ** 0: paradigm/form = 0002/06               Normal Form: 'РУССКИЙ'
    ** 1: paradigm/form = 0002/19               Normal Form: 'РУССКИЙ'
    ** 2: paradigm/form = 0313/05               Normal Form: 'РУССКИЙ'
  5 input word: языке (lemmatize results: 2)
    ** 0: paradigm/form = 0010/05               Normal Form: 'ЯЗЫК'
    ** 1: paradigm/form = 0021/05               Normal Form: 'ЯЗЫК'

"paradigm/form" に文法構造が示される。この数値で品詞,性・数・格などが示される。詳細は現在調査中である。"Normal Form" は見出し語である。

自作プログラムから Lemmatizer を呼出す方法の概略を,これで理解できた。そのうち,PCRE や Boost::regex などの正規表現ライブラリと組合わせて,コンコーダンス・プログラム,ロシア語旧正書法変換プログラムなどを開発したいと思っている。

ロシアの TeX ユーザーズグループのメーリングリスト CyrTeX-ru@vsu.ru で,「段落のはじめの単語のみ自動的にボールド書体にしたいのだが,マクロ中の \expandafter がうまく動かないのは何故」との質問が出ていた(Message #8242)。私にとって,\expandafter 云々はどうでもよかったが,段落冒頭単語を自動的にボールドにする工夫にはちょっと興味があった。自分でマクロを書いて,こんなのどう?と投稿してみた。

段落は \par で改段落される。その際に,\everypar の設定によって新しい段落のはじまり方を変えることができる。しかし, latex.ltx が別の環境への切替えのときなどに \everypar を頻繁にリセットしてしまうようで,一度 \everypar をカスタマイズしてもすぐ元通りになってしまい,なかなか思うようにはいかない。こんなことで悩むより,段落の最初の単語に対し,素直に \textbf{} をマークアップするほうが早く確実だともいえる。

とはいえ,できたものを一応掲載しておく。boldpar 環境内で,段落の冒頭の単語だけをノーマルではなくボールドにする。ただし,あくまで欧文用であり「単語」は最初の空白文字までのテキストである。和文だと,空白を探して段落の終わりに到達し,段落全体,あるいはセクション全体がゴシック体で組まれてしまうかも知れない。この環境内にはいかなる環境も記述することができない。そんなこんなであまり使い勝手がよろしくない。

% -*- coding: utf-8; -*-
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\makeatletter
\let\new@everypar=\everypar% get \everypar on the time
\newtoks\new@everypar%
\catcode32=13\relax% set space to catcode 13 
\def {\mdseries\space\catcode32=10\relax}% space is command \md
\def\boldpar{% make only the head word of paragraphs bold
\par\everypar\expandafter{\the\new@everypar%
\if@afterindent\else{\setbox\z@\lastbox}\@afterindenttrue\fi%
\bfseries\catcode32=13\relax}}%
\catcode32=10\relax% recover catcode
\def\endboldpar{\@nobreakfalse}% 
\makeatother
\begin{document}
\section{hogehoge}
\begin{boldpar}
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{boldpar}% recover bfserise --> mdserise
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{document}

上例では,boldpar 環境内で先頭の "Как" だけがボールド書体になるはずである。原稿の \makeatletter から \makeatother までが boldpar 環境定義マクロである。\everypar\bfseries 命令とインデント制御を埋め込む。空白文字の分類コードを一時的に 13 に変更して,これを \mdseries に置き換える。"\def {\mdseries\space ... }" の \def の次に空白がひとつあるのは,空白文字に命令を割り付けている訳である。命令を定義したすぐそのあとで,空白の分類コードを 10 に戻しておく必要がある。こうして,段落が開始された時点で \bfserise が実行され,最初の空白文字で \mdseries が実行され,見た目に元に戻るようにするというものである。デフォルト書体が bold だとドッチラケなんだけど。現時点のウェイトをチェックして振る舞いを変える必要があるだろう。\section 命令のあとのインデントの有無をコントロールするのに悩んだ。\@afterindenttrue\@nobreakfalse を設定しないと,\sectiton 命令指定時にインデントがおかしくなり,また3段落目でボールド化が解除されてしまうのである。

昨夜公開した Utf82TeX モジュール(utf82tex 本体プログラム)につまらないバグがあった。U+2000 から U+2FFF の JISX 0208 にない記号類が \UTFM0{xxxx} になってしまうというもの(正しくは \UTFM{xxxx})。

めったに使わない文字だと思いますが,早速ダウンロードしてくださった方には申し訳ありません。もう一度アーカイブを落としていただくか,utf82tex モジュールをこれと差換えてください。

Utf82TeX 0906 をリリースした。Unicode CJK Unified Ideographs Extension B(CJK 統合漢字拡張 B)をサポートし,Unicode 漢字の \UTFx, \CIDx 命令変換を改善した。漢字についてはほぼ遺漏なく処理できるようになったはずである。本サイトのダウンロード頁から取得できる。ドキュメントも改訂した。

Windows Vista がリリースされてから入力文字の範囲が拡張され,CJK 統合漢字拡張 B の文字も IME から普通に入力できるようになった。例えば,吉野屋の吉(つちよし):牛丼の吉野家の「吉」=「つちよし」もこのエリアに定義されている。従来の Utf82TeX だとそのまま出力されてしまい,コンパイルでエラーとなっていた。Utf82TeX 0906 は「つちよし」(U+20BB7)を \CID{13706} に変換する。

齋藤さんの OTF パッケージを前提としている。CJK 統合漢字拡張 B 領域文字を OTF パッケージで出力するには,安定版(stable)ではだめで,開発版(devel)を導入する必要があることに注意いただきたい。

今回いちばん苦労したのが,変換テーブル。Unicode コードポイントとそれに対応する CID 番号の対である。TeX コミュニティの権威者・角藤先生の utf8toutf 変換ツールがこのテーブルを持っていることを知った。先生にメールを書いて,流用許諾をお願いした。先生は快く了承してくださった。

テーブル構築用のプログラムを何本も書いた。UCS コードとビット列との相互変換などのコードを書くうちに,UTF-8 や UTF-16BE の符号化方式についても勉強になった。

Unicode Home Page にある Unihan database: Unihan.txt をダウンロードし,UCS と Adobe_Japan1_6 コード(つまり CID 番号)の対を抽出し,プログラムで加工した。Adobe Reader に添付されている CMap(日本語用 UniJIS-UTF16-H,中国語簡体字用 UniGB-UTF16-H,中国語繁体字用 UniCNS-UTF16-H,韓国語用 UniKS-UTF16-H)と突き合わせして,UCS --- CID JP, CID CS, CID CT, CID KR のレコードを生成した。これでできたテーブルを角藤先生のテーブルデータとマッチングして不足,不正をチェックした。最終的に 15,790 字のテーブルとなった。このうち CJK 統合漢字拡張 B 領域の変換可能文字は日本語,中国語合わせ(韓国語のハンチャはそもそもこの領域には定義されていない)1,939 文字となっている。

0906 の改修で少し Perl コードを整理した。strict でないし,余計な処理の残骸もこれまで野ざらしにしていたのだ。まだ misima にはこの変更を反映していない。もうしばらく時間がかかりそうである。

Profile

ISAO。システムエンジニア。昭和 30 年代を懐かしむオヤジ。ロシアに興味があります。
[more], [About our site]

Notice

この文書はフィクションであり,実在する個人,団体等とは一切関係ありません。

文書の記述内容は無保証です。不適切な表現があればコメントにてご指摘ください。

管理者が公序良俗に反すると判断したコメント,トラックバックは,断りなく削除される場合があります。

Links

About this archive

All Entries of Category 日曜大工

Previous: 文房清玩

Next: 鏡の中の鏡

Recent Entries in Main Index.
All Entries in Archive Index.

Web Pages

Powered by Movable Type 4.1