![如何使用 \begin{xxx} … \end{xxx} 重新定义环境,同时保持相同的语法?](https://linux22.com/image/382196/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20%5Cbegin%7Bxxx%7D%20%E2%80%A6%20%5Cend%7Bxxx%7D%20%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%9D%E6%8C%81%E7%9B%B8%E5%90%8C%E7%9A%84%E8%AF%AD%E6%B3%95%EF%BC%9F.png)
假设我们有一个如下使用的环境:
\begin{foo}
... code in here
\end{foo}
并且,在不改变文档中的上述语法的情况下,我们想重新定义环境的作用foo
。
例如,假设我们想要包装foo
在bar
,以便影响上述代码如下:
\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
\endFoo
Foo
\begin
\end
Bar
\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}