textext に関するページです。

Inkscape のオブジェクト中に LaTeX オブジェクトを挿入、編集可能にする Python Extension。 (本家

インストール

Mac OS X

pstoedit など必要なパッケージを homebrew でインストールした後、python-lxml パッケージが homebrew にないので、easy_install でインストールする。(参考:python - How do you install lxml on OS X Leopard without using MacPorts or Fink? - Stack Overflow)

その後、textext の tar ボールを解凍し、Inkscape の extension ディレクトリ (homebrew でインストールした場合は、~/.config/inkscape/extensions/)にコピーする。

$ brew install pstoedit libxml2 libxslt
$ sudo easy_install lxml
$ wget http://pav.iki.fi/software/textext/textext-0.4.4.tar.gz
$ tar zxvf textext-0.4.4.tar.gz
$ cp textext.* ~/.config/inkscape/extensions/

Ubuntu 12.04

pstoedit パッケージをインストールした後、textext の tar ボールを解凍し、Inkscape の extension ディレクトリ (~/.config/inkscape/extensions/) にコピーする。

$ sudo apt-get install pstoedit
$ wget http://pav.iki.fi/software/textext/textext-0.4.4.tar.gz
$ tar zxvf textext-0.4.4.tar.gz
$ cp textext.* ~/.config/inkscape/extensions/

バージョン2.5以上の Python への対応

TexText オブジェクトを作成すると、以下の警告が表示される。

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

バージョン2.5以上のPythonでハッシュ計算のモジュールをhashlibへ移行する - 試験運用中なLinux備忘録によると、「md5」や「sha」のモジュールは古いので「hashlib」を代わりに使用せよってことらしい。

また、うぶつん: inkscapeでLaTeX数式(textextによれば、md5.new と hashlib.md5 は微妙に違うので、以下のように修正するのがよいらしい。

  • textext.py
    $ diff -Nur textext.py.orig textext.py
    --- textext.py.orig	2011-06-02 17:55:11.364268250 +0900
    +++ textext.py	2011-06-02 17:59:32.014274698 +0900
    @@ -52,7 +52,7 @@
     sys.path.append(os.path.dirname(__file__))
     
     import inkex
    -import os, sys, tempfile, traceback, glob, re, md5, copy
    +import os, sys, tempfile, traceback, glob, re, hashlib, copy
     from lxml import etree
     
     USE_GTK = False
    @@ -868,10 +868,13 @@
         def __init__(self, document):
             PdfConverterBase.__init__(self, document)
             self.hash = None
    +        USE_GTK = False
     
         def convert(self, *a, **kw):
             # compute hash for generating unique ids for sub-elements
    -        self.hash = md5.new('%s%s' % (a, kw)).hexdigest()[:8]
    +        m = hashlib.md5()
    +        m.update('%s%s' % (a, kw))
    +        self.hash = m.hexdigest()[:8]
             return PdfConverterBase.convert(self, *a, **kw)
     
         def pdf_to_svg(self):
    
  • 社会基盤情報システム研究室wiki - 研究で使うもの
  • うぶつん: textextで日本語を使う
  • いわにぃのブログ : textext を含む記事

日本語を使えるようにする

上記の Python 2.5 以上への対応も含めて、以下のように書き換える。(情報:仮想化された日々:Textextの日本語化 - livedoor Blog(ブログ)うぶつん: textextで日本語を使う

以下では、日本語文字コードを UTF-8 としている。

$ diff -Nur ~/.config/inkscape/extensions/textext.py.orig ~/.config/inkscape/extensions/textext.py
--- /Users/hoge/.config/inkscape/extensions/textext.py.orig	2013-12-24 18:40:29.000000000 +0900
+++ /Users/hoge/.config/inkscape/extensions/textext.py	2013-12-24 18:39:58.000000000 +0900
@@ -51,8 +51,9 @@
 sys.path.append(r'c:/Program Files/Inkscape/share/extensions')
 sys.path.append(os.path.dirname(__file__))
 
+import codecs
 import inkex
-import os, sys, tempfile, traceback, glob, re, md5, copy
+import os, sys, tempfile, traceback, glob, re, hashlib, copy
 from lxml import etree
 
 USE_GTK = False
@@ -718,13 +719,15 @@
 
         # Write tex
         f_tex = open(self.tmp('tex'), 'w')
+        utf8_tex = codecs.getwriter('utf_8')(f_tex)
         try:
-            f_tex.write(texwrapper)
+            utf8_tex.write(texwrapper)
         finally:
             f_tex.close()
             
         # Exec pdflatex: tex -> pdf
-        exec_command(['pdflatex', self.tmp('tex')] + latexOpts)
+        exec_command(['platex', self.tmp('tex')] )
+        exec_command(['dvipdfmx', self.tmp('dvi')] )
         if not os.path.exists(self.tmp('pdf')):
             raise RuntimeError("pdflatex didn't produce output")
 
@@ -868,10 +871,13 @@
     def __init__(self, document):
         PdfConverterBase.__init__(self, document)
         self.hash = None
+        USE_GTK = False
 
     def convert(self, *a, **kw):
         # compute hash for generating unique ids for sub-elements
-        self.hash = md5.new('%s%s' % (a, kw)).hexdigest()[:8]
+        m = hashlib.md5()
+        m.update('%s%s' % (a, kw))
+        self.hash = m.hexdigest()[:8]
         return PdfConverterBase.convert(self, *a, **kw)
 
     def pdf_to_svg(self):

MacOS X (10.8.5) では、以下のエラーが出て日本語文字が表示されなかった。

  File "textext.py", line 725, in tex_to_pdf
    utf8_tex.write(texwrapper)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 144: ordinal not in range(128)

tatsushimの黒歴史について紹介しておく : 【pythonで「 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)」ってエラーが出たときの対処方】によれば、Python のデフォルトエンコードを UTF-8 に変更すればよいらしい。

$ sudo vi /usr/lib/python2.7/site.py

493行目
     encoding = "ascii" # Default value set by _PyUnicode_Init()
		↓
     encoding = "utf-8" # Default value set by _PyUnicode_Init()

ちゃんと解決しようと思ったら、textext のソースを修正しなければいけないと思うが、Python は知らないので、とりあえずエラーメッセージでググった結果だけ、参考までに以下にリストしておく。

参考


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-12-24 (火) 19:08:26 (1916d)