A chave `xkeyval` não funciona para definir a opção `frágil` no beamer

A chave `xkeyval` não funciona para definir a opção `frágil` no beamer

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 xkeyvala macro inteira para de funcionar.

Como posso passar a fragileopçã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}

insira a descrição da imagem aqui

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, beamernã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@optionsnão é reconhecido como opcional fragilee 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 fragileseu 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, beamernã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.

informação relacionada