2010年4月21日水曜日

inkscapeでLaTeX数式(textext)

日本語化の話題を先にしてしまいましたが、Ubuntuのinkscapeにtextextを導入するには少し気をつけなければならない点があります。今回はその話をしておきます。
Ubuntu 9.10のリポジトリにあるinkscape 0.47では、デフォルトで「エクステンション」→「レンダリング」→「LaTeX数式」からLaTeX数式を出力出来るのですが、如何せん再編集機能が無い、字が大きいなど不便な印象があります。
textextはLaTeXの数式を出力出来るinkscapeの有名(多分)な拡張機能で、一度出力した数式を再編集することが出来たり、事前にプリアンブルファイルを用意しておくことで自前で定義したコマンドを扱うことが可能になるなど非常に便利です。
Ubuntu 9.10にて導入しようとしたところ、煩わしい点が幾つかあったので、それらについて記録しておこうと思います。

まずはtextextのサイトからtextext-0.4.4.tar.gzをダウンロードし、展開して得られる
textext.py
textext.inx
を~/.config/inkscape/extensions に移動します。(inkscape 0.46以前では~/.inkscape/extensions というディレクトリになっているようです。)
textextではLaTeX数式を含む文章ファイルをsvg形式に変換するために、まずpdflatexでpdfファイルを生成した後、pstoeditでpdfファイルをskファイルに変換し、さらにskconvertでsvgファイルに変換するという手順を取っているようです。そのためこれらのコマンドが使える状態になってなければなりません。
pdflatexは多くのTeXディストリビューションに含まれているようなのでTeXが使えている状態ならば問題ないでしょう。pstoedit, skconvertはUbuntuのリポジトリにあるパッケージで間に合います。skconvertコマンドを使うにはskencilを導入すればいいみたいです。他にもpython-lxmlというパッケージも必要です。

$ sudo apt-get install pstoedit skencil python-lxml

これで必要な道具はそろったはずなので、inkscapeを起動してメニューの「エクステンション」→「Tex Text」からtextextを実行し、適当に入力してみたところ

 /home/username/.config/inkscape/extensions/textext.py:55: 
DeprecationWarning: the md5 module is deprecated; use hashlib instead
   import os, sys, tempfile, traceback, glob, re, md5, copy

というエラーが出ました。そこでPascal Schulthessさんとこを参考に、textext.pyを書き換えます。以下その詳細の丸写しです。一行が長い部分がうまく表示されていないようなので、Pascal Schulthessさんの記事をご覧になるとよいと思います。
まずtextext.pyの55行目にある
54 import inkex
55 import os, sys, tempfile, traceback, glob, re, md5, copy
56 from lxml import etree
の部分を

54 import inkex
55 import os, sys, tempfile, traceback, glob, re, copy
56 import hashlib
57 from lxml import etree
と書き換えます。左についている番号は行番号です。実際のファイルには書き込まないよう
に注意してください。 さらに870行目前後の
868    def __init__(self, document):
869        PdfConverterBase.__init__(self, document)
870        self.hash = None
871
872    def convert(self, *a, **kw):
873        # compute hash for generating unique ids for sub-elements
874        self.hash = md5.new('%s%s' % (a, kw)).hexdigest()[:8]
875        return PdfConverterBase.convert(self, *a, **kw)
876
877    def pdf_to_svg(self):
878        exec_command(['pdf2svg', self.tmp('pdf'), self.tmp('svg'), '1']) 
という部分を
868    def __init__(self, document):
869        PdfConverterBase.__init__(self, document)
870        self.hash = None
871        USE_GTK = False
872
873    def convert(self, *a, **kw):
874        # compute hash for generating unique ids for sub-elements
875        m = hashlib.md5()
876        m.update('%s%s' % (a, kw))
877        self.hash = m.hexdigest()[:8]
878        return PdfConverterBase.convert(self, *a, **kw)
879
880    def pdf_to_svg(self):
881        exec_command(['pdf2svg', self.tmp('pdf'), self.tmp('svg'), '1'])
と書き換えます。これでUbuntu 9.10のinkscapeでLaTeXの数式を扱うことが出きるようになりました。但しpdflatexコマンドは日本語を処理出来ないため、このままでは日本語を用いることが出来ません。日本語を使えるようにする話は別の記事で扱いましたのでそちらを参考にしてみてください。