8

I was trying to create an image in TIKZ. My code is as below:

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, shadows, fit, arrows, positioning}
\begin{document}
\begin{center}
\tikzset{
neuron/.style={shape=circle,draw,inner sep= 0pt,minimum size = 2.5 em, node 
distance = 10ex and 1 em
},
every loop/.style={min distance=10mm,looseness=5},
dot/.style={shape=circle,minimum size=1mm, inner sep=0pt, fill=black, node 
distance= 1ex and 2 em
},
group/.style={rectangle,draw, inner sep=1pt,rounded corners,minimum height= 
3.5em,minimum width=15.5 em, node distance= 1ex and 1em},
conn/.style={draw,-latex'}
}

\begin{tikzpicture}
\node[neuron](x1){$x_1$};
\node[neuron,right=of x1](x2){$x_2$};
\node[dot,right=of x2](dot_1){};
\node[dot,right=of dot_1](dot_2){};
\node[neuron,right=of dot_2](xN){$x_N$};
\node[group,fit={(x1)(x2)(dot_1)(dot_2)(xN)}](grp1){};
\end{tikzpicture}
\end{center}
\end{document}

and the result is this enter image description here

How can I fill the box with any color only excluding the circles and the dots? Also is there any way to export tikz image(I want to use tikz produced image in a word document)?

  • You could just draw the big box first and then draw the other stuff over top of it. – JPi Dec 30 '18 at 4:00
  • When you compile a document, you get a pdf. If you use the standalone class, it will have the right size. And pdf files can be included into word documents, I think. – user121799 Dec 30 '18 at 4:34
13

One solution is to fill the circle nodes white and draw the container on the background layer.

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, shadows, fit, arrows, positioning,backgrounds}
\begin{document}
\begin{center}
\tikzset{
neuron/.style={shape=circle,draw,inner sep= 0pt,minimum size = 2.5 em, node 
distance = 10ex and 1 em,fill=white},
every loop/.style={min distance=10mm,looseness=5},
dot/.style={shape=circle,minimum size=1mm, inner sep=0pt, fill=black, node 
distance= 1ex and 2 em
},
group/.style={rectangle,draw, inner sep=1pt,rounded corners,minimum height= 
3.5em,minimum width=15.5 em, node distance= 1ex and 1em},
conn/.style={draw,-latex'}
}

\begin{tikzpicture}
\node[neuron](x1){$x_1$};
\node[neuron,right=of x1](x2){$x_2$};
\node[dot,right=of x2](dot_1){};
\node[dot,right=of dot_1](dot_2){};
\node[neuron,right=of dot_2](xN){$x_N$};
\begin{scope}[on background layer]
\node[group,fit={(x1)(x2)(dot_1)(dot_2)(xN)},fill=blue!20](grp1){};
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}

enter image description here

Another possibility is to use even odd rule, which is in this case a bit more cumbersome but has the advantage that, if you have a background picture, it won't get overdrawn by fill=white.

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, shadows, fit, arrows, positioning}
\makeatletter % https://tex.stackexchange.com/a/38995/121799
\tikzset{
  use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother

\begin{document}
\begin{center}
\tikzset{
neuron/.style={shape=circle,draw,inner sep= 0pt,minimum size = 2.5 em, node 
distance = 10ex and 1 em,fill=white},
every loop/.style={min distance=10mm,looseness=5},
dot/.style={shape=circle,minimum size=1mm, inner sep=0pt, fill=black, node 
distance= 1ex and 2 em
},
group/.style={rectangle,draw, inner sep=1pt,rounded corners,minimum height= 
3.5em,minimum width=15.5 em, node distance= 1ex and 1em},
conn/.style={draw,-latex'}
}

\begin{tikzpicture}
\node[neuron](x1){$x_1$};
\node[neuron,right=of x1](x2){$x_2$};
\node[dot,right=of x2](dot_1){};
\node[dot,right=of dot_1](dot_2){};
\node[neuron,right=of dot_2](xN){$x_N$};
\node[group,fit={(x1)(x2)(dot_1)(dot_2)(xN)},save path=\pathF](grp1){};
\fill[blue!20,even odd rule] [use path=\pathF] 
(x1.center) circle (1.25em+\pgflinewidth/2)
(x2.center) circle (1.25em+\pgflinewidth/2) (xN.center) circle (1.25em+\pgflinewidth/2)
(dot_1.center) circle(0.5mm) (dot_2.center) circle(0.5mm);
\end{tikzpicture}
\end{center}
\end{document}

Yet another possibility is to use reverseclip.

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, shadows, fit, arrows, positioning}
\makeatletter % https://tex.stackexchange.com/a/38995/121799
\tikzset{
  use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother
% https://tex.stackexchange.com/a/12033/121799
\tikzset{reverseclip/.style={insert path={(current bounding box.north
        east) rectangle (current bounding box.south west)}}}

\begin{document}
\begin{center}
\tikzset{
neuron/.style={shape=circle,draw,inner sep= 0pt,minimum size = 2.5 em, node 
distance = 10ex and 1 em,fill=white},
every loop/.style={min distance=10mm,looseness=5},
dot/.style={shape=circle,minimum size=1mm, inner sep=0pt, fill=black, node 
distance= 1ex and 2 em
},
group/.style={rectangle,draw, inner sep=1pt,rounded corners,minimum height= 
3.5em,minimum width=15.5 em, node distance= 1ex and 1em},
conn/.style={draw,-latex'}
}

\begin{tikzpicture}
\node[neuron,save path=\pathA](x1){$x_1$};
\node[neuron,right=of x1,save path=\pathB](x2){$x_2$};
\node[dot,right=of x2,save path=\pathC](dot_1){};
\node[dot,right=of dot_1,save path=\pathD](dot_2){};
\node[neuron,right=of dot_2,save path=\pathE](xN){$x_N$};
\node[group,fit={(x1)(x2)(dot_1)(dot_2)(xN)},save path=\pathF](grp1){};
\begin{scope}
\clip [use path=\pathA,reverseclip];
\clip [use path=\pathB,reverseclip];
\clip [use path=\pathC,reverseclip];
\clip [use path=\pathD,reverseclip];
\clip [use path=\pathE,reverseclip];
\fill[blue!20] [use path=\pathF];
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}

All options lead to the same output.

2

How about using \tcbox from the tcolorbox package? The only change needed is adding fill=white to the neuron style, and then use \tcbox instead of the enclosing node. Note that I commented out the group style.

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, shadows, fit, arrows, positioning}
\usepackage{tcolorbox}
\begin{document}
\begin{center}
\tikzset{
neuron/.style={fill=white,shape=circle,draw,inner sep= 0pt,minimum size = 2.5 em, node 
distance = 10ex and 1 em
},
every loop/.style={min distance=10mm,looseness=5},
dot/.style={shape=circle,minimum size=1mm, inner sep=0pt, fill=black, node 
distance= 1ex and 2 em
},
% group/.style={rectangle,draw, inner sep=1pt,rounded corners,minimum height= 
% 3.5em,minimum width=15.5 em, node distance= 1ex and 1em},
% conn/.style={draw,-latex'}
}

\tcbox{
  \begin{tikzpicture}
    \node[neuron](x1){$x_1$};
    \node[neuron,right=of x1](x2){$x_2$};
    \node[dot,right=of x2](dot_1){};
    \node[dot,right=of dot_1](dot_2){};
    \node[neuron,right=of dot_2](xN){$x_N$};
  \end{tikzpicture}
}

\end{center}
\end{document}

cropped from the pdf file

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.