Невозможно вставить переносы строк и амперсанды в математическом режиме с помощью \newif

Невозможно вставить переносы строк и амперсанды в математическом режиме с помощью \newif

Я пишу лекции и слайды для бимера, используя множество макросов, содержащих математические выражения. Я хотел бы иметь возможность форматировать условно, независимо от того, запущен ли я бимер. Поэтому я написал условный код, используя оператор \newif, который работаеткромекогда я хочу включить символы форматирования, такие как \\и &, в этом случае beamer выдает ошибку. Вот пример кода: Есть три \ifThenBeamerстроки кода: первые две выдают одну и ту же ошибку, т.е.

! Missing } inserted.
<inserted text> 
                }
l.40 \end{frame}

Третья строка в порядке.

\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}

Может кто-нибудь объяснить, почему возникает ошибка и как ее исправить? Или как-то обойти ее, если ее невозможно исправить?

Спасибо!

решение1

Окружение alignвнутри использует таблицу ( \halign), а макрос \ifThenBeamerпомещает групповые скобки вокруг ее аргументов. Группы мешают группам ячеек и строк таблицы. Без скобок пример работает:

\def\ifThenBeamer#1#2{
    \ifConditionOnBeamer
        #1%
    \else
        #2%
    \fi
}

Более защитная версия перемещает расширение условных предложений в начало:

\makeatletter
\newcommand*{\ifThenBeamer}{%
  \ifConditionOnBeamer
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\makeatother

\ifConditionOnBeamerВызывается первый . Затем \expandafterв ветви выполняется закрытие \elseили \fi. It remains\@firstoftwo or\@secondoftwo . The macro reads the two arguments and selects one of them. Then#1 or#2` вызываются без последующего токена из условного оператора.

Связанный контент