如何编写一个接受可选键值对的类?

如何编写一个接受可选键值对的类?

用户定义的类:

\ProvidesClass{preview}[2012/12/15 v 0.01 class for creating a tight PSTricks diagram]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[]{article}
\RequirePackage{pstricks}
\RequirePackage[tightpage,active]{preview}
\PreviewEnvironment{pspicture}
\endinput

消费者的输入文件:

\documentclass[PreviewBorder=12pt]{preview}% the option will set \PreviewBorder=12pt.

\begin{document}
\begin{pspicture}[showgrid=true](-2,-2)(2,2)
\end{pspicture}
\end{document}

如何编写一个接受可选键值对的类来设置PreviewBorder如代码片段所示? 笔记:该键的默认值为0pt


我不接受现有答案的原因是:

因为默认值没有按预期工作。请尝试以下代码,看看红色矩形周围是否仍然有一条细细的白色填充(CSS 术语)。

\begin{filecontents}{preview.cls}
\ProvidesClass{preview}[2012/12/15 v 0.01 class for creating a tight PSTricks
diagram]
\RequirePackage{scrbase}
\DefineFamily{preview}
\DefineFamilyMember{preview}
\DefineFamilyKey{preview}{PreviewBorder}[0pt]{%
  \if@atdocument% before or after \begin{document}?
    \expandafter\@firstofone% after \begin{document} do it just now
  \else
    \expandafter\AtEndOfClass% \PreviewBorder first defined after loading
                            % preview package!
  \fi{\setlength{\PreviewBorder}{#1}}%
}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\FamilyProcessOptions{preview}
\LoadClass{article}
\RequirePackage{pstricks}
\RequirePackage[tightpage,active]{preview}
\PreviewEnvironment{pspicture}
\endinput
\end{filecontents}

%\documentclass{preview}%default value 0pt does not work!
\documentclass[PreviewBorder=0pt]{preview}% works as expected.

\begin{document}
\begin{pspicture}(-2,-2)(2,2)
\psframe[linecolor=red](-2,-2)(2,2)
\end{pspicture}

\end{document}

换句话说,我想要两者

\documentclass{preview}

\documentclass[PreviewBorder=0pt]{preview}

产生没有边界的相同结果。

答案1

您需要区分初始值(即使从未使用过该键也会设置)和默认值(如果未指定任何值,则使用该值)。在您的示例中,您似乎想要一个初始值,而不是默认值。有几个包可以满足您的要求:我可能会使用kvoptions对于这个相对简单的情况。

\begin{filecontents}{preview.cls}
\ProvidesClass{preview}[2012/12/15 v 0.01 class for creating a tight PSTricks
diagram]
\RequirePackage{kvoptions}
\DeclareStringOption[0 pt]{PreviewBorder}
\ProcessKeyvalOptions*
\LoadClass{article}
\RequirePackage{pstricks}
\RequirePackage[tightpage,active]{preview}
\PreviewEnvironment{pspicture}
\AtEndOfClass{\setlength{\PreviewBorder}{\preview@PreviewBorder}}
%\AtEndOfClass{\showthe\PreviewBorder}
\end{filecontents}

\documentclass{preview}%default value 0pt does not work!
%\documentclass[PreviewBorder=0pt]{preview}% works as expected.

\begin{document}
    \begin{pspicture}(-2,-2)(2,2)
    \psframe[linecolor=red](-2,-2)(2,2)
    \end{pspicture}
\end{document}

您会发现我只设置了一次长度:似乎没有必要以其他方式设置它。

答案2

这是一个使用的小例子数据库

\begin{filecontents}{preview.cls}
\ProvidesClass{preview}[2012/12/15 v 0.01 class for creating a tight PSTricks
diagram]
\RequirePackage{scrbase}
\DefineFamily{preview}
\DefineFamilyMember{preview}
\DefineFamilyKey{preview}{PreviewBorder}[0pt]{%
  \if@atdocument% before or after \begin{document}?
    \expandafter\@firstofone% after \begin{document} do it just now
  \else
    \expandafter\AtEndOfClass% \PreviewBorder first defined after loading
                            % preview package!
  \fi{\setlength{\PreviewBorder}{#1}}%
}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\FamilyProcessOptions{preview}
\LoadClass{article}
\RequirePackage{pstricks}
\RequirePackage[tightpage,active]{preview}
\PreviewEnvironment{pspicture}
\endinput
\end{filecontents}

\documentclass[PreviewBorder=12pt,twoside]{preview}

\begin{document}
\begin{pspicture}[showgrid=true](-2,-2)(2,2)
\end{pspicture}

And you may even change the value inside the document:

\FamilyOptions{preview}{PreviewBorder=5cm}
\begin{pspicture}[showgrid=true](-2,-2)(2,2)
\end{pspicture}

\end{document}

我这样做是因为您可能会发现很多有关使用所有其他包的信息,但很少有关于使用的信息scrbase

答案3

我不知道您在哪里使用 \PreviewBorder 长度,但这是我要做的事情。

\RequirePackage{xkeyval}
\newlength{\preview@border}
\setlength{\preview@border}{0pt}
\DeclareOptionX{PreviewBorder}[0pt]{\setlength{\preview@border}{#1}
\ProcessOptionsX

稍后在代码中使用长度 \preview@border。请注意,默认值是在\setlength宏中设置的。[0pt]选项声明中使用的只是当用户指定没有值的键时要提供的值。

  • \usepackage{preview}导致边框为 0pt。
  • \usepackage[PreviewBorder]{preview}导致边框为 0pt。
  • \usepackage[PreviewBorder=10pt]{preview}导致边框为 10pt。

编辑。这是工作示例。感谢您的修正。课程:

\ProvidesClass{p}
\LoadClass{article}
\RequirePackage{xkeyval}
\newlength{\preview@border}
\setlength{\preview@border}{0pt}
\DeclareOptionX{PreviewBorder}[0pt]{\setlength{\preview@border}{#1}}
\ProcessOptionsX

\def\myborder{\the\preview@border}

现在,使用类“p”LaTeX 文件:

\documentclass[PreviewBorder=10pt]{p}
\begin{document}
The border is \myborder

\end{document}

相关内容