Texpad で PythonTex を使ってみる。


## 動機

### PythonTexの理由

実験に `pythhon` を使っている場合のみの話ですが、データが `python` で読み込めると思います。その上で、pdfを作ろうとした時に以下のようなことを自動化できたらいいなあと思いました。

* 数式の自動生成
* データの具体例などの提示
* 表の作成
* （図の挿入）

最後の図に関しては、図に影響するパラメータが変更する率が高い時やパラメータだけを変えた同じような図を幾つか使う時に有効だと思うので正直、、、。

###### ※ `python`の実行と`tex`のコンパイル
 `tex` のコンパイルの度に `python` が実行されることになるので、１文字推敲しただけで挿入する図までまた再生成することは、、、。（ `platex` 、 `dvipdfmx` や `pythontex` などのコマンドをビルドスクリプトにまとめて実行している場合）


### Texpadの理由

[Texpad · Smoothest way to write LaTeX](https://www.texpadapp.com/)

有料ですが、お試しで２週間？使えます。
なぜ、`Texpad` なのかというと友達に紹介されて使ってみたかったです。有料も含め、 `tex` 用のエディターを検討中です。（今のところ `TexShop` か `atom`で`gulp`とか書いて頑張るか。[参考](https://github.com/nekobato/m-thesis)）

## 導入

### PythonTexのインストール

[PythonTeX - TeX Wiki](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?PythonTeX)

私は `El Capitan` で `/usr/textbin` フォルダが作れなくなってしまったので、[こちら](http://qiita.com/hideaki_polisci/items/3afd204449c6cdd995c9)を参考にしたのですが、 `TexLive` に最初から `PythonTex` が入っています。
また、[Pygments](http://pygments.org/)モジュールが必要なので

```
pip install pygments
```

します。

また、`Texpad`の環境設定の`ディストリビューション`タブに`MacTexをダウンロード`ボタンもあります。

### Texpadのタイプセット

`TexPad` では以下のように選択できます。
また、 `.tpbuildスクリプトを使用` にチェックを入れることでプロジェクトフォルダ以下のビルドスクリプトを `bash`で実行できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32636/8a3c537a-186c-9177-8667-7815faa14dd4.png" width="300px">

###### ※ bib
`参考文献` にチェックを入れれば、 `biber` とかもやってくれるみたいです。
私はまだ論文を書いたことがないので、 `bib` による管理がいまいちわかっておりません。

### TexPadのビルドスクリプト

[Texpad · Help · Custom Typesetting in Texpad OS X using Build Scripts](https://www.texpadapp.com/support/osx/typesetting/custom-typesetting)

サンプルは[こちら](https://github.com/vallettaventures/TexpadKB/tree/master/tpbuild-scripts)。

私は `pyenv` を使っているのですが、ビルドスクリプトに書いた `pythontex` コマンドがうまく実行されませんでした。
原因はインストールしたはずの `pygments`モジュールがないというエラーでした。
ビルドスクリプトの実行ユーザの問題なのかよくわかりませんでしたが、とりあえず無理矢理ビルドスクリプトの中で `PYTHONPATH` 追加してなんとかなりました。

### Hello PythonTex!

基本的に `{pycode}`環境で `python` の関数などを定義して、`\py`コマンドで `tex`上に出力できます。

以下のような `tex` が <img height="48px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/3c371aee-c390-f459-c8a5-fb9daf88f1cd.png"> になります。

```tex
\begin{pycode}
# -*- coding: UTF-8 -*-

def hello():
  msg = r"Hello \textbf{PythonTex}!"
  return msg
\end{pycode}


\py{hello() + " via py"}
```


## 実践

[A Gentle Introduction to PythonTeX](https://tug.org/tug2013/slides/Mertz-A_Gentle_Introduction_to_PythonTeX.pdf)

上のスライドでは、[sympy](http://www.sympy.org/en/index.html)を使った数式、[matplotlib](http://matplotlib.org/)を使った図、[webkit2png](https://github.com/adamn/python-webkit2png)を使ったウェブページの挿入から`table`の自動生成まで書かれています。

ただ、`pycode`環境で`print`を使って直接出力していますが、自分の環境ではできませんでした。ちなみに自分は`2.7`です。


### 数式の自動生成

[PythonTeXを試してみた：Pythonコードの出力結果をLaTeX文書に埋め込む : はむ吉(のんびり)の雑記帳](http://blog.livedoor.jp/hamu_nbr/archives/39582714.html)

上のスライドでは`\newcommand`と組み合わせたり、`sympy`と組み合わせたりしています。

`sympy`には`latex`コマンドがありますが、わざわざ`sympy`で数式を作らずに実際に自分が使っている数式から自動生成できたら最高です。

自分は`Theano`ベースのライブラリを使おうと思っているので、`Theano`の数式のグラフ構造から`sympy`もしくは`latex`に変換してくれるようなのがありそうな気がしたのですが見つかりませんでした。
（もっと探してみて、無かったら自分で書くか`sympy`で普通に書くかします。ですが`sympy`で書くのであれば普通に`tex`で書けばいいんじゃないのかなあと思っています。微分式などの`simplication`がどの程度のものなのかわかっていません。[参考](http://matthewrocklin.com/blog/work/2013/03/28/SymPy-Theano-part-2/)）

### データの具体例などの提示

これは簡単にできそうです。

### 表の作成

すでにデータありきでやられていますが、自分がpdfにする前に実験結果を実際どう管理するのかというところです。
エクセル系（プレーンテキストじゃない）で保存しとく説が濃厚ですが、その場合、[tabfileio](https://github.com/sswan/tabfileio)とかを使ってみようと思っています。使ってみたらまた忘備録書きたいと思います。
（csvとかであれば、標準でモジュールがあるのであれですが。）

### 図の挿入

[PythonTeXとMatplotlib - 何かを書き留める何か](http://xaro.hatenablog.jp/entry/2013/09/16/155444)


```tex
\begin{pycode}
  ・・・
  pylab.savefig('myplot.pdf')
\end{pycode}

\begin{figure}
\includegraphics{myplot.pdf}
\end{figure}
```

と言った感じです。
これは、一度画像を保存してしまって普通に`tex`で読み込めばいいかなと思います。

###### ※ グラフ画像保存

[rodeo](https://github.com/yhat/rodeo/)を使えば、割と`python`でグラフ画像保存のハードル下がりそうなので（グラフィカルにできそう）使ってみたいです。`ipython`ベースのブラウザで動くエディターです。[pandas](http://pandas.pydata.org/)のデータ構造をビューで表示してくれるみたいです。

#### TikZ

[Plot of the Brillouin Function | TikZ example](http://www.texample.net/tikz/examples/brillouin-function/)

上のページは`luatex`で`lua`で関数定義して`TikZ`作ってますが、これの`python`版もいけるんじゃないか？と汗

## 感想

執筆環境とか調べる前に早く実験終わらせろやと言われそうです。。