\newif を使用して数式モードで改行とアンパサンドを挿入できない

\newif を使用して数式モードで改行とアンパサンドを挿入できない

私は講義ノートや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

関連情報