Дублирование и зеркалирование содержимого в диаграмме TikZ

Дублирование и зеркалирование содержимого в диаграмме TikZ

У меня есть следующая диаграмма, сделанная в TikZ:

введите описание изображения здесь

Вот код:

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

Теперь я пытаюсь "зеркалить" Все, как показано на рисунке ниже. Возможно ли это? (не обращайте внимания на зеркальные буквы, я не хочу, чтобы они были зеркальными, только структура кругов и стрелок внутри коробки).

введите описание изображения здесь

Для начала, у меня возникли проблемы даже с созданием второй диаграммы, которая отображается под первой. Я пробовал использовать внешний цикл for, но это вообще не сработало.

Редактировать: Поскольку Symbol 1 предоставил прекрасный ответ ниже, который заключается в использовании \Spy для создания копии области, я хотел бы уточнить свой вопрос и добавить, что я бы предпочел иметь возможность рисовать стрелки между двумя блоками (как показано красным на моем нарисованном от руки рисунке). Я пытался найти информацию о том, как это сделать, имея копию, сделанную Spy, но ничего не смог найти. Может быть, это невозможно?

решение1

Вы можете получить бесплатную копию прицела\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}

Связанный контент