根据文章类定义类时发生名称冲突

根据文章类定义类时发生名称冲突
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{funny-class}

%%

% Pass any options to the underlying class.
\DeclareOption*{%
  \PassOptionsToClass{\CurrentOption}{article} % (could be another class)
}

% Options for this class.
\DeclareOption{fun}{%
  \def\contentsname{Blarg, blarg, blarg}%
}


% Defaults.
\ExecuteOptions{fun}

% Now execute any options passed in
\ProcessOptions\relax

% Load underlying class.
\LoadClass{article}

article当类尝试定义时,LaTeX 会发出抱怨\contentsname

\newcommand\contentsname{Contents}

当我尝试在进行选项处理之前加载该类时,LaTeX 当然会抱怨。

解决这个问题的最佳方法是什么?理想情况下,我希望尽可能坚持我原来的想法,因为我确信有更好的方法来完成我想做的事情(比如弄清楚如何利用 Babel 等)。

答案1

您不应该定义该类article稍后也会定义的宏。这些宏要么无论如何都会被再次覆盖,要么会抛出“宏已定义”错误。您需要将这些修改延迟到加载基类之后。通常,这可以通过仅修改选项代码中的 if-switch 来完成,然后仅当此 switch 为真时才执行某些代码:

\newif\ifmyclass@myoption% false at first
\DeclareOption{someoption}{\myclass@myoptiontrue}
..
\ProcessOptions\relax

\LoadClass{article}
..
\ifmyclass@myoption
   code active only for this option
\fi

在您的具体情况下我只需使用\AtEndOfClass

\DeclareOption{fun}{%
  \AtEndOfClass{\def\contentsname{Blarg, blarg, blarg}}%
}

相关内容