框图 TikZ 中的多输入 - 多输出组件

框图 TikZ 中的多输入 - 多输出组件

我的问题是,用矩阵(主要是块对角线)来定义其中带有标签的块(主要是矩形),使得此矩形中的 n 个箭头在视觉上与标签对角线上的相应元素处于同一高度。考虑以下示例

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[>=stealth]
\node[draw,rectangle,inner sep=0.5cm] (y) at (0,0) {$A$};
\node[draw,rectangle,inner sep=0.3cm] (d) at (0,2) {$\begin{array}{cc}B&\\&C \end{array}$};
\draw[->] (y.west) -| ++(-1,1) |- (d.west);
\draw[->] (d.east) -| ++(1,-1) |- (y.east);
\end{tikzpicture}
\end{document}

现在,让我首先创建两个子问题:

  1. 当我创建此标签时,inner sep节点形状选项(B 和 C 周围的可见矩形)调整起来有点烦人。所以我认为它不会在更好的解决方案中存在。因此,如果解决了以下问题,这个问题就过时了。
  2. 我想获得由我输入的矩阵标签产生的节点高度的句柄,然后以某种方式获得这个高度的 n + 1 的细分,创建 n 个节点来连接西侧和东侧。这样在上面的最小例子中,我将连接到两个从 A 出去的箭头(不是从同一位置而是分开并均匀地划分 A 的高度)并分别连接到 B 和 C(反之亦然)。

答案1

您可以使用.<angle>语法手动控制箭头的位置;另一种选择是使用matrix of (math) nodes而不是array环境来访问矩阵中的节点。以下示例说明了这两个想法:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,matrix}

\begin{document}

\begin{tikzpicture}[>=stealth]
  \node[draw,rectangle,inner sep=0.5cm] (y) at (0,0) {$A$};
  \node[draw,rectangle,inner sep=0.3cm] (d) at (0,2) {$\begin{array}{cc}B&\\&C \end{array}$};
  \draw[->] (y.west) -| ++(-1,1) |- (d.160);
  \draw[->] (y.west) -| ++(-0.8,1) |- (d.190);
  \draw[->] (d.-10) -| ++(0.8,-1) |- (y.east);
  \draw[->] (d.20) -| ++(1,-1) |- (y.east);
\end{tikzpicture}

\vspace*{10pt}

\begin{tikzpicture}[>=stealth,remember picture]
\node[draw,rectangle,inner sep=0.5cm] (y) at (0,0) {$A$};
\node[draw] (d) at (0,2) {%
  \begin{tikzpicture}[remember picture]
    \matrix [matrix of math nodes] (mat)
  {
    B & \phantom{C}   \\
    \phantom{B} & C \\
  };
  \end{tikzpicture}
  };
\draw[->,shorten >= 6pt] (y.west) -| ++(-1,1) |- (mat-1-1);
\draw[->,shorten >= 6pt] (y.west) -| ++(-0.8,1) |- (mat-2-1);
\draw[->] ($(mat-2-2)+(14pt,0)$) -| ++(0.8,-1) |- (y.east);
\draw[->] ($(mat-1-2)+(14pt,0)$) -| ++(1,-1) |- (y.east);
\end{tikzpicture}

\end{document}

图片 1

编辑:kgr 解决方案的变体,但使用两个节点矩阵:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,matrix,positioning}

\begin{document}

\begin{tikzpicture}[>=stealth]
\matrix[matrix of math nodes,nodes in empty cells,draw] (d) at (0,2)
{
  A & & & & \\
  & B & & & \\
  & & C  & & \\
  & & & D & \\
  & & & & E \\
};
\matrix[matrix of math nodes,nodes in empty cells,draw,minimum width=30pt,below=of d] (y) 
{
   \\ \\ \\ \\ \\
};
\node at (y) {$D$};

\foreach \i in {1,2,3,4,5}
  {
  \draw[->] let \p1 = (d.west), \p2 = (d-\i-\i.west), \p3 = (y.west), \p4 = (y-\i-1.west) in (\x3,\y4) -| 
    ++(-2.4+0.2*\i,1) |- (\x1,\y2);
  \draw[->] let \p1 = (d.east), \p2 = (d-\i-\i.east), \p3 = (y.east), \p4 = (y-\i-1.east) in (\x1,\y2) -|
    ++(1.6-0.2*\i,-1) |- (\x3,\y4);
  }
\end{tikzpicture}

\end{document}

图片 2

答案2

我不太清楚你想要什么,但这是第一次使用 tikz 矩阵:

\documentclass[11pt]{memoir}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}[>=stealth]
\node[draw,rectangle,inner sep=0.5cm] (y) at (0,0) {$A$};
\matrix[matrix of nodes,nodes in empty cells,rectangle,draw] (d) at (0,2)
{
  $B$ & \\
  & $C$ \\
};
\draw[->] let \p1 = (d.west), \p2=(d-1-1.west) in (y.west) -| ++(-1,1) |- (\x1,\y2);
\draw[->] let \p1 = (d.west), \p2=(d-2-2.west) in (y.west) -| ++(-0.8,1) |- (\x1,\y2);
\draw[->] let \p1 = (d.east), \p2=(d-2-2.east) in (\x1,\y2) -| ++(0.8,-1) |- (y.east);
\draw[->] let \p1 = (d.east), \p2=(d-1-1.east) in (\x1,\y2) -| ++(1,-1) |- (y.east);
\end{tikzpicture}

\end{document}

通过编写一些宏,线条绘制可能会变得简单很多。

示范

为了使线条在正确的位置开始/结束,您还可以使用更简单的线条绘制语法,上面我没有这样做,因为它的透明度稍差。例如,除了上面的第一条绘制线之外,您可以执行以下操作:

\draw[->] (y.west) -| ++(-1,1) |- (d.west |- d-1-1.west);

等等。

(对此进行了一些编辑以符合 Gonzalo Medina 对请求的解释,这似乎比我最初的解释更正确。)

好的,还有一次编辑:

只是为了好玩,我做了一些更有趣的东西。

\documentclass[11pt]{memoir}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{matrix}

\begin{document}


\begin{tikzpicture}[>=stealth]
\node[draw,rectangle,inner sep=0.5cm] (y) at (0,0) {$A$};
\matrix[matrix of nodes,nodes in empty cells,rectangle,draw] (d) at (0,3)
{
  $B$ & & & &\\
 & $C$ & & & \\
 & & $D$ & & \\
 & & & $E$ & \\
 & & & & $F$ \\
};

\foreach \z in {1,...,5}
{
  \draw[->] let \n1={\z * -0.2cm - 0.5cm} in
      (y.west) -| ([xshift=\n1] d.west |- y.west) |- (d.west |- d-\z-\z.west);
  \draw[->] let \n1={\z * 0.2cm + 0.5cm} in
      (d.east |- d-\z-\z.east) -| ([xshift=\n1] d.east |- y.east) |- (y.east);
}

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容