假设有一个现有的环境,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}
existedenv
beamer
frame
答案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 使用的参数数量。