我正在尝试设置自定义宏来在演示文稿中创建框架。但是,当我尝试设置可以使用整个宏传递给框架的选项时,xkeyval
整个宏停止工作。
如何fragile
使用已定义的宏将选项传递给框架?此外,您能解释一下为什么不起作用吗?
\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}
答案1
总的来说,“不要这样做”是最好的答案。你的方法有两个问题,其中一个问题在这里出现,另一个问题在你修复第一个问题后出现!
当前的问题是,与大多数可选参数一样,beamer
这里不是在寻找“扩展为 的东西” fragile
,而是在寻找文本fragile
。因此,发生的事情是\cmdabc@mf@options
无法被识别为可选的fragile
,并且文本(或其中的一部分!)最终出现在幻灯片内。
第二个更大的问题出现在如果我们修复这个问题的时候,例如在测试用例中通过简单的硬编码fragile
到你的示例中
\begin{frame}[fragile]{\cmdabc@mf@title}
然后,由于内部错误,此操作完全失败。原因是,对于易碎的幻灯片,beamer
会进行一些依赖于行尾存在的专门解析。在您的“包装”版本中,行尾已通过 TeX 标记化转换为空格,因此beamer
无法找到命令的结尾。这导致了错误。与任何逐字抓取一样,您确实必须非常小心隐藏标记文本。