我已经列出dvipsnames
(或其他选项),\LoadClass
希望我不需要dvipsnames
在中指定(或其他选项)\documentclass
。
显然,这并不像我预期的那样工作。这意味着,我需要dvipsnames
在中指定\documentclass
,即使此选项已在中默认指定\LoadClass
。看起来在中定义的选项\LoadClass
被忽略了。
平均能量损失
\begin{filecontents}{dummy.cls}
%\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{dummy}[2015/10/21 v 0.01 description]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[% the default options
dvipsnames,
12pt,
]{article}
\RequirePackage{xcolor}
\def\test{\textcolor{Red}{It is a test.}}
\endinput
\end{filecontents}
% try remove dvipsnames
\documentclass[dvipsnames]{dummy}
\begin{document}
\test
\end{document}
问题
创建用户定义类时定义默认选项的正确方法是什么?
答案1
这些选项不会成为全局选项,因此它们不会传递给每个已加载的包;因此,如果您希望它成为全局的,则\LoadClass
必须手动添加。dvipsnames
该选项dvipsnames
未在中定义article.cls
,因此它不执行任何操作,但也不会引发错误,这是因为选项是在类文件中处理的方式。
\ProvidesClass{dummy}[2015/10/21 v 0.01 description]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[% the default options
12pt,
]{article}
\@expandtwoargs\in@{dvipsnames}{\@classoptionslist}
\ifin@
% dvipsnames has been used as a global option by the user, do nothing
\else
% append dvipsnames to the list of global options
\ifx\@classoptionslist\@empty
\g@addto@macro\@classoptionslist{dvipsnames}
\else
% with a comma if the list is not empty
\g@addto@macro\@classoptionslist{,dvipsnames}
\fi
\fi
\RequirePackage{xcolor}
\def\test{\textcolor{Red}{It is a test.}}
\endinput
现在调用\documentclass{dummy}
或\documentclass[dvipsnames]{dummy}
将导致\@classoptionslist
包含dvipsnames
,因此在加载时将xcolor
选项dvipsnames
传递给它。
然而,我不确定这是否是一件好事。