该键将其他键的列表作为参数并设置它们

该键将其他键的列表作为参数并设置它们

我想定义一个键,我们称之为mystyle,它有几个子键,如mystyle/Amystyle/B,并且我希望能够通过调用mystyle=Amystyle=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(实际上是一个/pgfkey):

\pgfkeys{%
  /pgf/decoration/.code={\pgfkeys{/pgf/decoration/.cd,#1}}}

例如,这使得可以使用decoration={<something>}from \pgfset(例如/pgf路径)以及 from,而\tikzset不受限制地返回/pgf或。(无论如何,从那里/tikz返回到搜索的/tikz位置是安全的,但对于纯粹的解决方案,这会失败。)/pgfpgf

代码

\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指定):。/.listmystyle/.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}

在此处输入图片描述

相关内容