我的场景是让用户覆盖中指定的默认选项myclass.cls
。
最小工作示例
\RequirePackage{filecontents}
\begin{filecontents*}{myclass.cls}
\ProvidesClass{myclass}[2017/05/23 version 0.0.0.1]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[]{article}
\RequirePackage[paperwidth=5cm,paperheight=3cm,hmargin=2mm,vmargin=2mm]{geometry}
\RequirePackage[many]{tcolorbox}
\AtBeginDocument{\begin{tcbitemize}[raster height=\textheight,raster columns=1,raster rows=1]}
\AtEndDocument{\end{tcbitemize}}
\pagestyle{empty}
\endinput
\end{filecontents*}
%\documentclass[paperwidth=4cm,paperheight=5cm]{myclass}% override the defaults
\documentclass{myclass}
\begin{document}
\tcbitem{A}
\tcbitem{B}
\tcbitem{C}
\end{document}
问题
如何覆盖用户定义类中指定的默认选项?
例如,
\documentclass[paperwidth=4cm,paperheight=5cm,]{myclass}
必须覆盖默认选项,但
\documentclass{myclass}
使用默认选项。
答案1
您可以使用普格福普特允许myclass.cls
接受/处理键值选项。为此,您需要设置一些鍵盤接受您想要支持的选项,这很简单:
\pgfkeys{/myclass/.is family, /myclass,
paperheight/.initial=3cm,
paperwidth/.initial=5cm,
hmargin/.initial=2mm,
vmargin/.initial=2mm,
}
这将使用您列出的默认值定义选项、 和paperheight
。paperwidth
然后您可以使用等访问键值。下面我定义了一个“辅助”宏来执行此操作。hmargin
vmargin
\pgfkeysvalueof{/myclass/paperheight}
\Myclass
下列的使用 pgfopts 时仅传递其他选项,您可以使用“未知密钥处理程序”将所有无法识别的选项传递给文章类,以递归方式构建传递给该类的“额外”选项。这些“额外选项”存储在宏中\extra@options
。
这是更新后的 MWE:
\RequirePackage{filecontents}
\begin{filecontents*}{myclass.cls}
\ProvidesClass{myclass}[2017/05/23 version 0.0.0.1]
\RequirePackage{pgfopts}
\def\extra@options{}% will hold "extra" options to pass to article
% set up supported options with default values
\pgfkeys{/myclass/.is family, /myclass,
paperheight/.initial=3cm,
paperwidth/.initial=5cm,
hmargin/.initial=2mm,
vmargin/.initial=2mm,
.unknown/.code={\edef\extra@options{\extra@options,\pgfkeyscurrentname}}
}
% helper for accessing values of options
\newcommand\Myclass[1]{\pgfkeysvalueof{/myclass/#1}}
\ProcessPgfOptions{/myclass}% process options
\LoadClass[\extra@options]{article}% load article class with options
% give settings to geometry
\RequirePackage[paperwidth=\Myclass{paperwidth},%
paperheight=\Myclass{paperheight},%
hmargin=\Myclass{hmargin},%
vmargin=\Myclass{vmargin},
]{geometry}
\RequirePackage[many]{tcolorbox}
\AtBeginDocument{\begin{tcbitemize}[raster height=\textheight,raster columns=1,raster rows=1]}
\AtEndDocument{\end{tcbitemize}}
\pagestyle{empty}
\endinput
\end{filecontents*}
%\documentclass[paperwidth=4cm,paperheight=5cm]{myclass}% override the defaults
\documentclass{myclass}
\begin{document}
\tcbitem{A}
\tcbitem{B}
\tcbitem{C}
\end{document}