gnuplotでLaTeXコマンドを使いたい！   ～epslatexを用いたグラフの作成～

# はじめに
これは私の初めての投稿になります．見苦しい記事かもしれませんがご了承ください．皆さんからご意見・ご指摘をいただけると幸いです．
LaTeX文書に画像を挿入する際，形式はpdfかepsを多く使うのではないでしょうか．「LaTeXといえばepsなんて考えは古い！」という方も多いでしょう．私もその考えには同意しますがepsが悪だとは思いません．ただ，「思考停止でepsを使い続ける」のは愚かな行為かもしれませんね．

## epslatexとは
epslatexはフリーソフトgnuplotの機能のひとつで，LaTeXコマンドを用いてグラフへの数式の入力等が可能になります．
gnuplotで作成したグラフ内で複雑な数式やギリシャ文字，日本語を使いたい人，Computer Modernを使いたい人にはオススメ．
しかし使い勝手は決していいとは言えず，普段gnuplotを使用している人でさらに自由度の高いグラフを作成したい場合なら使用してもよいがgnuplot初心者に向いている機能ではありません．
また，使用環境に大きく左右される可能性があることにも注意する必要があります．
epslatexについて扱ったサイトは既にいくつかありますがQiitaでまとめてあるものは無かった気がするのでこの記事でまとめました．


## 筆者の使用環境
OS: Windows 11 pro
gnuplot: Version 5.2 patchlevel 8


# epslatexを使ってみる
話がややこしくなるので初めに登場人物を紹介しておきます．
1. `sample.plt`（自分で作る．gnuplotのスクリプト）
2. `sample.eps`（gnuplotが作ってくれる）
3. `sample.tex`（gnuplotが作ってくれる）
4. `main.tex`（自分で作る．メインのLaTeX文書）
5. `standalone_class.tex`（おまけ）

## gnuplotスクリプトの作成

```gnuplot:sample.plt
#setting
set terminal wxt enhanced
set grid
set key right top

#label
set xlabel '$x$'
set ylabel '$y$'

#title
t1 = '$y=e^{-0.25x}$'
t2 = '$y=-e^{-0.25x}$'
t3 = '$y=e^{-0.25x}\sin x$'

#plot the data
plot \
exp(-0.25*x) title t1,\
-exp(-0.25*x) title t2,\
exp(-0.25*x)*sin(x) title t3

#output epslatex
set terminal epslatex size 12.0cm,8.0cm
set output "sample.tex"
replot
```
epslatex用のスクリプトでは冒頭に

```
set terminal wxt enhanced
```

と記述し，末尾で

```
set terminal epslatex size 12.0cm,8.0cm
set output "sample.tex"
```

のように出力するepsファイルの大きさとファイル名を指定します．
ここで生成されるファイルは`sample.eps`と`sample.tex`です．
epsファイルはグラフの文字以外の画像情報，texファイルはグラフの文字情報が記述されます．
両ファイルを**本文の**texファイル（`main.tex`）に挿入することによりグラフを表示します．
数式を使いたい箇所は

```
t1 = '$y=e^{-0.25x}$'
t2 = '$y=-e^{-0.25x}$'
t3 = '$y=e^{-0.25x}\sin x$'
```

のようにシングルクオーテーションで囲んでその中でLaTeXの数式環境を用います．
ダブルクオーテーションだとバックスラッシュで始まるLaTeXコマンド（`\sin`とか）をpltスクリプトに入れたとき，生成されるtexファイルでバックスラッシュが抜かれてしまいます（つまり，そのまま使うことができないのでtexファイルを書き換える必要が出てくる．そんなの面倒ですよね）．

ちなみに軸を対数にしたければ

```
set log x
set format x '$10^{%L}$'
```

のように書くと，`epslatex_sample.tex`内で軸目盛を数式環境にしてくれます．

ただし，挿入する文字列の中にシングルクオーテーションを含む場合（微分記号等），gnuplotがシングルクオーテーションを命令と解釈してしまうため`^\prime`を使うか，`sample.plt`内では別の記号で記述しておき，`sample.tex`の中身でシングルクオーテーションに書き換えるようにします．

一つ大事なことを言っておくと，wxtターミナルで出力されたグラフと最終的にLaTeX文書のpdfファイルに埋め込まれるグラフは全然見た目が違います．
「あれれ？wxtターミナルのグラフおかしいな？どこか間違えたかな？」とか思わずに挿入してみてください．
ちなみに筆者の環境ではこのようにターミナルに出力されました．

![wxtターミナル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/e4fc17f4-657a-1b51-b724-aeea9853c60e.png)




## LaTeX文書に挿入
まずは普通に作成．

```LaTeX:main.tex
\begin{document}
ほげほげ
\begin{figure}[h]
	\centering
   	\input{sample}
   	\caption{普通に挿入．}
   	\label{fig:sample1}
\end{figure}
ほげほげ
\end{document}
```

`\includegraphics`コマンドではなく`\input`コマンドを使い，`\input{sample}`のように記述していることに注意してください．
また，拡張子をつけてはいけません．ここで挿入しているのは`sample.tex`だからです．
ここでは**挿入する**texファイル（`sample.tex`）の中身は何もいじっていません．
また，gnuplotから生成された`sample.eps`と`sample.tex`はメイン文書の`main.tex`と
同じディレクトリになければなりません．

こんな風に出力されたら成功です．
とても綺麗ですよね．
これだけでご飯が美味しくなります．

![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/63d2824a-0893-8a05-e68c-9dcbdac18c92.png)



もしグラフ全体の文字の大きさを変えたかったら

```LaTeX:main.tex
{\footnotesize \input{sample}}
```

みたいな感じで変えてみてください．

## 異なるディレクトリから画像を挿入
LaTeX文書に挿入する画像が増えると画像用のディレクトリを用意することがあると思います．
その場合，texファイル（`sample.tex`，`main.tex`）を少しいじる必要があります．
今回は`./fig`以下の画像を挿入することにします．
まずはメイン文書の`main.tex`で以下のように画像を挿入します．

```LaTeX:main.tex
\begin{figure}[h]
	\centering
   	\input{./fig/sample}
   	\caption{異なるディレクトリから挿入．}
   	\label{fig:sample2}
\end{figure}
```

`\input{./fig/sample}`のようにディレクトリを変えていることがわかります．
また，`./fig/sample.tex`の後ろから4行目（行数は作成したグラフ，環境によって異なるかもしれないがだいたい最後の辺り）にも注目してみます．

```LaTeX:sample.tex
\put(0,0){\includegraphics{./fig/sample}}%
```

ここに`\includegraphics`があるのでディレクトリを書き加える必要があります（これは手動）．
ここで気がついたと思いますが，`sample.tex`は文字情報だけでなく，epsファイル挿入の命令も行っているのです．
したがって，挿入するepsファイルの階層が変わったら`sample.tex`の中身を書き換える必要があるということです．
これを忘れると「ファイルが見つからないよ！」と怒られてしまいます．

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/5c11932c-c8de-5e91-cc49-05ae97d21ed0.png)

当然ですが同じ結果を得られます．

## 応用
epslatexはLaTeXの機能を使って文字を挿入しています．
ということは複雑な数式は勿論，ギリシャ文字や日本語も挿入できます．

![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/0c881298-ddb4-4d3d-ecb3-956adc5564bb.png)


上の図は下記コマンドを`sample.tex`に挿入しました．

```LaTeX:sample.tex
\put(6000,1200){\makebox(0,0)[r]{\strut{}{\footnotesize $\displaystyle \lim_{n \to \infty} \sum_{k=1}^{n} \int_{(k-1)\pi}^{k\pi}|e^{-0.25x}\sin x|\mathrm{d}x$を求めよ．}}}%
```

`\displaystyle`コマンドを入れないとディスプレイ数式にならないので注意．

![sample4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/6c8d8955-cac7-c18d-c8ce-658a7288c03e.png)


## 別の画像形式で保存
グラフをepsファイルとtexファイルの組み合わせで使用するのではなく，一つの画像ファイル（pdfやpng）として使用したい場合．
「TeX2img」というフリーソフトをオススメします．
これはTeXソースからさまざまな形式の画像を生成してくれるスグレモノです．
つまり，TeX2img用のスクリプトに`sample.tex`挿入の命令をすればよいというわけです．
おそらくTeX2imgの大部分の利用者は複雑な数式を画像として貼り付けたい場合に使うと思いますが，このような使い方も可能です．
勿論，pdf化してLaTeX文書に再挿入することも可能です．

## BoundingBoxについて
ここで述べることは使用するLaTeXの環境に依存するので万人共通ではありません．
epslatexで画像を挿入すると下図のようにepsファイルと文字がズレて表示されることがあります．

![sample5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/75df47fe-b038-44a8-b2cb-3eef49d41f14.png)


epsファイルはベクター画像としてさまざまな情報を含んでいるため，epsファイルをテキストエディタで開くとその情報が出てきます．
`sample.eps`の最初の方を見てみると次のような記述があるはずです．

```
%% BoundingBox: 50 50 390 276
```

epslatexのデフォルトだとBoundingBoxの最初の二つの数字は`50 50`になっていると思います．
しかし，TeXのバージョンや使用環境によっては`50 50`だとズレて表示されてしまう場合があります．
この場合，`0 0`か`25 25`に書き換えると解決する可能性が高いです．

## やっぱりepsで挿入したくないという人は
先程書いたようにBoundingBoxの関係などもあり，epsで画像を挿入したくない人は多くいると思います．
その場合はTeX2imgでpdf化してから挿入してもいいですし，`standalone`クラスを用いて図だけのpdfをLaTeXで作成するのもアリだと思います．

```LaTeX:standalone_class.tex
\documentclass{standalone}
\begin{document}
\input{sample}
\end{document}
```


# gnuplot Version5.4について
gnuplot Version5.4でepslatexを使用したところ，仕様が変更されていたようでうまく動作しませんでした．
細かい原因は暇なときに調査しますが，一旦古いバージョンを使うことをオススメします．


# 参考文献等
1. 山本昌志，gnuplotの精義［第二版］（2013），（ISBN: 978-4-87783-304-6）．
2. [gnuplotのepslatexを使ってTeXへちゃんとした数式入りのグラフを挿入する](https://daily.belltail.jp/?p=1641)
3. [gnuplotのepslatexターミナルで図がずれる場合の対処法](http://kobayashi.hub.hit-u.ac.jp/topics/gnuploteps.html)
4. [TeX2img配布サイト](https://tex2img.tech/)