如何在我的类文件中仅为算法环境定义宏

如何在我的类文件中仅为算法环境定义宏

我有一个doc.tex和一个myclass.cls文件,并试图尽可能保持第一个文件的干净。

我需要定义myclass.cls一些宏来使用并且仅在两个环境内可见:algorithmclase(最后一个只是的修改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}

在此处输入图片描述

相关内容