LoginSignup
33
21

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-14

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}という形で囲んでやればいいです。

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オプションを与える必要があります。
例としてはこんなかんじでコンパイルします。

pdflatex -shell-escape hoge

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

minted.png

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

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

【入力】

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

【出力】

スクリーンショット 2017-06-14 22.03.05.png

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

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

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

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

【入力】

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

【出力】
スクリーンショット 2017-06-14 22.06.52.png

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

ソースコード文が横に長いと普通にはみ出します。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}

notail

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

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

wrapped

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

【入力】 

\usepackage{mdframed}

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

【出力】 

across_pages.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/に出力ファイルを吐くようにしている時には、

\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}
33
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
21