如何使用 \begin{xxx} … \end{xxx} 重新定义环境,同时保持相同的语法?

如何使用 \begin{xxx} … \end{xxx} 重新定义环境,同时保持相同的语法?

假设我们有一个如下使用的环境:

\begin{foo}
... code in here
\end{foo}

并且,在不改变文档中的上述语法的情况下,我们想重新定义环境的作用foo

例如,假设我们想要包装foobar,以便影响上述代码如下:

\begin{bar}
    \begin{foo}
... code in here
    \end{foo}
\end{bar}

例如,在这篇文章中建议我们可以做以下事情:

\let\OldFoo\foo

% in the minimal redefinition case
\renewcommand{\foo}[1]{\OldFoo#1\endfoo}

% in the wrapping w/ bar case
\renewcommand{\foo}[1]{\begin{bar}\OldFoo#1\endfoo}\end{bar}}

这将使我们能够执行以下操作:

\foo{ ... code in here }

然而,这不是我们想要的语法——它本质上是一个新\foo命令,而不是重新定义\begin{foo}...\end{foo}


我的尝试如下:

\let\origfoo\foo
\let\origendfoo\endfoo

\renewcommand{\foo}[1]{
  \begin{bar}
  \origfoo{#1}
}

\renewcommand{\endfoo}[0]{
  \origendfoo
  \end{bar}
}

...但它似乎不起作用。

对于如何做到这一点您有什么想法吗?

PS 附加问题:我不明白这\endfoo是什么意思。LaTeX中的\end{foo}语法简写是\endfoo

答案1

\begin在 LaTeX 中,环境由两个宏组成(加上由和添加的一些代码 \end)。\newenvironment和定义这两个命令。 下面保存和\renewenvironment的值,并使用这些值定义另一个版本的环境,该版本也包含和的代码。\Foo\endFooFoo\begin\endBar

\documentclass[]{article}

\newenvironment{Foo}
  {%
    \itshape
    \ignorespaces
  }
  {%
    \ifhmode\unskip\fi
  }

\newenvironment{Bar}
  {%
    \bfseries
    \ignorespaces
  }
  {%
    \ifhmode\unskip\fi
  }

\begin{document}
\begin{Bar}
  Test this
\end{Bar}
\begin{Foo}
  Test this
\end{Foo}
\begin{Bar}
  \begin{Foo}
    Test this
  \end{Foo}
\end{Bar}

\let\FooOrig\Foo
\let\endFooOrig\endFoo
\renewenvironment{Foo}
  {%
    \Bar
    \FooOrig
  }
  {%
    \endFooOrig
    \endBar
  }%
\begin{Foo}
  Test this
\end{Foo}

\end{document}

enter image description here

相关内容