16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TeXにソースコードを等幅フォントで"ちゃんと"載せる

Posted at

はじめに

以下のクイックソートの疑似コードをアラインメント込みで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}

"ちゃんと"やれば以下のような出力が得られる。

image.png

巷に溢れかえっている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},
}

image.png

スペースがガン無視されてアラインメントが消失する。

columns=fixed

\lstset{
  ...
  columns=fixed,
}

image.png

文字間の間隔が空いてしまって見た目が良くない。
おそらくこれがfullflexibleの設定が浸透してしまった原因のような気がする。

上手くいく例

\lstset{
  ...
  columns=fixed,
  basewidth=0.5em,
}

image.png

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}
16
10
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
16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?