
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 \newif
declaració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 \ifThenBeamer
lí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 align
utiliza internamente una tabla ( \halign
) y la macro \ifThenBeamer
coloca 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 \ifConditionOnBeamer
se llama. Luego, \expandafter
en la rama ejecuta el cierre \else
o 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.