我想将一个 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
无需重置即可添加)。