TikZ 忽略临时覆盖的宏值并使用前一个宏值

TikZ 忽略临时覆盖的宏值并使用前一个宏值

我对这个简单的 TikZ 图形的奇怪行为绞尽脑汁:

我有以下 pgf 键:

\tikzset{
    the name/.store in=\nodename,
    the name=OLD,
    my node/.style={
        node contents=\nodename,
        other node=\nodename,
    },
    other node/.style={
        append after command={
            \pgfextra
            \node [base right=of \tikzlastnode] {#1};
            \endpgfextra
        }
    }
}

\nodename然后我创建一个通过设置覆盖的节点the name=NEW

\node (node 1) [
    the name=NEW, % temporary overrides the node name
    my node       % draw the nodes using the value stored in \nodename 
];

这应该是预期的结果:

预期结果

然而这就是我所拥有的:

实际结果

我怎样才能达到期望的结果?

出现的问题:

  • 样式代码是否保存为它然后在每次实例化时进行评估?
  • append after command当风格出现时,TikZ 会执行任何类型的自定义魔法吗?
  • \pgfkeysvalueof使用宏而不是保存宏中的值会有什么区别吗?

谢谢!

平均能量损失

https://www.overleaf.com/read/vppfdhtsgqyp

\documentclass[12pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}

\tikzset{
    the name/.store in=\nodename,
    the name=OLD,
    my node/.style={
        node contents=\nodename,
        other node=\nodename,
    },
    other node/.style={
        append after command={
            \pgfextra
            \node [base right=of \tikzlastnode] {#1};
            \endpgfextra
        }
    }
}


\node (node 1) [
    the name=NEW, % temporary overrides the node name
    my node       % draw the nodes using the value stored in \nodename 
];

\end{tikzpicture}
\end{document}

答案1

当 TikZ 处理绘图命令(\draw、、、、等中的任一个)时\path,它会在 TeX 组中执行此操作(并在 PGF 范围内,但这里的关键是组),因此任何定义都仅限于该组本地。\fill\node

append after command执行的代码来自外部append after command该组不会受到其内部执行的任何本地定义的影响。由于的内容被定义,因此存在复杂的走私程序里面执行该操作的组外部的。

要弄清楚你的代码中发生了什么,我们必须考虑一个问题:何时\nodename扩展?

使用您的代码,结果是append after commandTikZ 会记住在当前命令完成后执行以下代码(因此,在组之外):

\pgfextra
\node [base right=of \tikzlastnode] {\nodename};
\endpgfextra

这里重要的是#1已被 替换\nodename。执行此操作时,请记住这是外部然后,该群\nodename扩展为它的值,即现在的OLD

为了获得你想要的行为,我们需要扩展\nodename 里面该组。幸运的是,pgfkeys有针对这种情况的处理程序,并且使用起来很容易。只需other node使用.expand once处理程序调用密钥即可:

other node/.expand once=\nodename,

使用此版本,TikZ 记住的代码是:

\pgfextra
\node [base right=of \tikzlastnode] {NEW};
\endpgfextra

你就得到了想要的效果。

相关内容