So zeichnen Sie einen Rahmen um eine Teilmenge von Knoten

So zeichnen Sie einen Rahmen um eine Teilmenge von Knoten

Ich brauche Diagramme wie dieses:

Bildbeschreibung hier eingeben

Ich habe den „schwarzen“ Teil automatisiert, konnte aber nicht herausfinden, wie ich das mit dem roten Rand machen kann. Meine aktuelle Version ist diese:

\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}

und das gefällt mir überhaupt nicht. Nach Verbesserungen bei diesem hässlichen automatisierten Teil zu fragen wäre wahrscheinlich zu viel verlangt, aber die Sache mit den Rändern ist besonders schlimm.

Weiß jemand, wie man diesen roten Rand setzt, indem man die Teilmenge der Knoten angibt, die umfasst werden muss?

Antwort1

Ich habe versucht, Ihren Code etwas zu vereinfachen. (Beachten Sie, dass ich auch die Knoten 1 und 2 vertauscht habe, um die gewünschte Ausgabe zu erzielen.) Unter anderem überschreibt dieser Code keine Knoten mehr.

\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}

Bildbeschreibung hier eingeben

Dieser Code enthält ein Makro \DrawHalo, das eine Liste von 1, 2 oder 3 Knoten erwartet (ohne die Klammern). Wenn Sie drei Knoten haben, platzieren Sie sie in der Reihenfolge {ganz linker Knoten, ganz oberster Knoten, ganz rechter Knoten}, wenn Sie zwei Knoten horizontal angeordnet haben, ist die Reihenfolge {ganz linker Knoten, ganz rechter Knoten} und wenn die beiden Knoten vertikal angeordnet sind, platzieren Sie drei {unterster Knoten, oberster Knoten, unterster Knoten}.

AKTUALISIEREN: Der Einzelknotenfall wurde hinzugefügt.

ZWEITES UPDATE: Da hast du recht \ifnum. Außerdem habe ich den Knoten vorher (4-\k)zweimal gezeichnet. Ich habe die Gelegenheit genutzt, um noch zwei weitere Änderungen vorzunehmen: Ich habe einen Knotenzähler hinzugefügt, sodass man mehrere Diagramme in einem zeichnen kann, tikzpictureohne zwei Knoten den gleichen Namen zu geben. Beachte aber, dass sich das \DrawHaloimmer auf das letzte davor gezeichnete Diagramm bezieht. Außerdem habe ich die emEinheiten durch dimensionslose Ausdrücke ersetzt, um das Ganze besser skalierbar zu machen. Was die Optionen betrifft, habe ich ein Beispiel hinzugefügt, in dem ich anhand dieser ein bisschen zeige, was man damit machen kann.

Antwort2

Sie könnten die fitBibliothek verwenden. Wenn Sie eine anspruchsvollere Umrissform wünschen, verwenden Sie backgroundsvielleicht:

\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}

Dies ergibt:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Antwort3

Sie können die im pgfmanual in Kapitel 52 auf Seite 622 dokumentierte Tikz-Anpassungsbibliothek verwenden. Leider kann der Begrenzungsrahmen nur eine der vordefinierten Formen sein.

Dieses Beispiel stammt aus dem Handbuch:

\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}

Antwort4

Sie können eine ausreichend dicke Linie auf den Hintergrund zeichnen, um Ihre Knoten „hervorzuheben“. Wenn Sie wirklich an der Kontur Ihres Beispiels interessiert sind, können Sie die doubleLinien wie im folgenden Beispiel verwenden:

\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}

Bildbeschreibung hier eingeben

verwandte Informationen