Wednesday, 12 November 2014
Making GIF animated figures using LaTeX
How to convert pstricks animation to GIF file?
up vote 20 down vote favorite
12
As an example, let's take this animation. How can I convert it to GIF file?
pstricks conversion animations gif
shareimprove this question
edited Jan 7 '13 at 8:34
Peter Jansson
3,47952036
asked Sep 21 '12 at 17:28
Physicsworks
474315
1
Related: tex.stackexchange.com/q/23727/2975 – Martin Scharrer♦ Sep 21 '12 at 18:05
add a comment
2 Answers
active oldest votes
up vote 26 down vote accepted
Assume that you want to create an animation as follows.
enter image description here
Step 1:
Create a PDF file consists of at lease 2 pages. Compiling the following input file with either latex-dvips-ps2pdf or xelatex produces a PDF file with 30 pages. Each page represent one frame.
% input.tex
\documentclass[pstricks,border=0pt]{standalone}
\usepackage{pstricks-add,fp}
\FPeval{Size}{3.00}
\FPeval{N}{30}
\FPeval{Delta}{round(Size/N:2)}
\begin{document}
\multido{\r=\Size+-\Delta}{\N}
{
\begin{pspicture}(-\Size,-\Size)(\Size,\Size)
\psframe*[linecolor=yellow](-\Size,-\Size)(\Size,\Size)
\pscircle*{\r}
\end{pspicture}
}
\end{document}
enter image description here
Step 2:
Install ImageMagick.
Step 3:
Convert the PDF to GIF using the following command:
convert -delay -loop 0 -density -alpha input.pdf output.gif
Remarks:
-delay specifies the delay between 2 consecutive frames in 1/100 second.
-density specifies the resolution.
-alpha specifies whether or not you enable, disable or remove the alpha channel.
enter image description here
Another example:
enter image description here
\documentclass[border=0pt,pstricks]{standalone}
\usepackage{pst-coil,pstricks-add}
\usepackage[nomessages]{fp}
\newcommand\const[3][6]{%
\expandafter\FPeval\csname#2\endcsname{round(#3:#1)}%
\pstVerb{/#2 \csname#2\endcsname\space def}%
}
\newcommand\Const[3][7]{\begingroup\edef\temp{\endgroup\noexpand\const[#1]{#2}{#3}}\temp}
\Const{CoilArm}{0.250}
\Const{CoilWidth}{0.300}
\Const{CoilTurn}{50/3}
\Const{DeltaY}{0.5}
\Const{Amplitude}{1.5}
\Const{FPS}{25}% frame rate must be synced with the convert's delay!
\Const{Vx}{2}% propagation speed
\Const{Period}{1}% second
\def\Y#1{-\DeltaY-\Amplitude*cos(2*\psPi*#1/\Period)+2}
\psset
{
coilarm=\CoilArm,
coilwidth=\CoilWidth,
}
\newcommand\System[4][0]{% #1: box, #2: x, #3: y, #4: label
\uput[90](#2,4.25){#4}
\Const{CoilHeight}{(4-(#3)-2*CoilArm)/(CoilWidth*CoilTurn)}
\pszigzag[coilheight=\CoilHeight,linejoin=2](#2,4)(#2,#3)
\ifnum#1=1
\bgroup
\psset{origin={#2,#3}}
\psframe[dimen=inner,fillstyle=solid,fillcolor=black](-0.5,0)(0.5,-1)
\psdot[linecolor=yellow](0,-0.5)
\egroup
\fi
}
\Const{DeltaTime}{1/\FPS}
\Const[0]{TotalFrames}{\FPS*\Period}
\begin{document}
\multido{\n=0.000+\DeltaTime}{\TotalFrames}{%
\begin{pspicture*}[showgrid=false](-1.5,-2)(3.5,5)
\psframe[fillstyle=vlines,hatchsep=2pt,hatchwidth=0.5\pslinewidth,hatchcolor=gray,hatchangle=45](0,4)(2,4.25)
\Const{Yn}{\Y{\n}}%
\System[1]{1}{\Yn}{}
\psplot[algebraic,linecolor=red,plotpoints=1000]{-1.5}{3.5}{\Y{((-\Vx*\n+x-1)/\Vx)}-0.5}
\end{pspicture*}}
\end{document}
Use convert -delay 4 -loop 0 -density 200 -alpha remove shm.pdf shm.gif. The -delay 4 represents the rate of 25 frame per second. The formula is FPS = 100 / DELAY.
shareimprove this answer
edited Jan 7 '13 at 4:42
answered Sep 21 '12 at 17:47
Who is crazy first
8898265
1
OK, you could just say "use Image Magick" =) Thanks! – Physicsworks Sep 21 '12 at 17:53
4
"use Image Magick" should be submitted as a comment rather than an answer that I actually want. – Who is crazy first Sep 22 '12 at 15:49
@AdorableCreature,follow your steps, I can't get animated GIF. I only get the first page picture of the 30 pages pdf file in my GIF file. How to solve it? Thanks. – Pig Cry Jan 7 '13 at 4:23
@PigCry: Make sure you had 30 pages in your PDF and you typied the convert command correctly. – Who is crazy first Jan 7 '13 at 4:44
@AdorableCreature: yes, I have 30 pages. The convert command is convert -delay 100 -loop 0 -density 200 -alpha on input.pdf output.gif. – Pig Cry Jan 7 '13 at 5:13
show 5 more comments
up vote 8 down vote
Just in case you need a PDF animation then use the following template.
% this filename is main.tex
% compile it with pdflatex -shell-escape main
\documentclass[preview]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{temporary.tex}
% put you compilable PSTricks input file here!
\end{filecontents*}
\usepackage{animate}
\immediate\write18{latex temporary}
\immediate\write18{dvips temporary}
\immediate\write18{ps2pdf temporary.ps}
\begin{document}
\animategraphics[controls,autoplay,loop,scale=1]{}{temporary}{}{}
\end{document}
For example,
% this filename is main.tex
% compile it with pdflatex -shell-escape main
\documentclass[preview]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{temporary.tex}
\documentclass[border=0pt,pstricks]{standalone}
\usepackage{pst-coil,pstricks-add}
\usepackage[nomessages]{fp}
\newcommand\const[3][6]{%
\expandafter\FPeval\csname#2\endcsname{trunc(#3:#1)}%
\pstVerb{/#2 \csname#2\endcsname\space def}%
}
\newcommand\Const[3][3]{\begingroup\edef\temp{\endgroup\noexpand\const[#1]{#2}{#3}}\temp}
\Const{CoilArm}{0.250}
\Const{CoilWidth}{0.300}
\Const{CoilTurn}{50/3}
\Const{DeltaY}{0.5}
\Const{Amplitude}{1.5}
\Const{FPS}{25}
\Const{Vx}{2}% propagation speed
\Const{Period}{1}% second
\def\Y#1{-\DeltaY-\Amplitude*cos(2*\psPi*#1/\Period)+2}
\psset
{
coilarm=\CoilArm,
coilwidth=\CoilWidth,
}
\newcommand\System[4][0]{% #1: box, #2: x, #3: y, #4: label
\uput[90](#2,4.25){#4}
\Const{CoilHeight}{(4-(#3)-2*CoilArm)/(CoilWidth*CoilTurn)}
\pszigzag[coilheight=\CoilHeight,linejoin=2](#2,4)(#2,#3)
\ifnum#1=1
\bgroup
\psset{origin={#2,#3}}
\psframe[dimen=inner,fillstyle=solid,fillcolor=black](-0.5,0)(0.5,-1)
\psdot[linecolor=yellow](0,-0.5)
\egroup
\fi
}
\Const[3]{DeltaTime}{1/\FPS}
\Const[0]{TotalFrames}{\FPS*\Period}
\begin{document}
\multido{\n=0.000+\DeltaTime}{\TotalFrames}{%
\begin{pspicture*}[showgrid=false](-1.5,-2)(3.5,5)
\psframe[fillstyle=vlines,hatchsep=2pt,hatchwidth=0.5\pslinewidth,hatchcolor=gray,hatchangle=45](0,4)(2,4.25)
\Const{Yn}{\Y{\n}}%
\System[1]{1}{\Yn}{}
\psplot[algebraic,linecolor=red,plotpoints=1000]{-1.5}{3.5}{\Y{((-\Vx*\n+x-1)/\Vx)}-0.5}
\end{pspicture*}}
\end{document}
\end{filecontents*}
\usepackage{animate}
\immediate\write18{latex temporary}
\immediate\write18{dvips temporary}
\immediate\write18{ps2pdf temporary.ps}
\begin{document}
\animategraphics[controls,autoplay,loop,scale=1]{25}{temporary}{}{}
\end{document}
And compile it with pdflatex -shell-escape main.
shareimprove this answer
edited Oct 21 '13 at 9:07
community wiki
3 revs
Marienplatz
there is no need to load package fp when it is not really needed \documentclass[pstricks,border=0pt]{standalone} \usepackage{pstricks-add} \makeatletter \def\Size{3} \def\N{30} \def\Delta{\strip@pt\dimexpr \Size pt/\N} \makeatother [...] more animations are here: tug.org/PSTricks/main.cgi?file=Animation/gif/gif – Herbert Sep 21 '12 at 18:00
Thanks for this trick. I put \newcommand\const[3][3]{% \expandafter\FPeval\csname#2\endcsname{round(#3:#1)}% \pstVerb{/#2 \csname#2\endcsname\space def}% } in a package to make my project consistent. – Who is crazy first Sep 21 '12 at 18:06
looks like " why an easy solution when a complicated one is possible ..." ;-) – Herbert Sep 21 '12 at 18:13
add a comment
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment