広告 デバイス

【解説&実装例紹介】LaTeXに複数のソースコードをそれぞれハイライトして掲載する

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人

[latex]\LaTeX[/latex]でレポートを書く際に複数の言語のソースコードを記載したい。

また、listing.styとjlisting.styの使い方も併せて知りたい。

こんなお悩みを解決します。

情報系の学生さんは、実験のレポートを書くために\(\LaTeX\)を使っていると思います。

今回は、そんな情報系の学生さんに向け、\(\LaTeX\)にソースコードを記載する方法について解説します。

必要な設定を順番に解説していくので、興味がある方は是非最後までご覧ください。

ソースコード掲載時の課題

\(\LaTeX\)では、「listing.sty」と「jlisting.sty」を利用することで、使用するプログラミング言語ごとに色分けして表示することが可能です(ハイライト機能)。

このスタイルファイルを用いることでハイライト機能が利用できますが、一般的に用いられる以下のような設定の場合、1種類のプログラミング言語のみが対象となり、2種類以上のプログラミング言語に適用できません。

\usepackage{listings, jlisting}
\renewcommand{\lstlistingname}{list}
\lstset{
  language={C},
  basicstyle={\footnotesize},
  commentstyle={\itshape \color[rgb]{0.0,0.6,0.0}},
  keywordstyle={\bfseries \color[cmyk]{1.0,0.0,0.0,0.3}},
  showstringspaces={false},
  numbers={left},stepnumber={1},numberstyle={\footnotesize},numbersep={1zw},
  tabsize={4}
}

レポートに限らないですが、私は自分の成果をまとめる際、見栄えにもこだわるべきだと考えています。

この考えのもと、ここでは、2種類以上のプログラミング言語を\(\LaTeX\)で掲載する方法を解説します。

方針

具体的な説明に入る前に、解決方針を示しておきます。

ここでは、以下の2ステップで上記の課題を解決します。

  1. プリアンブルに使用する言語ごと、ハイライト機能の設定をする。
  2. ソースコード掲載する際に、参照するハイライト機能の設定情報を付加する。

LaTeXファイルの設定

方針に従って、それぞれの設定をしていきます。

ハイライト機能の設定

重要となるハイライト機能の設定について説明していきます。

以下の内容は、プリアンブルに記載してください。

\usepackage[dvipdfmx]{graphicx, color} % カラー表示するためのパッケージ
\usepackage{listings,jlisting}         % ソースコードを掲載するためのパッケージ

\definecolor{selfComment}{rgb}{0.0, 0.6, 0.0}       % コメントスタイル用の色設定
\definecolor{selfKeyWord}{cmyk}{1.0, 0.0, 0.0, 0.3} % キーワードスタイル用の色設定
\definecolor{selfString}{cmyk}{0.0, 1.0, 0.0, 0.0}  % 文字列スタイル用の色設定


% テキスト用(デフォルト)
\lstdefinestyle{customText}{
    backgroundcolor  = {\color{white}},                 % 背景色
    basicstyle       = {\footnotesize},                 % コードの基本書式
    breaklines       = {true},                          % 途中で改行するかどうか
    commentstyle     = {\itshape  \color{selfComment}}, % コメントのスタイル
    frame            = {shadowbox},                     % フレームの書式
    framesep         = {4pt},                           % ステップ幅
    keywordstyle     = {\bfseries \color{selfKeyWord}}, % キーワードのスタイル
    lineskip         = {-0.5ex},                        % 行送り
    numbers          = {left},                          % 行番号の位置
    numberstyle      = {\footnotesize},                 % 行番号のスタイル
    numbersep        = {1zw},                           % コードから行番号までの距離
    showstringspaces = {false},                         % 文字列中における半角スペースの表示の有無
    sensitive        = {true},
    stepnumber       = {1},                             % 行番号のステップ幅
    stringstyle      = {\ttfamily \color{selfString}},  % 文字書式のスタイル
    tabsize          = {2},                             % タブ幅
    xleftmargin      = {2zw},                           % 左側の余白
    xrightmargin     = {2zw}                            % 右側の余白
}
% C 言語用
\lstdefinestyle{customC}{
    language         = {C},
    style            = {customText},
    morecomment      = [l]{//},                         % 行コメント
    morecomment      = [s]{/*}{*/},                     % 複数行コメント
    morecomment      = [n]{/*}{*/},                     % ネスト可能な複数行コメント
    morestring       = [b]{"}
}
% Bash 用
\lstdefinestyle{customBash}{
    language         = {bash},
    style            = {customText},
    morestring       = [b]{`}
}
% Fortran 用
\lstdefinestyle{customFortran}{
	language         = {[77]Fortran},
	style            = {customText}
}
% Python 用
\lstdefinestyle{customPython}{
	language         = {Python},
	style            = {customText}
}
\lstset{escapechar = , style = {customText}}
\newcommand{\includeCode}[3][C]{\lstinputlisting{#2}}

ソースコードの掲載

今回は、以下の2パターンに対しての使い方を紹介する。

  • 同じディレクトリにあるsample.cの内容を反映する場合
  • \(\LaTeX\)に直接記入したソースコードを反映する場合

sample.cの内容の反映

これは、プリアンブルに設定したincludeCodeコマンドを用います。

\includeCode[C]{./sample.c}{sample}

コマンドの引数の対応関係を以下に示します。

対象説明
C第一引数。使用するプログラミング言語を指定する。
ここで、指定できる言語は、プリアンブルに記載した言語のみとなる。
./sample.c第二引数。掲載するソースコードの相対パスを指定する。
sample第三引数。ラベルとキャプションの名前に使われる。
今回の場合、キャプションは「sample」となり、ラベルは「src:sample」となる。
引数の対応関係

今回は、C言語が対象でしたが、例えばtestcodeというキャプションを付けてカレントディレクトリにあるhoge.pyを掲載したい場合、以下のように設定することになります。

\includeCode[Python]{./hoge.py}{testcode}

直接記入したソースコードの反映

以下のように、\begin{lstlisting}\end{lstlisting}の中にソースコードを記載します。

\begin{lstlisting}
#include
int main(int argc, char **argv){
  printf("Hello World!\n");
  return 0;
}
\end{lstlisting}

LaTeXファイルの雛形

最後に、私が普段使っている\(\LaTeX\)ファイルの雛形を共有しておきます。

必要に応じて、パッケージの追加等を行っていただいて構いません。

\documentclass[a4,12pt]{jsarticle}
\usepackage[dvipdfmx]{graphicx, color} % カラー表示するためのパッケージ
\usepackage{listings,jlisting}         % ソースコードを掲載するためのパッケージ
\usepackage{amsmath, amssymb}
\newcommand{\argmax}{\mathop{\mathrm{argmax~}}\limits}
\newcommand{\argmin}{\mathop{\mathrm{argmin~}}\limits}
\definecolor{selfComment}{rgb}{0.0, 0.6, 0.0}       % コメントスタイル用の色設定
\definecolor{selfKeyWord}{cmyk}{1.0, 0.0, 0.0, 0.3} % キーワードスタイル用の色設定
\definecolor{selfString}{cmyk}{0.0, 1.0, 0.0, 0.0}  % 文字列スタイル用の色設定
% テキスト用(デフォルト)
\lstdefinestyle{customText}{
    backgroundcolor  = {\color{white}},                 % 背景色
    basicstyle       = {\footnotesize},                 % コードの基本書式
    breaklines       = {true},                          % 途中で改行するかどうか
    commentstyle     = {\itshape  \color{selfComment}}, % コメントのスタイル
    frame            = {shadowbox},                     % フレームの書式
    framesep         = {4pt},                           % ステップ幅
    keywordstyle     = {\bfseries \color{selfKeyWord}}, % キーワードのスタイル
    lineskip         = {-0.5ex},                        % 行送り
    numbers          = {left},                          % 行番号の位置
    numberstyle      = {\footnotesize},                 % 行番号のスタイル
    numbersep        = {1zw},                           % コードから行番号までの距離
    showstringspaces = {false},                         % 文字列中における半角スペースの表示の有無
    sensitive        = {true},
    stepnumber       = {1},                             % 行番号のステップ幅
    stringstyle      = {\ttfamily \color{selfString}},  % 文字書式のスタイル
    tabsize          = {2},                             % タブ幅
    xleftmargin      = {2zw},                           % 左側の余白
    xrightmargin     = {2zw}                            % 右側の余白
}
% C 言語用
\lstdefinestyle{customC}{
    language         = {C},
    style            = {customText},
    morecomment      = [l]{//},                         % 行コメント
    morecomment      = [s]{/*}{*/},                     % 複数行コメント
    morecomment      = [n]{/*}{*/},                     % ネスト可能な複数行コメント
    morestring       = [b]{"}
}
% Bash 用
\lstdefinestyle{customBash}{
    language         = {bash},
    style            = {customText},
    morestring       = [b]{`}
}
% Fortran 用
\lstdefinestyle{customFortran}{
	language         = {[77]Fortran},
	style            = {customText}
}
% Python 用
\lstdefinestyle{customPython}{
	language         = {Python},
	style            = {customText}
}
\lstset{escapechar = , style = {customText}}
\newcommand{\includeCode}[3][C]{\lstinputlisting{#2}}
\title{Template}
\author{yuruto}
\date{}
\begin{document}
\maketitle
\tableofcontents
\section{hoge}\label{sec:hoge}
C言語を用いて「Hello World!」を出力するプログラムを以下に示す。
\begin{lstlisting}
#include
int main(int argc, char **argv){
  printf("Hello World!\n");
  return 0;
}
\end{lstlisting}
\end{document}

見た目も綺麗なレポートを作成しよう!

今回は、2種類以上のプログラミング言語を\(\LaTeX\)に掲載する方法を紹介しました。

この手の設定は、一度やっておけば後々使いまわせるので、同じように困っている方がいましたら、ぜひ参考にしてみてください。

スポンサードリンク



-デバイス
-