
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 \newif
instruçã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 \ifThenBeamer
linhas 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 align
usa internamente uma tabela ( \halign
) e a macro \ifThenBeamer
coloca 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 \expandafter
na ramificação executa o fechamento \else
ou \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.