使用 pgfkeys,我有名为a
、b
和 的键c
。如果未设置键的值c
,那么我希望其值取决于其他键。我试图执行的伪代码是:
if c is set:
pass
else:
c <- f(a, b)
其中f
是某个函数。
我尝试了以下
\documentclass[varwidth,margin=0.5cm]{standalone}
\usepackage{pgfkeys}
\pgfkeys{
/mykeys/.is family, /mykeys,
a/.estore in = \a,
b/.estore in = \b,
%c/.code={\pgfkeyssetvalue{c}{#1}\pgfkeysgetvalue{c}{\c}},
c/.estore in = \c,
default/.style = {
a = hello,
b = world,
}
}
\newcommand{\mycommand}[1][]{%
\pgfkeys{/mykeys, default, #1}
\pgfkeysifdefined{c}{%if
% pass
}{%else
\def\c{\a ,\ \b}
}
\c \\
}
\begin{document}
\mycommand[a=greetings]
\mycommand[]
\mycommand[c={howdy, stranger}]
\mycommand[]
\mycommand[b=all]
\end{document}
但\pgfkeysifdefined{c}
事实绝非如此。
所以我尝试了
\documentclass[varwidth,margin=0.5cm]{standalone}
\usepackage{pgfkeys}
\pgfkeys{
/mykeys/.is family, /mykeys,
a/.estore in = \a,
b/.estore in = \b,
c/.code={\pgfkeyssetvalue{c}{#1}\pgfkeysgetvalue{c}{\c}},
default/.style = {
a = hello,
b = world,
}
}
\newcommand{\mycommand}[1][]{%
\pgfkeys{/mykeys, default, #1}
\pgfkeysifdefined{c}{%if
% pass
}{%else
\def\c{\a ,\ \b}
}
\c \\
}
\begin{document}
\mycommand[a=greetings]
\mycommand[]
\mycommand[c={howdy, stranger}]
\mycommand[]
\mycommand[b=all]
\end{document}
但是一旦我\mycommand
使用c
键集进行调用,就会\mycommand
使用以前的键值而不是使用默认键值。
我如何测试是否c
提供了密钥,如果没有,则根据其他密钥进行设置?
答案1
您的代码不是已经这样做了吗?您需要做的就是将分配设为本地分配。
\documentclass[varwidth,margin=0.5cm]{standalone}
\usepackage{pgfkeys}
\pgfkeys{
/mykeys/.is family, /mykeys,
a/.estore in = \a,
b/.estore in = \b,
c/.code={\pgfkeyssetvalue{c}{#1}\pgfkeysgetvalue{c}{\c}},
default/.style = {
a = hello,
b = world,
}
}
\newcommand{\mycommand}[1][]{\begingroup%
\pgfkeys{/mykeys, default, #1}
\pgfkeysifdefined{c}{%if
% pass
}{%else
\def\c{\a ,\ \b}
}
\c \\
\endgroup
}
\begin{document}
\mycommand[a=greetings]
\mycommand[]
\mycommand[c={howdy, stranger}]
\mycommand[]
\mycommand[b=all]
\end{document}
我所做的只是添加\begingroup
和\endgroup
。
题外话:考虑使用\par
而不是\\
。