Bilder und GIF-Animationen mit LaTeX

    • Allgemein

      Bilder und GIF-Animationen mit LaTeX

      Hallo liebe Community,

      Wieder Mal ein kleines Tutorial von mir. Und zwar zu einem meiner Lieblings-Themen:
      $\LaTeX$
      !
      Genaugenommen geht es heute darum, wie man mit
      $\LaTeX$
      Animationen erstellen kann, welche dann als GIF-Bildle hier ins Forum eingebunden werden können. Leider ist das ein etwas komplexerer und anspruchsvollerer Vorgang, als einfach Formeln darzustellen - ein gewisses Grundverständnis für
      $\LaTeX$
      ist deshalb vorrausgesetzt. Aber vielleicht genügt es dem Einen oder Anderen die kommenden Beispiele etwas zu modifizieren.

      Bilder erzeugen mit
      $\LaTeX$

      Mit
      $\LaTeX$
      lassen sich angenehme und schöne PDF's erstellen. Diese sind im Idealfall zwar schön anzusehen, lassen sich aber nicht unbedingt schön in einem Forumspost einbinden. Dem sei nun Abhilfe geschaffen: Die Grafik lässt sich anhand eines Zusatztools(ebenso plattformunabhängig wie
      $\LaTeX$
      selbst) zu einem angenehm handlichen PNG konvertieren.
      Voraussetzungen:


      Als Beispiel für dieses Tutorial nehme ich meine
      $\TeX$
      -Datei, die ich für diese Frage benötigt habe:
      TeX-Datei

      TeX-Quellcode

      1. \documentclass[border=10pt]{standalone}
      2. \usepackage{tikz}
      3. \begin{document}
      4. \begin{tikzpicture}
      5. \def\Radius{3}
      6. \def\E{2}
      7. \def\Alpha{30}
      8. \draw[gray] ({-(\Radius+\E)}, {-(\Radius+\E)}) grid ({\Radius+\E}, {\Radius+\E});
      9. \draw[-stealth,thick] ({-(\Radius+\E)}, 0) -- ({\Radius+\E}, 0);
      10. \draw[-stealth,thick] (0, {-(\Radius+\E)}) -- (0, {\Radius+\E});
      11. \draw[green!60!black] (0, 0) --({\E*cos(\Alpha)},{\E*sin(\Alpha)}) coordinate (krmitte);
      12. \draw[yellow!50!red, thick] (krmitte) circle (\Radius);
      13. \draw[red!10!blue] (krmitte) -- (0, {\E*sin(\Alpha)+sqrt(\Radius^2-(\E*cos(\Alpha))^2)}) coordinate (yend);
      14. \draw[draw=red,very thick,-stealth] (0, 0) -- (yend) node[pos=0.5,anchor=west]{$\textcolor{red}{y}(\alpha)=\textcolor{green!60!black}{e}\sin(\alpha)+\sqrt{\textcolor{red!10!blue}{r}^2-(\textcolor{green!60!black}{e}\cos(\alpha))^2}$};
      15. \draw[variable=\x,smooth,samples=60,domain={-(\Radius+\E)}:{(\Radius+\E)}] plot ({\x},{\E*sin((\x+\Alpha/180*pi)/pi*180)+sqrt(\Radius^2-(\E*cos((\x+\Alpha/180*pi)/pi*180))^2)});
      16. \end{tikzpicture}
      17. \end{document}

      Das ergibt nach der Kompilierung mit PDFLaTeX ein PDF mit dem Plot. Und zu einer PNG-Datei konvertieren wir es, indem wir bei der Dokumentenklasse ein weiteres optionales Argument übergeben:

      TeX-Quellcode

      1. \documentclass[convert={convertexe={magick.exe},density=300,outext=.png},border=10pt]{standalone}

      Damit wirft die Klasse nach der Kompilation den Magick-Compiler an, welcher dann die gewünschte PNG-Datei ausgibt, die dann so aussieht:


      GIFs erzeugen mt
      $\LaTeX$

      Nun sind bewegte Bilder natürlich etwas anschaulicher. Dafür eigenen sich GIF-Dateien für Forumsbeiträge wohl am ehesten. Wieder nutzen wir den Beispielcode, geben uns aber für jedes Frame eine einzelne Seite aus, wofür wir den Hintergrund einfärben müssen, da sich sonst die einzelnen Frames überlappen. Dies lässt sich mit dem pagecolor-Paket erreichen, oder indem wir der Tikz-Umgebung einen Hintergrund verpassen. Weiter ist das Paket preview vonnöten, welches verhindert, dass die einzelnen Tikz-Bilder auf eine Seite gelangen:
      TeX-Datei

      TeX-Quellcode

      1. \documentclass{standalone}
      2. \usepackage{tikz}
      3. \usetikzlibrary{backgrounds}
      4. \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
      5. \begin{document}
      6. \foreach \iteration in {1,...,90} {
      7. \begin{tikzpicture}[background rectangle/.style={fill=white}, show background rectangle]
      8. \def\Radius{3}
      9. \def\E{2}
      10. \def\Alpha{0}
      11. \def\Alpha{(4*\iteration)}
      12. \draw[gray] ({-(\Radius+\E)}, {-(\Radius+\E)}) grid ({\Radius+\E}, {\Radius+\E});
      13. \draw[-stealth,thick] ({-(\Radius+\E)}, 0) -- ({\Radius+\E}, 0);
      14. \draw[-stealth,thick] (0, {-(\Radius+\E)}) -- (0, {\Radius+\E});
      15. \draw[green!60!black] (0, 0) --({\E*cos(\Alpha)},{\E*sin(\Alpha)}) coordinate (krmitte);
      16. \draw[yellow!50!red, thick] (krmitte) circle (\Radius);
      17. \draw[red!10!blue] (krmitte) -- (0, {\E*sin(\Alpha)+sqrt(\Radius^2-(\E*cos(\Alpha))^2)}) coordinate (yend);
      18. \draw[draw=red,very thick,-stealth] (0, 0) -- (yend) node[pos=0.5,anchor=west]{$\textcolor{red}{y}(\alpha)=\textcolor{green!60!black}{e}\sin(\alpha)+\sqrt{\textcolor{red!10!blue}{r}^2-(\textcolor{green!60!black}{e}\cos(\alpha))^2}$};
      19. \draw[variable=\x,smooth,samples=60,domain={-(\Radius+\E)}:{(\Radius+\E)}] plot ({\x},{\E*sin((\x+\Alpha/180*pi)/pi*180)+sqrt(\Radius^2-(\E*cos((\x+\Alpha/180*pi)/pi*180))^2)});
      20. \end{tikzpicture}
      21. }
      22. \end{document}

      Nach dem Kompilieren mit PDFLaTeX haben wir vorerst nur ein PDF mit vielen einzelnen Plots. Um daraus nun eine GIF-Datei zu erstellen, benötigen wir wieder etwas Magic... Ups. Magick.
      Leider können wir hierfür nicht wieder die standalone-Klasse bemühen, da die nur für Konvertierungen zu "statischen" Bildchen nutzbar ist. Das heisst, wir greifen zur Kommandozeile, bzw. Batch-Skripts:

      Quellcode

      1. @ECHO ON
      2. CD /D %~dp0
      3. SET Program=magick
      4. for %%A in (*.pdf) do %Program% -delay 5 -loop 0 -density 200 %%A %%~nA.gif
      5. Pause

      Hiermit werden alle PDFs zu GIFs konvertiert. Und dies mit 5*10ms=50ms pro Frame => 20fps. Das Endresultat sieht so aus:




      Hier noch ein paar Beispiele zur "Inspiration":

      Drehung eines Kubus mit mehreren liegenden Quader.

      TeX-Code

      TeX-Quellcode

      1. % Original(ohne Rotation) von Jeam-Michel Papy
      2. \documentclass{standalone}
      3. \usepackage{tikz}
      4. \usepackage{pstricks}
      5. \usepackage{pst-vue3d}
      6. \usepackage{multido}
      7. \usetikzlibrary{backgrounds}
      8. \usepackage[active,tightpage]{preview}\PreviewEnvironment{pspicture}
      9. \begin{document}
      10. \foreach \iteration in {0,...,44} {
      11. \psset{unit=1.5cm}
      12. \begin{pspicture}[bgcolor=white](-3,-3)(3,3)
      13. %\psframe(-3.8,-3)(3,3)
      14. \pgfmathparse{4*\iteration}
      15. \psset{THETA=\pgfmathresult,PHI=30,Dobs=150,Decran=10}
      16. %\AxesThreeD[linecolor=red,linestyle=dashed](50,60,50)
      17. \pNodeThreeD(25,-25,25){A}
      18. \pNodeThreeD(25,25,25){B}
      19. \pNodeThreeD(25,25,-25){C}
      20. \pNodeThreeD(25,-25,-25){D}
      21. \pNodeThreeD(-25,-25,25){E}
      22. \pNodeThreeD(-25,25,25){F}
      23. \pNodeThreeD(-25,25,-25){G}
      24. \pNodeThreeD(-25,-25,-25){H}
      25. %%% hidden faces of the exterior cube
      26. \pspolygon(A)(E)(H)(D)
      27. \pspolygon(E)(F)(G)(H)
      28. %%% mode-3 vectors
      29. \multido{\iZ=-20+10}{5}{%
      30. \multido{\iY=-20+10}{5}{%
      31. \CubeThreeD[A=23,B=3,C=3](0,\iY,\iZ)%
      32. }%
      33. }%
      34. %%% front faces of the exterior cube
      35. \pspolygon(A)(B)(C)(D)
      36. \pspolygon(B)(F)(G)(C)
      37. \end{pspicture}
      38. }
      39. \end{document}



      Sloppy Animation des Zusammenhanges einer Funktion und ihres Integrals.

      TeX-Code

      TeX-Quellcode

      1. \documentclass{standalone}
      2. \usepackage{tikz}
      3. \usepackage{siunitx}
      4. \usetikzlibrary{backgrounds}
      5. \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
      6. \begin{document}
      7. \foreach \iteration in {0,...,50} {
      8. \begin{tikzpicture}[background rectangle/.style={fill=white}, show background rectangle]
      9. \def\xtemp{0.1*\iteration}
      10. \draw[gray] (-1,-1) grid (5,5);
      11. \draw[-stealth,thick] (-1,0) -- (5,0) node[anchor=north west] {$x$};
      12. \draw[-stealth,thick] (0,-1) -- (0,5) node[anchor=south west] {$y$};
      13. \begin{scope}
      14. \clip(-1,-1) rectangle (5,5);
      15. \fill[opacity=0.1,fill=blue,variable=\x,smooth,domain=0:\xtemp] plot ({\x},{-0.5*abs(\x)^2+1.5*\x+0.5}) |- (0,0) -- cycle;
      16. \draw[blue,variable=\x,smooth,domain=-1:5] plot ({\x},{-0.5*abs(\x)^2+1.5*\x+0.5});
      17. \draw[red,variable=\x,smooth,domain=0:\xtemp] plot ({\x},{-0.5/3*abs(\x)^3+0.75*abs(\x)^2+0.5*\x});
      18. \end{scope}
      19. \pgfmathparse{\xtemp}%
      20. \edef\xtemp{\pgfmathresult}%
      21. \node at (2,4.5) {${\color{red}-\frac16x^3+\frac34x^2+\frac12x}=\int\limits_0^{\num[round-mode=places,round-precision=1]{\xtemp}}\left({\color{blue}-\frac12x^2+\frac32x+\frac12}\right)\mathrm dx$};
      22. \end{tikzpicture}
      23. }
      24. \end{document}


      Runge-Kutta: Heun-Verfahren der dritten Ordnung. Zusammenhang zwischen Schrittweite und Fehler.

      TeX-Code

      TeX-Quellcode

      1. \documentclass{standalone}
      2. \usepackage[utf8]{inputenc}
      3. \usepackage[german]{babel}
      4. \usepackage[T1]{fontenc}
      5. \usepackage{amsmath}
      6. \usepackage{amsfonts}
      7. \usepackage{amssymb}
      8. \usepackage{graphicx}
      9. \usepackage{lmodern}
      10. \usepackage{tikz}
      11. \usepackage{pgfplots}
      12. \usepackage{tkz-fct}
      13. \usepackage{printlen}
      14. \usepackage{numprint}
      15. \usepackage{etoolbox}
      16. \usetikzlibrary{decorations.pathreplacing}
      17. \usepackage{animate}
      18. \usepackage{ifthen}
      19. \usetkzobj{all}
      20. \usetikzlibrary{arrows,calc,intersections}
      21. \usetikzlibrary{backgrounds}
      22. \usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
      23. \author{Raphael Emberger}
      24. \title{Runge-Kutta}
      25. \newcommand{\f}[2] %f(#1, #2)=f(t, x)=f(x, y)
      26. {cos(3*#1*180/pi)}
      27. %=3((t3-6t)sin(t)+(3t2-6)cos(t))+x_0
      28. %{((#1-0.3)/0.3)^2+((#2-0.5)/0.3)^2-1}
      29. \newcommand{\newvec}[5][->]% [options], start point, vector
      30. { \xdef\mysum{0}
      31. \foreach \c in {#3}
      32. { \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
      33. \xdef\mysum{\mysquare}
      34. }
      35. \pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
      36. \coordinate (#4) at ($#5/\myveclen*(#3)$);
      37. \draw[#1] (#2) --+ (#4);
      38. }
      39. \newcommand{\newkvec}[5]{
      40. \newvec[k]{#1}{#2}{#3}{#4}
      41. \fill[fill=red!20] (#1) --+ (#3) --+ (#3 |- 0,0) -- cycle;
      42. \newvec[k]{#1}{#2}{#3}{#4}
      43. \path[k] (#1) --+ (#3 |- 0,0) node[anchor=west]{#5};
      44. }
      45. \newcommand{\calc}[2]{\pgfmathparse{#2}\let#1\pgfmathresult}
      46. \newcounter{xcount}
      47. \begin{document}
      48. \foreach \iteration in {0,...,90} {
      49. \begin{tikzpicture}[
      50. background rectangle/.style={fill=white}, show background rectangle,
      51. grid/.style={thin,black!20},
      52. coordsys/.style={thick,black},
      53. gradient/.style={thin,blue!40,-stealth},
      54. k/.style={red!90!black,-stealth},
      55. kstep/.style={dotted,thick,color=green!60!red,-stealth},
      56. bstep/.style={dashed,thick,color=blue!60!red,-stealth},
      57. x=8cm,
      58. y=8cm,
      59. yscale=0.8
      60. ]
      61. %\draw[grid] (-0.01, -0.01) grid (1.01, 1.01);
      62. \foreach \x in {0,0.1,...,1.1}{
      63. \draw[grid] (\x, -0.01) --+ (0, 1.02);
      64. }
      65. \foreach \y in {0,0.1,...,1.1}{
      66. \draw[grid] (-0.01, \y) --+ (1.02, 0);
      67. }
      68. \foreach \x in {0,0.05,...,1.05}{
      69. \foreach \y in {0,0.05,...,1.05}{
      70. \newvec[gradient]{\x,\y}{1,{\f{\x}{\y}}}{a}{0.04}
      71. }}
      72. \draw[coordsys,-stealth] (0, 0) -- (1.05, 0) node[anchor=north west]{$t$};
      73. \draw[coordsys,-stealth] (0, 0) -- (0, 1.05) node[anchor=north east]{$x$};
      74. \draw[coordsys] (0, 0.01) --+ (0, -0.02) node[anchor=north]{$0$};
      75. \setcounter{xcount}{1}
      76. \foreach \x in {0.1,0.2,...,0.9}{
      77. \draw[coordsys] (\x, 0.01) --+ (0, -0.02) node[anchor=north]{$0.\arabic{xcount}$};
      78. \stepcounter{xcount}
      79. }
      80. \draw[coordsys] (1, 0.01) --+ (0, -0.02) node[anchor=north]{$1$};
      81. \def\hstep{0}
      82. \calc{\hstep}{0.1+\iteration*0.01}
      83. \def\TZero{0}
      84. \def\XZero{0.1}
      85. \def\valX{\XZero}
      86. \def\valT{\TZero}
      87. \def\valC{1/3*\hstep}
      88. \def\valKStep{0.1}
      89. \def\valB{1/4*\hstep}
      90. \def\valTc{\TZero}
      91. \draw[domain=0:1,smooth,samples=100,variable=\x,blue!60!green] plot ({\x},{1/3*sin(3*\x*180/pi)+\XZero});
      92. \coordinate (xvec) at (\valT, \valX);
      93. \coordinate (Cvec) at (xvec);
      94. \calc{\valK}{\f{\valT}{(\valX)}}
      95. \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_1$}
      96. \draw[kstep] ($(xvec)+(kvec)$) -- (\valC, {\valX+\valK*(\valC-\valT)});
      97. \coordinate (cvec) at (\valB, {\valK*\valB});
      98. \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
      99. %Next K-Value
      100. \calc{\valX}{\valX + (\valC-\valT)*\valK}
      101. \calc{\valT}{\TZero + \valC}
      102. \def\valC{2/3*\hstep}
      103. \def\valTc{\valB}
      104. \def\valB{0}
      105. \coordinate (xvec) at (\valT, \valX);
      106. \calc{\valK}{\f{\valT}{(\valX)}}
      107. \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_2$}
      108. \draw[kstep] ($(xvec)+(kvec)$) -- (\valC, {\valX+\valK*(\valC-\valT)});
      109. \coordinate (cvec) at (\valB, {\valK*\valB});
      110. \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
      111. %Next K-Value
      112. \calc{\valX}{\valX + (\valC-\valT)*\valK}
      113. \calc{\valT}{\TZero + \valC}
      114. \def\valTc{\valB}
      115. \def\valB{3/4*\hstep}
      116. \coordinate (xvec) at (\valT, \valX);
      117. \calc{\valK}{\f{\valT}{(\valX)}}
      118. \newkvec{xvec}{1,\valK}{kvec}{\valKStep}{$k_3$}
      119. \coordinate (cvec) at (\valB, {\valK*\valB});
      120. \draw[bstep] (Cvec) --+ (cvec) coordinate (Cvec);
      121. \draw[red] ($(Cvec)+(0.05, 0)$) -- (Cvec) -- (\hstep,{1/3*sin(3*\hstep*180/pi)+\XZero}) --+ (0.05, 0);
      122. \end{tikzpicture}
      123. }
      124. \end{document}


      So, ich denke, das sollte genügen.

      Mit freundlichen Grüssen,

      Higlav

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Higlav“ ()