Nils:D
14-11-2010, 10:46
Moin,
Mit node und path kann man eigentlich ganz gut Automaten mit tikz darstellen, zum Beispiel:
\begin{tikzpicture}[...]
\tikzstyle{every state}=[...];
\node[initial,state] (A) {bla};
\node[state] (B) [right of=A] {asd};
\path[->] (A) edge node {test} (B) ;
\end{tikzpicture}
Das funktioniert super, doch nun muss ich auch mal einen Kellerautomaten zeichnen. Das Problem ist ganz einfach, dass ich mit dem node {test} nicht auskomme. Denn beim Keller gibt es für einen Pfad auch mehrere Operationen auf einmal. Also dürfte nicht nur ein kleiner Text (im obigen Beispiel) "test" über dem Pfeil stehen sondern von mir aus sowas wie 0,0,push und 1,1,push mal als ganz einfaches Beispiel. Dabei steht dann die Operation 1,1,push in dem Beispiel über 0,0,push. Dies lässt sich über einen Workaround lösen (dieses Beispiel dürfte kompilierbar sein):
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,semithick]
\tikzstyle{every state}=[minimum size=6mm, very thick,draw=black!50, top color=white,bottom color=black!20, font=\ttfamily];
\tikzset{non/.style={draw=none}}
\node[initial,state] (A) {Z$_0$};
\node[state] (B) [right of=A] {Z$_1$};
\path[->] (A) edge node {$0,0,pop$} (B)
edge [bend left,non] node {$1,1,pop$} (B);
\end{tikzpicture}
Denn wenn man überlegt kann man die edge einfach ausblenden, aber via bend left dann so anpassen, dass der Text mithilfe der unsichtbaren edge richtig positioniert ist. Aber das ist sicherlich keine gute Lösung. Ließe sich das nicht besser lösen ? Außerdem funktioniert der Workaround nicht bei Loops, denn ein Zustand kann ja auch auf sich selbst zeigen und das realisiert man mit einem
edge[loop above] ...
zum Beispiel - doch ein bend left hat einen Parameter x, also bend left=x, dieser fehlt bei dem Loop jedoch und daher kann ich bei einem loop dummerweise keine Operationen übereinander schreiben - außer es gibt auch hier einen Workaround, aber generell sind Workarounds sehr dreckig und ich hätte da lieber eine sauberere Lösung, falls es eine gibt.
Gruß,
Nils
Mit node und path kann man eigentlich ganz gut Automaten mit tikz darstellen, zum Beispiel:
\begin{tikzpicture}[...]
\tikzstyle{every state}=[...];
\node[initial,state] (A) {bla};
\node[state] (B) [right of=A] {asd};
\path[->] (A) edge node {test} (B) ;
\end{tikzpicture}
Das funktioniert super, doch nun muss ich auch mal einen Kellerautomaten zeichnen. Das Problem ist ganz einfach, dass ich mit dem node {test} nicht auskomme. Denn beim Keller gibt es für einen Pfad auch mehrere Operationen auf einmal. Also dürfte nicht nur ein kleiner Text (im obigen Beispiel) "test" über dem Pfeil stehen sondern von mir aus sowas wie 0,0,push und 1,1,push mal als ganz einfaches Beispiel. Dabei steht dann die Operation 1,1,push in dem Beispiel über 0,0,push. Dies lässt sich über einen Workaround lösen (dieses Beispiel dürfte kompilierbar sein):
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,semithick]
\tikzstyle{every state}=[minimum size=6mm, very thick,draw=black!50, top color=white,bottom color=black!20, font=\ttfamily];
\tikzset{non/.style={draw=none}}
\node[initial,state] (A) {Z$_0$};
\node[state] (B) [right of=A] {Z$_1$};
\path[->] (A) edge node {$0,0,pop$} (B)
edge [bend left,non] node {$1,1,pop$} (B);
\end{tikzpicture}
Denn wenn man überlegt kann man die edge einfach ausblenden, aber via bend left dann so anpassen, dass der Text mithilfe der unsichtbaren edge richtig positioniert ist. Aber das ist sicherlich keine gute Lösung. Ließe sich das nicht besser lösen ? Außerdem funktioniert der Workaround nicht bei Loops, denn ein Zustand kann ja auch auf sich selbst zeigen und das realisiert man mit einem
edge[loop above] ...
zum Beispiel - doch ein bend left hat einen Parameter x, also bend left=x, dieser fehlt bei dem Loop jedoch und daher kann ich bei einem loop dummerweise keine Operationen übereinander schreiben - außer es gibt auch hier einen Workaround, aber generell sind Workarounds sehr dreckig und ich hätte da lieber eine sauberere Lösung, falls es eine gibt.
Gruß,
Nils