4

I'm building a figure of a finite state automate. However the edge of F to C seems to make the image less readable. Using bend options doesn't solve the problem. is there a way to solve this problem? Introducing a phantom node could be a solution I think, but I don't know any option that generates an edge through that phantom node.

enter image description here

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
\begin{document}
\begin{tikzpicture}[->,shorten >=1pt,auto,node distance=2cm,on grid,semithick,state/.style=state with output,every state/.style={draw=black!50,very thick,fill=black!20,scale=0.75}]
\node[state] (E) {$e$\nodepart{lower} $1$};
\node[state] (F) [right=of E] {$f$\nodepart{lower} $1$};
\node[state] (A) [below=of E] {$a$\nodepart{lower} $0$};
\node[state] (B) [below=of F] {$b$\nodepart{lower} $0$};
\node[state] (C) [below=of A] {$c$\nodepart{lower} $0$};
\node[state] (D) [below=of B] {$d$\nodepart{lower} $0$};
\path (A) edge[loop left] node {00} (A)
      edge[bend left] node {01} (B)
      edge[bend left] node {10} (C)
      (B) edge[bend left] node {00} (A)
      edge[loop right] node {01} (B)
      edge node {11} (F)
      (C) edge[bend left] node {00} (A)
      edge[loop left] node {10} (C)
      edge[bend left] node {11} (D)
      (D) edge node {00} (B)
      edge[bend left] node {10} (C)
      edge[loop right] node {11} (D)
      (E) edge node {00} (A)
      edge[loop left] node {01} (E)
      edge[bend left] node {11} (F)
      (F) edge[bend left] node {01} (E)
      edge[loop right] node {11} (F)
      edge node {10} (C);
\end{tikzpicture}
\end{document}
cmhughes
  • 100,947

2 Answers2

6

you can fit the node and use south east corner to draw the path with

\draw (F) to [out=45,in=45] (box.south east) to[out=-135,in=-45]  (C);  

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,automata,fit}
\begin{document}
\begin{tikzpicture}[->,shorten >=1pt,auto,node distance=2cm,on grid,semithick,state/.style=state with output,every state/.style={draw=black!50,very thick,fill=black!20,scale=0.75}]
\node[state] (E) {$e$\nodepart{lower} $1$};
\node[state] (F) [right=of E] {$f$\nodepart{lower} $1$};
\node[state] (A) [below=of E] {$a$\nodepart{lower} $0$};
\node[state] (B) [below=of F] {$b$\nodepart{lower} $0$};
\node[state] (C) [below=of A] {$c$\nodepart{lower} $0$};
\node[state] (D) [below=of B] {$d$\nodepart{lower} $0$};



\path (A) edge[loop left] node {00} (A)
      edge[bend left] node {01} (B)
      edge[bend left] node {10} (C)
      (B) edge[bend left] node {00} (A)
      edge[loop right] node {01} (B)
      edge node {11} (F)
      (C) edge[bend left] node {00} (A)
      edge[loop left] node {10} (C)
      edge[bend left] node {11} (D)
      (D) edge node {00} (B)
      edge[bend left] node[name=bas] {10} (C)
      edge[loop right] node[name=basdroit] {11} (D)
      (E) edge node {00} (A)
      edge[loop left] node {01} (E)
      edge[bend left] node {11} (F)
      (F) edge[bend left] node {01} (E)
      edge[loop right] node {11} (F);

\node[draw=red, fit=(E) (C) (F) (basdroit) (bas) ](box) {};  

  \draw (F) to [out=45,in=45] (box.south east) to[out=-135,in=-45] node[below,midway]{11} (C);   

\end{tikzpicture}
\end{document}

fit node and path

rpapa
  • 12,350
6

It's like the answer of rpapa but you don't need to use fit library. The solution works with the current bounding box. We know that the bounding box is update when a path is added. So we can use the last bounding box and more precisely the last south east corner.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
\begin{document}
\begin{tikzpicture}[->,
                    shorten >=1pt,
                    auto,
                    node distance=2cm,
                    on grid,
                    semithick,state/.style=state with output,
                    every state/.style={draw=black!50,
                                        very thick,
                                        fill=black!20,
                                        scale=0.75}]
\node[state] (E) {$e$\nodepart{lower} $1$};
\node[state] (F) [right=of E] {$f$\nodepart{lower} $1$};
\node[state] (A) [below=of E] {$a$\nodepart{lower} $0$};
\node[state] (B) [below=of F] {$b$\nodepart{lower} $0$};
\node[state] (C) [below=of A] {$c$\nodepart{lower} $0$};
\node[state] (D) [below=of B] {$d$\nodepart{lower} $0$};
\path (A) edge[loop left] node {00} (A)
      edge[bend left] node {01} (B)
      edge[bend left] node {10} (C)
      (B) edge[bend left] node {00} (A)
      edge[loop right] node {01} (B)
      edge node {11} (F)
      (C) edge[bend left] node {00} (A)
      edge[loop left] node {10} (C)
      edge[bend left] node {11} (D)
      (D) edge node {00} (B)
      edge[bend left] node {10} (C)
      edge[loop right] node {11} (D)
      (E) edge node {00} (A)
      edge[loop left] node {01} (E)
      edge[bend left] node {11} (F)
      (F) edge[bend left] node {01} (E)
      edge[loop right] node {11} (F); 
 \draw (F) 
           to [out=45,in=45] (current bounding box.south east) 
           to [out=-135,in=-60] node[below,midway]{11} (C);   

\end{tikzpicture}
\end{document}

enter image description here

Alain Matthes
  • 95,075