Ключ `xkeyval` не работает для установки параметра `fragile` в бимере

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

Связанный контент