
Я пишу лекции и слайды для бимера, используя множество макросов, содержащих математические выражения. Я хотел бы иметь возможность форматировать условно, независимо от того, запущен ли я бимер. Поэтому я написал условный код, используя оператор \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` вызываются без последующего токена из условного оператора.