pgfkeys 和 ifs

pgfkeys 和 ifs

我仍在寻找一个可行的解决方案来实现“条件图片”或图片,我可以使用样式启用和禁用图片的某些部分(非常像投影仪覆盖)。

我的目标是能够添加一种可以抑制图片某一部分的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,因为分配对于\ifdrawitTeX-group 来说是本地的。

相关内容