我正在学习pgfkeys
并尝试使用它来处理键值参数。
我正在尝试使用它来设置样式。为此,我定义了一个宏\mystyle
来处理它,并使用与这里解决样式的执行问题。现在,如果我想使用 向参数添加更多代码.append
,宏不会反映出它的变化。
\documentclass{article}
\usepackage{tikz}
\pgfkeys{
/test/.cd,
my style/.store in=\mystyle,
my style/.default={draw,color=cyan,},
my style,
% helpers to get execution on styles
% https://tex.stackexchange.com/a/85647/7561
/tikz/.cd,
execute style/.style = {#1},
execute macro/.style = {execute style/.expand once=#1},%
}
\newcommand{\makenode}[2][]{
\pgfkeys{/test/.cd,#1}
\begin{tikzpicture}
\node[execute macro=\mystyle]{#2};
\end{tikzpicture}
}
\pagestyle{empty}
\begin{document}
\makenode{testing}
\makenode[my style={draw,color=blue,line width=5pt,}]{testing blue}
% this should be yellow, with thin line
\makenode[my style/.append={color=yellow,line width=1pt}]{testing blue}
\end{document}
根据我对手册的理解,参数应该附加到键的值。因此,如果我在值中有<something>
,并且我确实有<key>/.append={<more>}
,则中的值<key>
应该是<something><more>
。但事实并非如此。
我错过了什么?
答案1
不确定为什么要同时使用 和=
。剩下的都是基于我的猜测。.append=
.default=
- 如果传递
[my style=\A]
给,则会应用\makenode
样式列表。\A
- 如果您传递
[append my style=\B]
给\makenode
,则样式列表\B
将与 (您的默认值)一起应用draw,color=cyan
。 - 如果您未向 传递任何内容
\makenode
,则\newcommand
会插入其默认值append my style={}
。这意味着仅应用 ,而不draw,color=cyan
应用任何内容。
\documentclass[tikz,border=10]{standalone}
\pgfkeys{
/test/.cd,
my style/.style={
/test/final style/.style={#1}
},
append my style/.style={
/test/final style/.style={draw,color=cyan,#1}
}
}
\newcommand{\makenode}[2][append my style={}]{
\pgfkeys{/test/.cd,#1}
\begin{tikzpicture}
\node[/test/final style]{#2};
\end{tikzpicture}
}
\begin{document}
\makenode{testing}
\makenode[my style={}]{testing plain}
\makenode[my style={fill=blue,line width=5pt}]{testing blue}
\makenode[append my style={fill=yellow,line width=1pt}]{testing yellow}
\end{document}
因此
- 对于
testing
,它以青色绘制,这是您的默认设置; - 对于
testing plain
,所有样式均被重置; - 对于
testing blue
,draw
并且color=cyan
被覆盖,因此不会发生绘制;- (否则它应该更高,因为
line width=5pt
)
- (否则它应该更高,因为
- 对于
testing yellow
,填充与绘制同时发生。
太长。短吗?
作为默认设置,根本的问题cyan
是您希望以下内容做什么?
\makenode[blue]{testing}
\makenode[]{testing}
这听起来很蠢:第一个节点显示为蓝色,而第二个节点遵循默认颜色...但是等等,什么是默认现在?蓝色还是青色?
答案可能是蓝色,因为写入my style=blue
或my style/.style=blue
导致 PGF 忘记旧值/旧样式。保持全局的唯一方法是默认是my style/.default={cyan}
,假设my style
是行动。 一个行动由 声明.code
,并且均不.append
适用.append style
。
总之,、、=
和.append
并非.default
设计用于协同工作。也许有一种巧妙的方法可以克服它。但迟早你会混淆 PGF……和你自己。