
Ich schreibe Vorlesungsnotizen und Beamer-Folien mit vielen Makros, die mathematische Ausdrücke enthalten. Ich möchte in der Lage sein, abhängig davon zu formatieren, ob ich Beamer laufen lasse oder nicht. Also habe ich bedingten Code mit einer \newif
Anweisung geschrieben, die funktioniertaußerwenn ich Formatierungszeichen wie \\
und einfügen möchte &
, in diesem Fall gibt beamer einen Fehler aus. Hier ist ein Beispielcode: Es gibt drei \ifThenBeamer
Codezeilen: Die ersten beiden geben denselben Fehler aus, d. h.
! Missing } inserted.
<inserted text>
}
l.40 \end{frame}
Die dritte Zeile ist in Ordnung.
\documentclass{beamer}
\newif\ifConditionOnBeamer
\makeatletter
\def\isConditionOnBeamer#1{
\ifnum\pdf@strcmp{\useBeamer}{#1}=0
\ConditionOnBeamertrue
\else
\ConditionOnBeamerfalse
\fi
}
\makeatother
\def\useBeamer{on}
\def\BeamerOn{\isConditionOnBeamer{on}}
\def\BeamerOff{\isConditionOnBeamer{off}}
\def\ifThenBeamer#1#2{
\ifConditionOnBeamer
{#1}
\else
{#2}
\fi
}
\BeamerOn
\begin{document}
\begin{frame}
\begin{align}
\ifThenBeamer{a \\ b}{c d} %This throws a Missing } inserted error
\ifThenBeamer{a & b}{c d}%This throws a Missing } inserted error
\ifThenBeamer{a b}{c d}
\end{align}
\end{frame}
\end{document}
Könnte mir bitte jemand erklären, warum der Fehler auftritt und wie man ihn behebt? Oder einen Workaround, falls er nicht behebbar ist?
Danke!
Antwort1
Die Umgebung align
verwendet intern eine Tabelle ( \halign
) und das Makro \ifThenBeamer
setzt Klammern um die Argumente. Die Gruppen bringen die Gruppierungen der Tabellenzellen und -zeilen durcheinander. Ohne die Klammern funktioniert das Beispiel:
\def\ifThenBeamer#1#2{
\ifConditionOnBeamer
#1%
\else
#2%
\fi
}
Eine defensivere Version verschiebt die Erweiterung des Konditionals an den Anfang:
\makeatletter
\newcommand*{\ifThenBeamer}{%
\ifConditionOnBeamer
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
First \ifConditionOnBeamer
wird aufgerufen. Anschließend \expandafter
wird im Zweig das Schließen ausgeführt \else
oder \fi. It remains
\@firstoftwo or
\@secondoftwo . The macro reads the two arguments and selects one of them. Then
#1 or
#2` ohne nachfolgendes Token aus dem Konditional aufgerufen.