我希望能够通过指定其范围和名称从范围外部引用范围内部的节点,如下所示范围内的 TiKZ 节点名称前缀这里提出的解决方案对节点进行了重命名,这样就不可能在不知道它们位于哪个范围的情况下引用范围内的节点。
下面的代码是我想要实现的,但我无法弄清楚如何在 name/.code 参数中添加别名。我尝试从 tikz 源粘贴别名/.code 文本,但没有成功,而且命名也失败了。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/128049/86}
\usepackage{tikz}
\begin{document}
\tikzstyle{vertex}=[circle,draw,fill=black!20]
\makeatletter
\tikzset{%
prefix node name/.code={%
\tikzset{%
name/.code={{\edef\tikz@fig@name{##1}}} %don't know how to create alias from ##1 (node name) to #1 ##1 (scope name node name)
}%
}%
}
\makeatother
\begin{tikzpicture}
% ---- Copy 1
\begin{scope}[yshift=-32pt,prefix node name=G1]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\end{scope}
% ---- Copy 2
\begin{scope}[yshift=32pt,prefix node name=G2]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\end{scope}
\draw (G1 u) -- (G2 v);
\end{tikzpicture}
\end{document}
答案1
正如 OP 问题的评论所示,在最新的 PGF 版本中,节点名称可以在 内添加前缀pic
。但是,此机制也可以在范围内使用。请注意,为了获得 OP 所需的空间,前缀必须以 结尾\space
。
\documentclass[tikz,border=5]{standalone}
\begin{document}
\begin{tikzpicture}[vertex/.style={circle, draw, fill=black!20}]
% ---- Copy 1
\begin{scope}[yshift=-32pt, name prefix=G1\space]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\end{scope}
% ---- Copy 2
\begin{scope}[yshift=32pt, name prefix=G2\space]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\end{scope}
\draw (G1 u) -- (G2 v);
\end{tikzpicture}
\end{document}
答案2
为了完整起见,这看起来像是你想要的alias
代码
\documentclass[tikz]{standalone}
\makeatletter
\tikzset{%
vertex/.style={circle,draw,fill=black!20},
prefix node name/.code={%
\tikzset{%
name/.code={\edef\tikz@fig@name{#1 ##1}%
\tikz@fig@mustbenamed%
\expandafter\def\expandafter\tikz@alias\expandafter{%
\tikz@alias\pgfnodealias{##1}{\tikz@fig@name}%
}%
}%
}%
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
% ---- Copy 1
\begin{scope}[yshift=-32pt,prefix node name=G1]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\end{scope}
% ---- Copy 2
\begin{scope}[yshift=32pt,prefix node name=G2]
\node[vertex] (u) at (0, 0) {u};
\node[vertex] (v) at (1, 0) {v};
\draw (u) -- (v);
\draw (G1 u) to[bend right] (v);
\end{scope}
\draw (G1 u) -- (G2 v);
\end{tikzpicture}
\end{document}