📖

TeXでソースコードをVSCode風に出力

2021/11/30に公開

TeXでソースコードをVSCode風に出力

そこまでTeXに詳しいわけではないですが,調べたりして実際にレポートで書いたので載せる.

目次

  1. PC環境
  2. TeX環境
  3. 使用したTexの文章クラス
  4. ソースコードの出力に使用するパッケージ
  5. plistingsについて
  6. listingsによる言語定義
  7. lstsetによる言語設定
  8. VSCode風に色設定
  9. プログラムを出力
  10. 参照コマンドの定義とキャプションのコマンドの再定義

PC環境

環境
PC M1 Macbook Air
OS Big Sur
インストール場所 Docker

TeX環境

Docker上でPaperist/texlive-jaのlatestのバージョンをイメージをpullする.
githubにもある.

https://hub.docker.com/r/paperist/alpine-texlive-ja/

https://github.com/Paperist/texlive-ja

使用したTexの文章クラス

文章クラス(documentclass)にはjsarticleを使用した.
jsarticleは新しい和文に対応した文章クラスである.

次に使用例を示す.

\documentclass[a4j,uplatex,dvipdfmx,11pt]{jsarticle}

オプションについては次の表に示す.

オプション 使用理由
a4j 日本のA4サイズ
uplatex コンパイラの種類(?)
dvipdfmx PNG画像の読み込みと色設定に使用
11pt 標準の文字の大きさ

ソースコードの出力に使用するパッケージ

listingsはソースコードを掲載するのに,便利なもの.
日本語を対応させるために,plistingsも読み込む.
plistingsについては次のセクションで説明する.
VSCode風に出力するために,colorを読み込む.

\usepackage{listings,plistings}
\usepackage{color}

plistingsについて

先のTeX環境の記述したPaperist/texlive-jaにはplistingsが入ってない.
Docker初心者なので,dockerfileの書き換えなど詳しいことはわからないので,
今回は,texファイルと同じディレクトリ内にplistings.styを置いた.

https://github.com/h-kitagawa/plistings

listingsによる言語定義

\lstdefinelanguage{<言語名>}{<設定>}

を使って新しい言語として設定する.
先に設定について次の表に示す.

キー名 意味 オプション オプションの意味
morekeywords キーワードを追加 {key1, key2, ...} [<数字>] キーワードを区別
sensitive 大文字小文字の区別 true or false
morecomment コメントアウトとなる記号の追加 {<記号>} [l] or [s] lは1行(左に位置する), sは複数行(囲われている)
morestring 文字列となる記号の追加 {<記号>} [b] or [d] bはバックスラッシュまで, dは2つ続くまで
alsodigit 記号を数字に追加 {<記号>}
alsoletter 記号を文字に追加 {<記号>}
今回のプログラミング言語はScilabで作成した.
morekeywordsのオプションで役割を決めた.
出力したいプログラムの中にある予約語や関数名などを追加していく.
オプションの数字によって分けているため,分け方は自由.
オプション 役割
1 予約語
2 関数名
3 大域変数
4 定数

実際に書いたTeXファイルの言語定義の部分を次に示す.
上の表に従って作成した.
また,定数が\%piのように\%が必要なので,alsoletterに\%を追加する.

\lstdefinelanguage{myscilab}{
    morekeywords=[1]{   % 予約語 標準ライブラリを含む
        for, end, if, then, function, endfunction, 
        clear, strtod, read_csv, size, zeros, mean, sqrt, floor, string, disp, sum, 
        cov, cell, cat, exp, matrix, inv, det, int, gsort, tabul, max, 
    },
    morekeywords=[2]{   % 関数名
        get_class_range,
        bayes_train,
        bayes_valid,
    },
    morekeywords=[3]{   % 大域変数
        DATADIR, ALLDATA,
        FEATURE1, FEATURE2, FEATURES,
        FDIM, FDATA, ALLDATA,
        N_CLASS, N_FDATA, N_CLASS_DATA,
    },
    morekeywords=[4]{ \%inf, \%pi, },   % 定数
    sensitive=true,         % 大文字小文字の区別
    morecomment=[l]{//},    % コメントアウト
    morestring=[d]{'}{'},   % 文字列 (シングル)
    morestring=[b]{"},      % 文字列 (ダブル)
    alsoletter={\%},        % 文字としてに\%を追加
}

lstsetによる言語設定

lstsetによる言語設定に示す.
下の方で予約語などの文字のスタイルを指定している.
colorについては後述する.

\lstset{
    language=myscilab,  % 新しく定義した言語を設定
    frame=none,         % 枠設定
    breaklines=true,    % 行が長くなった場合自動改行
    breakindent=12pt,   % 自動改行時のインデント
    columns=fixed,      % 文字の間隔を統一
    basewidth=0.5em,    % 文字の横のサイズを小さく
    numbers=left,       % 行数の位置
    numberstyle={\scriptsize \color{white}},  % 行数のフォント
    stepnumber=1,       % 行数の増間
    numbersep=1zw,      % 行数の余白
    xrightmargin=0zw,   % 左の余白
    xleftmargin=2zw,    % 右の余白
    framexleftmargin=18pt,  % フレームからの左の余白
    keepspaces=true,    % スペースを省略せず保持
    lineskip=-0.2ex,    % 枠線の途切れ防止
    tabsize = 4,        % タブ数
    showstringspaces=false,  %文字列中の半角スペースを表示させない
    %%%%% VSCode風 の style & color %%%%%
    backgroundcolor={\color[gray]{0.1}},                    %背景色
    basicstyle     ={\small\ttfamily \color{white}},        % 基礎の文字のフォント設定
    identifierstyle={\small          \color{identifier}},   % 変数名などのフォント設定
    commentstyle   ={\small          \color{comment}},      % コメントのフォント設定
    keywordstyle   =[1]{\small\bfseries \color{keyword1}},  % 予約語のフォント設定
    keywordstyle   =[2]{\small\bfseries \color{keyword2}},  % 関数名のフォント設定
    keywordstyle   =[3]{\small\bfseries \color{keyword3}},  % 大域変数のフォント設定
    keywordstyle   =[4]{\small\bfseries \color{keyword4}},  % 定数のフォント設定
    stringstyle    ={\small\ttfamily    \color{string}},    % 文字列のフォント設定
    %%%%% VSCode風 の style & color %%%%%
}

VSCode風に色設定

VSCodeのデフォルトの配色風に色設定してみた.
definecolorの1つ目の中括弧で色の名前を定義するが,今回は上のlstsetの文字のスタイルの指定にある.colorのものに対応する形で作成した.

\definecolor{identifier}{rgb}{0.611, 0.862, 0.996}  % LightBlue (変数)
\definecolor{comment}{rgb}{0.415, 0.600, 0.333}     % DeepGreen (コメント)
\definecolor{keyword1}{rgb}{0.768, 0.521, 0.749}    % Purple    (予約語)
\definecolor{keyword2}{rgb}{0.862, 0.862, 0.666}    % Yellow    (関数名)
\definecolor{keyword3}{rgb}{0.2, 0.8, 1}            % Blue      (大域変数)
\definecolor{keyword4}{rgb}{0.854, 0.439, 0.839}    % Pink      (定数)
\definecolor{string}{rgb}{0.847, 0.560, 0.458}      % Orange    (文字列)

プログラムを出力

プログラムファイルの出力の仕方は2つある.

1つ目

\begin{lstlisting}[language=<言語名>, caption=<キャプション>, label=<ラベル>]
...
...
...
\end{lstlisting}

2つ目

\lstinputlisting[language=<言語名>, caption=<キャプション>, label=<ラベル>]{<ファイルパス>}

出力結果

上の2つ目の方法を用いてプログラムファイルを読み込んだ.
オプションのlanguageはlstsetで定義済みなので,省略した.

\lstinputlisting[caption=2次元正規分布に基づいたベイズ識別器のプログラム, label=code_bayes]{code/bayes.sce}

出力結果の画像を次に示す.

参照コマンドの定義とキャプションのコマンドの再定義

おまけで参照コマンドの定義とキャプションのコマンドの再定義をした.

\newcommand{\lstlistingnameref}[1]{\textbf{Source Code.\ref{#1}}}   % ソースコード参照
\renewcommand{\lstlistingname}{\textbf{Source Code.}}    % ソースコードキャプション

Discussion