在使用 Spy 複製的內容之間繪製箭頭

在使用 Spy 複製的內容之間繪製箭頭

我有一個用 TiKZ 製作的圖表(使用 Spy 複製/鏡像部分)。它看起來像這樣:

第一的

這是使用以下程式碼建立的:

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, fit, arrows.meta,spy}

\begin{document}

    \begin{tikzpicture}[
                prod/.style={circle, draw, inner sep=0pt, fill=black!5, black!20},
                ct/.style={circle, draw, inner sep=5pt, ultra thick, minimum width=5mm, fill=black!5, black!20},
                inp/.style={circle, draw, inner sep=5pt, minimum width=6mm},
                ft/.style={circle, draw, minimum width=4mm, inner sep=1pt, fill=black!5, black!20},
                filter/.style={circle, draw, minimum width=3.5mm, inner sep=1pt, fill=black!5, black!20},
                mylabel/.style={font=\scriptsize\sffamily},
                >=LaTeX
            ]


        \begin{scope}[spy scope]

            \node[ct, label={[mylabel, black!20]Memory cell}, fill=black!5] (ct) {};
            \node[filter, right=of ct, fill=black!5] (int1) {$f_g$};
            \node[prod, right=of int1, fill=black!5] (x1) {$\times$}; 
            \node[right=of x1] (ht) {};
            \node[prod, left=of ct, fill=black!5] (x2) {$\times$}; 
            \node[filter, left=of x2, fill=black!5] (int2) {$f_h$};
            \node[prod, below=2.5mm of ct, fill=black!5] (x3) {$\times$}; 
            \node[ft, below=2.5mm of x3, label={[mylabel, black!20]right:Forget gate}, fill=black!5] (ft) {$f_t$};
            \node[ft, above=of x2, label={[mylabel, black!20]left:Input gate}, fill=black!5] (it) {$f_t$};
            \node[ft, above=of x1, label={[mylabel, black!20]left:Output gate}, fill=black!5] (ot) {$f_t$};
            \node[inp, left=of int2, label={[mylabel]}] (inp1) {};
            \node[inp, right=of x1, label={[mylabel]}] (out1) {};


            % Draw contents inside of memory block
            \foreach \i/\j in {int2/x2, x2/ct, ct/int1, int1/x1, x1/ht, it/x2, ct/it, ct/ot, ot/x1, ft/x3}
                \draw[->, black!20] (\i)--(\j);

            % From input nodes into network, and from network to output nodes
            \draw[->] (inp1) to (int2);  
            \draw[->] (x1) to (out1); 


            \draw[->, black!20] (ct) to[bend right=45] (ft);
            \draw[->, black!20] (ct) to[bend right=30] (x3);
            \draw[->, black!20] (x3) to[bend right=30] (ct);

            \node[fit=(int2) (it) (ot) (ft), draw, inner sep=0pt] (fit) {};

            %\draw[->] (inp1) to [bend right=75] (fit.south-|ft)  node[below]{};
            %\draw[->] (inp1) to [bend left=75] (fit.north-|ft)  node[below]{};

            %\draw[<-] (fit.west|-int2) coordinate (aux)--++(180:8mm) node[left]{};

            %\draw[<-] (fit.north-|it) coordinate (aux)--++(90:8mm) node[above]{};;

            %\draw[<-] (fit.north-|ot) coordinate (aux)--++(90:8mm) node[above]{};

            %\draw[<-] (fit.south-|ft) coordinate (aux)--++(-90:8mm) node[below]{};

            \spy [blue, size=10cm]on(0,0)in node[transform shape,yscale=-1]at(0,5);

        \end{scope}




    \end{tikzpicture}


\end{document}

我想知道是否可以在複製區塊的兩個“實例”之間繪製箭頭。為了說明我的意思,下圖的藍色箭頭就是我想要做的。如果使用 Spy 時不可能,我是否應該使用其他方法進行鏡像/複製? (關於如何鏡像/複製 TikZ 內容的原始問題在這裡:TikZ 圖中的複製與鏡像內容

第二

答案1

可能切換到使用圖片是一個解決方案,因為節點名稱可以添加前綴。但請注意,存在一個錯誤,這意味著某些to路徑無法使用:例如,to [bend right=45]無法使用圖片中的前綴節點,因此需要使用曲線進行一些「愚弄」:

\documentclass[tikz,border=5]{standalone} 
\usetikzlibrary{positioning, fit, arrows.meta,spy}

\tikzset{network/.pic={
  \node[ct, label={[mylabel, black!20]Memory cell}, fill=black!5] (ct) {};
  \node[filter, right=of ct, fill=black!5] (int1) {$f_g$};
  \node[prod, right=of int1, fill=black!5] (x1) {$\times$}; 
  \node[right=of x1] (ht) {};
  \node[prod, left=of ct, fill=black!5] (x2) {$\times$}; 
  \node[filter, left=of x2, fill=black!5] (int2) {$f_h$};
  \node[prod, below=2.5mm of ct, fill=black!5] (x3) {$\times$}; 
  \node[ft, below=2.5mm of x3, label={[mylabel, black!20]right:Forget gate}, fill=black!5] (ft) {$f_t$};
  \node[ft, above=of x2, label={[mylabel, black!20]left:Input gate}, fill=black!5] (it) {$f_t$};
  \node[ft, above=of x1, label={[mylabel, black!20]left:Output gate}, fill=black!5] (ot) {$f_t$};
  \node[inp, left=of int2, label={[mylabel]}] (inp1) {};
  \node[inp, right=of x1, label={[mylabel]}] (out1) {};
  % Draw contents inside of memory block
  \foreach \i/\j in {int2/x2, x2/ct, ct/int1, int1/x1, x1/ht, it/x2, ct/it, ct/ot, ot/x1, ft/x3}
      \draw[->, black!20] (\i)--(\j);
%  % From input nodes into network, and from network to output nodes
  \draw[->] (inp1) to (int2);  
  \draw[->] (x1) to (out1); 
  \draw[->, black!20] (ct) .. controls ++(200:3/4) and ++(160:3/4) .. (ft);
  \draw[->, black!20] (ct) to (x3);
  \draw[->, black!20] (x3) .. controls ++(0:1/2) and ++(315:1/2) ..  (ct);
  \node[fit=(int2) (it) (ot) (ft), draw, inner sep=0pt] (fit) {};
}}
\begin{document}

  \begin{tikzpicture}[
      prod/.style={circle, draw, inner sep=0pt, fill=black!5, black!20},
      ct/.style={circle, draw, inner sep=5pt, ultra thick, minimum width=5mm, fill=black!5, black!20},
      inp/.style={circle, draw, inner sep=5pt, minimum width=6mm},
      ft/.style={circle, draw, minimum width=4mm, inner sep=1pt, fill=black!5, black!20},
      filter/.style={circle, draw, minimum width=3.5mm, inner sep=1pt, fill=black!5, black!20},
      mylabel/.style={font=\scriptsize\sffamily},
      >=LaTeX]

\pic (lower-) at (0, -3) {network};
\scoped[yscale=-1, transform shape]\pic (upper-) at (0,-3) {network};
\foreach \i in {inp1,x1,x2,x3,ct}{
  \draw [blue, ->] (upper-inp1) -- (lower-\i);
  \draw [red, ->] (lower-out1) -- (upper-\i);
}
\end{tikzpicture}
\end{document}

在此輸入影像描述

相關內容