使用 pgfkeys 使密钥的默认值依赖于其他密钥

使用 pgfkeys 使密钥的默认值依赖于其他密钥

使用 pgfkeys,我有名为ab和 的键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而不是\\

相关内容