我正在这样做:
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
/foo/.is family,
/foo,
a/.estore in = \bar,
a/.default = bye,
a
}
\newcommand\go[1]{
\pgfkeys{/foo, #1}
\bar
}
\begin{document}
\go{a=hello}
\go{}
\end{document}
我期望输出有hello
和 然后bye
,但它打印了hello
两次。为什么?
答案1
喜欢@egreg 说分配是本地的,并.default
设置一个值,如果没有提供值则使用该值。
一种常见的(通常是好的)做法是在您自己的宏中将一个组放在您的用法周围,这样一次调用的本地分配就不会影响另一个调用,并且会导致预期的行为(另一个选择是@egreg 所做的,不使用组并在每次调用时恢复默认值)。
因此,以下内容也适用于您的使用(像@egreg一样,我将内部更改为\fooa
不影响\bar
,就像@egreg一样,我通过注释掉行尾从您的定义中删除了错误的空格;并且我更改\pgfkeys{/foo,#1}
为\pgfqkeys{/foo}{#1}
更快):
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
/foo/.is family,
/foo,
a/.estore in = \fooa,
a/.default = bye,
a
}
\newcommand\go[1]{%
\begingroup
\pgfqkeys{/foo}{#1}%
\fooa
\endgroup
}
\begin{document}
\go{a=hello}
\go{}
\end{document}
答案2
你误解了它.default
的作用:它的目的是当键后面没有值时提供一个值。因此,使用你的设置,
\pgfkeys{/foo,a=bye}
\pgfkeys{/foo,a}
完全等价。另一方面,你的第二个调用\go{}
只是执行
\pgfkeys{/foo}
并且未提供任何值a
,因此\bar
保留其先前的值,并在同一组级别设置。
如果你定义
\pgfkeys{
/foo/.is family,
/foo,
a/.estore in = \fooa,
a/.default = bye,
a
}
\newcommand\go[1]{%
\pgfkeys{/foo, a, #1}%
\fooa
}
(我将\bar
其改为\fooa
,为了不破坏现有命令。)