Animations in LaTeX

Since the OP asks for creating an animated PDF using the animate package without the need to have the animation frames in a separate (PDF) file, the tikzpicture environment can be directly put into an animateinline environment:

\documentclass{article}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{%
  \symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
  \rule{A->F[+A][-A]}
}

\begin{document}
\begin{animateinline}[controls,autoplay,loop]{2}
\multiframe{8}{n=1+1}{
  \begin{tikzpicture}[scale=10,rotate=90]
    \draw (-.1,-.2) rectangle (.4,0.2);
    \draw [blue,opacity=0.5,line width=0.1cm,line cap=round]
      l-system [l-system={A,axiom=A,order=\n,angle=45,step=0.25cm}];
  \end{tikzpicture}    
}
\end{animateinline}
\end{document}

There are two things here,

  1. to produce a gif file (which we do here normally, in this site for uploading).
  2. to have the animation inside the pdf file.

For first, my take will be imagemagick. Install imagemagick and ensure that convert.exe is in system path. Produce your pdf file (as you have shown in the link in OP). Then issue this command from within the same folder using command prompt.

convert -delay 10 -loop 0 -density 400 -alpha remove lsystems.pdf lsystems.gif  

Change the parameters as needed. For details refer to imagemagick's documentation. Ususally, I prefer a batch file for repeated use. Save the contents below in to a file named mygifbatch.bat inside the same folder as your pdf file.

@ECHO ON
cls

REM convert to animated gif

CD /D %~dp0
mkdir gifs
SET Program="convert.exe"
for %%A in (*.pdf) do %Program%  -delay 30 -loop 0 -density 200 -alpha remove %%A gifs/%%~nA.gif
Pause

To convert, double click on mygifbatch.bat file and it will convert all pdf files in the current folder in to gif files inside a sub-directory gifs.

Now the second. You can use animate package as in the following code:

\documentclass[preview,border={10pt 0pt 10pt 10pt}]{standalone}

\usepackage{filecontents}
    %% This is your file to be animated
\begin{filecontents*}{lsystems.tex}  
\documentclass{article}
\usepackage{tikz}
\usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
\begin{document}
\foreach \n in {1,...,8} {
\begin{tikzpicture}[scale=10,rotate=90]
\draw (-.1,-.2) rectangle (.4,0.2);
\draw
    [blue,opacity=0.5,line width=0.1cm,line cap=round]
    l-system [l-system={A,axiom=A
    ,order=\n,angle=45,step=0.25cm}];
\end{tikzpicture}
}

\end{document}
\end{filecontents*}
%
\immediate\write18{pdflatex lsystems}

%% convert to GIF animation. Uncomment following line to have a gif animation in the same folder.
%\immediate\write18{convert -delay 10 -loop 0 -density 400 -alpha remove lsystems.pdf lsystems.gif}
%%

\usepackage{animate}
\begin{document}
\begin{preview}
%\animategraphics[controls,autoplay,loop,scale=<integer>]{<frame rate>}{<PDF filename without extension>}{<left blank>}{<left blank>}
\animategraphics[controls,autoplay,loop,scale=1]{2}{lsystems}{}{}
\end{preview}
\end{document}

Here I used filecontents to write your .tex file and pdflatexed it from within the main document. Hence you will need to use --shell-escape while compiling. If you already have the pdf file, you don't need lines 3--32. The pdf should be viewed using adobe reader. For more details refer to animate documentation (texdoc animate or at to texdoc.net).

There is a nice arara rule written by Chris (cmhughes) which makes production of gif from pdf easy. Install the cool tool arara from Paulo's github repository. It is included in texlive. But you have to install it by yourself if you are a miktex user. Now save the contents of cmhughes code in to a file by name animate.yaml. Put this file in some folder, say C:\Users\<your name>\AppData\Roaming\Arara\rules (for windows). Then create a file araraconfig.yaml in your home directory (C:\Users\<your name> usually) with the following contents:

!config
paths:
- C:\Users\<your name>\AppData\Roaming\Arara\rules

You can add many paths like this. Now your good to go. Add the following in your tex file

% arara: pdflatex
% arara: animate: {density: 200, delay: 20}

Sample code (lsystems.tex):

% arara: pdflatex
% arara: animate: {density: 200, delay: 20}
\documentclass[tikz]{standalone}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
\begin{document}
\foreach \n in {1,...,8} {
\begin{tikzpicture}[scale=10,rotate=90]
\draw (-.1,-.2) rectangle (.4,0.2);
\draw
    [blue,opacity=0.5,line width=0.1cm,line cap=round]
    l-system [l-system={A,axiom=A
    ,order=\n,angle=45,step=0.25cm}];
\end{tikzpicture}
}
%
\end{document}

Compile lsystems.tex with - arara lsystems.tex. arara can also be integrated with many editors. For details, refer to beautiful arara manual.

enter image description here


You can create .gif animations by the follwing steps:

  1. Create a PDF with multiple pages. Every page is one part of the animation. The easiest way to do this might be the beamer document class
  2. Use pdfcrop and imagemagicks convert to create the animation.

For Linux users

To make step 2 trivial, I use the following Makefile for every projects:

SOURCE = bellman-ford-algorithm
DELAY = 80
DENSITY = 300
WIDTH = 512

make:
    pdflatex $(SOURCE).tex -output-format=pdf
    make clean

clean:
    rm -rf  $(TARGET) *.class *.html *.log *.aux *.toc *.snm *.out *.nav

gif:
    pdfcrop $(SOURCE).pdf
    convert -verbose -delay $(DELAY) -loop 0 -density $(DENSITY) $(SOURCE)-crop.pdf $(SOURCE).gif
    make clean

animatedGif:
    make
    pdfcrop $(SOURCE).pdf
    convert -verbose -delay $(DELAY) -loop 0 -density $(DENSITY) $(SOURCE)-crop.pdf $(SOURCE).gif
    make clean

transparentGif:
    convert $(SOURCE).pdf -transparent white result.gif
    make clean

png:
    make
    make svg
    inkscape $(SOURCE).svg -w $(WIDTH) --export-png=$(SOURCE).png

svg:
    make
    #inkscape $(SOURCE).pdf --export-plain-svg=$(SOURCE).svg
    pdf2svg $(SOURCE).pdf $(SOURCE).svg
    # Necessary, as pdf2svg does not always create valid svgs:
    inkscape $(SOURCE).svg --export-plain-svg=$(SOURCE).svg
    rsvg-convert -a -w $(WIDTH) -f svg $(SOURCE).svg -o $(SOURCE)2.svg
    inkscape $(SOURCE)2.svg --export-plain-svg=$(SOURCE).svg
    rm $(SOURCE)2.svg
  1. Just save it as Makefile (be aware of the fact that Makefiles have tabs, not four spaces! So copy-and-paste might not work)
  2. Replace the first 4 variables according to your needs
  3. Type make animatedGif in the shell of your choice (most might use bash, but zsh with the oh-my-zsh plugin offers tabbed autocompletion for Makefiles :-))

Examples

Eulerian path

See my article "How to visualize Graph algorithms" for more information how this was created:

enter image description here

Cholesky decomposition

Source: LaTeX-examples

enter image description here

Tags:

Pdf

Animations