最小工作示例

最小工作示例

我的场景是让用户覆盖中指定的默认选项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,
}

这将使用您列出的默认值定义选项、 和paperheightpaperwidth然后您可以使用等访问键值。下面我定义了一个“辅助”宏来执行此操作。hmarginvmargin\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}

相关内容