4

I want to connect the blocks B and M in my code without having the connection line "cutting" F. How can I force the connection to enlarge the connecting line and avoid F?

\documentclass[11pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}

\begin{document}


\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]

\node[main node] (L)                     {L};
\node[main node] (F) [left = of L  ] {F};
\node[main node] (C) [below = of F  ] {M};
\node[main node] (B)    [right = of L  ] {B};
\node[main node] (AP)    [below = of B  ] {AP};
\node[main node] (A)    [below = of L  ] {A};
\node[main node] (H)  [right = of B  ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR)  [below = of G] {BR};
\node[main node] (LR)   [below = of BR] {LR};
\node[main node] (U)  [below = of AP  ] {U};
\node[main node] (P)  [below = of U  ] {P};
\path[every node/.style={font=\sffamily\small}]
(L)      edge node [right]                   {} (B)
(L)      edge node [right]                   {} (F)
(L)      edge node [right]                   {} (C)
(F)      edge node [right]                   {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
(B.north) edge [out=90,in=180] node [right] {} (C.west)
(B)      edge node [right]                   {} (AP)
(B)      edge node [right]                   {} (A)
(AP.east) edge [out=0,in=270] node [left]    {} (H.south)
(B)      edge node [right]                   {} (H)
(H)    edge node [right]                   {} (G)
(U.east) edge [out=0,in=270] node [left]   {} (H.south)
(P.east) edge [out=0,in=270] node [left]   {} (H.south)
(U)      edge node [right]                 {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west)  edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right]     {} (G.east)
(LR.east) edge [out=0,in=0] node [right]     {} (G.east);
\end{tikzpicture}


\end{document}

This is what I'm getting now

enter image description here

and this is what I'd like to get

enter image description here

Thanks!

Community
  • 1
  • 1
venom
  • 173
  • 1
  • 6

1 Answers1

5

There is no direct way to do that in tikz, but this can be achieved by adding intermediate nodes. Here are two ways to do that.

First one (in blue) uses edges in your main path. As edges only have a single branch, a coordinate is created at a proper position and reused in another edge.

Second way (in red) uses a regular tikz line with several intermediate nodes. It is more flexible and any number of intermediate nodes if required.

Positions of intermediates nodes should tweaked to achieve the desired effect.

\documentclass[11pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric,arrows,positioning,intersections}

\begin{document}


\begin{tikzpicture}[auto,node distance=1cm,thick,
main node/.style={black,draw,minimum width=1.5cm,minimum height=0.75cm}]%circle,draw,font=\sffamily\Large\bfseries}]

\node[main node] (L)                     {L};
\node[main node] (F) [left = of L  ] {F};
\node[main node] (C) [below = of F  ] {M};
\node[main node] (B)    [right = of L  ] {B};
\node[main node] (AP)    [below = of B  ] {AP};
\node[main node] (A)    [below = of L  ] {A};
\node[main node] (H)  [right = of B  ] {H};
\node[main node] (G) [right = of H] {G};
\node[main node] (BR)  [below = of G] {BR};
\node[main node] (LR)   [below = of BR] {LR};
\node[main node] (U)  [below = of AP  ] {U};
\node[main node] (P)  [below = of U  ] {P};
\path[every node/.style={font=\sffamily\small}]
(L)      edge node [right]                   {} (B)
(L)      edge node [right]                   {} (F)
(L)      edge node [right]                   {} (C)
(F)      edge node [right]                   {} (C)
(B.north) edge [out=90,in=90] node [right] {} (F.north)
%%%% (B.north) edge [out=90,in=180] node [right] {} (C.west)
%west_of_F is an intermediate node to allow a proper connection of B and C
(B.north) edge [blue,out=90,in=90] coordinate[at end] (west_of_F) ($(F.west)+(-1cm,0)$) 
(west_of_F) edge [blue, out=-90,in=180] (C.west)
(B)      edge node [right]                   {} (AP)
(B)      edge node [right]                   {} (A)
(AP.east) edge [out=0,in=270] node [left]    {} (H.south)
(B)      edge node [right]                   {} (H)
(H)    edge node [right]                   {} (G)
(U.east) edge [out=0,in=270] node [left]   {} (H.south)
(P.east) edge [out=0,in=270] node [left]   {} (H.south)
(U)      edge node [right]                 {} (P)
(BR.west) edge [out=180,in=270] node [right] {} (H.south)
(LR.west)  edge [out=180,in=270] node [right] {} (H.south)
(BR.east) edge [out=0,in=0] node [right]     {} (G.east)
(LR.east) edge [out=0,in=0] node [right]     {} (G.east);

\draw[red] (B.north) to[out=90,in=0]   ($(B.north)+(-3cm,2cm)$)
                     to [out=180,in=90] ($(C.west)+(-1.1cm,2cm)$) 
                     to [out=-90,in=180] (C.west);

\end{tikzpicture}


\end{document}

enter image description here

Alain Merigot
  • 10,667
  • 3
  • 18
  • 31