No se pueden insertar saltos de línea y símbolos en modo matemático usando \newif

No se pueden insertar saltos de línea y símbolos en modo matemático usando \newif

Escribo notas de clase y diapositivas usando muchas macros que contienen expresiones matemáticas. Me gustaría poder formatear dependiendo de si estoy ejecutando Beamer o no. Entonces escribí código condicional usando una \newifdeclaración, que funcionaexceptocuando quiero incluir caracteres de formato como \\y &, en cuyo caso el proyector arroja un error. Aquí hay un código de muestra: Hay tres \ifThenBeamerlíneas de código: las dos primeras arrojan el mismo error, es decir,

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

La tercera línea está bien.

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

¿Alguien podría explicar por qué se produce el error y cómo solucionarlo? ¿O bien una solución alternativa si no se puede solucionar?

¡Gracias!

Respuesta1

El entorno alignutiliza internamente una tabla ( \halign) y la macro \ifThenBeamercoloca llaves de grupo alrededor de sus argumentos. Los grupos se meten con los grupos de celdas y líneas de la tabla. Sin las llaves el ejemplo funciona:

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

Una versión más defensiva mueve la expansión de los condicionales al principio:

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

Primero \ifConditionOnBeamerse llama. Luego, \expandafteren la rama ejecuta el cierre \elseo se llama a \fi. It remains\@firstoftwo or\@ secondoftwo . The macro reads the two arguments and selects one of them. Then#1 or#2` sin un token siguiente del condicional.

información relacionada