我有一个doc.tex
和一个myclass.cls
文件,并试图尽可能保持第一个文件的干净。
我需要定义myclass.cls
一些宏来使用并且仅在两个环境内可见:algorithm
和clase
(最后一个只是的修改algorithm
)。
我的类名.cls
...
\usepackage[ruled,vlined,spanish,onelanguage]{algorithm2e}
\makeatletter
\newcounter{clase}
\newenvironment{clase}[1][htb]{%
\renewcommand{\algorithmcfname}{Clase}% Update algorithm name
\let\c@algocf\c@clase% Update algorithm counter
\begin{algorithm}[#1]%
}{\end{algorithm}}
\makeatother
...
文档
...
\begin{document}
...
\begingroup
\definecolor{green2}{RGB}{0,156,0}
\newcommand\true{\textcolor{red2}{$true$}}
\newcommand\store{\textcolor{green2}{$store()$}}
% And 40+ others like these
% I want them in myclass.cls and avoid that \begingroup
\begin{clase}
% Defined macros are visible here
\end{clase}
\paragraph{Another stuff} I don't need the macros to be visible here
\begin{algorithm}
% also visible here
\end{algorithm}
\endgroup
...
答案1
如果只针对某个环境进行代码更改,那么有时\AtBeginEnvironment
是一个更好的选择\patchcmd
,但这取决于实际应用。
由于\renewcommand
不是全局的,在环境内改变的宏的含义不会泄漏到外面,所以\AtBeginEnvironment
是一个合适的选择。
我把原帖的例子简化为最小的例子,用于一些虚假的环境foo
。(当然,在现实世界的例子中,环境通常不会在同一个文件中定义,然后用进行更改\AtBeginEnvironment
)
\documentclass{article}
\newcommand{\foobar}{This is foobar}
\newenvironment{foo}{%
\bfseries\foobar
}{}
\usepackage{etoolbox}
\AtBeginEnvironment{foo}{%
\renewcommand{\foobar}{This is foobar inside foo}%
}{}
\begin{document}
Foobar before foo: \foobar
\begin{foo}
Hello World
\end{foo}
Foobar after foo: \foobar
\end{document}