화살표로 연결된 서로 다른 그리드에 노드를 만드는 방법은 무엇입니까?

화살표로 연결된 서로 다른 그리드에 노드를 만드는 방법은 무엇입니까?

저는 tikz 초보자입니다. 아래 사진(특히 왼쪽상단, 오른쪽상단, 오른쪽하단 체인)을 재현해보려고 합니다. 저는 다음과 같이 시작했습니다.

\documentclass[tikz]{standalone}
\usepackage{amsmath}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \tikzstyle{tensor} = [circle, inner sep = 0pt, minimum size = 0.2cm]
  \tikzstyle{QTensor} = [tensor, draw, fill=green!50, minimum size = 0.3cm]
  \tikzstyle{delta} = [tensor, draw, fill=red!50, minimum size = 0.4cm]
  \tikzstyle{ellipsisNode} = [tensor, minimum size = 0.7cm]

  % Draw delta tensors
  \foreach \x in {2, 4}
    \foreach \y in {2, 4}
      \node[delta] (\x-\y) at (\x, \y) {};

  % Draw Q tensors
  \foreach \x in {1, 3, 5}
    \foreach \y in {2, 4}
      {
      \node[QTensor] (\x-\y) at (\x, \y) {};
      \node[QTensor] (\y-\x) at (\y, \x) {};
      }

  % Draw ellipsis nodes
  \foreach \x in {0, 6}
    \foreach \y in {2, 4}
    {
    \node[ellipsisNode] (\x-\y) at (\x, \y) {$\cdots$};
    \node[ellipsisNode, rotate = 90] (\y-\x) at (\y, \x) {$\dots$};
    }

  % Connections
  \foreach \x in {0, ..., 5}
    \foreach \y in {2, 4}
    {
    \pgfmathtruncatemacro{\neighbor}{\x + 1};
    \draw (\x-\y) -- (\neighbor-\y);
    \draw (\y-\x) -- (\y-\neighbor);
    }

\end{tikzpicture}
\end{document}

나는 그 일이 힘든 일이라고 생각한다. 너무 많은 좌표를 추적하고 싶지 않습니다. 위치 라이브러리를 사용해야 합니까? 다른 점을 기준으로 좌표계를 사용할 수 있나요? 아니면 별도의 tikz 사진을 만들고 화살표로 연결할 수 있나요?

이러한 유형의 이미지를 여러 개 더 만들어야 하기 때문에 가장 유지 관리가 용이하고 관용적인 솔루션에 관심이 있습니다.

텐서 네트워크

지금까지 내 결과는 다음과 같습니다.

내가 지금까지 가지고 있는 것

답변1

많이 재사용되는 tikz 코드의 경우 pics스타일을 정의하는 것이 좋습니다. 그런 다음 를 사용하여 코드를 그릴 수 있습니다 \draw (0,0) pic{<pics name>};. 이에 대한 자세한 내용은 tikz 매뉴얼(버전 3.0.1a)의 섹션 18.2에서 읽을 수 있습니다. 다이어그램의 반복 구성 요소에 대한 사진을 정의한 후에는 \foreach루프를 사용하여 원하는 위치에 사진을 배치하는 것이 비교적 간단합니다.

이렇게 하면 다음 두 이미지를 생성할 수 있습니다.

여기에 이미지 설명을 입력하세요

코드를 사용하여:

\documentclass{article}
\usepackage{tikz}

\tikzset{% define pic styles
  pics/array/.style={
       code={\draw(-0.6,0)--+(1.2,0);
             \draw(0,-0.6)--+(0,1.2);
             \draw[fill=red!50] circle[red!50,radius=4pt](0,0);
             \foreach \a in {0.5,-0.5} {
                 \draw[fill=green!50] (0,\a) circle[radius=2pt];
                 \draw[fill=green!50] (\a,0) circle[radius=2pt];
             }
            }
       },
  pics/semiarray/.style={
       code={\draw[rounded corners, fill=yellow!20](-0.45,-0.45) rectangle +(0.9,0.9);
             \draw(-0.6,0)--+(1.2,0); % draw the "axes" over the top of the shading
             \draw(0,-0.6)--+(0,1.2); 
             \draw[fill=red!50] circle[red!50,radius=4pt](0,0);
             \draw[fill=green!50](-0.35,-0.1) -- +(0,0.2) arc(90:-90:0.1) -- cycle; % semicircles
             \draw[fill=green!50](0.35,0.1) -- +(0,-0.2) arc(270:90:0.1) -- cycle;
             \draw[fill=green!50](-0.1,0.35) -- +(0.2,0) arc(0:-180:0.1) -- cycle;
             \draw[fill=green!50](-0.1,-0.35) -- +(0.2,0) arc(0:180:0.1) -- cycle;
             }
       },
}

\begin{document}

\begin{tikzpicture}
    \foreach \x in {0,...,4} {
        \draw[dotted](-0.4,\x)--+(-0.5,0);
        \draw[dotted](4.4,\x)--+(0.5,0);
        \draw[dotted](\x,-0.4)--+(0,-0.5);
        \draw[dotted](\x,4.4)--+(0,0.5);
    }
    \foreach \x in {0,...,4} {
        \foreach \y in {0,...,4} {
           \draw(\x,\y) pic{array};
        }
    }
\end{tikzpicture}
\begin{tikzpicture}
    \foreach \x in {0,...,4} {
        \draw[dotted](-0.4,\x)--+(-0.5,0);
        \draw[dotted](4.4,\x)--+(0.5,0);
        \draw[dotted](\x,-0.4)--+(0,-0.5);
        \draw[dotted](\x,4.4)--+(0,0.5);
    }
    \foreach \x in {0,...,4} {
        \foreach \y in {0,...,4} {
           \draw(\x,\y) pic{semiarray};
        }
    }
\end{tikzpicture}

\end{document}

명령 내부의 좌표는 pics이 배치된 위치를 기준으로 합니다 pic. 명령 은 pics인수를 취할 수도 있습니다(예를 들어 다음을 참조하세요).TikZ를 사용한 간단한 그리기).

관련 정보