你好,我是 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
我建议你使用\surroundwithmdframed
mdframed
这是专门为此目的而设计的:
\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}
这里有一个使用framed
和etoolbox
包来轻松定义你的命令的可能性\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}