![根据 tikz 样式的存在选择性地忽略一些 pgfkeys](https://linux22.com/image/387548/%E6%A0%B9%E6%8D%AE%20tikz%20%E6%A0%B7%E5%BC%8F%E7%9A%84%E5%AD%98%E5%9C%A8%E9%80%89%E6%8B%A9%E6%80%A7%E5%9C%B0%E5%BF%BD%E7%95%A5%E4%B8%80%E4%BA%9B%20pgfkeys.png)
我希望能够根据tag
节点或路径修改复杂图片某些部分的样式(确切地说,我有一个复杂的架构图,我想有选择地突出显示一些数据路径)。为了方便图片的维护,我更喜欢单一来源。
其中一种方法是:
- 声明为
tags
空pgfkeys
样式 - 并根据需要修改其值。
\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}
当然,它是有效的,但是需要事先声明,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}
实际上,它不起作用。< 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}
也许还可以定义分层标签,以便能够一次更改单个标签 /tag/foo/bar 或标签层次结构 /tag/foo/* 的样式。
谢谢大家。