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に変更できた。

textext_jpこれで改造は終了である。変更を保存してエディタを終了し、inkscapeを開いてTextextを実行して動作確認をしてみよう。日本語入りtexソースが通れば、成功である。もし、Textextの起動時にエラーが出た場合、textext.pyにおいて、追加した行のインデントを間違っている可能性が高いので、そこら辺に注意して見直してみることを勧める。

ここでは、Linux OSのつもりで説明してきたが、恐らく、platexコマンドが要求する日本語文字コードさえ知っていれば(例えば、dos版ではEUC-JPではなく、Shift-jisだったと思う)、同じ流れで日本語化が出来ると思う。

!----追記 09 1/26----!
dos版のinkscape, textextの日本語化について、何人からの方からコメントを頂いた。pstoeditが日本語を通す、通さないといった問題があるようだが、上手くいった、という例もあるようなので、根性がある人は試す価値があるかもしれない。
!----追記ここまで----!


les_paul_sp
posted at 00:04

トラックバックURL

この記事へのコメント

1. Posted by yama   January 15, 2009 11:32
はじめまして.
windows環境でどうにかtextextで日本語を使えないか調べていてここを訪れました.

ここの記事を参考にさせていただいて,euc-jpに変換する部分をshift_jisに変換するようにしてwindows環境で実行してみました.

どうやら,windows環境ではpstoeditが日本語に対応していないため,うまく変換出来ないようです。。。

一時ファイルを置いている場所からファイルを削除する部分のコードをコメントアウトにして確認したのですが,pdfファイルまではできています.
でも,pstoeditを使ってsvgを作成するところでうまくいっていないみたいです.svgファイルの中身がありません。。。

VMWareでubuntuの仮想環境を作ってLinuxの環境で実行してみることにします.
2. Posted by les_paul_sp   January 15, 2009 22:18
yamaさん、情報、有難うございます。
> どうやら,windows環境ではpstoeditが日本語に対応していないため,うまく変換出来ないようです。。。
そうでしたか…。文字コードさえクリアすればDOSでも行けるかな、と踏んでいたのですが、矢張り、自分で試していないことをblogに書くものでは無いですね…。
3. Posted by kuji   January 26, 2009 14:58
はじめまして。
現在、windows環境ででtextextを実行した後にinkscapeにsvgファイルが自動で読み込まれずに困っています。
解決策を検索していたらこの記事を発見したため、とりあえず日本語化だけ試してみました。

windows xp sp2、inkscape 0.46、Textext 0.4.3で、
この記事どおりに変更して、euc-jpをshift_jisにしてみたところ問題なく日本語を含んだsvgファイルを作成できましたので報告させていただきました。
4. Posted by les_paul_sp   January 26, 2009 23:43
>kujiさん
コメント有難うございます。
他の方で、pstoeditを実行したさいに、日本語を含んでいる為に上手くいかなかった、という事例もあるそうなので、やはり成功するかどうかは環境に大きく依存するようですね。
5. Posted by oden   November 26, 2009 02:14

どうも,はじめまして.日本語が使えないどころか,textext そのものが動かず困っていた者です.

"GtkWarning: gtk_text_buffer_emit_insert: assertion `g_utf8_validate > (text, len, NULL)`"

というエラーがでていたので,文字コードの問題かなと思い検索していたところ,この記事を見つけました.
'euc-jp' の部分を 'shift-jis' に置き換えてこの記事に書いてある通りに textext.py を変更したところ,textext が動きました.ありがとうございます!本当に助かりました.

私の環境 (WinXP sp3,inkscape 0.47 pre4,textext 0.4.4) では日本語も使えるようになっていました.
latex の処理環境や cygwin を入れていることにも影響を受けているのかも (自分でもよく分かりません^^;).

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔