LaTeX
Mac
Ubuntu
archLinux

[TeX Live 2018] LaTeXでシンタックスハイライト付きのソースコードを掲載する


はじめに

LaTeXでレポートを書くときにソースコードを掲載しなければならないとき、よくありますよね。2年ぐらい前はbreak itemboxを使っていたのですが、シンタックスハイライトが可能なlistingというものがあるのを知ってからはこっちを使っていました。ただlisting単体だと日本語の扱いに難があるので、jlistingという別のスタイルファイルを導入する必要がありました。

さらにこのjlistingにもコメントを示す記号の後ろに半角スペースを入れないとその後のシンタックスハイライトが無効になるという謎のバグが残っており、使い勝手が良いものとはいえませんでした。

そこで最近見つけたのがmintedというスタイルファイルです。どうも構文解析部分にPython製構文解析ライブラリPygmentsを活用しているらしく、LaTeX単体で色々しようとしているlistingよりはシンプルな構造のようです。色々あさってみましたが日本語の資料が全くないので、独自にまとめた見解をお伝えします。

今回はArch LinuxとmacOS Sierraで検証しています。それぞれでの手順には注釈を付けますので参考にしてください。


インストール


Pygmentsの導入

とりあえずPygmentsの導入が必須です。Arch Linuxでは以下のようにして導入しました。

$ yaourt -S pygmentize

macOSではpyenv(on Anyenv)を使って入れてみました。コマンドが認識されない場合は適宜端末の再起動を挟んでください。

$ anyenv install pyenv

$ pyenv install 3.7.2
$ pyenv global 3.7.2
$ pip install Pygments


Mintedの導入

続いてmintedの導入と行きたいところですが、フルパッケージでTeX Live 2018がインストールされている場合はデフォルトで使用可能となっています。

Arch Linuxの方は導入記事を参照してフルパッケージ版を導入してください。

macOS Sierraをお使いの方でBasic TeXをインストールしてしまった方はMacTeXのフルパッケージ版をインストールしなおしてください(tlmgrで個別にmintedを入れてみたのですがどうもうまくいかなかったので)。


使ってみる

とりあえずサンプルコードをコンパイルしてみましょう。

\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a4paper,12pt]{bxjsarticle}

\usepackage{minted}

\begin{document}
\section{にほんご}

\begin{minted}{c}
#include <stdio.h>

int main(void) {
// にほんご
printf("Hello Worldn");
return 0;
}
\end{minted}
\end{document}

mintedを使ったLaTeXソースコードはplatexコマンドでコンパイルする際に-shell-escapeオプションを付けてコンパイルしなければならないのでご注意ください。導入記事を参考にlatexmkを設定した場合、すでに-shell-escapeコマンドが実行されるようになっておりますので心配はいりません。

$ latexmk test.tex

ptex2pdfを利用する場合は、以下のようにしてください。

$ ptex2pdf -u -l -ot "-shell-escape" test.tex

なお、TeX Live 2015の環境では、以下のようなエラーが発生します(2016では発生しません)。


! Undefined control sequence.

<argument> edef minted@hash {pdf@filemdfivesum

{minted@outputdir jobnam...

l.15 end{minted}


色々調べたところ、mintedパッケージを読み込むところで[cache=false]を指定すると良いそうです。ソースの2行目を訂正しましょう。

\documentclass[a4j, dvipdfmx]{jsarticle}

\usepackage[cache=false]{minted}

\begin{document}
\section{にほんご}

\begin{minted}{c}
#include &lt;stdio.h&gt;

int main(void) {
// にほんご
printf("Hello Worldn");
return 0;
}
\end{minted}
\end{document}


ちょこっとカスタマイズ

mintedにはいろいろな機能が付属しています。オプションとして付けてあげることで効果が出るようです。よく使いそうなものを紹介します。


フォントの調節

どうもデフォルトのままだとTTフォントを埋め込んでしまうらしく、ソースコードとしては微妙です。そこで等幅フォントを埋め込む設定に変えます。1行目にfontfamilyオプションを付加しました。

\begin{minted}[fontfamily=courier]{c}

#include <stdio.h>

int main(void) {
// にほんご
printf("Hello Worldn");
return 0;
}
\end{minted}


行番号を付けたい

行番号を付けるためには「linenos」オプションを使います。オプションを複数付けたい場合はカンマで区切ってください。

\begin{minted}[linenos, fontfamily=courier]{c}

#include <stdio.h>

int main(void) {
// にほんご
printf("Hello Worldn");
return 0;
}
\end{minted}


数式を埋め込みたい

プログラム中のアルゴリズムを数式で説明することもできます。「mathescape」オプションを使ってみましょう。

\begin{minted}[mathescape, linenos, fontfamily=courier]{haskell}

main :: IO()
main = do
putStrLn $ sum [1..10] -- $sum_{i=1}^{10}i$
\end{minted}


長いソースコードを自動で改行したい

ついつい横に長くなってしまうソースコードを自動で改行するためには、breaklinesオプションを利用します。

\begin{minted}[linenos, fontfamily=courier, breaklines]{haskell}

main = print $ map (\x -> if x `mod` 15 == 0 then "fizzbuzz" else if x `mod` 3 == 0 then "fizz" else if x `mod` 5 == 0 then "buzz" else show x) [1..30]
\end{minted}

単語の途中でも問答無用で切ってほしい場合は、breaklinesオプションに加えてbreakanywhereオプションを利用してください。


おわりに

ということで、日本語環境でも問題なく使えることがわかりました。最初は色々と躓いていましたけどね。タイトルにもあるとおり今回検証した環境はすべてTeX Live 2018のものです。TeX Live 2015またはそれ以下のバージョンがインストールされる環境では結果が異なってくるので注意してください。それでは快適なLaTeX生活を。