如何使用 xkeyval 声明布尔开关?

如何使用 xkeyval 声明布尔开关?

我正在尝试编写一个恰当命名的包 xkeyvalisinsanelydifficult ,以便用户可以\usepackage将其作为 \usepackage{xkeyvalisinsanelydifficult}\usepackage[turnedon]{xkeyvalisinsanelydifficult},但(最好,如果可能的话)不作为 \usepackage[turnedon=42]{xkeyvalisinsanelydifficult} (只是因为在这个包的情况下这没有多大意义)。

内容xkeyvalisinsanelydifficult.sty

\ProvidesPackage{xkeyvalisinsanelydifficult}[2022/07/22]
\RequirePackage{xkeyval}

\newcommand{\somesimplecommand}{nothing at all}
\define@boolkey{myfamily}{turnedon}{}
\ProcessOptionsX\relax

\ifKV@myfamily@turnedon
  \def\somesimplecommand{ON}
\else
  \def\somesimplecommand{OFF}
\fi

内容sample.tex

\documentclass{article}
\usepackage{xkeyvalisinsanelydifficult}


\begin{document}
Hello, it's turned \somesimplecommand!

\end{document}

sample.tex第二行是 时\usepackage{xkeyvalisinsanelydifficult},一切顺利:文档编译并读取“您好,它已关闭!” (这是预料之中的,因为xkeyval文档指出使用 将 \define@boolkey布尔值初始化为false\newif

sample.tex第二行是 时\usepackage[turnedon]{xkeyvalisinsanelydifficult},文档无法编译,并出现以下错误: ERROR: LaTeX Error: Unknown option 'turnedon' for package 'xkeyvalisinsanelydifficult'.

如何重写这些文件,使得如果第二行是sample.tex\usepackage[turnedon]{xkeyvalisinsanelydifficult}它会编译并读取“你好,它已打开!”?

答案1

将内容更改 xkeyvalisinsanelydifficult.sty 为:

\ProvidesPackage{xkeyvalisinsanelydifficult}[2022/07/22]
\RequirePackage{xkeyval}

\newcommand{\somesimplecommand}{nothing at all}
\define@boolkey{myfamily}{turnedon}[true]{}
\ProcessOptionsX<myfamily>\relax

\ifKV@myfamily@turnedon
  \def\somesimplecommand{ON}
\else
  \def\somesimplecommand{OFF}
\fi

这将产生turnedon所需的行为:

  • \usepackage{xkeyvalisinsanelydifficult}: 错误的
  • \usepackage[turnedon=false]{xkeyvalisinsanelydifficult}: 错误的
  • \usepackage[turnedon]{xkeyvalisinsanelydifficult}: 真的
  • \usepackage[turnedon=true]{xkeyvalisinsanelydifficult}: 真的
  • \usepackage[turnedon=X]{xkeyvalisinsanelydifficult},其中X是除true或之外的任何内容falseERROR: Package xkeyval Error: value 'X' is not allowed

相关内容