编辑

编辑

我正在尝试在 TikZ 中使用具有相对复杂密钥树的 PGF 密钥。(以我的标准来看很复杂,但我确信从整体上看它并不那么复杂。)

我希望定义一个命令来执行以下操作:

  • 设置密钥树中特定路径的后代密钥;
  • 保存所有剩余的键到宏中;
  • 做其他一些事情(计算、处理、设置);
  • 使用处理后的信息的各个部分来排版节点;
  • 将宏添加到节点选项,以便应用通用的 TikZ 键。

我不仅无法让它工作,而且我搞不清楚什么有效、什么无效背后的逻辑。有一次,我的 MWE 根本无法编译,而我的原始文档根本无法产生所需的输出。

在我的实际文档中,我传递的所有选项似乎都没有任何效果,但我希望 MWE 遇到同样的问题,或者至少是相同的问题之一。

这是我当前的 MWE:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\mymammals{}
\tikzset{
  mammals/.code={
    \tikzset{
      /pgf/key filters/is descendant of/.install key filter=/animals/mammals/,
      /pgf/key filter handlers/append filtered to/.install key filter handler=\mymammals,
      /animals/mammals/.cd,%
      #1
    }
  },
  /animals/.search also={/tikz},
  /animals/mammals/.search also={/animals,/tikz},
  /animals/mammals/.cd,
  elephant/.store in=\elephant,
  /animals/size/.style={},
}
\newcommand\mammals[1]{%
  \def\mymammals{}%
  \tikzset{mammals={#1}}%
  \node (\elephant) [circle, minimum size=5mm, draw=red, text=red] at (0,0) {x};
  \node (another \elephant) [/animals/size, \mymammals] at (\elephant) {\elephant};
}

\begin{tikzpicture}
  \mammals{
      elephant=Edward,
      text=blue,
      draw,
      minimum width=50mm,
      xshift=-10mm,
      yshift=-20mm
  }
\end{tikzpicture}

\end{document}

我希望它能生成一个红色圆圈,里面有一个红色的“x”,在圆圈左侧 10 毫米、下方 20 毫米处,有一个 50 毫米宽的框,里面用蓝色写着名字“Edward”,并画出节点的边框。(不确定这里我想要哪种颜色 - 但我们可以说黑色、红色或蓝色都是不错的选择!)

也就是说我希望得到这个:

梦

然而,我得到了这个:

现实

现在我完全接受我不知道自己在做什么的事实。因此,我对这不起作用并不感到惊讶。这是我预料到的。

但为什么部分正在工作?为什么 Edward 是蓝色的,但节点没有绘制,并且没有完成移位?

我知道这/animals/size在这里起着至关重要的作用,但我不清楚为什么。它不应该切换默认路径,如果是的话,我应该会得到错误。而且,在我的最小化示例中,这是一种什么都不做的样式,它应该有如此部分的影响似乎很奇怪。

这让我觉得我根本不应该以这种方式来做这件事,但如果我不想为了解决这个问题而将密钥放入家族中,我就不知道该怎么做了。如果我可以说“所有属于...的后代的密钥都归入家族...”,那将是一回事,但我的印象是家族概念应该是针对与树层次结构中的路径正交的类别。

也就是说,我不知道发生了什么,手册也帮不上什么忙。请问可以给我提示一下吗?

编辑

下面的方法似乎有效,但我不确定它有多安全或合理。我也不完全确定为什么有用。

\documentclass{article}
\usepackage{tikz}
\begin{document}

\tikzset{
  mammals/.code={
    \def\mysaved{}%
    \tikzset{
      /pgf/key filters/defined/.install key filter,
      /pgf/key filter handlers/append filtered to/.install key filter handler=\mysaved,
    }%
    \pgfkeysfiltered{/animals/mammals/.cd,#1}%
    \tikzset{
      /animals/mysaved/.estyle={\mysaved},
    }
  },
  /animals/.search also={/tikz},
  /animals/mammals/.search also={/animals,/tikz},
  /animals/mammals/.cd,
  elephant/.store in=\elephant,
}
\newcommand\mammals[1]{%
  \tikzset{mammals={elephant={??},#1}}%
  \node (\elephant) [circle, minimum size=5mm, draw=red, text=red] at (0,0) {x};
  \node (another \elephant) [/animals/mysaved] at (\elephant) {\elephant};
}

\begin{tikzpicture}
  \mammals{
      elephant=Edward,
      text=blue,
      draw,
      minimum width=50mm,
      xshift=-10mm,
      yshift=-20mm
  }
\end{tikzpicture}

\end{document}

相关内容