Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

はじめに

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

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

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

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

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

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

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

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

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

fig_test2.png

fig_test3.png

シェルスクリプト'texmath'

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

texmath
#!/bin/sh# written by Shotaro Fujimoto (https://github.com/ssh0)# first edited: 2015-11-03# using latexmk rc filelatexmkrc="$HOME/.latexmkrc_dvipng"# texmath templatetexmath_template="$HOME/.vim/template/template.texmath"# default outputdir is setted to $imgdirimgdir='img'if["$1"="-e"];thenecho"$1"if[ -f "$2"];thentexfile="$2"echo"${texfile} already exists."elsetexfile="fig_2"
    cat "$texmath_template"> "$texfile"fi
  vim "$texfile"elif[ ! -f "$1"];thenecho"$1 doesn't exist."exit 1
elif[ -f "$1"];thentexfile="$1"
  latexmk -r "$latexmkrc""${texfile}"\&& latexmk -c "${texfile}"\&& dvipng -T tight -bd 1000"${texfile%.tex}.dvi"\&& rm *.fls
fi

オプションや引数の扱いがぞんざいなのは基本的に自動化する過程で使用することを視野に入れており,コマンドラインから実行することをあまり考えていなかったので,このような形になりました。

latexmk

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

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

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

LaTeXのテンプレート

template.texmathには以下のように書くことによって,数式を書くのに便利なプリアンブルを入れた状態で編集を始めることができるようになります。

template.texmath
\documentclass[43pt]{jsarticle}\usepackage{amsmath}\usepackage{amssymb}\usepackage{amsthm}\usepackage{ascmac}\pagestyle{empty}% "\vector{a}" でベクトル\def\vector#1{\mbox{\boldmath\(#1\)}}\begin{document}\end{document}

コマンドラインからの使い方は簡単で,

texmath fig_test.tex

とすると,latexmkを使ってコンパイルを行った後に,中間ファイルを削除して,dviファイルからdvipngでpngファイルを作成します。
flsファイルだけ何故かうまく消せなかったので,これは手動で消しています。

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

これをvimから使用する方法ですが,vim-quickrunをつかうと,任意のタイミングで任意のコマンドを実行することができるので,
今回はファイルの保存時にファイル名がfig*.texである場合に,texmathをそのファイルに対して実行することにします。

これを実現するには,~/.vim/ftplugin/tex_quickrun.vimに,以下のように書きます。

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

augroup latex_autocompile
  autocmd!ifg:quickrun_user_tex_autorun !=0autocmdBufWritePost,FileWritePost *.tex :QuickRun
    autocmdBufWritePost,FileWritePost fig*.tex :QuickRun -type texmath
  endif
augroup END

実は他にいろいろ書いていたりするのですが,今回関係するのはこの部分だけです。
非同期処理のためにvimprocを使用しています。

先ほどのシェルスクリプトtexmathにファイル名を引数として渡して実行する形になっています。

まとめ

たくさん数式の画像がほしい時に,便利に使うことができると思います。
MacだとLaTeXiTなるものがあるらしく,そんなのがほしいなぁと考えてこのようなことになりました。

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>