如何将一个环境定义为另一个由宏指定名称的环境?

如何将一个环境定义为另一个由宏指定名称的环境?

假设我希望定义一个mynewenv与现有环境完全相同的新环境myenv**,但名称是在中给出的\testmacro。我该如何获取价值\testmacro做出定义时?

下面是 MWE。

\documentclass{article}

\ExplSyntaxOn

\def\testmacro{myenv**}

\NewDocumentEnvironment { myenv** } { O{} }
  { My }
  { Env }

\NewDocumentEnvironment { mynewenv } { O{} }
  {
    \expandafter \begin \expandafter { \testmacro }
  }
  {
    \expandafter \end \expandafter { \testmacro }
  }

\ExplSyntaxOff

\def\testmacro{cleared} % This shouldn't affect "mynewenv"

\begin{document}

\begin{mynewenv}
  
\end{mynewenv}

Text in case of empty.

\end{document}

答案1

你想让环境的主体有\begin{test**}所以在定义之前需要进行扩展,我ee在这里使用了一种变体。

\documentclass{article}

\ExplSyntaxOn

\def\testmacro{myenv**}

\NewDocumentEnvironment { myenv** } { O{} }
  { My }
  { Env }

\cs_new:Nn\my_def_env:nn{
\NewDocumentEnvironment { #1 } { O{} }
  {
    \begin { #2 }
  }
  {
    \end { #2 }
  }
}

\cs_generate_variant:Nn \my_def_env:nn {ee}

\my_def_env:ee  {mynewenv} { \testmacro}

\ExplSyntaxOff

\def\testmacro{cleared} % This shouldn't affect "mynewenv"

\begin{document}

\begin{mynewenv}
  
\end{mynewenv}

Text in case of empty.

\end{document}

相关内容