論文やプレゼンテーションで使えるグラフを gnuplottex と tikz で描く。

# 概要
[gnuplottex](https://ctan.org/pkg/gnuplottex "CTAN: Package gnuplottex") をそのターミナル tikz とともに利用することで、手軽に図と本文のフォントを統一し、図中に tex 記法で数式を記入する。[tikz](https://ctan.org/pkg/pgf "CTAN: Package pgf") の externalization ライブラリを利用して、図に変更が無い場合のコンパイル時間を短縮する方法についても述べる。latex エンジンとして platex および lualatex を使う例を挙げる。

# 前提、環境
* [gnuplot](http://www.gnuplot.info/) 5.2 patchlevel 2
* [texlive](https://www.tug.org/texlive/) 2017 の platex または lualatex

を利用している。

MacOS High Sierra で確認した。たぶん Linux でもほぼ同様。Windows では不明。

tex、tikz および gnuplot の使用法については既知とする。

# 準備
## スタイルファイルの設定
gnuplot のターミナル tikz を使うためにスタイルファイルを準備する。コマンドラインで

```shell:
kpsewhich gnuplot-lua-tikz.sty
``` 

および

```shell:
kpsewhich gnuplot-lua-tikz-common.tex
``` 

と入力してどちらもファイルの場所が表示される場合は、既にスタイルファイルが準備されているので次節へ進む。

ファイルの場所が表示されない場合は、まずコマンドラインで

```sh:
kpsewhich -var-value=TEXMFHOME
``` 

と入力して TEXMFHOME を見つける。TEXMFHOME の下の tex/latex/ の下が TeX スタイルファイル置き場である。次に、gnuplot に付属している (1) gnuplot-lua-tikz.sty および (2) gnuplot-lua-tikz-common.tex を TEXMFHOME/tex/latex/ 以下に移動する、あるいはシンボリックリンクを作成する。上記ファイル(1)あるいは(2)を見つけられない場合、gnuplot を起動して

```gnuplot:
set term tikz createstyle
``` 

と入力すれば上記ファイル(1)および(2)が作成されるので、TEXMFHOME/tex/latex/ にこれらを移動する。このコマンドで gnuplot-lua-tikz.tex および t-gnuplot-lua-tikz.tex も作成されるが、これらはそれぞれ plain tex および context 用なので不要なら削除してよい。

## 画像保存ディレクトリ
tikz の external ライブラリを利用する場合は本体 pdf とは別に画像ファイルが生成されるので、画像ファイルを保存するディレクトリをあらかじめ作成しておく。ここでは画像保存ディレクトリ名を figure とする。

## 必須ではない gnuplot の設定
ここでは、gnuplot の設定で

```gnuplot: 
set colorsequence podo
set for [i=1:9] linetype i dashtype i
```

とした（ファイル `~/.gnuplot` に記述）。一行目によって、色盲の人でも判別しやすい色設定に変更される（ただし$9$番目の色だけは純赤なので判別しにくい）。二行目によって、$i$番目の線の線種を番号$i$に設定している；デフォルトの線種は全て実線だが、この設定により実線、破線や点線など$9$種類の線種が設定されるので、色だけでは判別しにくい場合でも線種で判別できる。

# gnuplottex の利用
platex および lualatex のソースコードと結果の例を挙げる。platex と lualatex とで共通部分が多いので、両方の例の後でまとめて説明する。

## 例１：platex + dvipdfmx を使う場合
latex エンジンとして platex を用いる。dvi ファイルから PDF ファイルへの変換には dvipdfmx を使う。

```tex:example_platex.tex
\documentclass[platex, dvipdfmx, ja=standard, a4paper, 12pt, magstyle=nomag*]{bxjsarticle}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz, gnuplot-lua-tikz} %gnuplottexでtikzターミナルを使うとき必須
\usepackage{gnuplottex} %必須
\usetikzlibrary{external} %tikz の external ライブラリを使用
\tikzexternalize[prefix=figure/] %画像保存ディレクトリを指定
\tikzset{external/system call={platex -shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource" && dvipdfmx "\image" -o "\image".pdf}}
\tikzexternalize
\begin{document}
\begin{figure}
 \centering
 \tikzsetnextfilename{fig_platex}%図のファイル名指定。指定しない場合は自動的に連番がつく。
 \begin{gnuplot}[terminal=tikz, terminaloptions={font ',12'}]
  set for [i=1:9] linetype i linewidth 2
  set key spacing 1.25
  set sample 200
  set grid xtics lt 0 lw 2
  set grid ytics lt 0 lw 2
  set xr [-3:3]
  set yr [0:1]
  set xlabel '$x$'
  set ylabel '$g(x, \sigma)$'
  g(x, sigma) = exp(-x**2/(2*sigma**2))/(sqrt(2*pi)*sigma)
  plot g(x, 0.5) w l t '$\sigma = 0.5$', g(x, 1.0) w l t '$\sigma = 1.0$', g(x, 2.0) w l t '$\sigma = 2.0$'
 \end{gnuplot}
 \caption{標準偏差が$\sigma = 0.5$、$1.0$、および$2.0$の場合の正規分布。}
\end{figure}
\end{document}
```

platex で

```sh
platex --shell-escape texソースファイル名
```

のように、オプション `--shell-escape` を付けてコンパイルすると、figure ディレクトリ内に fig_platex.pdf（グラフの pdf ファイル）とその他もろもろのファイルが作られ、example_platex.tex（tex ソースファイル）と同じディレクトリ内に example_platex.dvi が作られる。これを dvipdfmx で処理すると example_platex.pdf（本体の pdf ファイル）が作られる。example_platex.pdf のグラフとキャプションを含む領域のスクリーンショットを示す：
<img width="530" alt="platex+dvipdfmxの出力結果の一部切り抜き" src="https://qiita-image-store.s3.amazonaws.com/0/155131/aa6005a1-39ea-ea92-8545-97d0e0bc43a2.png">


## 例２：lualatex を使う場合
latex エンジンとして lualatex を用いる。platex に比べて非常に長い時間がかかるので、利用する理由が特にないのであれば勧めない。以下の例では、プレゼンテーション等での利用を想定して

* フォントサイズを 20pt に設定（bxjs クラスのオプションと gnuplottex のオプションで指定）
* 英字フォント、数式フォントをプレゼンテーションで見やすい物（それぞれ palatino、Euler VM）に設定（パッケージ newpxtext と eulervm を使う）
* 図中に文字と矢印の書き込み（ソースコード中のコメント参照）
* キャプションは省略

とした。lualatex でなく platex+dvipdfmx を使う場合でもオプションやパッケージを同じように指定すれば同様の画像が得られる。

```tex:example_lualatex.tex
\documentclass[lualatex, ja=standard, a4paper, 20pt]{bxjsarticle}
\usepackage{shellesc} %lualatex では shell-escape 利用時に必要
\usepackage{lmodern}
\usepackage{tikz, gnuplot-lua-tikz}
\usepackage{gnuplottex}
\usepackage{newpxtext} % 英字フォントを palatino に
\usepackage[euler-digits]{eulervm} % 数式のフォントを Euler VM に
%\setmainjfont{HiraKakuProN-W3} % 日本語フォントをヒラギノ角ゴに（この例ではコメントアウトして不使用）
\usetikzlibrary{external}
\tikzexternalize[prefix=figure/]
\tikzset{external/system call={lualatex -shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize
\begin{document}
\begin{figure}
 \centering
 \tikzsetnextfilename{fig_lualatex}
 \begin{tikzpicture}[gnuplot]
  \begin{gnuplot}[terminal=tikz, terminaloptions={font ',20' nopicenvironment}]
   set for [i=1:9] linetype i linewidth 3
   #set key spacing 1.25 # gnuplot 環境内でのコメントアウトは#を行頭につける
   unset key
   set sample 150
   set grid xtics lt 0 lw 2
   set grid ytics lt 0 lw 2
   set xr [-3:3]
   set yr [0:1]
   set xlabel '$x$'
   set ylabel '$g(x, \sigma)$'
   g(x, sigma) = exp(-x**2/(2*sigma**2))/(sqrt(2*pi)*sigma)
   plot g(x, 0.5) w l, g(x, 1.0) w l, g(x, 2.0) w l
  \end{gnuplot}
  \draw[<-] (7.4, 6.7) -- ++(1.5, 0.5) node [right]{$\sigma = 0.5$}; %tikzの機能で図中に文字と矢印の書き込み
  \draw[<-] (8.4, 3.75) -- ++(0.5, 2.0) node [above]{$\sigma = 1.0$};
  \draw[<-] (10.0, 2.8) -- ++(0.25, 1.0) node [above]{$\sigma = 2.0$};
 \end{tikzpicture}
\end{figure}
\end{document}
```

オプション `--shell-escape` を付けて lualatex で

```
lualatex --shell-escape texソースファイル名
```

とコンパイルすると figure ディレクトリに fig_lualatex.pdf とその他もろもろのファイルが作られ、tex ソースファイルと同じディレクトリ内に example_lualatex.pdf が作られる。fig_lualatex.pdf を png に変換した画像を示す：
<img width="530" alt="lualatexによる出力画像" src="https://qiita-image-store.s3.amazonaws.com/0/155131/44a30450-8884-b797-0b50-457b29925986.png">

## 説明
tex ソース内にコメントとして書いた内容については一部省略する。
### ドキュメントクラス
好みの物を使う。ここでは [bxjsarticle](https://texwiki.texjp.org/?BXjscls "TeX Wiki BXjscls") を使った。オプションとして
* latex エンジンの指定が必要（例１では `platex`、例２では `lualatex` ）
* フォントサイズを指定できる（例１では `12pt` 、例２では `20pt` ）
*  `magstyle=nomag*` または `magstyle=nomag` を指定しないと、図のスケールが異常になり一部が切れて表示される。latex エンジンとして `lualatex` を指定した場合はデフォルトで `magstyle=nomag*` なので書く必要はない（[「magstyle設定」](https://texwiki.texjp.org/?BXjscls#we2b3036 "TeX Wiki BXjscls, magstyle")を参照）

### gnuplot 環境
`\begin{gnuplot}[terminal=tikz ...]` から `\end{gnuplot}` の間は、ターミナルを tikz に設定した gnuplot 環境になる[^gnuplot_tikz]。通常の gnuplot のコマンドを利用できる。gnuplot 環境のターミナル・オプションを `terminaloptions={...}` の形式で指定できる（例１，２参照）[^terminal_option]。オプションを `font ',12'` とすることでフォント・サイズを指定できる（フォント・サイズの前のカンマ`,`は必要）。ここで指定するフォントサイズは、グラフの軸数字や軸ラベルなどの文字位置を設定するために利用される。フォント・サイズを指定する必要はないが、指定しない場合に軸と文字が重なったり離れすぎていたりするなら、フォントを適切に指定すると改善される。

通常の gnuplot の tikz ターミナルでは `font '\sffamily,12'` のように `font 'フォントに関する宣言,サイズ'` の形式でフォント・ファミリー、シリーズ、シェイプも指定できる。しかし gnuplottex ではターミナル・オプションとして同じ形式でフォントに関する宣言を書くとエラーが発生して失敗する。バックスラッシュの入った文字列が失敗原因のようだが、解決方法がわからない。しかしフォント・ファミリー、シリーズ、シェイプを指定したいときは tex 側（gnuplot環境に入る前）で指定すればいいので、これは大きな問題ではないだろう。ターミナル・オプションとしてではなく軸ラベル等のフォントを個別に指定する場合にはエラー発生しないようなので、たとえば

```tex
set xlabel 'This is $x$ axis' font '\sffamily'
```

のように指定することはできる。

gnuplot の tikz ターミナルは tikzpicture 環境を暗黙的に付加するので、ユーザーは `\begin{tikzpicture}[gnuplot]...\end{tikzpicture}` を追加してはいけない（例１参照）。しかし例２のように tikz の機能を使って図中に文字や記号を記入するために tikzpicture 環境が必要な場合には、ターミナル・オプション `nopicenvironment` を指定すればよい。tikzpicture 環境が暗黙的に作成されなくなるので、ユーザーが `\begin{tikzpicture}[gnuplot]...\end{tikzpicture}` を明示的に書ける。

### tikz の external ライブラリ
通常は latex コンパイル処理のたびに tikz による描画が実行される。tikz での処理が重い図がある場合や図の個数が多い場合には、毎回時間を費やしてしまうことになる。tikz の external ライブラリを使うと、初回のコンパイルの時のみ tikz での描画が実行され画像ファイルが生成される[^pgfmanual]。二回目以降のコンパイルでは、前回コンパイルよりあとに tikzpicture 環境内の記述が変更されている場合に限り、再び tikz による描画が実行されて画像ファイルが更新される。tikzpicture 環境内の記述が変更されていなければ初回の画像ファイルが読み込まれるので、時間の節約になる。

上に挙げた例１と例２のソースコードのうち、external ライブラリに関係する部分は

```tex
\usetikzlibrary{external}
\tikzexternalize[prefix=...
\tikzset{external/system call=...
\tikzexternalize

\tikzsetnextfilename{...
```

の５行である。上から順に external ライブラリの読み込み、画像保存ディレクトリの設定、画像ファイル生成のコマンド設定、external 機能の有効化、画像ファイル名の設定である。

tikz 描画にそれほど時間がかかっていない場合は external ライブラリを使う利点はないので、上記の「external ライブラリに関係する部分」はコメントアウトするとよい。

画像保存ディレクトリ（例１、２では figure ディレクトリ）内には、さまざまなファイルが生成される。中でもログファイルはファイルサイズが大きいので、不要なら削除してよい。ただし（当然だが）画像ファイルおよび MD5 ファイルは削除しないこと。

[^gnuplot_tikz]: ここでは単に tikz ターミナルと呼んでいるが、これは lua tikz の短縮名である。このターミナルの使用法についての詳細は [Official gnuplot documentation](http://www.gnuplot.info/documentation.html) の Gnuplot_5.2.pdf の p.228-230 を参照。
[^terminal_option]: ターミナル・オプションを利用して gnuplot の変数を取得する方法など、ここに挙げていない内容について [gnuplottex](https://ctan.org/pkg/gnuplottex) のマニュアルにいくつかの例がある。
[^pgfmanual]: [CTAN: Package pgf](https://ctan.org/pkg/pgf) の PGF Manual の Externalization Library（version 3.0.1a では第５０章）を参照。