我正在尝试为我的一些 LaTeX 命令和环境制作一个包。我遇到的问题是包需要采用一个数值,如果未设置,则该数值具有默认值。所以我希望能够写:
\usepackage[XXXX]{myPackage}
或者
\usepackage[val=XXXX]{myPackage}
其中 XXXX 是从 0000 至 9999 的任意 4 位数字。
我查看过 kvoptions,但从我见过的例子中,我还没能弄清楚如何做到这一点。所以我需要的是:
- 我的包采用数值或键值对的一种方法。
- 检查值是否介于 0000 至 9999 之间的方法
答案1
该xkeyval
包设置了一组与该包同名的键。
对于这个家庭密钥可以定义,如
\define@key{mypackage.sty}{val}[100]{%
\ifnum#1 < -1
\GenericError{Error!}{The value is not in the correct range}{See blabla}{or other blabla}
\fi
\ifnum#1 > 10000
\GenericError{Error!}{The value is not in the correct range}{See blabla}{or other blabla}
\fi
\def\kvmypackage@val{#1}%
}
包裹代码:
\ProvidesPackage{mypackage}
\RequirePackage{xkeyval}
\define@key{mypackage.sty}{val}[100]{%
\ifnum#1 < -1
\GenericError{Error!}{The value is not in the correct range}{See blabla}{or other blabla}
\fi
\ifnum#1 > 10000
\GenericError{Error!}{The value is not in the correct range}{See blabla}{or other blabla}
\fi
\def\kvmypackage@val{#1}%
}
\ExecuteOptionsX{val} % Provide the default value (100 here)
\ProcessOptionsX%
\newcommand{\ValueOfVal}{%
\kvmypackage@val%
}
\endinput
指令\ifnum...
检查 范围内的值[0...9999]
,同时\kvmypackage@val{#1}
定义为稍后具有键值——这个accessing
宏的名称基本上是任意的,但它应该易于记忆,并且最好在其名称中包含键的名称,例如\kvmypackage@val
。
给出宏\ValueOfVal
是为了方便获取值而不需要\makeatletter...\makeatother
调用文档:
\documentclass{article}
\usepackage[val=256]{mypackage}
\begin{document}
Value of val is \ValueOfVal
\end{document}
答案2
解决方案使用kvoptions
默认值由宏“\myPackage@val@default”配置。如果该值超出范围,则给出错误消息,并将该值设置为默认值。
包选项中可以省略前导零,但宏\theMyPackageVal
被标准化为显示四位数字。
打包文件myPackage.sty
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{myPackage}[2016/04/03]
\RequirePackage{kvoptions}
\SetupKeyvalOptions{
family=myPackage,
prefix=myPackage@,
}
\newcommand*{\myPackage@val@default}{1234}
\DeclareStringOption[\myPackage@val@default]{val}
\AddToKeyvalOption*{val}{%
% Error checks
\ifnum\myPackage@val<0 %
\PackageError{myPackage}{%
Negative value (\myPackage@val) for option `val'%
}{%
The range for option `val' is 0000 to 9999.\MessageBreak
\@ehc
}%
\let\myPackage@val\myPackage@val@default
\else\ifnum\myPackage@val>9999 %
\PackageError{myPackage}{%
Too large value (\myPackage@val) for option `val'%
}{%
The range for option `val' is 0000 to 9999.\MessageBreak
}%
\let\myPackage@val\myPackage@val@default
\fi\fi
}
\ProcessKeyvalOptions*
% Normalization
\edef\theMyPackageVal{%
\ifnum\myPackage@val<1000 0\fi
\ifnum\myPackage@val<100 0\fi
\ifnum\myPackage@val<10 0\fi
\number\myPackage@val
}%
\endinput
测试文件:
\documentclass{article}
\usepackage[val=567]{myPackage}
\begin{document}
val=\theMyPackageVal
\end{document}