プレゼンで使う数式画像を作成する[vim + vim-quickrun + latexmk + dvipng]

# はじめに

プレゼンテーションで数式を使いたいときに，どのツールを利用するか，というのは(発表の中身を無視すれば)大事な要素の一つです。

殆どすべてのスライドに数式が登場し，$\LaTeX$そのものに慣れている人であれば，$\LaTeX$でスライド形式のpdfを作成できるパッケージbeamerなどを使ってスライドを作成するほうが，おそらく一番いいと思います。

逆に，前スライド中に一つや二つ程度しかスライドが出てこないのであれば，PowerPointやKeynoteなど，自分の使いやすいツールでスライドを作成し，数式の部分は付属の数式エディタを用いるか，その書体が気に入らない場合には数式を画像に変換したものを貼り付けるといった方法があるかと思います。

今回は，この$\LaTeX$記法で書いた数式を画像に変換する簡単な方法を紹介したいと思います。

また，この記事の中で本人はvimとその関連ツールを使っていますが，あまり自動化にこだわらないのであれば，別に手動でも簡単に編集と変換が行えます。

お世話になるツールはこちら

* [dvipng](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?dvipng)
* [latexmk](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Latexmk)
* vim
    * [vim-quickrun](https://github.com/thinca/vim-quickrun)

また，これらを合わせて利用するためのシェルスクリプトを使います。

# dvipng

まず，dvipngですが，これはその名称から明らかなようにtexファイルをコンパイルしたあとに生成されるdviファイルから，png形式(実はgifもいける)の画像を生成するスクリプトです。
TeXLiveでTeXをインストールしてきた場合，デフォルトで入っている場合が多いかと思います。

`fig_test.tex`ファイルに対してこのスクリプトを

```
platex fig_test.tex
dvipng -T tight -bd 1000 fig_test.dvi
```

のように実行すると，`fig_test.tex`が

```tex:fig_test.tex
\documentclass[43pt]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{ascmac}
\pagestyle{empty}

% "\vector{a}" でベクトル
\def\vector#1{\mbox{\boldmath \(#1\)}}

\begin{document}
\begin{align*}
    f(x) &= \int^{\infty}_{-\infty}\mathrm{d}x \frac{\sin x}{x} \\
         &= \pi
\end{align*}
\newpage
$\vector{x} = (x_{1}, x_{2})$
\newpage
$\mathcal{C}$
\end{document}
```

のようであったとき，各ページごとに数式を画像に変換したものが作成されます(`fig_test1.png`, `fig_test2.png`, `fig_test3.png`のように番号付けされる)。

このときオプション`-T tight`によって空白部分が切り抜かれ，
`-bd 1000`によって背景に透過処理が施された数式画像が生成されます。

![fig_test1.png](https://qiita-image-store.s3.amazonaws.com/0/54869/4644b9e9-5646-6c39-e346-d0fab22cc545.png)

![fig_test2.png](https://qiita-image-store.s3.amazonaws.com/0/54869/d9df67e5-117b-24df-1074-dbbab6bef095.png)

![fig_test3.png](https://qiita-image-store.s3.amazonaws.com/0/54869/58b2bc04-70ea-53ef-ecb1-574b68c13bd3.png)


# シェルスクリプト'texmath'

さて，このdvipngだけでもかなり簡単に画像作成ができることが分かるかと思いますが，
さらにこれを便利に使用するために，
新しく画像群を作成するときに使うためのシェルスクリプトを書いてみました。

* [dotfiles/texmath at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/bin/texmath)

```bash:texmath
#!/bin/bash -e
# written by Shotaro Fujimoto (https://github.com/ssh0)
# first edited: 2015-11-03

# using latexmk rc file
latexmkrc="$HOME/.latexmkrc_dvipng"

usage() {
  cat <<EOF

NAME
      texmath - compile latex to png with dvipng (and create texmath file)

USAGE
      texmath [-e FILE | FILE] [-h]

ARGUMENTS
      -e FILE: Open and edit FILE.
               Or create it when FILE doesn't exist, 

      FILE:    If you provide only file name, this script compiles the file with
               latexmk and then creates png file by dvipng.

      --help:  Display this help and exit

EOF
  exit 1
}

texmathtemplate="$(cat <<EOF
% vim: ft=texmath
\documentclass[43pt]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{ascmac}
\pagestyle{empty}

% '\vector{a}' でベクトル
\def\vector#1{\mbox{\boldmath \(#1\)}}

\begin{document}
\begin{eqnarray*}

\end{eqnarray*}
\newpage
\end{document}
EOF
)"

if [ "$1" = "-h" ]; then
  usage
elif [ "$1" = "-e" ]; then
  if [ -f "$2" ]; then
    texfile="$2"
  elif [ ! "$2" = "" ]; then
    texfile="$2"
    echo "$texmathtemplate" > "$texfile"
  else
    echo "Option '-e' needs a file name to edit."
    echo "Aborted."
    exit 1
  fi
  vim "$texfile"
elif [ ! -f "$1" ]; then
  echo "'$1' doesn't exist."
  echo "Aborted."
  exit 1
elif [ -f "$1" ]; then
  texfile="$1"
  latexmk -r "$latexmkrc" "${texfile}" \
  && latexmk -c "${texfile}" \
  && dvipng -T tight -bd 1000 "${texfile%.tex}.dvi" \
  && rm *.fls
else
  usage
fi
```

オプション`-e`の後にファイル名を指定することで，ファイルの編集ができます。(ない場合は新規作成)

オプションを付けずにファイル名を引数にした場合には，latexmkを使ってdviに変換したものをdvipngを用いてpng画像に変換します。

上のシェルスクリプトに関連して`~/.latexmkrc_dvipng`には以下のように書いておきます。

* [dotfiles/latexmkrc_dvipng at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/rcfiles/latexmkrc_dvipng)

```perl:~/.latexmkrc_dvipng
#!/usr/bin/perl
$latex = 'platex -interaction=nonstopmode -kanji=utf-8 %O %S';
$pdf_mode = 0;
```

`$pdf_mode = 0`とすることによって，自動でpdf化する機能を無効にすることができます。
詳しくはlatexmkのマニュアルを参照してください。

# Vimを使ってファイルを保存するたびに画像を生成するようにする

これをvimから使用する方法ですが，vim-quickrunをつかうと，任意のタイミングで任意のコマンドを実行することができるので，
今回はmodelineを使ってファイルタイプを"texmath"であると認識させ，そのファイルの保存時にコマンド`texmath`を実行することにします。

まず，ファイルタイプtexmathに対してもtexのシンタックスハイライトなどを効かせたいので，`~/.vimrc`に以下を記述します。

```vim:~/.vimrc
augroup texmath
  autocmd!
  autocmd FileType texmath setlocal syntax=tex
augroup END
```

`~/.vim/ftplugin/texmath_quickrun.vim`には以下のように書きます。

* [dotfiles/texmath_quickrun.vim at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/vimfiles/ftplugin/texmath_quickrun.vim)

```vim:~/.vim/ftplugin/texmath_quickrun.vim
" LaTeX Quickrun (texmath)
let g:quickrun_config['texmath'] = {
\ 'runner' : 'vimproc',
\ 'command' : 'texmath',
\ 'outputter' : 'error',
\ 'outputter/error/success' : 'null',
\ 'outputter/error/error' : 'quickfix',
\ 'srcfile' : expand("%s"),
\ 'exec': '%c %s',
\}

augroup texmath_autocompile
  autocmd!
  autocmd BufWritePost,FileWritePost *.tex :QuickRun
augroup END
```

非同期処理のためにvimprocを使用します。

# まとめ

たくさん数式の画像がほしい時に，便利に使うことができると思います。
Macだと[LaTeXiT](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?LaTeXiT)なるものがあるらしく，そんなのがほしいなぁと考えてこのようなことになりました。

何かの参考になれば幸いです。