总结

总结

总结

为什么无法设置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

相关内容