如何使用覆盖来改变用户定义环境的行为?

如何使用覆盖来改变用户定义环境的行为?

首先我必须给出一个链接相关问题+答案。我正在尝试创建一个beamer演示文稿并定义一个环境。该环境有一个可选参数,我希望beamer使用覆盖设置一个框架,以便在第 1 帧上使用默认值,在第 2 帧上使用另一个值。

澄清: 到目前为止,环境采用可选参数并排版优化问题(保持一致)。如果设置了可选变量,它将成为最小-最大问题,而参数本身将成为最大化变量。因此,根据可选参数的存在,一些静态文本加上参数本身将被排版。

现在beamer我想展示如何将一个问题转换为另一个问题。在第一个叠加层中应该有一个最小-最大问题排版,在下一个叠加层中应该有一个最小问题排版。我的想法是改变价值可选参数使其适合默认值,以指示纯最小值问题。因此,覆盖规范等在环境之外处理。这也有好处,我可以随时间(a la \only<1>{a}\only<2>{b}\only<3>{c})更改值而不受限制。

事实上,我可以为一个覆盖层提供明确的覆盖规范,并将两种不同的情况直接硬编码到环境中。但这似乎不灵活,也不是完美的解决方案。我也想知道为什么它对于强制性参数完美地起作用(参见更新的 MWE)。

我试图在下面给出一个最小(非)工作示例。

我收到有关 alt 宏定义错误的编译错误。

现在,我可能在将环境定义为具有覆盖感知能力的实际情况下会起作用(我不确定,如果一切顺利的话)。无论如何,我只能为环境提供一个覆盖规范。如果我希望参数采用 2 个以上的值,这将是一个问题。

你能告诉我如何解决这一要求吗?

\documentclass{beamer}
\usepackage{xifthen,xparse}
% \NewDocumentEnvironment{MyEnv}{m O{}}{Start (#1\ifthenelse{\equal{#2}{}}{}{, #2})\par}{End}
% \NewDocumentCommand{\mycmd}{m O{}}{Argument: "#1\ifthenelse{\equal{#2}{}}{}{, #2}\fi"}
\NewDocumentEnvironment{MyEnv}{m O{}}{Start (#1\ifx!#2!\else{, #2}\fi)\par\begingroup\bfseries}{\endgroup\par End\par}
\NewDocumentCommand{\mycmd}{m O{}}{Argument: "#1\ifx!#2!\else{, #2}\fi"}
\begin{document}
\begin{frame}{As commands}
\mycmd{x} (should be "")\par
\mycmd{x}[a] (should be "a")\par
\mycmd{\alt<2>{m2}{m1}} (should be "\alt<2>{m2}{m1}")\par
\mycmd{\alt<2>{m2}{m1}}[x] (should be "\alt<2>{m2}{m1}, x")\par

\vspace{1cm}
Error:\\
\mycmd{x}[\alt<2>{2}{}] (should be "x\alt<2>{, 2}{}")
\end{frame}

\begin{frame}{Using Environments}
\begin{MyEnv}{m}
Should be (m)
\end{MyEnv}
\begin{MyEnv}{m}[o]
Should be (m, o)
\end{MyEnv}
\begin{MyEnv}{\alt<2>{m1}{m2}}[o]
Should be (\alt<2>{m1}{m2}, o)
\end{MyEnv}

\vspace{1cm}
Error: \\
\begin{MyEnv}{m}[\alt<2->{b}{}]
Should be (m\alt<2>{, b}{})
\end{MyEnv}
\end{frame}
\end{document}

答案1

我不知道我是否理解了您的意思。但这里有一个带有可选参数(覆盖规范)的命令。如果传递了一些可选的覆盖规范,则将使用\alt<#1>

\documentclass{beamer}
\usepackage{xifthen,xparse}

\newcommand{\myfoo}[2][]{%
\par%
Start \ifthenelse{\equal{#1}{}}{(#2)}%
                               {\alt<#1>{(#2,b)}{(#2)}}\par%
End}

\begin{document}
\begin{frame}
\myfoo{m}

\myfoo[2-]{m}

\end{frame}
\end{document}

在此处输入图片描述 在此处输入图片描述

相关内容