RequirePackage 和 usepackage 的行为不同

RequirePackage 和 usepackage 的行为不同

我使用 pdflatex 设计考试,其中应包含代码示例。在讲义中,我成功地使用了列表包。一般设计是通过考试文檔類別。

我创建了自己的课程文件,扩展了考试课程文件并将选项引导至考试课程。

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{exam}}
\DeclareOption{answers}%
    {%
        ...
        \PassOptionsToClass{\CurrentOption}{exam}%pass option to exam
    }
\ProcessOptions
\LoadClass[a4paper,12pt,oneside,openany,\droptnm]{exam}

这个类定义了一个特殊的预定义格式列表并处理问题。因此,我的“私人”考试课想使用

\RequirePackage{listings}
\RequirePackage{probsoln}

不幸的是,这会导致以以下内容开头的错误消息:

! LaTeX Error: Command \abovecaptionskip already defined.
...
! LaTeX Error: Command \belowcaptionskip already defined.
...
! LaTeX Error: Command \solution already defined.
...

主考试文档中的以下代码有效:

\usepackage{listings}
\usepackage{probsoln}

当我查找信息源时,我收集到的信息是RequirePackage和与之前允许但不允许usepackage的差异相同。RequirePackagedocumentclassusepackage

有人能告诉我为什么RequirePackage这里的类文件不起作用吗?

答案1

这里的一个问题是 和 都probsoln定义examsolution环境。但是,probsoln只有在环境不存在时才会定义它。如果你probsoln先加载,它会定义solution环境,因为它未定义。然后你加载exam,它也会尝试定义solution环境,这就是导致错误的原因Command \solution already defined.

放置的位置\RequirePackage取决于您何时需要该包中定义的命令。例如,如果您的类选项需要使用xkeyval(或类似的东西),您需要在选项之前加载该包,但如果基本类命令需要在任何包含的包中的命令之前定义,那么这些包需要在之后加载\LoadClass

相关内容