xkeyval 的 \presetkeys

xkeyval 的 \presetkeys

请问有什么办法可以避免键值包裹在无限循环中爆炸,如以下简化的情况所暗示的那样?

\documentclass{article}
\usepackage{xkeyval}
\makeatletter
\define@key{fam}{key1}[key1-def]{\def\x##1{#1*##1}}
\define@cmdkey{fam}[store@]{key2}[key2-def]{\setkeys{fam}{key1=#1}}
%\define@key{fam}{key3}[key3-def]{\def\keyvalue{#1}}
\presetkeys{fam}{key2=val2}{}
\setkeys{fam}{key1}
\makeatother

\begin{document}
x
\end{document}

我得到“如果你真的需要更多容量,你可以请一位巫师来扩大我。”

答案1

我和 Hendri Adriaens(键值软件包)同意以下补丁确实解决了问题。我们还同意合作整合键值龙腾斯基瓦尔包装成键值对,如果我们有空闲时间的话。

\def\XKV@badsetkeys{%
  \@latex@error{You can't nest \noexpand\setkeys in preset keys.
    \MessageBreak That could cause an endless loop}\@ehd
}
\let\XKV@savsetkeys\setkeys
\def\XKV@usepresetkeys#1#2{%
  \XKV@presettrue
  \let\setkeys\XKV@badsetkeys
  \XKV@for@eo\XKV@fams\XKV@tfam{%
    \XKV@makehd\XKV@tfam
    \XKV@ifundefined{XKV@\XKV@header#2}{}{%
      \XKV@toks\expandafter\expandafter\expandafter
        {\csname XKV@\XKV@header#2\endcsname}%
      \@expandtwoargs\XKV@s@tkeys{\the\XKV@toks}%
        {\XKV@naa\ifx\XKV@naa\@empty\else,\fi#1}%
    }%
  }%
  \let\setkeys\XKV@savsetkeys
  \XKV@presetfalse
} 

相关内容