저는 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를 사용한 간단한 그리기).