inkscapeで数式

2010/06/16未分類import

textextを使ってTeX文章をベクトル画像化

inkscape上で,textextを使ってTeX文章をベクトル画像化します.
同じことを扱っているネット上の記事は多いですが,成功例ということで記述します.

環境について

使っているパソコンにTeXの環境と,pstoedit,inkscape本体がインストールされていることが必要です*1
特に,pstoeditはパスを通しておくことが必要だと思います*2
TeXについては以下の環境で構築しました.
dvioutのSystemInfoからの抜粋です.なお,ハードはThinkPad X200です.
 --- Environment ---
C:\usr\dviout\dviout.exe
dviout          : Ver 3.18.1 (July 20, 2006)
OS              : Windows2000  Version 6.0 (4 日本語 (日本)) ←つまり,Vistaです.Windows Vista Business 32bit.
comctl32.dll    : Version 5.82
shell32.dll     : Version 6.0
printer         : Brother HL-5070DN series(1200dpi)
TeX 3.1415926 (Web2C 7.5.7)
pTeX 3.1415926-p3.1.10 (sjis) (Web2C 7.5.7)
dvips(k) p1.7b 
dvipdfmx-20090115(cvs) 
GPL Ghostscript 8.64 (2009-02-03)
TEXMF=""
TEXMFMAIN=""
TEXMFCNF=""
GS_LIB=""
PATH="C:\Program Files\ImageMagick-6.5.7-Q16;C:\Program Files\ImageMagick-6.5.5-Q16;C:\Program Files\Intel\WiFi\bin\;c:\l2h\zlib\bin;c:\l2h\tool;c:\l2h\tiff\bin;c:\l2h\rle\bin;c:\l2h\png\bin;c:\l2h\netpbm\bin;c:\l2h\jpeg\bin;c:\l2h\jbigkit\bin;C:\MinGW\bin;C:\Program Files\Common Files\Roxio Shared\9.0\DLLShared\;C:\Program Files\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Common Files\Roxio Shared\DLLShared\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\gs\gs8.64\lib;C:\gs\gs8.64\bin;C:\usr\bin;C:\Program Files\Lenovo\Client Security Solution;C:\Program Files\ThinkPad\ConnectUtilities\;c:\Program Files\Common Files\Lenovo;C:\Windows\System32\Wbem;C:\Windows;C:\Windows\system32;C:\PROGRA~1\JUSTSY~1\JSLIB32;C:\Perl\bin;C:\Perl\site\bin;C:\Program Files\ThinkPad\Bluetooth Software\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files\JustSystems\JSLIB32;C:\Software\gfortran\libexec\gcc\i586-pc-mingw32\4.5.0;C:\Software\MinGW\bin;C:\borland\bcc55\Bin;c:\l2h\jbigkit\bin;c:\l2h\jpeg\bin;c:\l2h\netpbm\bin;c:\l2h\png\bin;c:\l2h\rle\bin;c:\l2h\tiff\bin;c:\l2h\tool;c:\l2h\zlib\bin;C:\borland\bcc55\Bin;C:\Software\gnuplot\bin;C:\Program Files\OpenVPN\bin;C:\Software\pstoedit;C:\Software\potrace-1.8.win32-i386;C:\Software\gfortran\libexec\gcc\i586-pc-mingw32\4.5.0;C:\Software\MinGW\bin;"
 --- parameters ---
multi=4
dpi=600
GS=16
gsx="C:\gs\gs8.64\bin\gswin32c.exe "
spi=c:\usr\dviout
ToEdit=^c^V
gen="`C:\usr\bin\mktexpk.exe --dpi ^d --bdpi ^D --mag ^M ^s"
Wshow=+
TEXROOT=C:\usr\share\texmf\fonts;C:\usr\share\texmf-local\fonts
TEXPK=^r\tfm\\^s^tfm;^r\pk\\^s.^dpk;^r\vf\\^s.vf;^r\ovf\\^s.ovf;^r\tfm\\^s.tfm

 --- End ---

textextの入手とインストール

公式サイト?から最新版をダウンロードしてきます.
アーカイブか実行ファイルかはお好きな方を.インストーラで入れた方が確実といえば確実ですが,
どちらの場合であっても,必要なソフトのパスを通し,
inkscapeのインストールフォルダのshare/extesions/以下にtextext.inxとtextext.pyを置けば問題ないはずです.
この操作だけで,すんなりと動けば良かったのですが,
このままではWindows上では正常にこのプログラムは動かないので,いくつか変更する場所が出てきます.

半角文字だけのTeX文書を正常に実行できるようにする

上の状態では,このtextextは動きません.
一時ファイルの保存場所が,ユーザのディレクトリになっているのが問題らしいです.
そのため,インストールしたtextext.pyを直接編集します.バックアップをしたのち,下記のように編集してください.


まず,650行付近を編集します.スペースもしっかり合わせるようにしないと,
Pythonは正常に動作しないとのことなので注意が必要です.
        #self.tmp_path = tempfile.mkdtemp()
        self.tmp_path = 'c:/tmp/textext/'
	self.tmp_base = 'tmp'
730行付近.パスを消す必要はないのでそれをコメントアウトします.
    def remove_temp_files(self):
        """Remove temporary files"""
        base = os.path.join(self.tmp_path, self.tmp_base)
        for filename in glob.glob(base + '*'):
            self.try_remove(filename)
        #self.try_remove(self.tmp_path)
この2個所の編集で,ちゃんとTeX記法で数式が打てるようになるはずです.
画面のように操作できるようになります.
WS000031.jpg

WS000034.jpg


日本語を含むTeX文章を入力できるようにする

上記に加えて,もう少し設定すると日本語を含んだTeX文章もinkscape上で利用できるようになります.
方針としては,PDFファイルを作成するのに利用するプログラムをpdflatexからplatex + dvipdfmxに変更し,
フォントを一度ベクトル画像に置き換えたepsファイルを作って,pstoeditに渡してやるというもののようです.

まず,55行目付近を下のように変更します.
import inkex
import codecs
import os, sys, tempfile, traceback, glob, re, md5, copy
from lxml import etree
720行目付近
        # Convert TeX to PDF

        # Write tex
        f_tex = open(self.tmp('tex'), 'w')
        try:
            #f_tex.write(texwrapper)
	    sjis_tex = codecs.getwriter('shift_jis')(f_tex)
	    sjis_tex.write(texwrapper)
        finally:
            f_tex.close()
            
        # Exec pdflatex: tex -> pdf
        #exec_command(['pdflatex', self.tmp('tex')] + latexOpts)
        exec_command(['platex', self.tmp('tex')] + latexOpts)
	exec_command(['dvipdfmx', self.tmp('dvi')])
	if not os.path.exists(self.tmp('pdf')):
            raise RuntimeError("pdflatex didn't produce output")
850行目付近
        # Exec pstoedit: pdf -> svg
	exec_command(['gswin32c', '-dSAFER', '-q', '-dBATCH', '-dNOPAUSE',
	              '-sDEVICE=epswrite', '-dEPSCrop', '-r9600',
	              '-sOutputFile='+self.tmp('eps'), self.tmp('pdf')])
	exec_command(['pstoedit', '-f', 'plot-svg',
	              self.tmp('eps'), self.tmp('svg')]
	              + pstoeditOpts)

これで,日本語化ができたと思います.

WS000035.jpg

WS000036.jpg


ちなみに,textextの項目がなぜ「Tex Text」と「Tex Text Japanese」があるのかといえば,
何となく,最初に説明した個所を直したものを前者に,日本語化したものを後者に*3している関係でです.
こうすると,ファイルサイズが抑えられるかもしれないので*4


なお,この記事を書くにあたっては,こちらの記事と,こちらの記事,こちらの記事などを参考にしています.
特に,この記事の設定例は前の2つのページに沿っています.ただただ感謝するばかりです.

使い道

inkscapeのオブジェクトは,コピーペーストで
Word,Excel,PowerPoint,花子などにベクトル画像として貼り付けられます.
なので,図と数式を使って説明する資料を作成する場合にこの方法は非常に役に立つのです.
Adobeの製品のように追加で高額な投資をしなくても良いし,数式表現は厳密なものが使えますので.
活用してみてください.

*1 : 本記事の例では,pstoeditはversion3.50,inkscapeは0.47です.

*2 : インストーラを使うとパスの設定はしてくれるようですが,手動でやっても問題ないです.公式サイトはこちら

*3 : textext-jp.py,textext-jp.inxとリネームして,タイトルなどを適宜変更しています.

*4 : 日本語化の時点で,フォントが完全に図形になっているので…….ただ,日本語化前ももしかしたらフォントを図形化しているような気もするので意味はほとんどありません.