Duplicando e espelhando conteúdo no diagrama TikZ

Duplicando e espelhando conteúdo no diagrama TikZ

Tenho o seguinte diagrama, feito em TikZ:

insira a descrição da imagem aqui

Este é o código para isso:

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

\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=10mm, fill=black!5, black!20},
    ft/.style={circle, draw, minimum width=8mm, inner sep=1pt, fill=black!5, black!20},
    filter/.style={circle, draw, minimum width=7mm, inner sep=1pt, fill=black!5, black!20},
    mylabel/.style={font=\scriptsize\sffamily},
    >=LaTeX
    ]

\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) {$h_t$};
\node[prod, left=of ct, fill=black!5] (x2) {$\times$}; 
\node[filter, left=of x2, fill=black!5] (int2) {$f_h$};
\node[prod, below=5mm of ct, fill=black!5] (x3) {$\times$}; 
\node[ft, below=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$};

\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);

\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[<-] (fit.west|-int2) coordinate (aux)--++(180:7mm) node[left]{$x_t$};
\draw[<-, black!20] ([yshift=1mm]aux)--++(135:7mm);
\draw[<-, black!20] ([yshift=-1mm]aux)--++(-135:7mm);

\draw[<-] (fit.north-|it) coordinate (aux)--++(90:7mm) node[above]{$x_t$};
\draw[<-, black!20] ([xshift=1mm]aux)--++(45:7mm);
\draw[<-, black!20] ([xshift=-1mm]aux)--++(135:7mm);

\draw[<-] (fit.north-|ot) coordinate (aux)--++(90:7mm) node[above]{$x_t$};
\draw[<-, black!20] ([xshift=1mm]aux)--++(45:7mm);
\draw[<-, black!20] ([xshift=-1mm]aux)--++(135:7mm);

\draw[<-] (fit.south-|ft) coordinate (aux)--++(-90:7mm) node[below]{$x_t$};
\draw[<-, black!20] ([xshift=1mm]aux)--++(-45:7mm);
\draw[<-, black!20] ([xshift=-1mm]aux)--++(-135:7mm);

\end{tikzpicture}


\end{document}

Agora estou tentando "espelhar" tudo como mostra a imagem abaixo. Isso é possível? (não se importe com as letras espelhadas, não quero que sejam espelhadas, apenas com a estrutura dos círculos e setas dentro da caixa).

insira a descrição da imagem aqui

Para começar, estou tendo problemas até mesmo para criar um segundo diagrama que apareça abaixo do primeiro. Tentei usar um loop for externo, mas não funcionou.

Editar: Como o Símbolo 1 forneceu uma excelente resposta abaixo, que é usar \Spy para criar uma cópia do escopo, gostaria de refinar minha pergunta e acrescentar que preferiria poder desenhar setas entre os dois blocos (como visto com vermelho na minha imagem desenhada à mão). Tentei encontrar informações sobre como fazer isso ao fazer uma cópia pelo Spy, mas não consegui encontrar nada. Talvez não seja possível?

Responder1

Você pode obter uma cópia gratuita de um escopo acessando\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=10mm, fill=black!5, black!20},
                ft/.style={circle, draw, minimum width=8mm, inner sep=1pt, fill=black!5, black!20},
                filter/.style={circle, draw, minimum width=7mm, 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) {$h_t$};
            \node[prod, left=of ct, fill=black!5] (x2) {$\times$}; 
            \node[filter, left=of x2, fill=black!5] (int2) {$f_h$};
            \node[prod, below=5mm of ct, fill=black!5] (x3) {$\times$}; 
            \node[ft, below=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$};
            \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);
            \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[<-] (fit.west|-int2) coordinate (aux)--++(180:7mm) node[left]{$x_t$};
            \draw[<-, black!20] ([yshift=1mm]aux)--++(135:7mm);
            \draw[<-, black!20] ([yshift=-1mm]aux)--++(-135:7mm);
            \draw[<-] (fit.north-|it) coordinate (aux)--++(90:7mm) node[above]{$x_t$};
            \draw[<-, black!20] ([xshift=1mm]aux)--++(45:7mm);
            \draw[<-, black!20] ([xshift=-1mm]aux)--++(135:7mm);
            \draw[<-] (fit.north-|ot) coordinate (aux)--++(90:7mm) node[above]{$x_t$};
            \draw[<-, black!20] ([xshift=1mm]aux)--++(45:7mm);
            \draw[<-, black!20] ([xshift=-1mm]aux)--++(135:7mm);
            \draw[<-] (fit.south-|ft) coordinate (aux)--++(-90:7mm) node[below]{$x_t$};
            \draw[<-, black!20] ([xshift=1mm]aux)--++(-45:7mm);
            \draw[<-, black!20] ([xshift=-1mm]aux)--++(-135:7mm);

            \spy [blue, size=10cm]on(0,0)in node[transform shape,yscale=-1]at(0,10);
        \end{scope}
    \end{tikzpicture}
\end{document}

informação relacionada