将参数扩展为 \begin

将参数扩展为 \begin

我有一些环境foobar我想用环境替换它们,newfoonewbar在环境前添加“这是一个修改过的 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。我曾尝试在那里添加\expandafters,但没有成功,但我没能让它工作。我也尝试过通过使用来规避它

\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}

相关内容