Zeichnen von Pfeilen zwischen mit Spy kopierten Inhalten

Zeichnen von Pfeilen zwischen mit Spy kopierten Inhalten

Ich habe ein in TiKZ erstelltes Diagramm (mit kopierten/gespiegelten Teilen mithilfe von Spy). Es sieht so aus:

Erste

Dies wurde mit dem folgenden Code erstellt:

\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}

Ich würde gerne wissen, ob es möglich ist, Pfeile zwischen den beiden „Instanzen“ kopierter Blöcke zu zeichnen. Um zu verdeutlichen, was ich meine, zeigen die blauen Pfeile im Bild unten, was ich machen möchte. Wenn dies bei Verwendung von Spy nicht möglich ist, sollte ich dann mit einem anderen Ansatz spiegeln/kopieren? (Die ursprüngliche Frage zum Spiegeln/Kopieren von TikZ-Inhalten finden Sie hier:Duplizieren und Spiegeln von Inhalten im TikZ-Diagramm)

zweite

Antwort1

Möglicherweise ist die Umstellung auf die Verwendung von Bildern eine Lösung, da die Knotennamen mit Präfixen versehen werden können. Beachten Sie jedoch, dass es einen Fehler gibt, der bedeutet, dass bestimmte toPfade nicht verwendet werden können: funktioniert beispielsweise to [bend right=45]nicht mit vorangestellten Knoten in Bildern, sodass ein wenig „Herumspielen“ mit Kurven erforderlich ist:

\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}

Bildbeschreibung hier eingeben

verwandte Informationen