January 14, 2009
Textextの日本語化
昨日、ドローツールinkscape上で、Latexの数式や文章を扱うための拡張、Textextの記事を書いた。Textextは、非常に便利な拡張なのだが、難点としては日本語を扱うことが出来ない(日本語を含むソースコードを読ませるとエラーになってしまう)事が挙げられる。
そこで、Textextで日本語が使えるように改造してみたので、その方法を紹介する。大分やっつけで適当なので、その辺は目をつぶって貰いたい。実践する前に注意しておきたいのだが、以下の方法は、Linux環境(Ubuntu8.04)で、且つinkscapeのバージョン0.46、Textextのバージョン0.4.4(2009年1月現在の最新版)で試したものであり、プラットフォームやバージョン違い等、他の環境での動作の保証は一切しないので、それを踏まえて行って欲しい。
改造方法を説明する前に、まず、エラーの原因と、対処法の流れを追っていこう。何故Textextに日本語のLatexソースを食わせた際にエラーが起こるのか?これは、Textextが内部で、Latexソースコードをpdfファイルに変換する部分で、日本語未対応なコマンド、pdflatexを使っていることが主な原因である。そこで、この処理の部分を、platexコマンドで、.tex→.dviとし、さらにdvipdfmxコマンドで.dvi→.pdfとして、二段階に分けてやれば良いのではないか。
また、日本語を扱う上で、注意したいのが文字コードである。基本的にLinuxのplatexコマンドは、日本語のコーディングがEUC-JPであることを前提にしている。しかし、inkscapeの拡張の記述に用いられるpythonでは、マルチバイト文字はユニコードで扱われることが多いので、platexに食わせる一時ファイルは、EUC-JPに変換する必要があるだろう。
それでは、実際にTextextを改造していこう。エディタで~/.inkscape/extensions/textext.pyを開く。54行目に、
import inkex
という行があるので、この上に、
import codecs
という行を追加する。これは、文字コードの変換に必要なおまじないのような物である。次に、720行目当たりに、
f_tex = open(self.tmp('tex'), 'w')
と書かれた行があるので、この下に、
euc_tex = codecs.getwriter('euc-jp')(f_tex)
という行を追加する。pythonに触れたことがある人は大丈夫だと思うが、インデント(行頭の空白文字の個数)がズレないように注意すること。そして、この2行下に、
f_tex.write(texwrapper)
という行があるので、これの行頭に#を付けて、
#f_tex.write(texwrapper)
として、この行をコメントアウトして、この行の下に次のコードを書く。
euc_tex.write(texwrapper)
ここまでの変更で、platexに渡すファイルを、文字コードをEUC-JPに変換した上で保存できたことになる。
さらに数行下に、
exec_command(['pdflatex', self.tmp('tex')] + latexOpts)
と書かれた行があるので、先程と同じ要領で、この行の行頭に#を付けて、この処理をコメントアウトしておき、その下に次の2行を追加する。
exec_command(['platex', self.tmp('tex')] )
exec_command(['dvipdfmx', self.tmp('dvi')] )
これで、tex→pdfの変換コマンドを、pdflatexから、platex+dvipdfmxに変更できた。
これで改造は終了である。変更を保存してエディタを終了し、inkscapeを開いてTextextを実行して動作確認をしてみよう。日本語入りtexソースが通れば、成功である。もし、Textextの起動時にエラーが出た場合、textext.pyにおいて、追加した行のインデントを間違っている可能性が高いので、そこら辺に注意して見直してみることを勧める。
ここでは、Linux OSのつもりで説明してきたが、恐らく、platexコマンドが要求する日本語文字コードさえ知っていれば(例えば、dos版ではEUC-JPではなく、Shift-jisだったと思う)、同じ流れで日本語化が出来ると思う。
!----追記 09 1/26----!
dos版のinkscape, textextの日本語化について、何人からの方からコメントを頂いた。pstoeditが日本語を通す、通さないといった問題があるようだが、上手くいった、という例もあるようなので、根性がある人は試す価値があるかもしれない。
!----追記ここまで----!
そこで、Textextで日本語が使えるように改造してみたので、その方法を紹介する。大分やっつけで適当なので、その辺は目をつぶって貰いたい。実践する前に注意しておきたいのだが、以下の方法は、Linux環境(Ubuntu8.04)で、且つinkscapeのバージョン0.46、Textextのバージョン0.4.4(2009年1月現在の最新版)で試したものであり、プラットフォームやバージョン違い等、他の環境での動作の保証は一切しないので、それを踏まえて行って欲しい。
改造方法を説明する前に、まず、エラーの原因と、対処法の流れを追っていこう。何故Textextに日本語のLatexソースを食わせた際にエラーが起こるのか?これは、Textextが内部で、Latexソースコードをpdfファイルに変換する部分で、日本語未対応なコマンド、pdflatexを使っていることが主な原因である。そこで、この処理の部分を、platexコマンドで、.tex→.dviとし、さらにdvipdfmxコマンドで.dvi→.pdfとして、二段階に分けてやれば良いのではないか。
また、日本語を扱う上で、注意したいのが文字コードである。基本的にLinuxのplatexコマンドは、日本語のコーディングがEUC-JPであることを前提にしている。しかし、inkscapeの拡張の記述に用いられるpythonでは、マルチバイト文字はユニコードで扱われることが多いので、platexに食わせる一時ファイルは、EUC-JPに変換する必要があるだろう。
それでは、実際にTextextを改造していこう。エディタで~/.inkscape/extensions/textext.pyを開く。54行目に、
import inkex
という行があるので、この上に、
import codecs
という行を追加する。これは、文字コードの変換に必要なおまじないのような物である。次に、720行目当たりに、
f_tex = open(self.tmp('tex'), 'w')
と書かれた行があるので、この下に、
euc_tex = codecs.getwriter('euc-jp')(f_tex)
という行を追加する。pythonに触れたことがある人は大丈夫だと思うが、インデント(行頭の空白文字の個数)がズレないように注意すること。そして、この2行下に、
f_tex.write(texwrapper)
という行があるので、これの行頭に#を付けて、
#f_tex.write(texwrapper)
として、この行をコメントアウトして、この行の下に次のコードを書く。
euc_tex.write(texwrapper)
ここまでの変更で、platexに渡すファイルを、文字コードをEUC-JPに変換した上で保存できたことになる。
さらに数行下に、
exec_command(['pdflatex', self.tmp('tex')] + latexOpts)
と書かれた行があるので、先程と同じ要領で、この行の行頭に#を付けて、この処理をコメントアウトしておき、その下に次の2行を追加する。
exec_command(['platex', self.tmp('tex')] )
exec_command(['dvipdfmx', self.tmp('dvi')] )
これで、tex→pdfの変換コマンドを、pdflatexから、platex+dvipdfmxに変更できた。

ここでは、Linux OSのつもりで説明してきたが、恐らく、platexコマンドが要求する日本語文字コードさえ知っていれば(例えば、dos版ではEUC-JPではなく、Shift-jisだったと思う)、同じ流れで日本語化が出来ると思う。
!----追記 09 1/26----!
dos版のinkscape, textextの日本語化について、何人からの方からコメントを頂いた。pstoeditが日本語を通す、通さないといった問題があるようだが、上手くいった、という例もあるようなので、根性がある人は試す価値があるかもしれない。
!----追記ここまで----!