Zeilenumbrüche und Et-Zeichen können im Mathematikmodus mit \newif nicht eingefügt werden

Zeilenumbrüche und Et-Zeichen können im Mathematikmodus mit \newif nicht eingefügt werden

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 \newifAnweisung 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 \ifThenBeamerCodezeilen: 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 alignverwendet intern eine Tabelle ( \halign) und das Makro \ifThenBeamersetzt 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 \ifConditionOnBeamerwird aufgerufen. Anschließend \expandafterwird im Zweig das Schließen ausgeführt \elseoder \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.

verwandte Informationen