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}
コピーされたブロックの 2 つの「インスタンス」間に矢印を描くことができるかどうか知りたいです。私の言いたいことを説明すると、下の図の青い矢印が私がやりたいことです。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}