У меня есть схема, сделанная в 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
Возможно, переключение на использование pics является решением, поскольку имена узлов могут быть префиксированы. Обратите внимание, однако, есть ошибка, которая означает, что определенные to
пути не могут быть использованы: например, to [bend right=45]
не будет работать с префиксными узлами внутри pics, поэтому требуется некоторая «игрушка» с кривыми:
\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}