`xkeyval` 键不适用于在 beamer 中设置 `fragile` 选项

`xkeyval` 键不适用于在 beamer 中设置 `fragile` 选项

我正在尝试设置自定义宏来在演示文稿中创建框架。但是,当我尝试设置可以使用整个宏传递给框架的选项时,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无法找到命令的结尾。这导致了错误。与任何逐字抓取一样,您确实必须非常小心隐藏标记文本。

相关内容