总结
为什么无法设置pgfkeys
密钥\pgfkeysnovalue
?
\pgfkeys{
/foo/bar/.initial=\pgfkeysnovalue,
% ...
% This will not work
/foo/bar=\pgfkeysnovalue
}
主要问题
我无法理解 的问题pgfkeys
。我想要一个可以自行重置的选项。我想使用宏\pgfkeysnovalue
:如果没有将值传递给键,则应该是\pgfkeysnovalue
,否则为相应的值。
这没有按预期工作,所以我将其分解为 MWE。我将代码放在下面。
这里,/foo
是某个命名空间,/foo/bar
是所讨论的参数。使用\testCall{}
它可以添加可选参数bar=...
来设置该调用的值。
调用时,当前值存储在宏中\mymacro
并输入出来。
运行 MWE 时得到以下结果:
Result:
Result: 3
Result: 2
Result: 3
3
Result: 3
Result: 3
Result: 2
Result: 3
注意第一个块正如预期的那样:\pgfkeysnovalue
被扩展为空字符串。然后在第一次运行期间,该值被重置(此处为以3
显示问题),这在第二行和第四行输出。在第三行中,默认值被覆盖。
奇怪的是3
第五行输出了。那应该是一个纯赋值。
从第六行开始,我们期望相同的块会重复出现。但是第二个块的第一行有所不同,显然 3 仍存储在密钥中。
当用MWE 中的注释中指出的替换\pgfkeys
第五行的调用时,它可以按预期工作。\pgfkeyssetvalue
为什么\pgfkeys
这里不能用?
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
/foo/.is family,/foo,
bar/.initial=\pgfkeysnovalue,
call/.code={
\pgfkeysalso{
/foo,
bar/.get=\mymacro,
% This should be \pgfkeysnovalue but here for sake of presentation some dummy value "3"
bar=3,
}
Result: \mymacro \par
}
}
\newcommand{\testCall}[1]{\pgfkeys{/foo,#1,call}}
\begin{document}
\testCall{}
\testCall{}
\testCall{bar=2}
\testCall{}
\pgfkeys{/foo/bar=\pgfkeysnovalue}
% \pgfkeyssetvalue{/foo/bar}{\pgfkeysnovalue}
\testCall{}
\testCall{}
\testCall{bar=2}
\testCall{}
\end{document}
答案1
我刚刚被转发到这个PGF 源代码的改变。
似乎为了更简单地读取值,现在允许使用 来获取值\pgfkeys{/foo/bar}
。后者在内部被解析为 ,它\pgfkeys{/foo/bar=\pgfkeysnovalue}
被重新定义为输出键的内容的特殊情况/foo/bar
。
我最终使用了一个专用的方法\newif
来设置一个标志,以决定是否使用该参数。如下所示:
\newif\ifbarpresent
\pgfkeys{
/foo/bar present/.is if=barpresent,
/foo/bar value/.initial=0,
/foo/bar/.style={
/foo/bar present=true,
/foo/bar value=#1
}
}
我确实使用了它
\ifbarpresent
The value of bar: \pgfkeys{/foo/bar value}
\fi