我仍在寻找一个可行的解决方案来实现“条件图片”或图片,我可以使用样式启用和禁用图片的某些部分(非常像投影仪覆盖)。
我的目标是能够添加一种可以抑制图片某一部分的pic
样式。dontdrawitnow
我目前的实施情况:
\documentclass[tikz,png]{standalone}
\begin{document}
\newif\ifdrawit
\tikzset{
drawit/.initial=true,
dontdrawitnow/.style={drawit=false},
drawit/.is if=drawit,
mypic/.pic={
\node at (-3,0) {\pgfkeysvalueof{/tikz/drawit}};
\ifdrawit
\node {I'm drawing it!};
\else
\node[drawit=true] {Maybe next time!};
\fi
}
}
\begin{tikzpicture}
\pic at (0,0) {mypic};
\pic[dontdrawitnow] at (0,1) {mypic};
\pic at (0,2) {mypic};
\end{tikzpicture}
\end{document}
它最初将一个键设置drawit
为 true。每当我应用某种样式时dontdrawit
,该值就会设置为 false。我将键绑定到\if
。每当我绘制时pic
,它都会查看键的值以决定是否绘制某些内容,之后它会将键重置为true
。
至少我是这样认为的。但输出却是:
发生了什么事? 既没有\ifdrawit
正确执行,也没有将键设置为 false!
这变得更有趣了。为了好玩,删除以下行:
drawit/.is if=drawit,
那么输出是:
密钥现在已正确设置!(当然,\ifdrawit
不会有反应,因为现在尚未设置。)
这是怎么回事?我完全误解了.is if
它的工作原理吗?还是它坏了?
答案1
RunarTrollet 为我指明了正确的方向。/.is if
它确实完全按照手册中所述执行,并且仅有的有两个合理的预期,你可能会认为没有做:
- 执行时
drawit/.is if=drawit
,它没有将键的当前值存储在 TeX-if 中。(因此您必须随后初始化该值!) - 随后执行时
drawit=somevalue
,没有将值存储somevalue
在键中。
因此正确行为的代码似乎是这样的:
\documentclass[tikz,png]{standalone}
\begin{document}
\newif\ifdrawit
\tikzset{
drawit/.is if=drawit,
drawit=true,
dontdrawitnow/.style={drawit=false},
mypic/.pic={
\ifdrawit
\node {I'm drawing it!};
\else
\node {Maybe next time!};
\fi
}
}
\begin{tikzpicture}
\pic at (0,0) {mypic};
\pic[dontdrawitnow] at (0,1) {mypic};
\pic at (0,2) {mypic};
\end{tikzpicture}
\end{document}
结果是:
正如 cfr 在评论中指出的那样,您不需要[drawit=true]
节点中的 -option,因为分配对于\ifdrawit
TeX-group 来说是本地的。