在 TikZ 绘图中创建伪锚点

在 TikZ 绘图中创建伪锚点

我有一个复杂的 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}

有关的:TikZ 中的复杂对象:pgfkeys 范围和最佳实践

答案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}

相关内容