在宏中重新定义环境

在宏中重新定义环境

你好,我是 LaTeX 编程新手。

在格式化我的文档时,我发现如果我可以修改定理环境(使用阿姆斯特丹包)。所以我尝试了以下代码

\makeatletter
\newcount\@envcount
\newcommand{\enclosebox}[2]{%
    % Create copies of old environments
    \expandafter\let\expandafter\@old\csname #1\endcsname%
    \expandafter\let\expandafter\@oldend\csname end#1\endcsname%
    % Redefine environment using old ones.
    \renewenvironment{#1}[1][]{%
        \@nameuse{@old}[##1]%
        \begin{#2}%
    }{%
        \end{#2}%
        \@nameuse{@oldend}%
    }%
}
\makeatother

此命令将新环境(名称为 #2)插入到原始环境(名称为 #1)。这样,我可以像这样修改定理环境:

 \newtheorem{theorem}{Theorem}
 \enclosebox{theorem}{<some box environment>}

问题是,每当我调用命令时,令牌\@old和都会被覆盖。例如,\@oldend\enclosebox

 \enclosebox{theorem}{shadebox}
 \enclosebox{definition}{shadebox}
 \enclosebox{example}{leftbar}

覆盖我旧的定义和定理环境,结果如下:

在此处输入图片描述

因此我尝试使用\csname ~ \endcsname动态分配名称,但编译器只是吐出一堆错误。

当然,我可以通过粘贴多份代码并手动修改每个代码来解决这个问题......但我这样做只是为了避免这种笨拙的解决方案。

我不知道如何修复我的代码。你能帮助我吗?

答案1

有关原始framed包的解决方案,请参见下文

作为一个现成的替代方案,framed我建议你使用\surroundwithmdframedmdframed这是专门为此目的而设计的:

\documentclass{article}
\usepackage{xcolor}
\usepackage{amsthm}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{lipsum}

\newtheorem{theorem}{Theorem}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\theoremstyle{remark}
\newtheorem{example}{Example}

\surroundwithmdframed[hidealllines=true,backgroundcolor=gray!30]{theorem}
\surroundwithmdframed[backgroundcolor=red,backgroundcolor=cyan!30]{definition}
\surroundwithmdframed[backgroundcolor=red,backgroundcolor=orange!30,roundcorner=10pt]{example}

\begin{document}


\begin{theorem}
\lipsum[4]
\end{theorem}

\begin{definition}
\lipsum[4]
\end{definition}

\begin{example}
\lipsum[4]
\end{example}

\end{document}

在此处输入图片描述

这里有一个使用framedetoolbox包来轻松定义你的命令的可能性\enclosebox

\documentclass{article}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{amsthm}
\usepackage{framed}
\usepackage{lipsum}

\colorlet{shadecolor}{gray!30}

\newcommand\enclosebox[2]{%
  \BeforeBeginEnvironment{#1}{\begin{#2}}%
  \AfterEndEnvironment{#1}{\end{#2}}%
}

\newtheorem{theorem}{Theorem}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\theoremstyle{remark}
\newtheorem{example}{Example}

\enclosebox{theorem}{framed}
\enclosebox{example}{shaded}
\enclosebox{definition}{leftbar}

\begin{document}

\begin{theorem}
\lipsum[4]
\end{theorem}

\begin{definition}
\lipsum[4]
\end{definition}

\begin{example}
\lipsum[4]
\end{example}

\end{document}

在此处输入图片描述

相关内容