为包裹赋予数值

为包裹赋予数值

我正在尝试为我的一些 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}

结果:val=0567

相关内容