Ich möchte ein paar Folien zu Beamer erstellen, um zu zeigen, wie ein Graphenalgorithmus funktioniert.
Was ich brauche, ist, am Anfang ein Diagramm zu haben. Ich muss eine zusätzliche Beschriftung für die Knoten außerhalb davon haben können, ich muss gewichtete Kanten haben und ich muss die Farbe der Kanten ändern können. Ich habe unten ein Bild als Beispiel für die Funktionalität angehängt, die mein Diagramm haben soll, aber nach einiger Recherche habe ich keine Möglichkeit gefunden, all diese Dinge zu haben.
Da ich bei jedem Schritt eine kleine Änderung am Diagramm haben möchte – einen Knoten schwarz markieren, die Farbe der Kante ändern, die äußere Beschriftung des Knotens ändern –, wäre eine Lösung, den Code auf verschiedene Frames zu kopieren. Ist es möglich, dies so zu programmieren, dass es einfacher ist und weniger Frames benötigt?
Antwort1
label
Sie können für den Text außerhalb der Zustände und für die Beschriftung der Kanten Knoten verwenden .
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta}
\tikzset{%
node distance=2cm,
State/.style={%
draw,circle,
thick,
color=black!60!green,
inner sep=0pt,
minimum size=10mm,
fill=blue!40!green,
text=white,
},
StateMark/.style={%
State,
fill=black},
Edge/.style={%
color=blue!40!green,
very thick,
-{Triangle[scale=1.1]},%% Try Latex instead oc Triangle
text=black,
},
EdgeMark/.style={%
Edge,
color=blue!90!green,
text=black,
}
}
\begin{document}
\begin{tikzpicture}
\node[StateMark,label=90:r] (S1) {$\infty$};
\node[StateMark,label=90:s,right=of S1] (S2){0};
\node[State,label=90:t,right=of S2] (S3){2};
\node[State,label=90:x,right=of S3] (S4){6};
%%
\draw[Edge] (S1) -- node[above,pos=0.5]{5} (S2);
\draw[Edge] (S1) to[bend right] node[below,pos=0.5]{5} (S3);%% Default bend = 30 degrees
\draw[EdgeMark] (S2) -- node[above,pos=0.5]{2} (S3);
\draw[EdgeMark] (S2) to[bend left=40] node[above,pos=0.5]{5} (S4);
\draw[Edge] (S3) -- node[above,pos=0.5]{7} (S4);
\end{tikzpicture}
\end{document}
Um den Code zu vereinfachen, kann der Beschriftungstext als Eingabe angegeben werden, State
indem die Definition wie folgt geändert wird:
State/.style={%
draw,circle,
thick,
color=black!60!green,
inner sep=0pt,
minimum size=10mm,
fill=blue!40!green,
text=white,
label=90:#1,
},
StateMark/.style={%
State=#1,
fill=black},
und dann die Zustände zeichnen als
\node[StateMark=r] (S1) {$\infty$};
\node[StateMark=s,right=of S1] (S2){0};
\node[State=t,right=of S2] (S3){2};
\node[State=x,right=of S3] (S4){6};