Kurztipp: In LaTeX auf Pandoc prüfen
Marvin Gülker · 20.06.2021
Zur Unterscheidung von Pandoc und LaTeX in einem LaTeX-Dokument.
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.