노드 하위 집합 주위에 테두리를 그리는 방법

노드 하위 집합 주위에 테두리를 그리는 방법

다음과 같은 다이어그램이 필요합니다.

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

"검은색" 부분을 자동화했지만 빨간색 테두리를 어떻게 처리해야 할지 알 수 없었습니다. 내 현재 버전은 다음과 같습니다.

\documentclass[border=1mm,tikz,preview]{standalone}

\newcount\prevnode

\def\EDynkin#1{
\prevnode=0
\node (1) at (2,0) [circle,draw,radius=1em] {};
\node (2) at (0,1) [circle,draw,radius=1em] {};
\node (3) at (1,0) [circle,draw,radius=1em] {};
\node (4) at (0,0) [circle,draw,radius=1em] {};
\node (5) at (-1,0) [circle,draw,radius=1em] {};
\node (6) at (-2,0) [circle,draw,radius=1em] {};
\draw (1) -- (3) -- (4) -- (5) -- (6);
\draw (2) -- (4);
\foreach\kthweight[count=\k] in {#1}{
\ifnum\k=1\node at (2,0) {\scriptsize\kthweight};\fi
\ifnum\k=2\node at (0,1) {\scriptsize\kthweight};\fi
\ifnum\k>6
\node (\k) at (4-\k,0) [circle,draw,radius=1em] {};
\draw (\k) -- (\the\prevnode);
\fi
\ifnum\k>2\node at (4-\k,0) {\scriptsize\kthweight};\fi
\global\advance\prevnode by1
}
}

\begin{document}

\begin{tikzpicture}[scale=.5]
\EDynkin{2,0,1,0,2,1,0,1}
\draw [red,rounded corners] (-.5,1.5) -- (.5,1.5) -- (.5,.5) -- (1.5,.5) --
(1.5,-.5) -- (-2.5,-.5) -- (-2.5,.5) -- (-.5,.5) -- cycle;
\end{tikzpicture}

\end{document}

그리고 나는 그것을 전혀 좋아하지 않습니다. 그 추악한 자동화 부분의 개선에 대해 묻는 것은 아마도 너무 많은 일일 것입니다. 그러나 경계 문제는 특히 끔찍합니다.

포함되어야 하는 노드의 하위 집합을 표시하여 이 빨간색 테두리를 표시하는 방법을 아는 사람이 있습니까?

답변1

코드를 다소 단순화하려고 노력했습니다. (원하는 출력을 생성하기 위해 노드 1과 2도 바꿨습니다.) 무엇보다도 이 코드는 더 이상 노드를 덮어쓰지 않습니다.

\documentclass[border=1mm,tikz,preview]{standalone}
\usetikzlibrary{calc}
\newcounter{DynkinDiagram}
\tikzset{DynkinNode/.style={circle,draw,minimum size=1em,inner sep=0pt,font=\scriptsize}}
\newcommand{\EDynkin}[2][]{\stepcounter{DynkinDiagram}
\foreach\kthweight[count=\k] in {#2}{
\pgfmathtruncatemacro{\prevnode}{\k-1}
\ifnum\k=1\node[DynkinNode] (\theDynkinDiagram-\k) at (0,1) {\kthweight};\fi % exchanged 1 and 2
\ifnum\k>1
\node[DynkinNode] (\theDynkinDiagram-\k) at (4-\k,0) {\scriptsize\kthweight};
\ifnum\k>2\draw[-,#1] (\theDynkinDiagram-\k) -- (\theDynkinDiagram-\prevnode);\fi
\ifnum\k=4\draw[-,#1] (\theDynkinDiagram-\k) -- (\theDynkinDiagram-1);\fi
\fi
}
}
\newcommand{\DrawHalo}[2][]{%
\foreach \Node[count=\i] in {#2}
{
\xdef\imax{\i}
\coordinate (AuxNode-\i) at ($(\theDynkinDiagram-\Node)$);
}
\ifnum\imax=3%
\draw[#1] ($(AuxNode-1)+(-0.50,0)$) -- ($(AuxNode-1)+(-0.50,0.50)$) -|  ($(AuxNode-2)+(-0.50,0.50)$)
    -- ($(AuxNode-2)+(0.50,0.50)$) |-
    ($(AuxNode-3)+(0.50,0.50)$)
    --($(AuxNode-3)+(0.50,-0.50)$) -- ($(AuxNode-1)+(-0.50,-0.50)$) -- cycle;
\else
\ifnum\imax=2%
\draw[#1] ($(AuxNode-1)+(-0.50,0.50)$) --  ($(AuxNode-2)+(0.50,0.50)$)
    -- ($(AuxNode-2)+(0.50,-0.50)$) -- ($(AuxNode-1)+(-0.50,-0.50)$)--
    cycle;
\else
\draw[#1] ($(AuxNode-1)+(-0.50,0.50)$) --  ($(AuxNode-1)+(0.50,0.50)$)
    -- ($(AuxNode-1)+(0.50,-0.50)$) -- ($(AuxNode-1)+(-0.50,-0.50)$)--
    cycle;
\fi 
\fi 
}
\begin{document}

\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{6,1,3}
\begin{scope}[xshift=8cm]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[fill=red,opacity=0.3,rounded corners]{6,1,3}
\end{scope}
\end{tikzpicture}
%
\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{6,2}
\end{tikzpicture}
%
\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{4,1,4}
\end{tikzpicture}
%
\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{6,1,4}
\end{tikzpicture}
%
\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{4,1,3}
\end{tikzpicture}
%
\begin{tikzpicture}[scale=.5]
\EDynkin{0,2,1,0,2,1,0,1}
\DrawHalo[red,rounded corners]{6}
\end{tikzpicture}
\end{document}

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

이 코드는 1, 2 또는 3개의 노드 목록을 예상하는 marco와 함께 제공됩니다 \DrawHalo(대괄호 제외). 노드가 3개 있는 경우 {가장 왼쪽 노드, 가장 위쪽 노드, 가장 오른쪽 노드} 순서로 배치하고, 가로로 2개의 노드가 배열된 경우 {가장 왼쪽 노드, 가장 오른쪽 노드} 순서로 배치합니다. 두 개의 노드를 수직으로 배열하여 3개의 {하단 노드, 상단 노드, 하단 노드}를 넣습니다.

업데이트: 단일 노드 케이스를 추가했습니다.

두 번째 업데이트: 당신 말이 맞아요 \ifnum. 또한 이전에는 노드를 두 번 그렸습니다 (4-\k). 저는 이 기회를 이용하여 두 가지를 더 변경했습니다. 노드 카운터를 추가하여 tikzpicture두 노드에 동일한 이름을 지정하지 않고도 여러 다이어그램을 한 번에 그릴 수 있었습니다. 그러나 이는 \DrawHalo항상 그 전에 그려진 마지막 다이어그램을 나타냅니다. 그 외에도 em확장성을 높이기 위해 단위를 무차원 표현으로 대체했습니다. 옵션에 관해서는 이를 사용하여 수행할 수 있는 작업을 설명하기 위해 예제를 추가했습니다.

답변2

도서관 을 이용하시면 됩니다 fit. 보다 정교한 윤곽선 모양을 원한다면 backgrounds다음을 사용하십시오.

\documentclass[border=1mm,tikz,preview]{standalone}
\usetikzlibrary{fit,backgrounds}

\newcount\prevnode

\def\EDynkin#1{
\prevnode=0
\node (1) at (2,0) [circle,draw,radius=1em] {};
\node (2) at (0,1) [circle,draw,radius=1em] {};
\node (3) at (1,0) [circle,draw,radius=1em] {};
\node (4) at (0,0) [circle,draw,radius=1em] {};
\node (5) at (-1,0) [circle,draw,radius=1em] {};
\node (6) at (-2,0) [circle,draw,radius=1em] {};
\draw (1) -- (3) -- (4) -- (5) -- (6);
\draw (2) -- (4);
\foreach\kthweight[count=\k] in {#1}{
\ifnum\k=1\node at (2,0) {\scriptsize\kthweight};\fi
\ifnum\k=2\node at (0,1) {\scriptsize\kthweight};\fi
\ifnum\k>6
\node (\k) at (4-\k,0) [circle,draw,radius=1em] {};
\draw (\k) -- (\the\prevnode);
\fi
\ifnum\k>2\node at (4-\k,0) {\scriptsize\kthweight};\fi
\global\advance\prevnode by1
}
}

\begin{document}

\begin{tikzpicture}[scale=.5]
\EDynkin{2,0,1,0,2,1,0,1}
\node (box) [draw=red,rounded corners,fit = (3) (6) (2)] {};
\end{tikzpicture}

\begin{tikzpicture}[scale=.5]
\pgfdeclarelayer{bg}
\pgfsetlayers{bg,main}

\EDynkin{2,0,1,0,2,1,0,1}
\begin{pgfonlayer}{bg}
 \node (box) [draw=red,line width=.8pt,rounded corners,fit = (3) (6)] {};
 \node (box) [draw=red,line width=.8pt,rounded corners,fit = (4) (2)] {};
 \node (box) [fill=white,rounded corners,fit = (3) (6)] {};
 \node (box) [fill=white,rounded corners,fit = (4) (2)] {};
\end{pgfonlayer}
\end{tikzpicture}

\end{document}

결과는 다음과 같습니다.

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

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

답변3

622페이지의 52장의 pgfmanual에 문서화된 tikz 피팅 라이브러리를 사용할 수 있습니다. 불행히도 경계 상자는 미리 정의된 모양 중 하나만 될 수 있습니다.

이 예는 매뉴얼에서 가져온 것입니다.

\begin{tikzpicture}[
    inner sep=0pt,
    thick,
    dot/.style={
        fill=blue,
        circle,
        minimum size=3pt
    }
]
    \draw[help lines] (0,0) grid (3,2);
    \node[dot] (a) at (1,1) {};
    \node[dot] (b) at (2,2) {};
    \node[dot] (c) at (1,2) {};
    \node[dot] (d) at (1.25,0.25) {};
    \node[dot] (e) at (1.75,1.5) {};
    \node[draw=red,fit=(a) (b) (c) (d) (e)] {  box};
    \node[draw,circle,fit=(a) (b) (c) (d) (e)] {};
\end{tikzpicture}

답변4

노드를 "강조 표시"하기 위해 배경에 충분히 두꺼운 선을 그릴 수 있습니다. 예제의 윤곽선 느낌에 정말로 관심이 있다면 double아래 예제와 같이 선을 사용할 수 있습니다.

\documentclass[tikz]{standalone}

\pgfdeclarelayer{bg}
\pgfsetlayers{bg,main}

\begin{document}
\begin{tikzpicture}

  \tikzset{
    contour/.style={
      red, 
      double,
      double distance=7mm,
      cap=round,
    }
  }

  \node[draw](a)at(0, 0){A};
  \node[draw](b)at(1, 0){B};
  \node[draw](c)at(2, 0){C};
  \node[draw](d)at(2, 1){D};
  \node[draw](e)at(3, 0){E};

  \begin{pgfonlayer}{bg}
    \draw[contour](b.center)--(c.center)--(d.center)
    (c.center)--(e.center);
  \end{pgfonlayer}

\end{tikzpicture}
\end{document}

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

관련 정보