使用 pgfkeys 将键值对作为值传递

使用 pgfkeys 将键值对作为值传递

我想将一个 key=value 对作为另一个 key=value 对的值传递。问题是,等号会被 pgfkeys 解释,因此我需要使用花括号将其封装起来,这反过来又会阻止 pgfkeys 解释等号(意外)。

以下最小示例毫无意义,但它说明了我想要做的事情。实际上,我尝试将 key=value 对传递给另一个接受 key=value 对的命令。

\documentclass[a4paper]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage{pgfkeys}

\begin{document}

\newcommand{\mycmd}[1]{%
    \pgfkeys{/mykey/.initial=hello}%
    \pgfkeys{/mykey2/.initial=world}%
    \pgfkeys{#1}%
    \pgfkeys{\pgfkeysvalueof{/mykey2}}%
    \pgfkeysvalueof{/mykey}%
    \pgfkeysvalueof{/mykey2}%
}

\mycmd{mykey2={mykey=test}}.

\end{document}

我得到的错误当然是:“我不知道密钥‘\mykey=test’...”。我该如何解决这个问题?

编辑:

感谢 percusse,我现在可以按照自己的风格来做事了。在下面的例子中,mycmdA 给出错误“我不知道键 '/fill/',而 mycmdB 可以工作。有人知道为什么吗?

\documentclass[a4paper]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage{pgfkeys}

\begin{document}

This is a test

\newcommand{\mycmdA}[1]{%
    \pgfkeys{/mystyle/.style={##1}}%
    \pgfkeys{#1}%
}

\newcommand{\mycmdB}[1]{%
    \pgfkeys{/mystyle/.style={}}%
    \pgfkeys{/mystyle/.code=\pgfkeys{/style/.style={##1}}}
    \pgfkeys{#1}%
}

\mycmdA{mystyle={fill=red}}
\mycmdB{mystyle={fill=red}}

\end{document}

答案1

您无需重新发明轮子。使用 pgfkeys 机制来处理/.style/.code处理程序,就像 TikZ 图片中那样。如果 mykey2 将成为密钥设置器,那么同时拥有一个值就没什么意思了。密钥机制的这一部分相当不简单。但这会打印test(这里不需要扩展,但以防万一您需要它)

\pgfkeys{mykey/.initial=hello}%
%\pgfkeys{mykey2/.initial=world}%
\pgfkeys{mykey2/.code={\expandafter\pgfkeys\expandafter{#1}}}% Expand once to remove braces
\pgfkeys{mykey2={mykey=test}}%
\pgfkeysvalueof{/mykey}%

您可以改为将 mykey2 设为 a /.style,并将选项作为密钥持有者传递给它。然后,每当您执行 mykey2 时,它都会执行所有存储的密钥值(/.append style无需重置即可添加)。

相关内容