我有一个复杂的 TikZ 子绘图(我称之为“对象”),我在许多图形中反复使用它。它比 TikZ/pgf 上下文中所谓的“形状”复杂得多,并且包含多个节点。它有一些连接点,比如形状的锚点,我用 定义它们coordinate (object name_connection name)
。如果它是形状的真正锚点,我可以使用语法(object name.connection name)
,但这在标准 tikz 中是不可能的(手册中也有说明)。有没有办法绕过这个问题并给坐标起一个包含“。”的名字?这将有助于获得更清晰的代码并更接近 TikZ/pgf 语法。
下面的例子说明了我的意思。它有点像最小工作示例,我的原始代码目前大约有 200 行代码。
\documentclass{article}
\usepackage{tikz}
\pgfkeys{
/object/.cd,
left node/.style={draw,red},
right node/.style={draw,blue},
}
\def\object[#1](#2,#3)#4;{
\pgfkeys{/object/.cd,#1}
\begin{scope}[shift={(#2,#3)}]
\node [/object/left node] (#4_left) at (-1,0) {#4};
\node [/object/right node] (#4_right) at (1,0) {#4};
\draw (#4_left) -- (#4_right);
\draw (#4_right) -- ++(.5,.5) coordinate (#4_connection b);
\draw (#4_left) -- ++(-.5,-.5) coordinate (#4_connection a);
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\object[](0,-1){A};
\object[left node/.append style={green}](0,1){B};
\begin{scope}[orange]
\draw (-2,0) -- (A_connection a);
% \draw (-2,0) -- (A.connection a);
\draw (A_connection b) to[out=45,in=225] (B_connection a);
% \draw (A.connection b) to[out=45,in=225] (B.connection a);
\end{scope}
\end{tikzpicture}
\end{document}
答案1
如您所见,主要目标已经实现:可以编写(A.connection left)
。
但是:对象内的坐标信息是重复的,当有多个对象类型时,我们需要区分它们。因此,要使一切真正发挥作用,需要存储对象类型和一些内部坐标……这实际上会重复 pgf 的形状机制。
还有一件事:锚点(包括通用锚点)返回一个点,因此(A.left)
实际上不是指节点,而是指其锚点。换句话说,我不相信递归(A.left.north)
可以以这种方式实现。
\documentclass{article}
\usepackage{tikz}
\pgfkeys{
/object/.cd,
left node/.style={draw,red},
right node/.style={draw,blue},
}
\def\object[#1](#2,#3)#4;{
\pgfkeys{/object/.cd,#1}
\begin{scope}[shift={(#2,#3)}]
\path coordinate(#4);
\node [/object/left node] (#4_left) at (-1,0) {#4};
\node [/object/right node] (#4_right) at (1,0) {#4};
\draw (#4_left) -- (#4_right);
\draw (#4_left) -- ++(-.5,-.5);
\draw (#4_right) -- ++(.5,.5);
\end{scope}
}
\pgfdeclaregenericanchor{left}{\pgfpointxy{-1}{0}}
\pgfdeclaregenericanchor{right}{\pgfpointxy{1}{0}}
\pgfdeclaregenericanchor{connection left}{\pgfpointxy{-1.5}{-0.5}}
\pgfdeclaregenericanchor{connection right}{\pgfpointxy{1.5}{0.5}}
\begin{document}
\begin{tikzpicture}
\object[](0,-1){A};
\object[left node/.append style={green}](0,1){B};
\begin{scope}[orange]
\draw[->] (-2,0) -- (A.connection left);
\draw (A.connection right) to[out=45,in=225] (B.connection left);
\end{scope}
\end{tikzpicture}
\end{document}