TeXでソースコードをVSCode風に出力してみた

# TeXでソースコードをVSCode風に出力してみた

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

[前回の記事](https://qiita.com/nkojima0823/items/b626e92556e9865b847a)より細かく書いてみた

https://qiita.com/nkojima0823/items/b626e92556e9865b847a


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


## PC環境

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

## TeX環境

Docker上で[Paperist/texlive-ja](https://hub.docker.com/r/paperist/alpine-texlive-ja/)のlatestのバージョンをイメージをpullする．
[github](https://github.com/Paperist/texlive-ja)にもある．

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


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


## 使用したTexの文章クラス

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

次に使用例を示す．

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

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

| オプション | 使用理由 |
| -------- | ---- |
| a4j | 日本のA4サイズ |
| [uplatex](https://texwiki.texjp.org/?upTeX%2CupLaTeX) | コンパイラの種類(?) |
| [dvipdfmx](https://texwiki.texjp.org/?dvipdfmx#:~:text=dvipdfmx%20%E3%81%AF%20DVI%20%E3%82%92%20PDF,%E7%89%88%20(eXtended%20version)%20%E3%81%A7%E3%81%99%EF%BC%8E) | PNG画像の読み込みと色設定に使用 |
| 11pt | 標準の文字の大きさ |

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

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

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

## [plistings](https://github.com/h-kitagawa/plistings)について

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

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

## listingsによる言語定義

```latex
\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に\\%を追加する．

```latex
\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については後述する．

```latex
\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のものに対応する形で作成した．

```latex
\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つ目

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

2つ目

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

## 出力結果

![スクリーンショット 2021-11-28 19.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472474/bb5ac2de-50c9-a571-0350-7a7042cb37c1.png "言語定義，言語設定をして出力した例")

![スクリーンショット 2021-11-28 19.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472474/b34e67d0-f3d3-0807-e9ba-8cf1d3002fcc.png)


## (おまけ) キャプション変更と参照コマンドの定義

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