가장자리가 있는 tikzpicture의 노드 내부를 그리는 방법

가장자리가 있는 tikzpicture의 노드 내부를 그리는 방법

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

을 사용하여 이러한 그래프를 어떻게 그릴 수 있습니까 tikzpicture?

답변1

pics다음 18장을 정의합니다 .틱즈매뉴얼은 확실히 갈 길입니다. 아래 코드는 두 개의 사진을 정의 2box하고 3box각각 두 개 또는 세 개의 원이나 사각형을 포함하는 상자를 정의합니다. 2box두 개의 원 안의 레이블과 화살표 위와 아래의 레이블 등 4개의 인수만 사용하므로 약간 더 쉽습니다 . 이것을 사용하면 다음을 사용하여 상단 상자를 그릴 수 있습니다.

\pic at (0,0) {2box={r,a,1{\mid}0,01}};

다음 과 pic같은 유용한 노드를 정의합니다.

  • ra상자 전체에 대해
  • ra-r첫 번째 서클의 경우
  • ra-a두 번째 원의 경우

이것은 부분적으로는 그림을 그리기 위한 것이고 부분적으로는 나중에 화살표를 그리기 위한 것입니다. 그림 3box은 비슷하지만 7개의 인수가 필요합니다. 즉, 3개의 노드 레이블과 2개의 화살표 위와 아래에 있는 4개의 레이블입니다.

2box이를 제자리에 두고 및 를 사용하여 상자를 그린 3box다음 가장자리를 그리기 만 하면 됩니다 . 처음에는 positioning라이브러리를 사용하여 노드를 배치하려고 생각했지만 안타깝게도 잘 작동하지 pics않아서 positioning모든 것을 손으로 배치하여 제작했습니다.

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

변화를 쉽게 주기 위해 스타일링을 넉넉하게 적용했습니다. 전체 코드는 다음과 같습니다.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\tikzset{
  arrow/.style = {-{LaTeX}, thick},
  label/.style = {pos=0.4, font=\scriptsize},
  mynode/.style = {fill=white, inner sep=3pt, thick, draw=black},
  onode/.style = {circle, mynode},
  snode/.style = {rectangle, mynode},
  box/.style = {thick, fill=gray!50, draw=black, anchor=south west},
  pics/2box/.style args = {#1,#2,#3,#4}{% a,b,top,bot
    code = {
        \node[box, minimum width=2cm, minimum height=1cm](#1#2) at (0,0){};
        \node[onode] (#1#2-#1) at (0.4,0.5){#1};
        \node[onode] (#1#2-#2) at (1.6,0.5){#2};
        \draw[arrow](#1#2-#1) -- node[label,above]{$#3$}
                                 node[label,below]{$#4$} (#1#2-#2);
    }
  },
  pics/3box/.style args = {#1,#2,#3,#4,#5,#6,#7}{% a,b,c,top,bot,top,bot}
    code = {
        \node[box, minimum width=2cm, minimum height=2cm](#1#2#3) at (0,0){};
        \node[snode] (#1#2#2-#1) at (0.4,1.5){#1};
        \node[snode] (#1#2#2-#2) at (0.4,0.5){#2};
        \node[onode] (#1#2#2-#3) at (1.6,1){#3};
        \draw[arrow](#1#2#2-#1.east) to[out=20, in=135]
            node[label,above]{$#4$} node[label,below]{$#5$} (#1#2#2-#3);
        \draw[arrow](#1#2#2-#2.east) to[out=-20, in=225]
            node[label,above]{$#6$} node[label,below]{$#7$} (#1#2#2-#3);
    }
  },
}

\begin{document}

  \begin{tikzpicture}
    \pic at (0,9) {2box={r,a,1{\mid}0,01}};
    \pic at (0,6) {3box={b,q,m,1{\mid}0,02,2{\mid}0,02}};
    \pic at (1,4) {2box={q,b,1{\mid}0,03}};
    \pic at (0,2) {2box={e,p,1{\mid}2,04}};
    \pic at (0,0) {2box={q,e,1{\mid}0,05}};
    \draw[arrow] (ra.south)--(bqm.north);
    \draw[arrow] (bqm.south)--(qb.north);
    \draw[arrow] (bqm) to[out=250, in=120](ep);
    \draw[arrow] (ep.south)--(qe.north);
    \draw[arrow] (qe.south)--++(0,-0.5);
    \draw[thick](0.5,10.6) -- ++(0,-0.1)--++(1,0)--++(0,0.1);
    \draw[{LaTeX}-,thick](ra.north)--++(0,0.5);
    \draw[arrow,rounded corners]
    (2.5,4)--++(0,-0.3)--++(1,0)--++(0,6.65)--++(-2,0)--++(0,-0.35);
  \end{tikzpicture}

\end{document}

보시다시피, 2box및 의 정의 3box는 상당히 유사한 작은 조각일 뿐입니다.틱즈암호. 상대 좌표 의 정의 내부가 pics사용됩니다. 나는 \delta연습으로 레이블을 남겼습니다 .

관련 정보