数式入りのmarkdownをSphinxを使ってhtml/pdfにする

Sphinxでmarkdown拡張を扱うためのrecommonmarkというライブラリがあります。 これを使うとreSTではなく、markdownを書いてhtmlやPDFが吐けるようになります。

詳細は以下のエントリにやり方がまとまっています。

<iframe src="http://tech.3rd-p-zombie.net/embed/2015/12/02/023732" title="MarkdownでSphinxできるようになったので試してみた(後編) - 意識の高いLISPマシン" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://tech.3rd-p-zombie.net/entry/2015/12/02/023732">tech.3rd-p-zombie.net</a></cite>

実は、このrecommonmarkはconfigに設定を書くだけで、数式をmarkdownの中に埋め込めるのでした。

conf.pyの上の方に以下をimportし、

import recommonmark from recommonmark.parser import CommonMarkParser from recommonmark.transform import AutoStructify

source_suffixの修正、source_parsersの追加

source\_suffix = [&#39;.rst&#39;, &#39;.md&#39;] #source\_suffix = &#39;.rst&#39; source\_parsers = { &#39;.md&#39; : &#39;recommonmark.parser.CommonMarkParser&#39; }

最後尾に以下を追加します。

def setup(app): app.add\_config\_value(&#39;recommonmark\_config&#39;, { &#39;enable\_math&#39;: True, &#39;enable\_inline\_math&#39;: True, }, True) app.add\_transform(AutoStructify)

すると、

 ```math (a + b)^2 = a^2 + 2ab + b^2 ```

とかくと、以下の数式の部分のようになります。(document)

また、inlineの数式も以下のように書けます。 (document)

This formula `$ y=\sum_{i=1}^n g(x_i) $`

ただ、残念ながら式番号を出す方法はわかりませんでした。

[追記]

> @chezou 数式番号ですが、conf.py に math_number_all = True を入れるとどうなりますか https://t.co/tH2ouf7Hk6 > > — shirou - しろう (@r_rudi) 2017年1月22日

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

conf.pyにmath_number_all = Trueを足せば数式がでました。ですが、参照はできないと思うので参照が必要な場合はreSTで書く必要があると思います。

<cite class="hatena-citation"><a href="https://gyazo.com/c1685a433683cd99590bba5cb6748bae">gyazo.com</a></cite>

[/追記]

$ make latexpdfja

とすれば、PDFが、

$ make html

とすればhtmlが生成されます。

さくっと書くときにはmarkdownで行けるのはありがたいですね。

Sphinxとlatex環境を用意するのが面倒な人向けに、docker imageも作りましたので活用してみてください。

https://hub.docker.com/r/chezou/sphinx-recommonmark/

参考

Avatar
Aki Ariga
Machine Learning Engineer

Interested in Machine Learning, ML Ops, and Data driven business.