如何在节点中画线

如何在节点中画线

我正在尝试复制如下图片: 在此处输入图片描述

我只是处于此复制的开始阶段,因此我得到以下结果:

\documentclass[margin=10pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{arrows,decorations,pathmorphing,backgrounds,positioning,fit,petri}

\begin{document}

%% Set up the style
\tikzstyle{rom} = [square, draw, text width=5em, text centered,
  minimum height=4em]

\begin{tikzpicture}
  %% Start drawing the nodes
  \node[rom] (rom1) {ROM};
  \node[rom] (rom2) [below=of rom1] {ROM};

  \draw[->] (rom1.west)
\end{tikzpicture}
\end{document}

其结果为:

在此处输入图片描述

我该如何绘制通往顶部节点的 A2、A1 和 A0 线?我的猜测是,我们将在左侧创建一个不可见节点,然后我们可以从不可见节点绘制到绘制节点的线?

答案1

首先,这是绘制第一个的简单方法。请注意,我不得不在几个地方更改您的代码,因为它无法编译而没有错误。

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri}

\begin{document}

%% Set up the style
\tikzset{%
  rom/.style = {draw, text width=5em, text centered, minimum height=4em}
}

\begin{tikzpicture}
  %% Start drawing the nodes
  \node[rom] (rom1) {ROM};
  \node[rom] (rom2) [below=of rom1] {ROM};

  \draw[<-] (rom1.west) -- +(-20mm,0) node [left] (a1) {$A_1$};
\end{tikzpicture}
\end{document}

第一的

从整体上看,我倾向于使用 来pic绘制 ROM 盒,因为它们是相同的,并且连接模式始终相同。然后,​​您可以使用几个循环来添加几条线,并完成更复杂的情况,逐一处理它们。

\documentclass[tikz,border=10pt]{standalone}

加载我们想要的库:

\usetikzlibrary{arrows.meta,positioning,calc}

\begin{document}

%% Set up the style

我们使用计数器来命名 ROM 盒。第一个是rom1,第二个是 ,rom2依此类推。

\newcounter{rom}
\setcounter{rom}{0}
\tikzset{%
  rom/.style = {draw, text width=5em, text centered, minimum height=4em, font=\sffamily},
  a node/.style = {inner sep=1pt, font=\scriptsize},

pic以下是,的代码rom node

  rom node/.pic = {%

增加计数器:

    \stepcounter{rom}%

绘制并命名基本框:

    \node [rom] (rom\therom) {ROM};

现在我们创建连接rom<counter>-a0rom<counter>-a1rom<counter>-a2在左侧标记它们。

    \foreach \i [count=\j from 0] in {1/4,1/2,3/4} \node (rom\therom-a\j) [a node, right] at ($(rom\therom.south west)!\i!(rom\therom.north west)$) {$A_\j$};

现在进行连接rom<counter>-d0rom<counter>-d1在右侧。

    \node (rom\therom-d1) [a node, left] at (rom\therom-a2 -| rom\therom.east) {$D_1$};
    \node (rom\therom-d0) [a node, left] at (rom\therom-a0 -| rom\therom.east) {$D_0$};

这是顶部的标签:

    \node [a node, below] at (rom\therom.north) {$8 \times 2$};

现在我们想要连接rom<counter>-oerom<counter>-ce底部。

    \node (rom\therom-ce) [a node, above, xshift=-10pt] at (rom\therom.south) {$CE$};
    \node (rom\therom-oe) [a node, above, xshift=10pt] at (rom\therom.south) {$OE$};
  },

绘制一端位于另一条线上的线条的样式将会很有用。

  bullet arrow/.style={{Circle[width=2pt,length=2pt]}->, shorten <=-1pt}
}

更改图片的默认箭头提示。

\begin{tikzpicture}[>={Latex[]}]
  %% Start drawing the nodes

现在来看看这两个rom node pic

  \pic {rom node};
  \pic [below=of rom1] {rom node};

使用来自 s 的连接,pic我们可以循环d右侧的连接并添加指向d0d1d2的箭头d3

  \foreach \i/\j in {rom1-d1/3,rom1-d0/2,rom2-d1/1,rom2-d0/0}
  \draw [->] (\i) -- +(20mm,0) node (d\j) [a node, right] {$D_\j$};

现在,画出左侧进入较高 ROM 盒的箭头,以及从这些箭头到较低 ROM 盒中相应连接器的连接。我们在将箭头画入较高盒时标记应从哪里开始连接到较低盒,然后使用第二个添加从这些点开始的连接\draw

  \foreach \i in {0,1,2}
  {
    \draw [<-] (rom1-a\i) -- +(-20mm,0) coordinate [pos=(3-\i)/6] (a\i x) node (a\i) [a node, left] {$A_\i$};
    \draw [bullet arrow] (a\i x) |- (rom2-a\i);
  }

接下来,将箭头放入rom2-ce和中rom2-oe,标记我们稍后想要添加更多箭头的位置。

  \draw [<-] (rom2-oe) |- +(20mm,-5mm) coordinate [pos=.85] (oex) coordinate (oe);
  \draw [<-] (rom2-ce) |- ([yshift=-2.5mm]oe) coordinate [pos=.8] (cex);

rom1-oe这是连接标记点和 的后续箭头rom1-ce

  \draw [bullet arrow] (oex) |- ([yshift=-5mm]rom1-oe.south) -- (rom1-oe.south);
  \draw [bullet arrow] (cex) |- ([yshift=-7.5mm]rom1-ce.south) -- (rom1-ce.south);
\end{tikzpicture}
\end{document}

ROM

完整代码:

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{arrows.meta,positioning,calc}

\begin{document}

%% Set up the style
\newcounter{rom}
\setcounter{rom}{0}
\tikzset{%
  rom/.style = {draw, text width=5em, text centered, minimum height=4em, font=\sffamily},
  a node/.style = {inner sep=1pt, font=\scriptsize},
  rom node/.pic = {%
    \stepcounter{rom}%
    \node [rom] (rom\therom) {ROM};
    \foreach \i [count=\j from 0] in {1/4,1/2,3/4} \node (rom\therom-a\j) [a node, right] at ($(rom\therom.south west)!\i!(rom\therom.north west)$) {$A_\j$};
    \node (rom\therom-d1) [a node, left] at (rom\therom-a2 -| rom\therom.east) {$D_1$};
    \node (rom\therom-d0) [a node, left] at (rom\therom-a0 -| rom\therom.east) {$D_0$};
    \node [a node, below] at (rom\therom.north) {$8 \times 2$};
    \node (rom\therom-ce) [a node, above, xshift=-10pt] at (rom\therom.south) {$CE$};
    \node (rom\therom-oe) [a node, above, xshift=10pt] at (rom\therom.south) {$OE$};
  },
  bullet arrow/.style={{Circle[width=2pt,length=2pt]}->, shorten <=-1pt}
}

\begin{tikzpicture}[>={Latex[]}]
  %% Start drawing the nodes
  \pic {rom node};
  \pic [below=of rom1] {rom node};
  \foreach \i/\j in {rom1-d1/3,rom1-d0/2,rom2-d1/1,rom2-d0/0}
  \draw [->] (\i) -- +(20mm,0) node (d\j) [a node, right] {$D_\j$};
  \foreach \i in {0,1,2}
  {
    \draw [<-] (rom1-a\i) -- +(-20mm,0) coordinate [pos=(3-\i)/6] (a\i x) node (a\i) [a node, left] {$A_\i$};
    \draw [bullet arrow] (a\i x) |- (rom2-a\i);
  }
  \draw [<-] (rom2-oe) |- +(20mm,-5mm) coordinate [pos=.85] (oex) coordinate (oe);
  \draw [<-] (rom2-ce) |- ([yshift=-2.5mm]oe) coordinate [pos=.8] (cex);
  \draw [bullet arrow] (oex) |- ([yshift=-5mm]rom1-oe.south) -- (rom1-oe.south);
  \draw [bullet arrow] (cex) |- ([yshift=-7.5mm]rom1-ce.south) -- (rom1-ce.south);
\end{tikzpicture}
\end{document}

相关内容