📈

gnuplotをupLaTeXに埋め込んで実験Aを突破する

2024/04/04に公開

これは何?

この記事では以下の2つを扱います。

  • upLaTeX上のgnuplot環境の構築
  • 実験A用LaTeXテンプレートの配布

はじめに

弊学の某実験では\LaTeXという組版用ソフトウェアを用いたレポートの執筆をさせられるそうです。別に強制ではないですが、とりあえずLaTeXを使っておけば書式で怒られることはない(はず)なので、個人的にはおすすめです。正しい書式を覚えることも実験Aの大きなテーマですからね。
しかしながら、LaTeXには図、特にグラフの描画を行う仕組みが(一応)存在しません[1]。そこで授業ではgnuplotという別のソフトウェアの標準の書式が指定されています。こちらも同様、最低限色の設定さえしておけば怒られることはないはずなので、おすすめです。
LaTeXやgnuplotが何者かという事については他の方の記事やサイトに任せることにして、本来別々で使わなければならないgnuplotをtexファイル上で完結させてしまおうというのが本記事のテーマです。正直ちょっとハードルが高いので、めんどくさければgnuplotで出力したものをLaTeXに貼ればいいですが、一度やってしまえばかなり楽になると思うので意欲のある方は是非どうぞ。

前提条件

  • gnuplotの動作環境
  • upLaTeXの動作環境

動作確認環境

OS

  • Windows
    • Windows 10 Home 22H2
    • gnuplot 5.4 patchlevel 8 (インストール版)
    • e-upTeX 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.uptex) (TeX Live 2023)
  • Mac
    • Sonoma 14.3.1 (Apple silicon)
    • gnuplot 6.0 patchlevel 0 (homebrew版)
    • e-upTeX 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.uptex) (TeX Live 2023)
  • Linux
    • Debian GNU/Linux 12 (bookworm) x86_64
    • gnuplot 5.4 patchlevel 4 (apt版)
    • e-upTeX 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.uptex) (TeX Live 2024)

LaTeX

  • 導入Collection
    • collection-langjapanese
    • collection-latexextra
    • collection-mathscience

自動でやる方法

各自のOSに合わせて次のコマンドを実行してください。(コマンドの実行の仕方はいーちゃんの記事を参考にしてください。)

Windows
powershell -NoProfile -ExecutionPolicy Bypass "iwr 'https://kanaru0928.github.io/latex-gnuplot-env-installer/install-gnuplot-windows-wrapper.ps1' | iex"
Mac (homebrew)

homebrew版のgnuplotが対象です。

sudo /bin/bash -c "$(curl -fsSL 'https://kanaru0928.github.io/latex-gnuplot-env-installer/install-gnuplot-mac.sh')"
Linux

apt版のgnuplotでしか動作確認をしていませんので、ご注意ください。

sudo /bin/bash -c "$(curl -fsSL 'https://kanaru0928.github.io/latex-gnuplot-env-installer/install-gnuplot-linux.sh')"

コマンドの作成はいーちゃんの記事を(勝手に)参考にさせていただきました。ありがとうございます。

実験A用テンプレート

いずれも、授業公式のLaTeXテンプレートをより安定化しました。また、便利なパッケージなども使えるようになっています。

gnuplot環境利用時
template.tex
\documentclass[a4paper,10pt,dvipdfmx]{jsarticle}
\usepackage{amsmath, %
  amssymb, %
  url, %
  xparse, %
  latexsym, %
  ifthen, %
  float, %
  hyperref, %
  booktabs, %
  titlesec, %
  bm, %
  multirow
}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz, circuitikz, gnuplot-lua-tikz}
\usepackage{gnuplottex}
\usepackage[format=hang,font=normalsize]{caption}
\usepackage[separate-uncertainty]{siunitx}

\usetikzlibrary{external}
\tikzexternalize[prefix=figure/]
\tikzset{external/system call={uplatex --shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource" && dvipdfmx "\image" -o "\image".pdf}}

\tikzexternalize

\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}

\setlength{\textwidth}{165mm} %165mm-marginparwidth
\setlength{\marginparwidth}{40mm}
\setlength{\textheight}{225mm}
\setlength{\topmargin}{-5mm}
\setlength{\oddsidemargin}{-3.5mm}

\makeatletter

\newcommand{\@studentnum}{YYXXNNN}
\newcommand{\studentnum}[1]{\renewcommand{\@studentnum}{#1}}

\newcommand{\@cluster}{O類XXプログラム}
\newcommand{\cluster}[1]{\renewcommand{\@cluster}{#1}}

\newcommand{\@create}{20YY年O月O日}
\newcommand{\create}[1]{\renewcommand{\@create}{#1}}

\renewcommand{\@maketitle}{
  \begin{center}
    {\Large{\bf\@title}} \par
    {\bf 電気通信大学~\@cluster \par
    \@studentnum~\@author} \par
    {\bf \@create 作成} \par
    {\bf \@date 更新}
  \end{center}
}

\titleformat{\section}[block]{\normalsize\normalfont\bf\raggedright}{\thesection}{\Cvs \@plus.5\Cdp \@minus.2\Cdp}{}
\titleformat{\subsection}[block]{\normalsize\normalfont\bf\raggedright}{\thesubsection}{\Cvs \@plus.5\Cdp \@minus.2\Cdp}{}

\makeatother

\NewDocumentCommand{\E}{m}{\times 10^{#1}}

\newcommand{\e}{\mathrm{e}}

\title{Template by Kanaru}
\cluster{X類}
\studentnum{YYXXNNN}
\author{電通 太郎}
\create{作成日}

\begin{document}

\maketitle

\section{目的}

\section{原理}

\section{方法}

\section{結果}

\section{考察}

\end{document}
gnuplot環境を使わない場合
template.tex
\documentclass[a4paper,10pt,dvipdfmx]{jsarticle}
\usepackage{amsmath, %
  amssymb, %
  url, %
  xparse, %
  latexsym, %
  ifthen, %
  float, %
  hyperref, %
  booktabs, %
  titlesec, %
}
\usepackage[dvipdfmx]{graphicx}
\usepackage{circuitikz}
\usepackage[format=hang,font=normalsize]{caption}
\usepackage[separate-uncertainty]{siunitx}

\setlength{\textwidth}{165mm} %165mm-marginparwidth
\setlength{\marginparwidth}{40mm}
\setlength{\textheight}{225mm}
\setlength{\topmargin}{-5mm}
\setlength{\oddsidemargin}{-3.5mm}

\makeatletter

\author{Template by Kanaru}

\newcommand{\@studentnum}{YYXXNNN}
\newcommand{\studentnum}[1]{\renewcommand{\@studentnum}{#1}}

\newcommand{\@cluster}{O類XXプログラム}
\newcommand{\cluster}[1]{\renewcommand{\@cluster}{#1}}

\newcommand{\@create}{20YY年O月O日}
\newcommand{\create}[1]{\renewcommand{\@create}{#1}}

\renewcommand{\@maketitle}{
  \begin{center}
    {\Large{\bf\@title}} \par
    {\bf 電気通信大学~\@cluster \par
    \@studentnum~\@author} \par
    {\bf \@create 作成} \par
    {\bf \@date 更新}
  \end{center}
}

\titleformat{\section}[block]{\normalsize\normalfont\bf\raggedright}{\thesection}{\Cvs \@plus.5\Cdp \@minus.2\Cdp}{}
\titleformat{\subsection}[block]{\normalsize\normalfont\bf\raggedright}{\thesubsection}{\Cvs \@plus.5\Cdp \@minus.2\Cdp}{}


\makeatother

\NewDocumentCommand{\E}{m}{\times 10^{#1}}

\newcommand{\e}{\mathrm{e}}

\title{Template by Kanaru}
\cluster{X類}
\studentnum{YYXXNNN}
\author{電通太郎}
\create{YYYY年MM月DD日}

\begin{document}
\maketitle

\section{目的}
\subsection{サブセクション}
\section{原理}
\section{結果}
\section{考察}

\end{document}

テンプレートの使い方

  • gnuplot環境を利用する際はfigureディレクトリを、texファイルと同じ場所に作成してください

  • 書き始めるときは、\begin{document}の上にある、

    • title (実験名)
    • cluster (類)
    • studentnum (学籍番号)
    • author (氏名)
    • create (作成日)

    を入力してください。

  • ネイピア数\mathrm{e}の入力は\eと入力してください (立体(eではなく\mathrm{e}ということ)のが好ましいため)

  • 指数(6.0 \times 10 ^ {23}のようなもの)の入力は、siunitxパッケージを用いるか6.0\E{23}と入力してください

gnuplot環境の使い方

gnuplot環境を使うためには、ファイルの初めの方に

\usepackage{tikz, gnuplot-lua-tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=figure/]
\tikzset{external/system call={uplatex --shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource" && dvipdfmx "\image" -o "\image".pdf}}

\tikzexternalize

\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}

と入力する必要があります(テンプレート使用の場合は不要)。

gnuplotの図を入れたい場合は、

\begin{figure}[H]
  \centering
  \begin{gnuplot}[terminal=tikz, terminaloptions={size 8cm, 8cm}]
    # ここにgnuplotのコード
  \end{gnuplot}
  \caption{ここにキャプション}
\end{figure}

としてください。

[発展] gnuplot環境のおまじないの意味

\usepackage{tikz, gnuplot-lua-tikz}gnuplot環境をインポートしています。

その下の\usetikzlibrary{external}は、tikzで生成される画像を中間ファイルを介して行う設定です(exteral)。こうすることで、前回と図の内容に変更がない時は無駄な処理を省いてくれます。これをしないとgnuplotのコンパイルが、texファイルを保存する度に走り、レポートどころではなくなります。
さらにその下はこの中間ファイルに関する設定です。figureディレクトリに保存されるようになります。

通常、upLaTeXでexternal設定を使うと図が出力されないというバグ(?)が発生します。\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}はその回避のためです。

[発展] 手動でやる方法

スタイルファイルの配置

最終的に、gnuplot環境を使いたいのですが、標準の状態ではまだ使えません。そこで、これを使えるようにするスタイルファイルを配置します。

まずはスタイルファイルを配置すべき場所を調べます。LaTeXがインストールされている環境で次のコマンドを実行してください。

kpsewhich -var-value=TEXMFLOCAL

次は、スタイルファイルの配置先パスに移動します。

cd 前のコマンドの実行結果
mkdir gnuplot
cd gnuplot

例えば、

cd /usr/local/texlive/texmf-local

といった感じです。

次に、gnuplotでスタイルファイルを生成します。gnuplotがインストールされている環境で次のコマンドを実行してください。

Windows
gnuplot -e "set term tikz createstyle"
Mac / Linux
sudo gnuplot -e "set term tikz createstyle"

最後に、このスタイルファイルを読み込み直します。

Windows
mktexlsr
Mac / Linux
sudo mktexlsr

これを実行することで、texでgnuplot環境が使えるようになります。

Luaの設定

このままgnuplot環境を利用すると、LaTeX Workshopを利用した際にコンパイルが止まらなくなる現象が発生します。そのため、Luaの設定を変更する必要があります。

Windows

C:\Program Files\gnuplot\share\lua\gnuplot-tikz.luaの1299行目くらいにある部分を以下の通り変更してください。

C\Program Files\gnuplot\share\lua\gnuplot-tikz.lua
-   notimestamp = false,
+   notimestamp = true,
Mac (Homebrew)

/opt/homebrew/share/gnuplot/*/lua/gnuplot-tikz.luaの1299行目くらいにある部分を以下の通り変更してください。(*はバージョン番号)

/opt/homebrew/share/gnuplot/*/lua/gnuplot-tikz.lua
-   notimestamp = false,
+   notimestamp = true,
Linux

/usr/share/gnuplot/gnuplot/*/lua/gnuplot-tikz.luaの1299行目くらいにある部分を以下の通り変更してください。(*はバージョン番号)

/opt/homebrew/share/gnuplot/*/lua/gnuplot-tikz.lua
-   notimestamp = false,
+   notimestamp = true,

以上で、LaTeX Workshop利用時も正しくコンパイルが正常終了します。

原因

コンパイルが止まらなくなるのは、gnuplotをtikzとして出力した際に、出力ファイルに生成されたタイムスタンプが入ってしまうことが原因です。これがLaTeX Workshopに「更新」とみなされ、コンパイルをやり直してしまいます。
上の設定をすることで、タイムスタンプの出力がなくなり、この現象が解決します。

補足

実験Aおすすめ記事

https://zenn.dev/e_chan1007/articles/8029f3f9dff2be

https://zenn.dev/team411/articles/latex-install-advanced

https://uec.medit.link/latex/

LaTeX Workshopを最大限活用したい方へ

LaTeX WorkshopではLaTeXだけでなく、その周辺のソフトウェアを利用し、様々な機能(文字数カウントやフォーマットなど)を提供してくれます。ただし、上の記事からインストールした場合はそれらが省かれているようです。
インストールするためには、次のコマンドを実行してください。(適宜sudoやpathなどを入れてください。)

tlmgr install collection-binextra

質問など

分からない点や詰まった点があればTwitterやZennのDiscussionなどで気軽に質問してください。もちろん答えられる範囲で答えますし、私が分からなくても私のコネでどうにか解決します。

脚注
  1. TikZなどがあるので、存在しないとは必ずしも言い切れないですが、レポート執筆などで現実的に使いやすいものは提供されていないと考えていいでしょう。 ↩︎

Discussion