我对这个简单的 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 command
TikZ 会记住在当前命令完成后执行以下代码(因此,在组之外):
\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
你就得到了想要的效果。