マークダウンで数式リストを書いてlatexを通じて画像にするpythonスクリプト

最終更新日06 Jun 2017 00:21

マークダウンで数式書いてAtomでプレビューして確認して、
それを一気に画像とemfにしてパワポに張り付けられるようにしたい。
という目的で作ったものです。

dependency

次のコマンドがインストールされていて環境変数PATHに通った状態である必要があります。

  • latex
  • dvisvgm
  • dvipng
  • inkscape

使い方

equationlist.mdというファイル名で数式を書きます

# equationname2

$$
\frac{\pi^2}{6}=\lim_{n \to \infty}\sum_{k=1}^n \frac{1}{k^2}
$$

# equationname2

$$
\frac{a}{b}
$$

…数式の名前に日本語は使えません。

そして以下のpythonスクリプトを実行すると
.emf.pngが出力されます。

pythonスクリプト

# coding: utf-8
import os
import glob
def tex2images(name):
    latex = "latex "+name+".tex"
    dvi2png = "dvipng "+name+".dvi -D 150 -bg Transparent -T tight -o"+name+".png"
    dvisvgm = "dvisvgm -n "+name+".dvi -c 2"
    svg2emf = "inkscape -f "+name+".svg -M "+name+".emf"
 
    os.system(latex)
    os.system(dvi2png)
    os.system(dvisvgm)
    os.system(svg2emf)
    os.remove(name+".aux")
    os.remove(name+".log")
    os.remove(name+".dvi")
    os.remove(name+".tex")
    os.remove(name+".svg")
texheader="""
\\documentclass{article}
\\usepackage{amsmath}
\\usepackage{amssymb}
\\usepackage{amsfonts}
\\usepackage{color}
\\thispagestyle{empty}
\\begin{document}
\\(\\displaystyle
"""
mdfile =open("equationlist.md",encoding="utf-8")
i=0
begineq = False
name = ""
for line in mdfile:
    if line[0] == "#":
        name = line[2:-1]
        name = name.replace(" ","_")
    if begineq:
        if line =="$$\n":
            begineq = False
            texstream+= "\\)\n\\end{document}"
            texfile = open(name+".tex","w")
            texfile.write(texstream)
            texfile.close()
            tex2images(name)
        else:
            texstream += line
    elif line == "$$\n":
        begineq = True
        texstream = texheader
print(texstream)
mdfile.close()

出力結果

name1.png

name1.png

name2.png

name2.png

参考にしたもの

  • inkscapeのlatexを出力するpythonスクリプトであるeqtexsvg.pyを見て解釈しました。

eqtexsvg.pyではpstoeditが使用されていましたが、出力結果があまり綺麗でないため
dvisvgmを通じてinkscapeでemfに変換するという方法をとっています


ファイル

サポートサイト Wikidot.com