8

How can I place labels (A and B) on the outside in the venndiagram package

\documentclass[10pt,a4paper,svgnames,openleft,explicit]{book} 

\usepackage{venndiagram}
\begin{document}
\begin{center}
\begin{venndiagram2sets}[showframe=false]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}
\end{document}

enter image description here

0

2 Answers 2

5

venndiagram hardwires the position with node[below].

You can patch to have node[above].

% Source - https://tex.stackexchange.com/q/761544
% Posted by Arne Timperman, modified by community. See post 'Timeline' for change history
% Retrieved 2026-04-03, License - CC BY-SA 4.0

\documentclass[10pt,a4paper]{book} 
\usepackage{venndiagram}

\usepackage{xpatch}

\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[above]}{}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[above]}{}{}

\begin{document}

\begin{center}
\begin{venndiagram2sets}[showframe=false]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}

\end{document}

output

A more general solution that allows you to decide for “in” or “out”:

% Source - https://tex.stackexchange.com/q/761544
% Posted by Arne Timperman, modified by community. See post 'Timeline' for change history
% Retrieved 2026-04-03, License - CC BY-SA 4.0

\documentclass[10pt,a4paper]{book} 
\usepackage{venndiagram}

\usepackage{xpatch}

\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[labelpos]}{}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[labelpos]}{}{}
\makeatletter
\define@key{venn}{labelpos}{\tikzset{labelpos/.style=#1}}
\setkeys{venn}{labelpos=below} % default is inside
\makeatother

\begin{document}

\begin{center}
\begin{venndiagram2sets}[showframe=false]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}

\begin{center}
\begin{venndiagram2sets}[showframe=false,labelpos=above]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}

\end{document}

output2

This doesn't cover three sets. Possibly some similar patches can do.

You can use in and out, provided you replace the previous code between \makeatletter and \makeatother with the following:

\pgfkeys{
  /labelpos/.is choice,
  /labelpos/in/.code=\tikzset{labelpos/.style=below},
  /labelpos/out/.code=\tikzset{labelpos/.style=above},
 }
\makeatletter
\define@key{venn}{labelpos}{\pgfkeys{/labelpos=#1}}
\makeatother
\setkeys{venn}{labelpos=in}

Full patch also for three sets

% Source - https://tex.stackexchange.com/q/761544
% Posted by Arne Timperman, modified by community. See post 'Timeline' for change history
% Retrieved 2026-04-03, License - CC BY-SA 4.0

\documentclass[10pt,a4paper]{book} 
\usepackage{venndiagram}

\usepackage{xpatch}

\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[labelpos]}{}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram2sets}{node[below]}{node[labelpos]}{}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram3sets}
  {node[below] (labelA)}
  {node[labelpos] (label A)}
  {}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram3sets}
  {node[below] (labelB)}
  {node[labelpos] (labelB)}
  {}{}
\ExpandArgs{c}\xpatchcmd{endvenndiagram3sets}
  {node[above] (labelC)}
  {node[labelposinv] (labelC)}
  {}{}

\pgfkeys{
  /labelpos/.is choice,
  /labelpos/in/.code=\tikzset{labelpos/.style=below,labelposinv/.style=above},
  /labelpos/out/.code=\tikzset{labelpos/.style=above,labelposinv/.style=below},
 }
\makeatletter
\define@key{venn}{labelpos}{\pgfkeys{/labelpos=#1}}
\makeatother
\setkeys{venn}{labelpos=in}


\begin{document}

\begin{center}
\begin{venndiagram2sets}[showframe=false]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\qquad
\begin{venndiagram2sets}[showframe=false,labelpos=out]
\fillA \fillB
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}

\begin{center}
\begin{venndiagram3sets}
\fillA \fillB \fillC
\end{venndiagram3sets}
\qquad
\begin{venndiagram3sets}[labelpos=out]
\fillA \fillB \fillC
\end{venndiagram3sets}
\end{center}

\end{document}

output3

2
  • Very nice, but I suggest IN and OUT would be a better option. Since working with venndiagram3sets is giving a problem with the "C" Commented Apr 3 at 11:10
  • 1
    @ArneTimperman See edit Commented Apr 3 at 12:39
8

You could add the labels manually:

\documentclass[10pt,a4paper,svgnames,openleft,explicit]{book} 

\usepackage{venndiagram}
\begin{document}
\begin{center}
\begin{venndiagram2sets}[showframe=false,labelA={},labelB={}]
\fillA \fillB
\setpostvennhook{
  \node at ([yshift=0.5cm]labelA) {A};
  \node at ([yshift=0.5cm]labelB) {B};
}
\node at (1,2) {a};
\node at (1.5,1) {b};
\node at (1.8,2) {c};
\node at (2.5,1.4) {d};
\node at (2.5,1.8) {e};
\node at (3.5,1.3) {f};
\node at (3.7,1.8) {g};
\end{venndiagram2sets}    
\end{center}
\end{document}

enter image description here

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.