用户定义的类:
\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}