我有一些环境foo
,bar
我想用环境替换它们,newfoo
并newbar
在环境前添加“这是一个修改过的 foo/bar 环境:”字样。我尝试在循环中执行此操作,如下所示:
\documentclass{minimal}
\usepackage{amsthm}
\let\bar\relax
\newtheorem{foo}{Foo}
\newtheorem{bar}{Bar}
\newtheorem{newfoo}{New Foo}
\newtheorem{newbar}{New Bar}
\makeatletter
\@for\@env:=foo,bar\do{%
\renewenvironment{\@env}{%
This is a modified \@env environment:
\begin{new\@env}
}{%
\end{new\@env}
}%
}
\makeatother
\begin{document}
\begin{foo}
I want this to be New Foo.
\end{foo}
\begin{bar}
I want this to be New Bar.
\end{bar}
\end{document}
但是,这不起作用,因为\begin
不想扩展命令\@env
。我曾尝试在那里添加\expandafter
s,但没有成功,但我没能让它工作。我也尝试过通过使用来规避它
\renewenvironment{\@env}{%
This is a modified \@env environment:
\csname new\@env\endcsname
}{%
\csname endnew\@env\endcsname
}%
但显然这也不起作用(我实际上不确定为什么)。
有人可以建议一个可行的解决方案吗?
答案1
您需要使用 的扩展\@env
,而不是\@env
。使用 更简单expl3
。在 的第二个参数中\xfor
,#1
表示正在处理的列表中的当前项。
\documentclass{article}
\usepackage{xparse}
\usepackage{amsthm}
\let\bar\relax
\newtheorem{foo}{Foo}
\newtheorem{bar}{Bar}
\newtheorem{newfoo}{New Foo}
\newtheorem{newbar}{New Bar}
\ExplSyntaxOn
\NewDocumentCommand{\xfor}{mm}
{
\clist_map_inline:nn { #1 } { #2 }
}
\ExplSyntaxOff
\xfor{foo,bar}{%
\renewenvironment{#1}{%
This is a modified #1 environment:
\begin{new#1}
}{%
\end{new#1}
}%
}
\begin{document}
\begin{foo}
I want this to be New Foo.
\end{foo}
\begin{bar}
I want this to be New Bar.
\end{bar}
\end{document}
答案2
如果不使用,expl3
您可以使用:
\documentclass{minimal}
\usepackage{amsthm}
\let\bar\relax
% not necessary because we don't use \renewenvironment but define the macros used for the environment later
%\newtheorem{foo}{Foo}
%\newtheorem{bar}{Bar}
\newtheorem{newfoo}{New Foo}
\newtheorem{newbar}{New Bar}
\makeatletter
\@for\@env:=foo,bar\do{%
\expandafter\xdef\csname\@env\endcsname{%
This is a modified \@env\ environment:
\noexpand\begin{new\@env}}
\expandafter\xdef\csname end\@env\endcsname{\noexpand\end{new\@env}}
}
\makeatother
\begin{document}
\begin{foo}
I want this to be New Foo.
\end{foo}
\begin{bar}
I want this to be New Bar.
\end{bar}
\end{document}