根据 tikz 样式的存在选择性地忽略一些 pgfkeys

根据 tikz 样式的存在选择性地忽略一些 pgfkeys

我希望能够根据tag节点或路径修改复杂图片某些部分的样式(确切地说,我有一个复杂的架构图,我想有选择地突出显示一些数据路径)。为了方便图片的维护,我更喜欢单一来源。

其中一种方法是:

  1. 声明为tagspgfkeys样式
  2. 并根据需要修改其值。

\documentclass{article}
\usepackage{tikz}
\begin{document}
    \pgfkeys{/tikz/.cd,<slide 1>/.style={}}
    \pgfkeys{/tikz/.cd,<slide 2>/.style={}}
    \pgfkeys{/tikz/.cd,<slide 3>/.style={}}
    \pgfkeys{/tikz/.cd,<slide 4>/.style={}}

    \newcommand{\complexpicture}{

  \node[draw, <slide 1>] at (0,0) {box 1};  
  \node[draw, <slide 2>] at (2,0) {box 2};
  \node[draw, <slide 3>] at (4,0) {box 3};
  \node[draw, <slide 4>] at (6,0) {box 4};
}

General overview (all tags are ignored)
\begin{tikzpicture}
  \complexpicture
\end{tikzpicture}

Highlight first item    
\begin{tikzpicture}[<slide 1>/.style={very thick}]
  \complexpicture
\end{tikzpicture}

Highlight second item
\begin{tikzpicture}[<slide 2>/.style={very thick}]
  \complexpicture
\end{tikzpicture}
\end{document}

enter image description here

当然,它是有效的,但是需要事先声明,tags不灵活且不优雅。

< tags >因此我尝试使用进行过滤pgfkeys,除非存在样式。我过去常常first char syntax检测首字母<

我没有成功声明以 开头的样式<。因此,tikzpicture 样式已存在/tag/name/.style,并且我过滤掉了< name >pgfkey,除非/tag/name存在。

\documentclass{article}

\usepackage{tikz}

\begin{document}
\newcommand{\complexpicture}{
  \node[draw, <slide 1>] at (0,0) {box 1};  
  \node[draw, <slide 2>] at (2,0) {box 2};
  \node[draw, <slide 3>] at (4,0) {box 3};
  \node[draw, <slide 4>] at (6,0) {box 4};
}

\pgfkeys{
  /handlers/first char syntax=true,
  /handlers/first char syntax/the character </.initial=\mykeymacro
}
\def\mykeymacro#1{\mykeyparser#1\someendtext}
\def\mykeyparser<#1>\someendtext{
  \pgfkeysifdefined{/tag/#1}{\pgfkeysvalueof{/tag/#1}}{}
}

General overview (all tags are ignored)\\
\begin{tikzpicture}
  \complexpicture
\end{tikzpicture}

Highlight first item\\
\begin{tikzpicture}[/tag/slide 1/.style={very thick}]
  \complexpicture
\end{tikzpicture}

Highlight second item\\
\begin{tikzpicture}[/tag/slide 2/.style={very thick}]
  \complexpicture
\end{tikzpicture}


\end{document}

enter image description here

实际上,它不起作用。< tags >被正确过滤掉,并且没有 pgfkeys 错误,但是全部这些键被抑制,并且声明的样式\tikzpicture永远不会被激活。我尝试了此方案的一些变体,但都没有奏效。

也许我遗漏了一些东西......

答案1

最后,我借助 unkonw 处理程序找到了解决方案,这个技巧对其他人很有用。

只需为提供空样式的完整系列定义一个未知处理程序。在 tikzpicture 中重新定义样式就足够了。

这是一个包含多个标签和多种样式的工作示例。

\documentclass{article}

\usepackage{tikz}

\begin{document}
\newcommand{\complexpicture}{
  \node[draw, blue, /tag/slide 1] at (0,0) {box 1};  
  \node[draw, rounded corners, /tag/slide 2, /tag/slide 3] at (2,0) {box 2}; % double tag
  \node[draw, green, /tag/slide 3] at (4,0) {box 3};
  \node[draw, /tag/slide 4] at (6,0) {box 4};
}

\pgfkeys{/tikz/highlight/.style={red, very thick}}
\pgfkeys{/tikz/grey out/.style={opacity=0.4}}

\pgfkeys{/tag/.is family, /tag, 
.unknown/.code = {
    \pgfkeyssetvalue{\pgfkeyscurrentpath/\pgfkeyscurrentname}{}
}

General overview (all tags are ignored)\\
\begin{tikzpicture}
  \complexpicture
\end{tikzpicture}

Highlight first item\\
\begin{tikzpicture}[/tag/slide 1/.style=highlight]
  \complexpicture
\end{tikzpicture}

Highlight second item and grey out slide 3 and 4\\
\begin{tikzpicture}[/tag/slide 2/.style=highlight, /tag/slide 3/.style=grey out,
                    /tag/slide 4/.style=grey out]]
  \complexpicture
\end{tikzpicture}
\end{document}

enter image description here

也许还可以定义分层标签,以便能够一次更改单个标签 /tag/foo/bar 或标签层次结构 /tag/foo/* 的样式。

谢谢大家。

相关内容