はじめに
以下のクイックソートの疑似コードをアラインメント込みでTeXにちゃんと載せたい。
\begin{lstlisting}
quicksort(data) {
if (data.length <= 1) {
return data;
} else {
p = select_pivot(data);
{lo, hi} = partition(p, data);
lo_sorted = quicksort(lo);
hi_sorted = quicksort(hi);
return (lo_sorted ++ p ++ hi_sorted);
}
}
\end{lstlisting}
"ちゃんと"やれば以下のような出力が得られる。
巷に溢れかえっているlistingの設定ではこうはならない。
アラインメントが崩れたソースコードが表示されがちである。
結論から...
よくあるlistingの設定の
\lstset{
...
columns=[l]{fullflexible},
}
を
\lstset{
...
columns=fixed,
basewidth=0.5em,
}
に書き換えよう、ということになる。
これは
\lstset{
...
basicstyle=\ttfamily,
}
などとして等幅フォントをlisting内で使用している場合に限る。
そもそも等幅フォントを使うならばfullflexibleにする必要がなく、fixedにしておいた方がアラインメントが崩れない。
上手くいかない例
columns=[l]{fullflexible}
まずはよくある設定。
\lstset{
...
columns=[l]{fullflexible},
}
スペースがガン無視されてアラインメントが消失する。
columns=fixed
\lstset{
...
columns=fixed,
}
文字間の間隔が空いてしまって見た目が良くない。
おそらくこれがfullflexibleの設定が浸透してしまった原因のような気がする。
上手くいく例
\lstset{
...
columns=fixed,
basewidth=0.5em,
}
basewidthのデフォルトは0.6emだが、これを0.5emに縮めてやるといい感じの見た目になる。
おわりに
これらは
vimのカラースキームでLaTeXのコードを彩る、carbonpaper.vim
このプラグインを作る際に調べたものでした。こちらもよろしくお願いします。
以下、PDF生成に使用した全ソース。
\documentclass[uplatex]{jsarticle}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{inconsolata}
% Color
\definecolor{Green}{HTML}{009e73}
% Listings
\lstset{
language=C++,
basicstyle=\ttfamily\Large,
keywordstyle=\bfseries\color{Green},
showstringspaces=false,
frame={tb},
numbers=left,
xrightmargin=0zw,
xleftmargin=2zw,
% columns=[l]{fullflexible},
columns=fixed,
basewidth=0.5em,
}
\begin{document}
\begin{lstlisting}
quicksort(data) {
if (data.length <= 1) {
return data;
} else {
p = select_pivot(data);
{lo, hi} = partition(p, data);
lo_sorted = quicksort(lo);
hi_sorted = quicksort(hi);
return (lo_sorted ++ p ++ hi_sorted);
}
}
\end{lstlisting}
\end{document}