第 9 章 L A TEX の応用 151
9.18 プログラムソースの挿入
プログラムなどのソースコードを載せるときに,
verbatim
だけでは寂しいと感じる方 も多いと思います.変数やコメントなどをうまく整形するプログラムやマクロパッケージ があります.アルゴリズムの行数を文中で指定したいときには行数も表示されるとうれし いものです.Texinfo
のように変数名や関数名なども半自動的に索引に追加されるとうれ しいものです.ソースコードの整形プログラムの中で私が良いと思うのがCarsten Heinz
氏が作成したlistingsです.これは正式には日本語が通りませんが,吉永徹美氏が作成し た自称強引なマクロで切り抜けることができます.これに関しては奥村晴彦氏の掲示板の『汎用的な浮動体』
http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/21172.html
好き好き
L
ATEX 2
ε初級編9.18
プログラムソースの挿入9
という一連の書き込みを参照してください.結果としてこれをまとめたファイルを
jlisting.sty
として置いておきます.おそらく私のサイトのhttp://tex.dante.jp/
にあると思われます.他にも
lgrind
,morevrb,progcなどの類似品がありますがそれら の包括的なパッケージがlistingsです.このlistingsだけを使用していれば特に困ること もないと思います.listingsを使用するときにはプリアンブルに
\usepackage[オプション]{listings}
のようにします.このときに指定するパッケージオプションは
draft ソースコードを出力しないようにします.ドキュメントクラスオプションですで
に
draft
を指定している場合はそれが反映されるので,さらにオプションを記述する必要はありません.
final
draft
オプションを無効にし,実際にソースコードを整形します.savemem
TEX/ L
ATEX
のメモリをなるべく消費しないようにします.などがあります.listingsは
TEX
のメモリをたくさん使いますので原稿執筆の段階ではdraft
オプションを付けたほうが良いでしょう.listingsの使い方は大きく分けて二つです.一つは
lstlisting
環境にソースコードを記述する方法,二つ目はプログラムのソースコードをファイルから入力する方法です.一 つ目の
L
ATEX
の原稿に直接記述する方法は次のような文法になります.begin{lstlisting}[
h設定1,
設定2,...i ]
ソースコードend{lstlisting}
例として
C
のソースを記述するならば\begin{lstlisting}[language=c]
int main( void ){
printf("Hello,World!!\n");
}
\end{lstlisting}
とになります.
二つ目の方法としては
\lstinputlisting
命令を使ってファイルからソースコードを 読み込みます.\lstinputlisting[
h設定1,
設定2,...
i]{
hファイル名i}
h設定iを毎回指定していたのでは疲れますので
\lstset
命令で\usepackage[dvips]{color}
\lstset{%listingsの表示設定
frame=tbrl,%枠を上下左右に表示する
backgroundcolor={\color[gray]{0.85}},%背景を灰色に numbers=left,%行番号を左に
numberstyle=\scriptsize,%
stepnumber=1,%1行おきに行番号を numbersep=1zw}%ソースと行番号の間隔
のように設定しておけば全てのソースコードに共通の設定をすることができます.この設 定の場合は上下左右に枠を表示させ,背景色を薄いグレーにし,行番号を左側の
1
行おき に表示するようにします.いくつかの設定をひとまとめにしたいときは
\lstdefinestyle
命令を使ってスタイル を定義します.\lstdefinestyle{
hスタイル名i}{
h設定i}
例えば行番号に関しては左側に
1
行おきに表示させたいので\lstdefinestyle{number1}{numbers=left,numberstyle=\scriptsize,%
stepnumber=1,numbersep=1zw}
という定義をして
\begin{lstlisting}[language=c,style=number1]
のように指定したり,または特定の言語に共通のスタイルを用いるときは
\lstdefinstyle{C}{language=c,style=number1}
として
\begin{lstlisting}[style=c]
と使うこともできます.
ある言語のソースコード用に新しい環境を定義できます.
\lstnewenvironment{
h環境名i}{
h始めの設定i}{
h終わりの設定i}
例えばC
言語用の環境を新たに定義するときは\lstnewenvironment{C}{%
\lstset{language=c,style=number1}}{}
のとしても良いでしょう.
ソースコードを浮動体(
float
)として出力することもできます.具体的には\begin{lstlisting}[language=c,float,caption={listingsの使用例}]
int main( void ){printf("Hello,World!!\n");}
\end{lstlisting}
のようになります.
好き好き
L
ATEX 2
ε初級編9.18
プログラムソースの挿入9 9.18.1 言語の設定
listingsでは非常に多くの言語用の設定が定義されています.あらかじめ定義されて
いない言語は自分で新たに定義することもできます.あらかじめ定義されている言語は 表
9.11
の通りです.角括弧を含む言語の指定は表9.11 listingsで使用できる主な言語
Assembler Basic C
C
++Cobol csh
[Sharp]C Delphi Fortran
HTML IDL Java
ksh [LaTeX]TeX Lisp
Logo make Mathematica
Matlab MetaPost MuPAD
Octave Pascal [plain]TeX
Perl PHP Prolog
Python Ruby Scilab
SQL tcl [tk]tcl
TeX VBScript [Visual]Basic
[Visual]C
++VRML XML
\begin{lstlisting}[\language={[LaTeX]TeX}]
のように波括弧の中に入れて指定するのが安全です.
言語があらかじめ定義されていなくても,
\lstdefinelanguage
命令で自分で言語の 定義をすることができます.\lstdefinelanguage{
h言語名i}{
h設定i}
具体的には
\lstdefinelanguage{CCC}{
morekeywords={short,int,long,float,double},%予約語 sensitive=false,
morecomment=[l]{//},%行末コメント morecomment=[s]{/*}{*/},%範囲コメント morestring=[b]",%文字列
morestring=[d]’,%文字} のようにします.
標準のlistingsの字詰めや行送りはローマン体でなるべく等幅になるように字詰めをし
ています.そちらのほうが正しい設定なのでしょうが,見栄えを考えると
columns=[l]{fullflexible}
としたほうが良いかもしれません.タイプライタ体で出力しない場合は等幅になりません ので,ソースコードとしては不適切な設定かもしれません.
9.18.2 主な設定値
空白などに関する設定です.
lineskip
=h長さi 行間にさらに加える空きを調節します.標準は0 pt
.firstline
=h整数i 入力されているソースコードを,どの行から読み込むを設定します.標準は
1
.lastline
=h整数i ソ ー ス コ ー ド の ど の 行 ま で 読 み 込 む か を 設 定 し ま す .標 準 は9999999
.tabsize
=h整数i ソースコード中のタブ文字を何文字分にするかを設定します.標準は8
です.showtabs
=htrue
|false
i タブ文字を可視・不可視にします.tab
=h文字列i タブ文字を h文字列i に置き換えて表示します.$\Longrightarrow$
(−→)などを使う方法もあります.
showspace
=htrue
|false
i スペースを可視()・不可視( )にします.linewidth
=h長さi ソースコードの文章幅を指定します.標準は\linewidth
です.xleftmargin
=h長さi 左側の余白を指定します.標準は0 pt
です.xrightmargin
=h長さi 右側の余白を指定します.標準は0 pt
です.breaklines
=htrue
|false
i ソースコードの文章幅よりも長い文字列を自動的に折り返 すかを指定します.標準はfalse
です.prebreak
=h文字列i 行頭に挿入する文字列を指定します.postbreak
=h文字列i 行末の挿入する文字列を指定します.例えば行末の改行の位置を 特別に示したいときは‘postbreak
=\return’
のようにすると良いでしょう.言語の設定です.
language
={
h言語i}
あらかじめ定義されている主な言語については表9.11
をご覧くだ さい.文字の表示の仕方の設定です.
basicstyle
=hスタイルi 通 常 の ソ ー ス の ス タ イ ル を 設 定 し ま す .hス タ イ ルi に は\small
や\ttfamily
などのフォントの宣言をする命令が使えます.commentstyle
=hスタイルi コメントのスタイルを設定します.stringstyle
=hスタイルi ソースコード中の文字列のスタイルを設定します.keywordstyle
=hスタイルi キーワード,プログラミング言語で言えば予約語のスタイル の設定です.好き好き
L
ATEX 2
ε初級編9.18
プログラムソースの挿入9
行番号の表示の設定です.
numbers
=hnone
|left
|right
i 行番号をどのように表示するかの設定です.stepnumber
=h数字i 何行おきに行番号を表示するかを設定します.numberstyle
=hスタイルi 行番号のスタイルを指定します.firstnumber
=hauto
|last
|h数字ii 行番号の開始の数字を指定します.浮動体などに関する設定です.
float
=hhtbp
の部分集合i ソースコードを浮動体として出力します.caption
=h文字列i 見出しの文字列を指定します.label
=h文字列i\ref
命令で参照できるラベルを作成します.captionpos
=ht
|b
i 見出しの位置を指定します.以下の命令はソースコードを目次として出力するときなどの命令です.適宜再定義して ください.
\lstlistoflistings
ソースコード目次を出力します.これはcaption
を付けたソー スコードが出力されます.\lstlistlistingname
ソースコード目次の見出しです.標準は‘Listings’
です.\lstlistingname
見出しの前の文字列を指定します.標準は‘listing’
です.\lstlistlistingname
命令と\lstlistingname
は\renewcommand{\lstlistlistingname}{ソースコード目次}
\renewcommand{\lstlistingname}{ソースコード}
のように定義しておくと日本語の文書でも違和感がないと思います.
罫線枠に関する設定です.
frame
=hnone
|single
|shadowbox
i ソースコードの周りに表示する罫線枠の設定です.frame
=htrblTRBL
の部分集合i 上(t
)・下(b
)・左(l
)・右(r
)の罫線の表示を指定し ます.枠を付けて表示する例として
\begin{lstlisting}[frame=TBlr,]
main( void ){
int a=3; int b=5;
printf("a+b=%d.\n", a+b);
}
\end{lstlisting}
と入力するとソースコード
9.1
のようになります.ソースコード9.1 枠の調整 1