Kurztipp: In LaTeX auf Pandoc prüfen

Marvin Gülker · 20.06.2021

Zur Unterscheidung von Pandoc und LaTeX in einem LaTeX-Dokument.

Kategorien: LaTeX, Software

Es kann gelegentlich sinnvoll sein, in einem LaTeX-Dokument danach zu unterscheiden, ob es es mit einem „gewöhnlichen“ LaTeX-Prozessor wie pdflatex oder lualatex verarbeitet wird oder mit Pandoc. Das ist allerdings nicht ganz einfach, da Pandoc ein entsprechendes Makro, das mit innerhalb von LaTeX prüfen könnte, nicht bereitstellt. Gleichwohl gibt es eine Möglichkeit, die sich der erst kürzlich in Pandoc implementierten LaTeX-Booleans bedient und die hier kurz vorgestellt werden soll.

Abstraktes Vorgehen

Der Grundgedanke besteht darin, Pandoc vor dem eigentlichen LaTeX-Dokument ein kleines Vordokument verarbeiten zu lassen. Dieses Vordokument definiert einen LaTeX-Boolean, den man dann im Hauptdokument abfragen kann. Damit das Dokument gleichzeitig mit einem gewöhnlichen LaTeX-Prozessor verarbeitbar bleibt (und nicht wegen eines nicht definierten Booleans zurückgewiesen wird), muss dieser LaTeX-Boolean allerdings auch, und zwar negativ, im Hauptdokument definiert werden. Da das aber dazu führen würde, dass auch Pandoc bei der Verarbeitung den Boolean negativ festlegt, muss die Festlegung so konstruiert werden, dass sie nur bei der Verarbeitung durch LaTeX ausgeführt wird. Dazu wiederum kann man sich \providecommand bedienen. Dieser etwas unbekanntere LaTeX-Befehl definiert ein Kommando nur dann, wenn es nicht schon definiert ist. Ob Pandoc diesen Befehl nun schlicht ignoriert (weil es nicht weiß, welche Kommandos bereits definiert wurden) oder ihn korrekt ausführt, kann ich nicht sagen, aber jedenfalls hat er den erwünschten Effekt: wenn im Vordokument der entsprechende Befehl definiert ist, wird er im Hauptdokument nicht noch einmal definiert.

Praktische Umsetzung

Konkret lassen sich diese etwas abstrakten Überlegungen wie folgt umsetzen. Zunächst ein minimales Vordokument pandoc-pre.tex. Dieses wird ausschließlich an Pandoc übergeben:

\newcommand\defpandocbool{
  \newif\ifrunsinpandoc
  \runsinpandoctrue}

Dies definiert den neuen Befehl \defpandocbool, führt ihn aber noch nicht aus. Wird er ausgeführt, wird ein neuer LaTeX-Boolean namens runsinpandoc definiert und auf true gesetzt. Die Syntax zur Erstellung reiner LaTeX-Booleans abseits des Pakets ifthen ist etwas gewöhnungsbedürftig, weil \newif den nachfolgenden Befehlsnamen am if zerlegt; Einzelheiten können bei Wikibooks nachgelesen werden.

Im Hauptdokument geht man in der Präambel dann so vor:

\providecommand\defpandocbool{
  \newif\ifrunsinpandoc
  \runsinpandocfalse}
\defpandocbool{}

Da in einem „normalen“ LaTeX-Lauf ohne Pandoc der Befehl \defpandocbool nicht zur Verfügung steht, wird er mithilfe von \providecommand erstmals definiert. In einem Pandoc-Lauf dagegen, bei dem vorher pandoc-pre.tex verarbeitet wurde, ist er bereits definiert und wird daher nicht neu definiert (oder Pandoc ignoriert \providecommand, das kann ich nicht sagen). Diese Definition setzt den Boolean auf false. Anschließend wird \defpandocbool sogleich aufgerufen. Bei einem regulären LaTeX-Lauf ist der Boolean runsinpandoc damit false, bei einem Pandoc-Lauf ist er true.

Anschließend braucht man nur noch an den Stellen, die unterschiedlich behandelt werden sollen, den Boolean abzuprüfen. Dazu dient dann das Konstrukt:

\ifrunsinpandoc
Ausführung mit Pandoc.
\else
Ausführung mit normalen \LaTeX{}.
\fi

Das Hauptdokument könnte damit so aussehen:

\documentclass[a4paper,ngerman,11pt]{scrartcl}
\usepackage{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\providecommand\defpandocbool{
  \newif\ifrunsinpandoc
  \runsinpandocfalse}
\defpandocbool{}

\begin{document}
\title{Test}
\author{Max Mustermann}
\date{\today}
\maketitle{}

Dieses wird immer im Dokument stehen.

\ifrunsinpandoc
Verarbeitung erfolgte mit Pandoc.
\else
Verarbeitung erfolgte mit normalen \LaTeX{}.
\fi

\end{document}

Zur Verarbeitung nutzt man dann wahlweise LaTeX:

$ pdflatex test.tex

Oder aber man benutzt Pandoc, wobei man darauf Acht gibt, pandoc-pre.tex als erste zu verarbeitende Datei anzugeben.

$ pandoc pandoc-pre.tex test.tex -o ergebnis.html

Ergebnis

Es ist etwas umständlich, aber man kann ohne Zuziehung externer Werkzeuge wie M4 feststellen, ob das aktuelle LaTeX-Dokument von Pandoc verarbeitet wird.