動機
私は数学を勉強すろときによくアニメーションを作りたいと思うことがあります。ネットで調べてみると多くの素晴らしいGIF画像などが存在し、そういったものを自分も作りたいと思っていたのですが、いつもどうやって作るのかわからず、挫折していました。
そんな中、LaTeXを利用してpdfでアニメーションが作れるという情報を知り、今回の記事を執筆することにしました。
準備
以下、自分の作業環境です。
OS:Linux Mint 20.3 x86_64
Kernel: 5.4.0-104-generic
Tex: Tex Live 2021
pdf reader: Adobe Reader 9
アニメーション作成方法
Tex Liveをインストールしていればanimate packageを利用することができます。animate packageは次のようにすれば利用できます
(dvipdfmx+platex+tikzの場合)
\documentclass[dvipdfmx]{jsarticle}
\usepackage{animate}
\usepakcage{tikz}
\usetikzlibrary{...} //必要なライブラリがあれば追加する
\begin{document}
\begin{animateinline}[option]{10} //optionでコントロールボタンの設定やリピートの設定が可能.{}内の数字はframe rate
\multiframe{#1}{i=1+1} //#1はframeの枚数.2つ目の{}は変数の初期値の設定と1frameごとの変数の処理.この場合、iは初期値1で1frameが終わるごとに変数iを1ずつ増やす.
{1frameごとの描写
\begin{tikzpicture}
... //tikzのコード
\end{tikzpicture}
}
\end{animateinline}
\end{document}
サンプル例
上の作成方法で作成したpdfのコードを下に載せておきます。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}
\def\frame{20}
\def\trans{5/\frame}
\def\parallel{2.4/\frame}
\pagestyle{empty}%ページ番号つけない
\begin{document}
\begin{center}%中身を中央揃えにします。
\begin{animateinline}[controls]{10}
\multiframe{42}{i=1+1}{%iが1から20までで動く
\begin{tikzpicture}[very thick]
\let\x\i
\def\a{5}
\def\b{3}
\def\c{4}
\coordinate (A) at (\a,0);
\coordinate (B) at (0,0);
\coordinate (C) at (9/5,12/5);
\coordinate[rotate around={acos(\b/\a):(C)}] (D) at ($(C)+(4,3)$);
\coordinate (E) at ($(0,-\a)!2!(B)$);
\coordinate (F) at ($(A)!7/4!(C)$);
\coordinate[rotate around={90:(B)}] (G) at (C);
\coordinate (H) at ($(\a,-\a)!2!(A)$);
\coordinate (I) at ($(B)!7/3!(C)$);
\coordinate[rotate around={-90:(A)}] (J) at (C);
\draw (A) -- (B) -- (C) --cycle;
%座標名を設定すると回転しなくなるので
\draw (0,-\a) rectangle (A);
\draw[rotate around={acos(\b/\a):(B)}] (B) rectangle (\b,\b);
\draw[rotate around={-acos(\c/\a):(A)}] (\a-\c,0) rectangle (\a,\c);
%破線部分の長方形を作図する
\draw[dashed,rotate around={acos(\b/\a):(C)}] (C) rectangle (D);
%破点線の作図
\draw[dashed] (0,-\a) -- (E);
\draw[dashed] (\a,-\a) -- ($(\a,-\a)!2!(A)$);
\draw[dashed] (D) -- (9/5,-\a);
\ifnum\x<22{
\def\deff{{(\x-1)*\trans}}
\def\del{{(\x-1)*\parallel}}
\coordinate (slide) at (0,\deff);
\coordinate (slides) at ($(0,\deff)+(0,\del)$);
\filldraw[fill=orange] ($(0,0)+(slide)$) -- ($(0,-\a)+(slide)$) -- ($(9/5,-\a)+(slides)$) -- ($(9/5,0)+(slides)$) -- cycle;
\filldraw[fill=green] ($(9/5,0)+(slides)$) -- ($(9/5,-\a)+(slides)$) -- ($(\a,-\a)+(slide)$) -- ($(\a,0)+(slide)$) -- cycle;
}\else\i>{
\def\d{{(\x-22)/20}}
\filldraw[fill=orange,draw=black] (C) -- (B) -- ($(E)!\d!(G)$) -- ($(D)!\d!(F)$);
\filldraw[fill=green,draw=black] (C) -- (A) -- ($(H)!\d!(J)$) -- ($(D)!\d!(I)$);
}
\fi
\ifnum\x=42{
\filldraw[fill=orange] (0,0) -- (0,-\a) -- (9/5,-\a) -- (9/5,0) -- cycle;
\filldraw[fill=green] (9/5,0) -- (9/5,-\a) -- (\a,-\a) -- (\a,0) -- cycle;
}
\fi
\end{tikzpicture}
}
\end{animateinline}
\end{center}
\end{document}
これを実行すると三平方の定理の証明のアニメーションを作成できます!
最後に
今回の記事はanimate packageとtikzを利用しましたが、tikzの代わりにPostScriptを利用したり、dvipdfmxの代わりにdvisvgmを利用してsvgファイルも作成できるらしいです。勉強不足のためこのあたりはもう少し勉強してから投稿できたらいいなと思います。