Estou tentando definir uma macro personalizada para criar quadros em minhas apresentações. Porém, quando tentei definir as opções que posso passar para o quadro usando xkeyval
a macro inteira para de funcionar.
Como posso passar a fragile
opção para o frame utilizando uma macro definida? Além disso, você pode explicar por que não está funcionando?
\documentclass{beamer}
\usepackage{xkeyval}
\makeatletter
% Define the keys for the myframe (my)
\define@cmdkey[abc]{mf}{title}{}% title of the frame
\define@cmdkey[abc]{mf}{options}{}% options to the frame
\presetkeys[abc]{mf}{title=,options=}{}
\newcommand{\myframe}[3][]{%
\setkeys[abc]{mf}{#1}
\begin{frame}[\cmdabc@mf@options]{\cmdabc@mf@title}%
% my frame definition here
#2 #3
\end{frame}%
}
\makeatother
\begin{document}
% this works
\myframe[title=test]{test1}{test 2}
% this doesn't
\myframe[options=fragile,title=test]{test1}{test 2}
\end{document}
Responder1
Em termos gerais, 'não faça isso' é a melhor resposta. Existem dois problemas com a sua abordagem, um dos quais aparece aqui e outro se você corrigir o primeiro!
A questão imediata é que, como a maioria dos argumentos opcionais, beamer
não está procurando aqui por 'algo que se expande para fragile
, está procurando o texto fragile
. Então o que acontece é que ele \cmdabc@mf@options
não é reconhecido como opcional fragile
e o texto (ou parte dele!) acaba dentro do slide.
O segundo problema, muito maior, surge se consertarmos isso, por exemplo, em um caso de teste, simplesmente codificando fragile
seu exemplo
\begin{frame}[fragile]{\cmdabc@mf@title}
Isso então morre inteiramente com um erro interno. A razão aqui é que, com slides frágeis, beamer
é feita alguma análise especializada que depende da presença de finais de linha. Na sua versão 'finalizada', os finais de linha foram transformados em espaços pela tokenização do TeX e, portanto, beamer
não conseguem encontrar o final dos comandos. Isso leva ao erro. Como acontece com qualquer agarramento literal, você realmente precisa estarmuitocauteloso ao ocultar o texto do marcador.