mintedでLaTeXドキュメントにソースコードを載せる

# minted、良さ

LaTeXにソースコードを載せる時に今までlisting.styを使っていましたが、mintedというのを最近になってやっと知ったので導入してみました。

結論：与謝野晶子（訳：かなり良さがある）

Pygmentsを使っているみたいなので、ただ`\usepackage`するだけだとうまくいかないことがあったので主に私的メモ用にまとめました。

# 基本的な使い方

pygmentsが必要になるので、[公式サイト](http://pygments.org/download/)から落としてくるか、またはpipとかでpython-pigmentsを入れます。
個人的にはpipで入れておけばいいのではないかと思ってます。
僕の場合はanacondaを使っているのでcondaで既に入ってました。

```bash
pip install pygments
```

準備ができたら、とにもかくにもプリアンブルでmintedの使用を宣言します。

```latex
\usepackage{minted}
```

ベタ書きで使いたい場合は次のように`\begin{minted}{<language>}<code>\end{minted}`という形で囲んでやればいいです。

```hoge.tex
\documentclass{article}

\usepackage{minted}

\begin{document}
    \begin{minted}[linenos]{c}
#include <stdio.h>

int main(void) {
    printf("Hello, world!\n");
    return 0;
}
    \end{minted}
\end{document}
```

`linenos`オプションで行番号を表示させます。

これをコンパイルするためには、コンパイル時に`shell-escape`オプションを与える必要があります。
例としてはこんなかんじでコンパイルします。

```bash
pdflatex -shell-escape hoge
```

latexmkとか統合環境を使っている場合はもっと楽にできると思います。
そうするとこんなかんじで出力してくれます。

<img width="400" alt="minted.png" src="https://qiita-image-store.s3.amazonaws.com/0/94737/b56f6742-f5f9-ed63-ad8c-489e586a7105.png">

ハイライトが少し野暮ったいですが、なにもいじってないのでご愛嬌で。

ワンライナーだったら次のような書き方でもいけます。

【入力】

```latex
\mint{awk}|{sum+=$1} END{print sum}|
```

【出力】

<img width="260" alt="スクリーンショット 2017-06-14 22.03.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/94737/3d063323-68ba-ff35-b6d3-c66004df2703.png">

ここで使っている`|`はdelimiterの一例で、基本的にほぼなんでも使えます。

ソースファイルからインクルードしたい場合は`\inputminted`を使います。

```latex
\inputminted[linenos]{c}{main.c}
```

また、`\mintinline`を使えばインラインでも挿入できます。

【入力】

```latex
You can calculate summation like following: \mintinline{awk}|{sum+=$2} END{print sum}|
```

【出力】
<img width="600" alt="スクリーンショット 2017-06-14 22.06.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/94737/aba236b8-3e0c-671b-f49f-76c0c7da30cb.png">


## ソースコードが長すぎると切れる

ソースコード文が横に長いと普通にはみ出します。LaTeXで画像を埋め込んだ時と同じです。

```latex
\begin{minted}{python}
super_long_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
\end{minted}
```

<img width="600" alt="notail" src="https://qiita-image-store.s3.amazonaws.com/0/94737/b7157346-c5dc-3cfa-10a5-ddcadda6f489.png">

そういう時は`breaklines`オプションを使えばちゃんとwrapしてくれます。

```latex
\begin{minted}[breaklines]{python}
...
```

<img width="600" alt="wrapped" src="https://qiita-image-store.s3.amazonaws.com/0/94737/7bdff91c-4da2-1be6-8744-c5dfe1da35c5.png">

更に、デフォルトだと縦に長い場合にも切れます。
基本的に画像と同様にひとかたまりで出力しようとするみたいなので、ページをまたいで出力してくれません。
それでは困るので、mdframedで囲うようにしましょう。

【入力】　

```latex
\usepackage{mdframed}

\begin{mdframed}
    \inputminted[breaklines]{python}{hoge.py}
\end{mdframed}
```

【出力】　

<img width="600" alt="across_pages.png" src="https://qiita-image-store.s3.amazonaws.com/0/94737/03701edc-6f82-800e-dfdb-a7f8d13bfce0.png">




# mintedを使う際に嵌った点

## pygmentsがないと言われる

僕は専らSublime Text 3にlatextoolsを入れてLaTeXをコンパイルしています。
そのためpygmentizeが存在するパスを通してあげる必要がありました。
例えばpygmentizeがanacondaのbin中にあった場合、latextoolsの設定ファイルの200行あたりにあるPlatform settingsの節中で該当する箇所を以下のように変えます。

```LaTeXTools.sublime-settings
"osx": 	{
		// Path used when invoking tex & friends; MUST include $PATH
		"texpath" : "$PATH:/Library/TeX/texbin:/usr/texbin:/usr/local/bin:/opt/local/bin:$HOME/anaconda/bin"
		// Path to PDF viewer, if needed
		// TODO think about it. Also, maybe configure it here!
	},
```

GUIエディタや統合環境を使っている場合には同様の変更が必要になるんじゃないでしょうか。
ターミナル上でlatexmk等でコンパイルする分にはパスは通っているはずなので問題ないと思われます。

## コンパイル時にファイルの出力先を変えていると動かない

pygmentsは基本的にファイル直下のディレクトリに中間ファイルが生成されるものとして動作するので、コンパイルによる出力ディレクトリを変更しているとうまく動作しません。
出力ディレクトリを変更している時は、mintedのオプションにoutputdirを指定してあげます。
例えば`.tmp/`に出力ファイルを吐くようにしている時には、

```latex
\usepackage[outputdir=.tmp]{minted}
```

という風に指定します。

## cacheがうまく働いてくれない

僕の環境では大丈夫でしたが、cacheをうまく使ってくれなくてエラーが発生することがあるそうです。
具体的には次みたいなエラーが出ることがあるとのこと。

```
! Package minted Error: Missing Pygments output; \inputminted was
probably given a file that does not exist--otherwise, you may need 
the outputdir package option, or may be using an incompatible build tool.
```

これを避けるには次のようにオプションを指定します。

```latex
\usepackage[cache=false]{minted}
```