gnuplotをupLaTeXに埋め込んで実験Aを突破する
これは何?
この記事では以下の2つを扱います。
- upLaTeX上のgnuplot環境の構築
- 実験A用LaTeXテンプレートの配布
はじめに
弊学の某実験では
しかしながら、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環境利用時
\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環境を使わない場合
\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行目くらいにある部分を以下の通り変更してください。
- notimestamp = false,
+ notimestamp = true,
Mac (Homebrew)
/opt/homebrew/share/gnuplot/*/lua/gnuplot-tikz.lua
の1299行目くらいにある部分を以下の通り変更してください。(*はバージョン番号)
- notimestamp = false,
+ notimestamp = true,
Linux
/usr/share/gnuplot/gnuplot/*/lua/gnuplot-tikz.lua
の1299行目くらいにある部分を以下の通り変更してください。(*はバージョン番号)
- notimestamp = false,
+ notimestamp = true,
以上で、LaTeX Workshop利用時も正しくコンパイルが正常終了します。
原因
コンパイルが止まらなくなるのは、gnuplotをtikzとして出力した際に、出力ファイルに生成されたタイムスタンプが入ってしまうことが原因です。これがLaTeX Workshopに「更新」とみなされ、コンパイルをやり直してしまいます。
上の設定をすることで、タイムスタンプの出力がなくなり、この現象が解決します。
補足
実験Aおすすめ記事
LaTeX Workshopを最大限活用したい方へ
LaTeX WorkshopではLaTeXだけでなく、その周辺のソフトウェアを利用し、様々な機能(文字数カウントやフォーマットなど)を提供してくれます。ただし、上の記事からインストールした場合はそれらが省かれているようです。
インストールするためには、次のコマンドを実行してください。(適宜sudoやpathなどを入れてください。)
tlmgr install collection-binextra
質問など
分からない点や詰まった点があればTwitterやZennのDiscussionなどで気軽に質問してください。もちろん答えられる範囲で答えますし、私が分からなくても私のコネでどうにか解決します。
-
TikZなどがあるので、存在しないとは必ずしも言い切れないですが、レポート執筆などで現実的に使いやすいものは提供されていないと考えていいでしょう。 ↩︎
Discussion