
私は講義ノートやBeamerスライドを、数式を含むマクロをたくさん使って書いています。Beamerを実行しているかどうかで条件付きでフォーマットできるようにしたいです。そこで、ステートメントを使って条件付きコードを書いてみました\newif
。を除外する\\
やのような書式設定文字を含めたい場合&
、beamer はエラーをスローします。サンプルコードは次のとおりです。\ifThenBeamer
コードは 3 行あります。最初の 2 行は同じエラーをスローします。
! Missing } inserted.
<inserted text>
}
l.40 \end{frame}
3行目は大丈夫です。
\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 #2` が呼び出されます。or