Não é possível inserir quebras de linha e "e" comercial no modo matemático usando \newif

Não é possível inserir quebras de linha e "e" comercial no modo matemático usando \newif

Eu escrevo notas de aula e slides usando muitas macros contendo expressões matemáticas. Gostaria de poder formatar dependendo de estar ou não executando o beamer. Então escrevi código condicional usando uma \newifinstrução, que funcionaexcetoquando desejo incluir caracteres de formatação como \\e &, nesse caso o beamer gera um erro. Aqui está um exemplo de código: Existem três \ifThenBeamerlinhas de código: as duas primeiras geram o mesmo erro, ou seja,

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

A terceira linha está boa.

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

Alguém poderia explicar por que o erro está sendo gerado e como corrigi-lo? Ou então uma solução alternativa se não puder ser corrigida?

Obrigado!

Responder1

O ambiente alignusa internamente uma tabela ( \halign) e a macro \ifThenBeamercoloca colchetes em torno de seus argumentos. Os grupos mexem com os grupos das células e linhas da tabela. Sem os colchetes o exemplo funciona:

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

Uma versão mais defensiva move a expansão das condicionais no início:

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

Primeiro \ifConditionOnBeameré chamado. Em seguida, o \expandafterna ramificação executa o fechamento \elseou \fi. It remains\@firstoftwo or\@secondoftwo . The macro reads the two arguments and selects one of them. Then#1 or#2` são chamados sem um token seguinte da condicional.

informação relacionada