Estoy intentando configurar una macro personalizada para crear marcos en mis presentaciones. Sin embargo, cuando intenté configurar las opciones, puedo pasar al marco usando xkeyval
toda la macro y deja de funcionar.
¿Cómo puedo pasar la fragile
opción al marco usando una macro definida? Además, ¿puede explicar por qué no funciona?
\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}
Respuesta1
En términos generales, "no hagas esto" es la mejor respuesta. Hay dos problemas con su enfoque, uno de los cuales aparece aquí y el otro aparece si soluciona el primero.
El problema inmediato es que, como la mayoría de los argumentos opcionales, beamer
aquí no se busca "algo que se expanda a" fragile
, sino el texto fragile
. Entonces, lo que sucede es que \cmdabc@mf@options
no se reconoce como opcional fragile
y el texto (¡o parte de él!) termina dentro de la diapositiva.
El segundo problema, mucho mayor, surge si lo solucionamos, por ejemplo, en un caso de prueba mediante una simple codificación fragile
en su ejemplo.
\begin{frame}[fragile]{\cmdabc@mf@title}
Esto luego muere por completo con un error interno. La razón aquí es que con diapositivas frágiles, beamer
se realiza un análisis especializado que se basa en la presencia de finales de línea. En su versión 'resumida', los finales de línea se han convertido en espacios mediante la tokenización TeX, por lo que beamer
no puede encontrar el final de los comandos. Eso lleva al error. Al igual que con cualquier captura textual, realmente hay que sermuytenga cuidado de ocultar el texto del marcador.