Я пытаюсь настроить пользовательский макрос для создания фреймов в моих презентациях. Однако, когда я пытаюсь настроить параметры, которые я могу передать фрейму, используя 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
не удается найти конец команд. Это приводит к ошибке. Как и в случае с любым дословным захватом, вам действительно нужно бытьоченьопасайтесь скрывать текст маркера.