![如何将未知值传递给 pgfkeys 中的选择键?](https://linux22.com/image/280891/%E5%A6%82%E4%BD%95%E5%B0%86%E6%9C%AA%E7%9F%A5%E5%80%BC%E4%BC%A0%E9%80%92%E7%BB%99%20pgfkeys%20%E4%B8%AD%E7%9A%84%E9%80%89%E6%8B%A9%E9%94%AE%EF%BC%9F.png)
为什么这里的未知键值的参数值没有传递给我的代码?
\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}