Folien mit Pandoc erstellen

Vor ein paar Wochen habe ich für eine Datenbankvorlesung an der Fachhochschule Campus 02 in Graz eine Menge Vortragsfolien verfasst. Werkzeug meiner Wahl war nicht LibreOffice, auch nicht LaTeX+Beamer (na ja, indirekt schon), sondern Pandoc. Dieser Beitrag beschreibt das Wie und Warum.

Pandoc ist ein Markdown-Konverter. Anders als das originale Markdown kann Pandoc auch dazu verwendet werden, um Dokumente unterschiedlichster Art und unterschiedlichsten Formats zu erzeugen — unter anderem eben Vortragsfolien im PDF-Format. Hinter den Kulissen kommen dabei LaTeX und dessen Beamer-Package zum Einsatz — d.h. Voraussetzung für die folgende Anleitung ist nicht nur Pandoc, sondern eben auch eine LaTeX-Installation. Unter Linux ist das alles rasch erledigt, unter Ubuntu z.B. mit:

apt-get install pandoc texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended texlive-lang-german

Basics

Der Einsatz von Pandoc zum Gestalten von Vortragsfolien ist auf der Pandoc-Website eingehend beschrieben, weswegen ich mich hier kurz fasse. Im Prinzip verfassen Sie ein ganz gewöhnliches Markdown-Dokument. Wenn Sie Pandoc nun mit der Option -t beamer -o out.pdf aufrufen, wird daraus ein PDF-Dokument.

Der spannendste Punkt ist dabei die Zerlegung in einzelne Seiten. Pandoc versucht anhand der Struktur des Dokuments zu erkennen, bei welcher Überschriftenebene neue Seiten erzeugt werden sollen. Versagt dieser Automatismus, können Sie mit der Option --slide-level n die Überschriftenebene angeben, bei der Pandoc auf jeden Fall neue Seiten beginnen soll. Darüber hinaus können Sie jederzeit durch zumindest drei Minuszeichen (also ---) eine neue Seite starten.

Intern greift Pandoc dabei auf LaTeX und Beamer zurück. Das gewünschte Beamer-Thema und -Farbschema stellen Sie bei Bedarf mit -V theme=Warsaw -V colortheme=beaver ein. Einen guten Überblick über die vielen zur Auswahl stehenden Möglichkeiten gibt die Beamer Theme Matrix.

Mehr Gestaltungsmöglichkeiten

Wenn Sie die Grenzen der in Pandoc vorgesehenen Layout- und Gestaltungsmöglichkeiten überschreiten möchten, benötigen Sie ein wenig LaTeX- und Beamer-Wissen und betten die entsprechenden LaTeX-Kommandos direkt in den Markdown-Code ein. Besonders effizient gelingt das, wenn Sie ein paar eigene LaTeX-Kommandos in einer Header-Datei definieren und diese mit der Pandoc-Option -H header.tex angeben.

Für meine eigenen Folien ist die Header-Datei keine 20 Zeilen lang. Sie hilft dabei, zweispaltige Folien zu gestalten, deaktiviert die in Beamer vorgesehen Navigationspfeile, definiert stattdessen eine eigene, minimale Fußzeile und verändert ein paar Schriftgrößen für URLs und für Listings:

% header.tex mit eigenen Kommandos und Layout-Anpassungen
newcommand{colA}[1]{begin{columns}[t]begin{column}{#1}} 
newcommand{colB}[1]{end{column}begin{column}{#1}} 
newcommand{colEnd}{end{column}end{columns}}

% keine Navigationspfeile
setbeamertemplate{navigation symbols}{} % keine Navigations-Buttons

% Fußzeile mit Titel und Seitenr.
definecolor{mygray}{gray}{0.75}
setbeamertemplate{footline}{{vspace{2mm}color{mygray}%
hspace*{2mm}tinyinserttitlehspace*{80pt}%
hfillinsertframenumber hspace*{2mm}vspace{2mm}}}

% Schrift für URLs
definecolor{myblue}{rgb}{0.2 0.0 0.8}
renewcommand{UrlFont}{color{myblue}footnotesizesf}

% Schriftgröße Listings
RequirePackage{fancyvrb}
DefineVerbatimEnvironment{Highlighting}{Verbatim}%
  {commandchars={},fontsize=footnotesize} 
DefineVerbatimEnvironment{Verbatim}{Verbatim}%
  {fontsize=footnotesize}

Hello World!

Ein Beispiel illustriert, wie aus wenigen Zeilen Text rasch und unkompliziert Folien werden. Hier zuerst der Markdown-Quelltext:

% Datenbanken I -- Einführung
% Michael Kofler
% September 2013

# Einführung

## Inhalt der Lehrveranstaltung

* Konzepte relationaler Datenbanksysteme
* Design von Datenbanken
* Daten mit SQL^[Standard Query Language] abfragen und verändern

Basis für alle Beispiele: MySQL

## Inhalt im Detail

* Einführung, Hello-World!-Beispiel, MySQL
* Datenbankmodellierung (semantisch, logisch, physisch)
* Entity-Relationship-Modelle
* Datentypen
* Relationships (1:1, 1:n, n:m, identifying vs. non-identifying)
* Primary Keys, Foreign Keys, Foreign Key Constraints
* Normalformen (1NF, 2NF, 3NF), De-Normalisierung
* SQL-Einführung (SELECT, INSERT, UPDATE, DELETE, CREATE/ALTER/DROP TABLE)
* Transaktionen, ACID
* viele praktische Beispiel

## Datenbanken versus Datenbanksysteme

colA{6cm}

Datenbanken

* Adressen für Serienbriefe
* Patientenkartei einer Artzpraxis
* Warenbestand eines Lebensmitteldiskonters
* Facebook
* Telekom-Abrechnungssystem
* ...

colB{6cm}

Datenbanksysteme

* IBM DB/2
* Microsoft Access
* Microsoft SQL Server
* MySQL
* Oracle
* PostgreSQL
* SAP MaxDB
* SQLite

colEnd

vspace{3mm}

PS: Ein Datenbanksystem ist genaugenommen ein *Datenbankmanagagementsystem*.
**DBMS** = *Database Management System*.

## Wozu Datenbanksysteme?

* Sicherheit

    + Datenverluste vermeiden
    + steuern, wer welche Daten lesen/verändern darf
    + aufzeichnen, wer wann was verändert hat
    + Transaktionen
    + Backups
    + Hochverfügbarkeit

* Netzwerkzugriff
* Multi-User-Zugriff mit Zugriffskontrolle

## Client/Server-Modell

includegraphics[width=0.8textwidth]{bilder/client-server.png}

## Relationale Datenbanken

* Organisation aller Daten in Tabellen
* jede Tabelle für sich: ähnlich wie Excel-Tabellenblatt
* Tabellen sind miteinander verknüpft (Relationships)
* Verknüpfungen über ID-Spalten (Primary Key, Foreign Key)

## Relationale Datenbanken

hbox{}hspace*{-9mm}includegraphics[width=1.17textwidth]{bilder/schema-mylibrary.png}

## Standard Query Language = SQL

    SELECT * FROM personen

    SELECT * FROM personen ORDER BY nachname, vorname

    SELECT id, nachname, vorname FROM personen

    SELECT COUNT(*) FROM personen

    SELECT COUNT(*) FROM personen WHERE geschlecht='f'

Und hier alle erforderlichen Dateien:

  • Die-Markdown-Datei sample.text (die Codierung ist UTF-8, falls die deutschen Sonderzeichen im Browser falsch dargestellt werden)
  • Zwei Bilder, die mit LibreOffice erstellt wurden, und die im Unterverzeichnis bilder gespeichert werden müssen: client-server.png und schema-mylibrary.png
  • Die Datei header.tex
  • Das erforderliche Pandoc-Kommando, um daraus eine PDF-Datei zu machen:
    pandoc -t beamer -H header.tex sample.text -o sample.pdf
  • Und hier die resultierende PDF-Datei

Bequem und effizient

Um mir auch noch den manuellen Aufruf des pandoc-Kommandos zu ersparen, verwende ich ein kleines bash-Script. Wenn ich an den Folien arbeite, läuft es im Hintergrund in einem Terminal-Fenster. Es testet alle 10 Sekunden, ob es name.text-Dateien gibt, die neuer sind als die entsprechende name.pdf-Datei. In diesem Fall wird die PDF-Datei automatisch neu generiert.

#!/bin/bash
while :
do
  for mdfile in *.text; do
    pdffile=${mdfile%.text}.pdf
    if [ $mdfile -nt $pdffile ]; then
      echo $mdfile
      pandoc -t beamer -H header.tex $mdfile -o $pdffile
    fi
  done
  sleep 10
done

Jetzt benötigen Sie nun noch einen PDF-Viewer, der Änderungen an den angezeigten PDF-Dateien überwacht und die PDF-Datei dann automatisch neulädt. Geeignete Programme sind Okular (Linux) oder Skim (OS X).

pandoc-folien

Jetzt können Sie im Editor Ihrer Wahl (meine Wahl fällt immer auf Emacs …) die *.text-Dateien erzeugen — alles anderes geschieht automatisch. Noch nie habe ich so komfortabel und effizient Folien verfasst.

6 Gedanken zu „Folien mit Pandoc erstellen“

  1. Die Idee mit dem kontinuierlichen Build ist gut. Erst heute hab ich vergebens nach einem Sublime-Plugin gesucht, mit dem ich diese Aufgabe lösen kann. Aber per Bash ist es natürlich noch einfacher und universeller ;-)

  2. Danke für die Anleitung.

    War eben beim TeXen (bzw. „beamen“) und hab mir überlegt, wie schön das wäre, wenn man es in Markdown machen könnte. Einmal googlen später bin ich hier gelandet. Super!

  3. Sehr hilfreiche Anleitung, ich werde mir das Buch auch besorgen.

    Ich würde gerne noch nachfragen, kann man das Skript auch so einstellen, dass ein pdf UND eine tex-Datei aus Markdown erstellt werden? Habe es zwar (in Ubuntu) versucht, aber ohne Kenntnisse der Skriptsprache.

    1. Anstatt die PDF-Datei direkt zu erzeugen (pandoc -t beamer in.md -o out.pdf), besteht auch die Möglichkeit, zuerst die latex-Datei zu erzeugen und daraus dann die PDF-Datei. Das kann z.B. zweckmäßig sein, wenn Sie den LateX-Code automatisiert (mit sed) verändern möchten:

      pandoc -t beamer in.md -o out.tex

      pdflatex out.tex

      1. Ich danke Ihnen für Ihre prompte Antwort, kenne auch selbst die Pandoc-Syntax, habe mich bei meiner Frage wahrscheinlich nicht präzise ausgedrückt:

        Worum es mir ginge, ist ein Skript (#!/bin/bash usw.), in dem in regelmäßigen Abständen aus dem Markdown-Text automatisch eine tex-Datei erstellt wird und evtl. gleichzeitig eine pdf-Version.
        Ich frage das u.a., weil ich aus den Folien auch Handout und Redemanuskript kompilieren möchte. Sähe das für die Nur-Tex-Version so aus? (Mir ist nicht klar, wie man sowohl tex, als auch eine pdf-Version gleichzeitig hierin erstellen lassen kann, bitte entschuldigen Sie die Bemühungen im Voraus!)

        #!/bin/bash
        while :
        do
          for mdfile in *.text; do
            texfile=${mdfile%.text}.tex
            if [ $mdfile -nt $texfile ]; then
              echo $mdfile
              pandoc -t beamer -H header.tex $mdfile -o $texfile
            fi
          done
          sleep 10
        done
        
        1. Wenn Sie mehrere Varianten/Versionen Ihres Dokuments parallel erzeugen wollen, bauen Sie im obigen Script nach dem pandoc-Aufruf eben entsprechend weitere Kommandos ein.

Kommentare sind geschlossen.