Tikz/pgfkeys,如何复制样式

Tikz/pgfkeys,如何复制样式

在 tikz/pgfkeys 中,我如何复制(如)给定路径内的/styleA/*/.cp所有键或单个键(如),比如在当前路径中,就像我手动复制所有键一样?/styleA/colorA/.cpstyleB

值得注意的是,这意味着如果我输入:

\node[styleA, styleB, styleC, colorA] {};

然后:

  1. 如果styleC/colorA存在,则colorA从中取出styleC,否则从中取出styleB,否则styleA
  2. 如果styleC调用一种样式,我们检查是否styleB定义它,如果没有styleA...当然,我不想对这个列表进行硬编码,styleD因为顺序可能会在后面的调用中改变,比如\node[styleA, styleC, styleB, colorA] {};
  3. styleA包含在、 …中的样式styleB应该可以轻松更改,而无需重新定义它们定义的所有其他样式。例如,我想重新定义 ,styleA/colorA/.style={}而无需重新定义styleA/colorB/.style
  4. 我想要一种简单的方法从给定的样式中选择一种颜色,例如将其包含在新样式中,myNewStyle/.style={styleA/colorA}而不采用中定义的其余键styleA

我尝试过的:目前我尝试了两种方法,但都不完美:

  • 嵌套样式:它们非常适合解决问题 1 和 2,可以获得 3,但不是很优雅(特别是在深度嵌套样式上),而且我找不到如何获得 4。
  • .cd.family,点 3 和 4 很容易获得,但我找不到获得 1 和 2 的方法:一旦我.cd到达某个地方,所有先前定义的键都会丢失。即使在使用 时.search also,搜索路径的顺序也是硬编码的,而且由于我无法知道稍后将使用的顺序,因此我无法获得点 3。

平均能量损失

在此处输入图片描述

\documentclass[]{article}

\usepackage{tikz}

\begin{document}

% Method 1: nested styles. Great to use, but hard to redefine style later.
\tikzset{
  styleA/.style={
    colorA/.style={fill=orange},
    colorB/.style={fill=red},
    colorC/.style={fill=yellow},
    colorD/.style={fill=pink},
    nice label/.style={label={\tiny I'm a label from style A}},
  },
  styleB/.style={
    colorA/.style={%
      fill=green,
      nice label % to check point 2
    },
    colorB/.style={fill=blue},
  },
}

\def\example#1{\tikz \node[#1, colorA] {A}; \tikz \node[#1, colorD] {D};}

\verb|styleA|: \example{styleA}

\verb|styleA, styleB|: \example{styleA, styleB}

Point 3: not very elegant to redefine \verb|styleB/colorA|?

\tikzset{
  styleB/.append style={ % Would prefer: styleB/colorA/.style={fill=gray}
    colorA/.style={
      fill=gray
    },
  },
}

\verb|styleA, styleB|: \example{styleA, styleB}

Problem 4:

\tikzset{
  myNewStyle/.style={
    styleA %<---- I'd like to get only styleA/colorA, but can't find how to do
  }
}
\tikz \node[styleB, myNewStyle, colorA] {A, should be orange}; \tikz \node[styleB, myNewStyle, colorB] {B, should be blue!!!};

\end{document}

答案1

使用此方法,A 将变成橙色,B 将变成蓝色。不多也不少。

但是,我必须说,总的来说,这段代码的设计确实很糟糕。为什么会colorA根据按键的顺序产生不同的颜色?这会让用户感到困惑,并且会让人觉得不可预测。

\documentclass[]{article}

\usepackage{tikz}

\begin{document}

% Method 1: nested styles. Great to use, but hard to redefine style later.
\tikzset{
  styleA/.style={
    colorA/.style={fill=orange},
    colorB/.style={fill=red},
    colorC/.style={fill=yellow},
    colorD/.style={fill=pink},
    nice label/.style={label={\tiny I'm a label from style A}},
  },
  styleB/.style={
    colorA/.style={%
      fill=green,
      nice label % to check point 2
    },
    colorB/.style={fill=blue},
  },
}

\def\example#1{\tikz \node[#1, colorA] {A}; \tikz \node[#1, colorD] {D};}

\verb|styleA|: \example{styleA}

\verb|styleA, styleB|: \example{styleA, styleB}

Point 3: not very elegant to redefine \verb|styleB/colorA|?

\tikzset{
  styleB/.append style={ % Would prefer: styleB/colorA/.style={fill=gray}
    colorA/.style={
      fill=gray
    },
  },
}

\verb|styleA, styleB|: \example{styleA, styleB}

Problem 4:

\tikzset{
  myNewStyle/.style={
    colorA/.code=\tikzset{styleA,colorA},
  }
}
\tikz \node[styleB, myNewStyle, colorA] {A, should be orange}; \tikz \node[styleB, myNewStyle, colorB] {B, should be blue!!!};

\end{document}

在此处输入图片描述

相关内容