为什么 pfgkeys 默认情况下不重新定义我的命令?

为什么 pfgkeys 默认情况下不重新定义我的命令?

我正在这样做:

\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,为了不破坏现有命令。)

相关内容