ソースコードの貼り付けができるmintedをpLaTeXで使ってみた

mintedとは

導入方法

  • Pygmentsのインストール
  • minted.styの導入
  • 使う

     Pygmentsのインストール

    Pygmentsが入っていない場合は以下のコマンドでインストールします。

sudo apt-get install python-pygments

 minted.styの導入

Pygmentsが入りましたら次にminted.styをダウンロードします。以下のサイトからダウンロードしてください。
CTAN: Package minted
下の"Down­load the con­tents of this pack­age in one zip archive"からダウンロードできます。 ダウンロードしたらダウンロード先のディレクトリまで進み、ファイルの解凍を行います。 解凍したディレクトリに入りmakeコマンドを実行してください。 実行が終わりますとディレクトリ内にminted.styというファイルがありますので。texmfの中に入れるなりして導入してください。

使う

ここまで来たら後は必要なことを記述して使うだけです。 記述の例はTeXLive2014と2015で違いますので気をつけてください。 mintedを使うTeXファイルの中で次の命令をプリアンブル部に記述します。

TeXLive2014の場合
\makeatletter\chardef\pdf@shellescape=\@ne\makeatother
\usepackage{minted}
TeXLive2015の場合
\usepackage[cache=false]{minted}

これでmintedを使うことができます。以下はmintedを使った例です。

\documentclass{jsarticle}
\chardef\pdf@shellescape=\@ne
\usepackage{minted}
\begin{document}
\begin{minted}{c}
#include<stdio.h>
int main(void){
  printf("Hello World!\n");
  return 0;
}
\end{minted}
\end{document}

コンパイルしたいころですがここで問題が発生します。なんとmintedは不具合のためかタブスペースが^^Iと変換されて表示されます。 試行錯誤を重ねたのですが原因はわからず...結局テキストエディタでタブをスペースに変換することにしました。タブをスペースに自動変換する方法は自分の使っているテキストエディタ毎に調べてください。設定ができましたらこれをコンパイルしていきます。 コンパイルの時はオプションをつけなければなりません。次のようにオプションをつけてコンパイルを行ってください。

platex -shell-escape [filename]

latexmkでコンパイルをする場合もshellescapeの設定を行えばコンパイルをすることができます。

latexmkの導入についての記事は以下をご覧ください。
muscle-keisuke.hatenablog.com 一度ターゲットを決めたら変更のたびにコンパイルを自動でやるので便利ですよ!
実行結果は以下のようになります。 f:id:muscle_keisuke:20151108030711p:plain

また、texファイル内に直接ソースコードを記述せずソースファイルを外部から読み込んで表示することも可能です。先ほどの例にあるCのソースコードhoge.cという名前で保存したとしましょう。それをLaTeXでmintedを使って読み込んで表示したい場合は以下のように記述します。  

\inputminted{c}{hoge.c}

言語を指定する引数がソース直書きの時と違い最初に来ていることに注意してください。長いソースコードの場合はこの方がすっきりしていいと思います。

mintedの例

ソースコードを行番号つきで載せる

ソースコードを行番号つきで載せる時は以下のmintedのオプションにlinenosと付けます。

\begin{minted}[linenos]{c}

f:id:muscle_keisuke:20151108133243p:plain

ソースコードのコメントに数式を付ける

LaTeXに載せたソースコードのコメントを付ける時に数式を使った方がわかりやすい場合があります。次のようにLaTeX用の数式コマンドを使っても オプションにmathescapeを付ければLaTeXと同じように数式を表示することができます。

\begin{minted}[linenos,mathescape]{c}
#include<stdio.h>
int main(void){
    int k=0;
    int x=0;
    // This code mean \sum_{k=0}^{100} k^2+2k+1
    for(k=0;k<100;++k){
        x=k*k + 2*k +1;
    }
    printf("x=%d\n");
    return 0;
}
\end{minted}

結果は次のように綺麗な数式でコメントを残すことができます。 f:id:muscle_keisuke:20151108133326p:plain

その他のオプション

そのほかにも枠を付けたり図や表のようなキャプションやラベルをつけることも可能です。

\definecolor{bg}{rgb}{0.95,0.95,0.95}
\begin{listing}
\begin{minted}[linenos,
       mathescape,
       numbersep=5pt,
       frame=lines,
       framesep=2mm,
       bgcolor=bg]{c}
#include<stdio.h>
int main(void){
    int k=0;
    int x=0;
    // This code mean \sum_{k=0}^{100} k^2+2k+1
    for(k=0;k<100;++k){
        x=k*k + 2*k +1;
    }
    printf("x=%d\n");
    return 0;
}
\end{minted}
\caption{mintedの例}
\label{lst:example}
\end{listing}
ソース\ref{lst:example}はmintedの例である。

引用したい時も助かります。 f:id:muscle_keisuke:20151108135308p:plain

新しいmintedマクロ

ここまでmintedに関する様々なオプションを紹介してきました。しかし、たくさんのオプションを使うときにいちいち記述していたらごちゃごちゃしたり面倒くさかったりします。そこでmintedには新しいminted用のマクロを作れるマクロがあります。それが\newmintedと\newmintedfileです。2つのマクロの違いは外部からソースを読み込むかどうかの違いしかありません。次のソースを元に\newmintedと\newmintedfileで書き換える次のようになります。

\begin{minted}[linenos,
       mathescape,
       numbersep=5pt,
       frame=lines,
       framesep=2mm
       ]{c}
#include<stdio.h>
int main(void){
    printf("Hello World!\n");
    return 0;
}
\end{minted}

\inputminted[linenos,
       mathescape,
       numbersep=5pt,
       frame=lines,
       framesep=2mm]{c}{hoge.c}

書き換えると

\newminted[myMinted]{c}{
    linenos,
    mathescape,
    numbersep=5pt,
    frame=lines,
    framesep=2mm
}
\newmintedfile[myMintedfile]{c}{
    linenos,
    mathescape,
    numbersep=5pt,
    frame=lines,
    framesep=2mm
}

\begin{myMinted}
#include<stdio.h>
int main(void){
    printf("Hello World!\n");
    return 0;
}
\end{myMinted}

\myMintedfile{hoge.c}

ソースが長くなった気がしますがそれは最初に定義を書いているからです。newminted、newmintedfileマクロによって新しいminted用のマクロmyMintedとmyMintedfileを定義してそれを使っています。普段から同じオプションを使う人はこのように定義をしておくとコードがすっきりするかもしれません。