我想定义一个键,我们称之为mystyle
,它有几个子键,如mystyle/A
和mystyle/B
,并且我希望能够通过调用mystyle=A
、mystyle=B
或 来选择设置这些子键中的哪一个mystyle={A,B}
。
如果我只需要设置其中一个子键,那就很容易了,可以使用如下方法完成:
\tikzset{
mystyle/A/.style=draw,
mystyle/B/.style={fill=yellow},
mystyle/.style={
mystyle/#1
}
}
这样我就可以说\tikz \node [mystyle={B}] {Test};
,节点将填充为黄色。但是,如果我尝试\tikz \node [mystyle={A,B}] {Test};
,则会收到错误I do not know the key '/tikz/B'
。
我尝试按如下方式定义键
\tikzset{
mystyle/A/.style=draw,
mystyle/B/.style={fill=yellow},
mystyle/.style={
mystyle/.cd,
#1
}
}
然而,这不起作用,因为虽然密钥目录的更改(mystyle/.cd
)解决了 pgfkeys 无法找到的问题mystyle/B
,但我现在收到以下错误消息:I do not know the key '/tikz/mystyle/draw'
。
该怎么办?
梅威瑟:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikzset{
mystyle/A/.style=draw,
mystyle/B/.style={fill=yellow},
mystyle/.style={
mystyle/.cd,
#1
}
}
\tikz \node [mystyle={A,B}] {Test};
\end{document}
答案1
处理程序如何.style
工作?它基本上是一个.code
处理程序(因为无论如何一切都在最后),保存的代码是\pgfkeysalso{#1}
。
该风格A
扩展至\pgfkeysalso{draw}
和。B
\pgfkeysalso{fill=yelow}
手册上说\pgfkeysalso
:
该命令与 具有同样的效果
\pgfkeys
,只是在设置键之前或之后不会修改默认路径。
“默认路径”是您当前所在的路径(\tikzset
使用/tikz
)。.cd
但是处理程序会将此默认路径更改为/tikz/mystyle
。使用 的键\pgfkeysalso
会尝试在此路径中查找draw
和,但会失败。fill
相当复杂的处理程序.search also
会安装一个.unknown
代码,尝试使用无法识别的密钥在给定的路径中应用。(/pgf
密钥在/tikz
方式与 类似。)敲击已经在他的解决方案中使用了这种方法,这可能是最方便的方法。
但问题是,您只能在路径中使用这些键/tikz/mystyle
。如果不将默认路径设置为/tikz
或,则无法在其他路径中使用它们/tikz/mystyle
。例如,您无法这样做,\pgfkeys{/tikz/mystyle/A}
因为由于键不是从/tikz/mystyle
路径调用的,所以不会检查已安装的.search also
。这似乎是一个不切实际的例子(可能确实如此),但对于不会更改整个路径属性的其他样式,例如,insert path
这很重要,因为包含此类样式的键可以在任何地方使用来精确设置这些属性。
最可靠的方式是使用以下命令保存样式/tikz
(并且您知道它们仅用作/tikz
关键内容,没有其他用途):
\tikzset{
mystyle/A/.style=/tikz/draw,
mystyle/B/.style={/tikz/fill=yellow}
}
如果您希望样式的行为就像在默认路径中使用一样,/tikz
则可以使用.tikz
将键保存为\tikzset
(而不是\pgfkeysalso
)的处理程序。一个简单的定义如下
\pgfkeys{/handlers/.tikz/.code=%
\pgfkeys{\pgfkeyscurrentpath/.code=\tikzset{#1}}}
可以将其用作
\tikzset{
mystyle/A/.tikz={draw},
mystyle/B/.tikz={fill=yellow}}
从某种程度上来说,这也是我对开mystyle
关键的解决方案。
同样,mystyle/.cd
(也仅在前一个路径为 时才有效/tikz
)会更改路径,即使对于您想要在 之后使用的键也是如此mystyle={A,B}
。虽然这些很可能又是/tikz
键,但它们不需要。您可以/tikz/mystyle={A,B}
从任何 PGF 键路径中使用,而不想返回/tikz
。与处理程序类似,.tikz
我将键定义mystyle
为:
\tikzset{
mystyle/A/.tikz={draw},
mystyle/B/.tikz={fill=yellow},
mystyle/.code=\pgfqkeys{/tikz/mystyle}{#1}
}
手册中甚至说\pgfkeysalso
“在里面悬挂默认路径\pgfkeyalso
是危险的,所以要小心使用”。
TikZ 自然也使用了类似的解决方案,例如 key decoration
(实际上是一个/pgf
key):
\pgfkeys{%
/pgf/decoration/.code={\pgfkeys{/pgf/decoration/.cd,#1}}}
例如,这使得可以使用decoration={<something>}
from \pgfset
(例如/pgf
路径)以及 from,而\tikzset
不受限制地返回/pgf
或。(无论如何,从那里/tikz
返回到搜索的/tikz
位置是安全的,但对于纯粹的解决方案,这会失败。)/pgf
pgf
代码
\documentclass[tikz,convert=false]{standalone}
\pgfkeys{/handlers/.tikz/.code=%
\pgfkeys{\pgfkeyscurrentpath/.code=\tikzset{#1}}}
\tikzset{
mystyle/A/.tikz={draw},
mystyle/B/.tikz={fill=yellow},
mystyle/.code=\pgfqkeys{/tikz/mystyle}{#1}
}
\begin{document}
\begin{tikzpicture}
\node [mystyle={A,B}] {Test};
\end{tikzpicture}
\end{document}
您可能感兴趣的另一个解决方案如下。
这样可以避免更改默认路径,并且mystyle={…}
在默认路径为 时依赖于使用/tikz
。您可以知道 say/.style={</tikz options>}
和 use,mystyle={…}
而无需使用额外的处理程序,也无需以/tikz
某种方式和某个地方指定。它所需要的只是一个与 一起使用的辅助键。(或者您可以在使用原始定义( )时直接在代码中/.list
指定):。/.list
mystyle/.style={mystyle/#1}
mystyle/.list={A,B}
但是,如果您知道使用的键是 TikZ 键,请按原样保存它们(使用/.tikz
或/tikz/
)。
代码
\documentclass[tikz,convert=false]{standalone}
\tikzset{
mystyle/A/.style={draw},
mystyle/B/.style={fill=yellow},
mystyle/.style={@mystyle/.list={#1}},
@mystyle/.style={/tikz/mystyle/#1}% auxiliary
}
\begin{document}
\begin{tikzpicture}
\node [mystyle={A,B}] {Test};
\end{tikzpicture}
\end{document}
答案2
您可以通过处理程序声明其他位置来查找未知密钥/.search also
。代码中偶尔也会这样做,pgfplots
以收集基于 TikZ 的路径密钥(尽管它已经完全成熟handler config
)。
\documentclass[tikz]{standalone}
\tikzset{
mystyle/A/.style={draw},
mystyle/B/.style={fill=yellow},
mystyle/.search also={/tikz,/pgf},
mystyle/.style={
mystyle/.cd,
#1,
/tikz/.cd
}
}
\begin{document}
\begin{tikzpicture}
\node [mystyle={A,B}] {Test};
\end{tikzpicture}
\end{document}