# Draw double line with empty interior in TikZ

I would like to draw a line around given subsets of nodes in Tikz. I have five nodes in total, and two overlapping subsets (red and black) of three nodes sharing one node (cf the attached picture). The issue is that the double lines have a white interior, therefore the red line hides the black one at the overlapping node.

\documentclass[12pt]{article}
\usepackage{tikz}

\begin{document}
\begin{figure}[!htbp]
\centering
\begin{tikzpicture}[scale=4,
vertex/.style={draw,circle,minimum size=0.75cm,inner sep=0pt},
arc/.style={draw=blue!50,thick,->},
arc label/.style={fill=white,font=\tiny,inner sep=1pt},
loop arc/.style={min distance=2mm}
]
% Subset 1
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=black] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
% Subset 2
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=red] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\end{tikzpicture}
\end{figure}

\end{document}


I thought that the option double=none would solve the issue, but it seems that I am missing something, any ideas?

• I don't think it's possible to have a transparent center in the "double" option... (I suppose the double line are done by drawing a second smaller white line on the main one). So you might have to draw the contour by hand. If you want to do so, you might want to use the polar coordinate (angle:radius) with the calc package and the arc function. But I hope someone will find a better solution. Sep 7, 2018 at 12:35
• Yes, it is possible to draw it "manually" but it means that you need an arc plus a line segment... It feels like there should be an easier solution :-D Sep 7, 2018 at 14:37

By playing around with transparency group one can create the desired effect:

\documentclass[12pt]{article}
\usepackage{tikz}

\begin{document}
\begin{figure}[!htbp]
\centering
\begin{tikzpicture}[scale=4,
vertex/.style={draw,circle,minimum size=0.75cm,inner sep=0pt},
arc/.style={draw=blue!50,thick,->},
arc label/.style={fill=white,font=\tiny,inner sep=1pt},
loop arc/.style={min distance=2mm}
]

\pgfsetblendmode{multiply}

\begin{scope}[transparency group]
% Subset 1
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=black] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\end{scope}

\begin{scope}[transparency group]
% Subset 2
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=red] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\end{scope}
\end{tikzpicture}
\end{figure}

\end{document}


\documentclass[12pt]{article}
\usepackage{tikz}

\begin{document}
\begin{figure}[!htbp]
\centering
\begin{tikzpicture}[scale=4,
vertex/.style={draw,circle,minimum size=0.75cm,inner sep=0pt},
arc/.style={draw=blue!50,thick,->},
arc label/.style={fill=white,font=\tiny,inner sep=1pt},
loop arc/.style={min distance=2mm}
]

\pgfsetblendmode{multiply}

\begin{scope}[transparency group]
\draw[line width=60pt, line join=round, line cap=round, draw=red] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\draw[line width=40pt, line join=round, line cap=round, draw=white] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\draw[line width=60pt, line join=round, line cap=round, draw=black] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\draw[line width=40pt, line join=round, line cap=round, draw=white] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\end{scope}

\begin{scope}[transparency group]
\draw[line width=60pt, line join=round, line cap=round, draw=black] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\draw[line width=40pt, line join=round, line cap=round, draw=white] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\draw[line width=60pt, line join=round, line cap=round, draw=red] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\draw[line width=40pt, line join=round, line cap=round, draw=white] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\end{scope}

\end{tikzpicture}
\end{figure}

\end{document}


• Very neat, exactly what I was looking for. Thank you ! Sep 8, 2018 at 11:17
• @RockyRock You're welcome! Sep 8, 2018 at 11:58

This is what I was trying to achieve originally, with a graph on the top layer as follows,

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{ifthen}

% Weighted graph from adjacency matrix
\foreach [count=\r] \row in {#3}{
\foreach [count=\c] \cell in \row{
\ifnum\cell>0
\ifnum\c=\r
\draw[arc/.try=\cell] (#2\r) edge[loop arc, in= #4*\r -#5 -#4*#6, out= #4*\r +#5 -#4*#6] node[arc label/.try=\cell]{\cell} (#2\c);
\else
\draw[arc/.try=\cell, #1] (#2\r) edge node[arc label/.try=\cell]{\cell} (#2\c);
\fi
\fi
}
}
}

\begin{document}
\begin{figure}[!htbp]
\centering
\begin{tikzpicture}[scale=4,
vertex/.style={draw,circle,minimum size=0.75cm,inner sep=0pt},
arc/.style={draw=blue!50,thick,->},
arc label/.style={fill=white,font=\tiny,inner sep=1pt},
loop arc/.style={min distance=2mm}
]

\pgfsetblendmode{multiply}
\begin{scope}[transparency group]
% Subset 1
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=black] (1,0)--(0.3090,0.9511)--(-0.8090,0.5878);
\end{scope}

\begin{scope}[transparency group]
% Subset 2
\draw[double=none, double distance=60pt, line join=round, line cap=round, draw=red] (-0.8090,0.5878)--(-0.8090,-0.5878)--(0.3090,-0.9511);
\end{scope}
\pgfsetblendmode{normal}
\foreach [count=\i] \coord in
{(0.3090,0.9511),
(-0.8090,0.5878),
(-0.8090,-0.5878),
(0.3090,-0.9511),
(1,0)}
{
\ifthenelse{\i<4}{\node[vertex] (p\i) at \coord {$x_{\i}$}}{\ifthenelse{\i=4}{\node[vertex] (p\i) at \coord {$u_{2}$}}{\node[vertex] (p\i) at \coord {$u_{1}$}}};
}
{24,20,24,0,0},
{1,1,1,0,0},
{0,0,2,0,0},
{2,0,0,0,0}}{72}{30}{0}
\end{tikzpicture}
\end{figure}

\end{document}


There is a graph macro plotting graphs from some coordinates and an adjacency matrix. The sets are overlapping weighted directed subgraphs.

Hope it can be of some use for others.

Romain

• Did you see these questions/answers? tex.stackexchange.com/q/70999/4918 and tex.stackexchange.com/a/76454/4918
– Tobi
Sep 8, 2018 at 11:46
• This is indeed related, for the special case when the graphs are trees. Sep 8, 2018 at 12:16
• As far as I can see it should work with any set of nodes independently of how they were added to the picture ...
– Tobi
Sep 8, 2018 at 17:50