通过现有环境及其可选参数定义新环境

通过现有环境及其可选参数定义新环境

假设有一个现有的环境,existedenv带有一个可选参数,即

\begin{existedenv}[argument]
....
\end{existedenv}

我想定义一个新的环境,比如,myenv它是的副本existedenv,也就是说,

\begin{myenv}[argument]
....
\end{myenv}

行为就像

\begin{existedenv}[argument]
....
\end{existedenv}

代码该怎么写?

答案1

你可以像myenv这样定义:

\newenvironment{myenv}{%
    % maybe some code here
    \begin{existedenv}%
    % but no code here!
}{%
    \end{existedenv}%
}

当您编写时,会将 展开为,其结果是。如果您需要在 之后编写\begin{myenv}[argument]代码,则这不是一个选项,并且当是逐字或伪环境(即,将其主体读取为参数,如s )时,如果不进行修改,它将无法工作。\begin{myenv}\begin{existedenv}\begin{existedenv}[argument]\begin{existedenv}existedenvbeamerframe

答案2

如果你确实不需要任何额外的功能,你可以稍微作弊一下:

\let\myenv\existedenv
\let\endmyenv\endexistedenv

否则,即如果您出于某种原因想要检查所有参数,事情就会变得更加复杂,因为存在具有多个 optargs 的环境(例如minipage),括号中的参数(picture),花括号中的可选参数(beamer's frame)等等。

答案3

如果您不想对可选参数执行任何操作,则myenv可以不带参数地编写它,然后让它existingenv处理它:

\newenvironment{myenv}{
  % stuff of your own...
  \existingenv
}{
  \endexistingenv
}

然后\begin{myenv}[foo]将扩展到扩展 \begin{existingenv}[foo]之前。foo

但如果这就是你想要做的,你可以考虑使用一些宏etoolbox软件包来修补环境。例如,

\pretocmd{\A}{stuff of your own}{}{}

只会在 的开始代码之前插入您想要的代码A

答案4

代码如下:

\newenvironment{myenv}[#args] {%
    %code coult be put here
    \begin{existedenv}{#1}..{#args}%
    %code could be put here but must be valid inside existedenv
}{%
    \end{existedenv}%
}

其中 #args 是 existedenv 使用的参数数量。

相关内容