minted、良さ
LaTeXにソースコードを載せる時に今までlisting.styを使っていましたが、mintedというのを最近になってやっと知ったので導入してみました。
結論:与謝野晶子(訳:かなり良さがある)
Pygmentsを使っているみたいなので、ただ\usepackage
するだけだとうまくいかないことがあったので主に私的メモ用にまとめました。
基本的な使い方
pygmentsが必要になるので、公式サイトから落としてくるか、またはpipとかでpython-pigmentsを入れます。
個人的にはpipで入れておけばいいのではないかと思ってます。
僕の場合はanacondaを使っているのでcondaで既に入ってました。
pip install pygments
準備ができたら、とにもかくにもプリアンブルでmintedの使用を宣言します。
\usepackage{minted}
ベタ書きで使いたい場合は次のように\begin{minted}{<language>}<code>\end{minted}
という形で囲んでやればいいです。
\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
オプションを与える必要があります。
例としてはこんなかんじでコンパイルします。
pdflatex -shell-escape hoge
latexmkとか統合環境を使っている場合はもっと楽にできると思います。
そうするとこんなかんじで出力してくれます。
ハイライトが少し野暮ったいですが、なにもいじってないのでご愛嬌で。
ワンライナーだったら次のような書き方でもいけます。
【入力】
\mint{awk}|{sum+=$1} END{print sum}|
【出力】
ここで使っている|
はdelimiterの一例で、基本的にほぼなんでも使えます。
ソースファイルからインクルードしたい場合は\inputminted
を使います。
\inputminted[linenos]{c}{main.c}
また、\mintinline
を使えばインラインでも挿入できます。
【入力】
You can calculate summation like following: \mintinline{awk}|{sum+=$2} END{print sum}|
ソースコードが長すぎると切れる
ソースコード文が横に長いと普通にはみ出します。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}
そういう時はbreaklines
オプションを使えばちゃんとwrapしてくれます。
\begin{minted}[breaklines]{python}
...
更に、デフォルトだと縦に長い場合にも切れます。
基本的に画像と同様にひとかたまりで出力しようとするみたいなので、ページをまたいで出力してくれません。
それでは困るので、mdframedで囲うようにしましょう。
【入力】
\usepackage{mdframed}
\begin{mdframed}
\inputminted[breaklines]{python}{hoge.py}
\end{mdframed}
【出力】
mintedを使う際に嵌った点
pygmentsがないと言われる
僕は専らSublime Text 3にlatextoolsを入れてLaTeXをコンパイルしています。
そのためpygmentizeが存在するパスを通してあげる必要がありました。
例えばpygmentizeがanacondaのbin中にあった場合、latextoolsの設定ファイルの200行あたりにあるPlatform 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/
に出力ファイルを吐くようにしている時には、
\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.
これを避けるには次のようにオプションを指定します。
\usepackage[cache=false]{minted}