Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

As an example, let's take this animation. How can I convert it to GIF file?

share|improve this question
1  
Related: tex.stackexchange.com/q/23727/2975 –  Martin Scharrer Sep 21 '12 at 18:05

2 Answers 2

up vote 28 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 <integer> -loop 0 -density <integer> -alpha <on,off,remove> input.pdf output.gif

Remarks:

  • -delay <integer> specifies the delay between 2 consecutive frames in 1/100 second.

  • -density <integer> specifies the resolution.

  • -alpha <on,off,remove> 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.

share|improve this answer
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. –  stalking is prohibited 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. –  stalking is prohibited 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

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]{<frame rate>}{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.

share|improve this answer
    
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. –  stalking is prohibited 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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.