我使用大量包含数学表达式的宏来编写讲义和 Beamer 幻灯片。我希望能够根据是否运行 Beamer 来设置条件格式。因此,我使用语句编写了条件代码\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
调用First 。然后,\expandafter
分支中的执行结束\else
或\fi. It remains
\@firstoftwo or
\@secondoftwo . The macro reads the two arguments and selects one of them. Then
#1 or
#2` 被调用,而没有来自条件的后续标记。