如何将未知值传递给 pgfkeys 中的选择键?

如何将未知值传递给 pgfkeys 中的选择键?

为什么这里的未知键值的参数值没有传递给我的代码?

\documentclass{article}
\usepackage{pgfkeys}

\makeatletter
\def\ae@size{2cm}
\pgfkeys{/ae/example/.cd,
  size/.is choice,
  size/small/.code=\def\ae@size{I am small},
  size/medium/.code=\def\ae@size{I am medium},
  size/large/.code=\def\ae@size{I am large},
  size/.unknown/.code={\typeout{UNKNOWN  ----> #1}\def\ae@size{I am customized to#1}},
}
\newcommand\problem[1]{%%
  \pgfkeys{/ae/example/.cd,#1}%%
  \ae@size  
  \par
}
\makeatother
\begin{document}

\problem{size=small}
\problem{size=medium}
\problem{size=large}
\problem{size=a different size}

\end{document}

在此处输入图片描述

答案1

处理.is choice程序基本上做两件事。

在您的情况下,它size会像您执行的操作一样设置密钥:

size/.style={/ae/example/size/#1}

然而,在size/#1执行该样式 ( ) 之前,参数#1被保存在中\pgfkeys@was@choice

这个宏\pgfkeys@was@choice然后在代码的定义中使用size/.unknown来给出适当的错误消息。

.unknown当然,你可以覆盖该处理程序来执行操作。在这种情况下,你可以使用\pgfkeys@was@choice处理程序来执行操作。在这种情况下,您可以使用。您也可以使用\pgfkeyscurrentname

.is choice如果有人滥用密钥,比如使用以下类似方法,就可以看出区别:

size={unknown=arg}

\pgfkeyscurrentname将给出unknown(只是键名),\pgfkeys@was@choice将扩展为unknown=arg#1您在定义中使用的.unknown将是arg

由于键名只能由可扩展内容组成,因此您可以安全地\edef \pgfkeys@was@choice\pgfkeyscurrentname。这也意味着,您不能执行size=a \emph{different} size。(可能的、不寻常的#1。(当然\edef可能包含任何内容,但我无论如何都在此示例中使用它。)

代码

\documentclass{article}
\usepackage{pgfkeys}
\makeatletter
\def\ae@size{2cm}
\pgfkeys{/ae/example/.cd,
  size/.is choice,
  size/small/.code=\def\ae@size{I am small},
  size/medium/.code=\def\ae@size{I am medium},
  size/large/.code=\def\ae@size{I am large},
  size/.unknown/.code=%
    \edef\ae@size{I am customized to ``\pgfkeys@was@choice''. Argument: ``#1''}}
\newcommand\problem[1]{%%
  \pgfkeys{/ae/example/.cd,#1,because/.code=}%%
  \ae@size\par}
\makeatother
\begin{document}
\problem{size=small}
\problem{size=medium}
\problem{size=large}
\problem{size=a different size}
\problem{size={Where is my=argument?}}
\end{document}

输出

在此处输入图片描述

相关内容