Der Vorstellungsfilm von sockenpaket – Wie kann man einen Film mit LaTeX erstellen?

“Ja und was ist jetzt das besondere an den Socken? Warum sollte ich die bei dir kaufen?”

Das hat mich eine Tante auf der Geburtstagsfeier meines Vaters gefragt, nachdem ich von sockenpaket.de erzählt habe.

Und die Frage wurde mir nicht zum ersten Mal gestellt. Eigentlich fragt mich das jeder, nachdem ich von meinem nebenberuflichen Projekt erzähle.

Wenn ich mit den Leuten rede, kann ich die Fragen natürlich einfach beantworten. Nur leider klappt das nicht, wenn potentielle Kunden im Internet auf sockenpaket.de stoßen. Deswegen hatte hatte ich schon seit längerer Zeit vor, die Vorzüge von sockenpaket.de anschaulich darzustellen.

Und das heißt in diesem Fall nicht in Textform, sondern mindestens in Bildform und idealerweise sogar als Film.

Allerdings habe ich keine Filmausrüstung, geschweige denn Erfahrung mit Videoschnitt und anderen technischen Finessen. Was ich habe, sind ein bisschen Erfahrung im Umgang mit Skripten für die Kommandozeile in Linux und ein paar LaTeX– und TikZ-Kenntnisse. TikZ ist ein Add-On für LaTeX, das die die Prinzipien aus LaTeX auf die Erstellung von Grafiken und Abbildungen überträgt. Hier ein kleines Beispiel: Aus dem TikZ-Quelltext

\documentclass[border=10mm, convert={density=300,outext=.png}]{standalone}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{shapes.arrows}

\definecolor{myGreen}{RGB}{0,116,48}

% define tikz styles
\tikzstyle{block} = [draw,
 minimum height=25mm,
 fill=white,
 minimum width=25mm]
\tikzstyle{blockarrow} = [single arrow,
 draw=myGreen,
 fill=myGreen,
 minimum height=20mm]

\renewcommand*\familydefault{\sfdefault}

\begin{document}
\begin{tikzpicture}[ node distance=50mm, thick]

% draw first stack
\node[block] at (0,0) (pdf1) {}; 
\node[block, right of = pdf1, node distance = 54 mm] (png1) {}; 
\node[block, below right = 3mm and 1 mm of pdf1, anchor=south east] (pdf2) {}; 
\node[block, below right = 3mm and 1 mm of pdf2, anchor=south east] (pdf3) {}; 
\node[block, below right = 3mm and 1 mm of pdf3, anchor=south east] (pdf4) {};

% draw other blocks 
\node[block, below right = 3mm and 1 mm of pdf4, anchor=south east] (pdf5){Frame-001.pdf}; 
\node[block, left of = pdf2,node distance=51mm] (pdf) {Film.pdf};
\node[block, left of = pdf] (tex) {Film.tex};

% draw second stack 
\node[block, below right = 3mm and 1 mm of png1, anchor=south east] (png2) {}; 
\node[block, below right = 3mm and 1 mm of png2, anchor=south east] (png3) {}; 
\node[block, below right = 3mm and 1 mm of png3, anchor=south east] (png4) {}; 
\node[block, below right = 3mm and 1 mm of png4, anchor=south east] (png5) {Frame-001.png};
\node[block, right of = png2, node distance = 53 mm] (mov) {Film.mov}; % draw rightmost block

% draw arrows
\node[blockarrow, right of = tex, node distance = 25mm] (pdflatex){pdflatex};
\node[blockarrow, right of = pdf, node distance =25mm] (pdftk){pdftk};
\node[blockarrow, right of = pdf2, node distance=28mm] (inkscape){inkscape}; 
\node[blockarrow, right of = png2, node distance =28mm] (avconv){\textcolor{myGreen}{p}avconv\textcolor{myGreen}{d}};% green characters for correct textheight

\end{tikzpicture}
\end{document}

entsteht das folgende Bild, das den Ablauf darstellt:

Ablauf um einen Film mit LaTeX zu erstellen
Die verwendete Toolchain um einen Film mit LaTeX zu erstellen

Die einzelnen Schritte vom LaTeX-Quelltext zum fertigen Film stelle ich dir im Folgenden vor.

Eine Animation mit LaTeX erstellen

LaTeX ist erst einmal ein Werkzeug für den Textsatz. Da es aber auch gleichzeitig der Goldstandard für professionellen Formelsatz ist, wurden in der LaTeX-Community nach und nach viele Erweiterungen programmiert.

Eine davon ist die Dokumentklasse beamer. Wann ein LaTeX-Dokument dieser Klasse zuordnet, bekommt man einen Satz von Befehlen zur Verfügung gestellt, mit denen Man definieren kann, wie sich eine Seite nach und nach aufbauen soll.

Mit LaTeX-Beamer kannst du dann die Inhalte für deinen Film zusammenstellen und die Abfolge an der resultierenden PDF testen.

In meiner Toolchain benötige ich die Frames für den Film a) einzeln und b) als Pixelgrafiken.

Die PDF aufteilen

Deswegen teile ich die eine PDF mit mehreren Seiten in mehrere PDFs mit einer Seite auf. Damit das schnell funktioniert, habe ich pdftk (“PDF ToolKit”) verwendet. Damit kann man prinzipiell alle möglichen Operationen an PDFs durchführen, z. B. bestimmte Seiten verschiedener PDFs zu einer einzelnen PDF zusammenführen. Im Vergleich zu den weiteren Möglichkeiten ist der Aufruf

pdftk Film.pdf burst output Frame-%03d.pdf

langweilig.

Einzelnen Seiten in Bitmaps umwandeln

Die Einzelbilder Frame-001.pdf, Frame-002.pdf usw. habe ich dann mit inkscape in PNGs konvertiert:

for i in Frame-*.pdf
   do
    inkscape ${i} --export-height=216 -e ${i/pdf/png} 
  done

Normalerweise wäre der Befehl convert das Mittel der Wahl gewesen, aber damit waren die Ergebnisse nicht zufriedenstellen, die Farbübergänge waren z.T. nicht sauber. Da inkscape nur einzelne Argumente akzeptiert, muss dieser Befehl in einer Schleife landen.

Bitmaps zu Film zusammensetzen

Die Einzelbilder habe ich mit

avconv -framerate 0.3 -f image2 -i Frame-%03d.png -r 25 Presentation.mov

zu einem Film zusammengesetzt. Dabei lässt sich die Geschwindigkeit mit dem Argument -framerate steuern.

Ergebnis

Das Ergebnis kannst du dir hier anschauen:

Möchtest du dir die Umsetzung im Detail anschauen? Dann lade dir doch das GitHub-Repo mit dem Quelltext runter. Hier habe ich eine kompatiblere Schriftart eingestellt und die Farbe des Logos geändert (das Originallogo wollte ich nicht unter Public Domain stellen 😉 ).

Wenn du mehr zur Entwicklung von sockenpaket.de lesen willst, findest du in in der Kategorie sockenpaket.de alle Artikel.

Leave a Reply

Your email address will not be published. Required fields are marked *