ここで言う、第一「いろは」問題とは、次の Tcl/Tk で書かれたプログラム a.tcl が生成する EPS ファイルを修正して、このプログラムの指示どおりのPDF ファイルを作成問題である。
この問題の要点は「いろは」をヒラギノ角ゴシックフォント(W6)で表示させる部分である。
ここではヒラギノフォントを例に出したが、他の日本語フォントに関しても同様である。 なお、Tcl/Tk で使うフォント名は
font familiesを wish で実行すれば得られる。詳しくは「Tcl/Tk Postscript の日本語フォントの問題(1)」に解説されている。そこで、以下では最初のレベルは解決されていると仮定する。
Tcl/Tk の postscript 出力で日本語フォントが使えない問題を解決する事の重要性は議論の余地がない。Python/Tk、ruby/Tk、perl/Tk など、多くの汎用言語は、postscript ファイルの生成に Tcl/Tk を利用しているからである。
第一「いろは」問題、Tcl/Tk が抱えている問題を完全に解決するものではない。プログラム a.tcl から生成された a.eps に手を加えて、「いろは」を表示させる問題なので、解決にはなっていないが、問題の原因をとらえる事ができ、解決へ向けて一歩前進するに違いない。
a.eps から PDF ファイル a.pdf を生成するために何を使うか?
筆者の環境は Mac/OSX 10.6.8 (Snow Leopard) である。この環境では、考えられるのは
の後に
/ISOEncode {} defを追加する。
を次のように変更する。
以上の修正を行った a.eps を a1.eps とする。
コマンドのメッセージを省略した。
注意: a1.pdf をマウスでクリックしてはならない。Preview.app が起動されて、転ける。コマンドから Adobe Reader を起動したのは、Preview が起動されるのを避けるためである。Preview.app は不安定で、今回の問題解決の利用には向かない。
第二「いろは」問題とは、「いろは」をキャンバスに書き出す Tcl/Tk のプログラムで、キャンバスから生成された EPS ファイルに、修正を加えないで、 PDF ファイルを作成する問題である。
なおベータバージョンは、8.6b2 である。ここでは 8.5.11 を使う。
コンパイルの実行中のメッセージに注意: Tcl も Tk も -arch i386
のコンパイルオプションが付いている。例えば
gcc -c -Os -arch i386 .....
コンパイルの結果は次のディレクトリにインストールされた。
/usr/local/bin /usr/local/lib/tk8.5 /Library/Frameworks/Tcl.framework /Library/Frameworks/Tk.framework
この事は、ファイルの生成時刻でも分かるが、もっと正当には次のコマンドから分かる。
-bash$ /usr/local/bin/tclsh % puts $tcl_patchLevel 8.5.11 % puts $tcl_library /Library/Frameworks/Tcl.framework/Versions/8.5/Resources/Scripts %なお、標準的にインストールされている Tcl/Tk 8.5.7 は、以下のディレクトリに関係している。
/usr/bin /usr/lib /System/Library/Frameworks/Tcl.framework /System/Library/Frameworks/Tk.framework
追記: /usr/local
へのインストールは、多分、X11 版であろう。これは $tk/unix
をコンパイルしてインストールした結果、生成されたと思われる。(生成時刻から判断)
注1:http://coding.derkeiler.com/Archive/Tcl/comp.lang.tcl/2009-10/msg00716.html
僕のケースでは
$HOME/src
に tcl8.5.11
と tk8.5.11
を置いている。他のバージョンも同じように $HOME/src
に置かれている。この場合 Tcl/Tk はコンパイル時に
$HOME/src/build/を作り、バージョン間で共有される。これが問題をもたらす。確実にコンパイルしたいならは、これを削除してから行う必要がある。
Tcl/Tk は
sudo make installで、何故か、一番新しいリソースにもアクセスが入る。僕の場合には、8.5.11 で 8.6b2 の存在が問題ももたらした。 そこで、これを防ぐために、
tcl8.6b2
や tk8.6b2
を tcl8.6b2-
や tk8.6b2-
になどにリネームして問題を回避した。
/usr/local/bin/wish
を実行しなくてはならない。
そして生成された c.eps のヘッダは
のように、フォント名に日本語文字が使われる。しかし、どうやら、gs 9.05 では、日本語文字を含むフォント名に対応していないようだ。解決には、Tk の postscript
出力で fontmap
を行う以外はなさそうである。
このプログラムでは「ヒラギノ角ゴ Pro W6」が HiraKakuPro-W6 として d.eps に書き出される。
$tcl
と$tk
を、各々 Tcl と Tk のソースコードが置かれているディレクトリとする。僕の場合には
tcl=$Home/src/tcl8.5.11 tk=$Home/src/tk8.5.11である。「いろは」問題に関係しているファイルは次の2つである。
$tk/library/mkpsenc.tcl $tk/generic/tkFont.c
ISOEncode
を無効にする。
mkpsenc.tcl
に Kenar
と書いた行を挿入する
tkFont.c
の中の
関数
Tk_TextLayoutToPostscript
の中の次のコードを修正する。
説明が要求されるであろう。
ヒラギノフォントなどの日本語フォントの場合、Tk_TextLayoutToPostscript
は glyphname
を見つけられないでいる。そこで、glyphname
の代わりに UTF8 文字列を使って
[(いろは)] と EPS ファイルに書き出そうと言うわけである。そこで glyphname
が見つからなかった場合の対応を加えたのが、ここでの修正である。
e.tcl
/usr/local/bin/wish e.tcl ps2pdf -dEPSCrop e.eps open -a "/Applications/Adobe Reader 9/Adobe Reader.app" e.pdfps2pdf が 「
HiraMaruPro-W4
」を扱えるには Ghostscript の設定が必要である。
ISOEncode
を無効にしたが、上位互換性を追求すべきである。このままではヨーロッパの言語に対して問題が発生する。
問題の箇所は Tcl/Tk postscript が生成した EPS ファイルに現れる次のコードである。
/HiraginoKakuGothicPro-Bold findfont 30 scalefont ISOEncode setfontCMAP フォントに対しては
ISOEncode
を実行したくないのであるが、次のように書けば良いようだ。
/ISOEncode {dup /CMap known {} {ISOEncode1} ifelse} def /ISOEncode1 { dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding CurrentEncoding def currentdict end % I'm not sure why it's necessary to use "definefont" on this new % font, but it seems to be important; just use the name "Temporary" % for the font. /Temporary exch definefont } bind def今度は
ISOEncode
は潰さない。