% tkz-tool-eu-angles.tex
% Copyright 2020 by Alain Matthes
% This file may be distributed and/or modified
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
\def\fileversion{3.02c}
\def\filedate{2020/01/24} 
\typeout{2020/01/24 3.02c  tkz-tool-eu-angles.tex} 
\makeatletter
%<--------------------------------------------------------------------------–>
\newdimen\tkz@arcsize% from julian julian@d-and-j.net
\newdimen\tkz@fillsize
%<-------------------------------------------------------------------------–>

%<--------------------------------------------------------------------------–>
%                       tkzDrawArcRAN                                        >
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcRAN[#1](#2,#3)(#4,#5){% 
\begingroup 
    \draw[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3); 
\endgroup  
}
%<--------------- tkzPathArcRAN ----------------------------------
\def\tkzPathArcRAN[#1](#2,#3)(#4,#5){% 
\begingroup     
    \path[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3); 
\endgroup  
}
%<--------------------------------------------------------------------------–>
%       Mark an angle
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
%                \tkzMarkAngle(B, A, C)
%
% Marque d'angle
% arc de cercle (simple/double/triple) et marque d'églité.
%
% Par défaut: 
%                 arc       = simple
%                 size     = 1cm (rayon de l'arc)
%                 style traits pleins
%                 mkpos ?  position: 0.5 (position de la marque)
%                 mark rien du tout (ignoré si type est utilisé)
%
% Paramètres (optionnels)
%             arc     : l, ll, lll
%             mksize  : 1cm
%             gap     : 3pt
%             dist ?
%             style   : type de traits
%             type    : none, |, ||,|||, z, s, x, o, oo
%             position: 0.5
%             mark    : none  , |, ||,|||, z, s, x, o, oo mais tous les 
%  % symboles de tikz sont permis
%<------------------------- Label on angle -------------------------------–>
\def\tkz@arcsimple{l} 
\def\tkz@arcdouble{ll}
\def\tkz@arctriple{lll} 

%\tikzset{lbstyle/.style = {color=\tkz@mainlinecolor}}

\pgfkeys{/tkzmkangle/.cd,
			arc/.estore in          = \tkz@arc,
			size/.store in          = \tkz@size,
			mark/.store in          = \tkz@markang,
			mkpos/.estore in        = \tkz@mkpos,
			mksize/.store in        = \tkz@mksize,
			mkcolor/.store in       = \tkz@mkcolor,
      arc      				        = l,
      size     				        = 1 cm,
      mark     				        = |,
      mksize   				        = 4pt,
      mkcolor  				        = black,
      mkpos    				        = 0.5,
  /tkzmkangle/.search also={/tikz}   
}                        \def\tkzMarkAngle{\pgfutil@ifnextchar[{\tkz@MarkAngle}{\tkz@MarkAngle[]}}   
\def\tkz@MarkAngle[#1](#2,#3,#4){%
\begingroup
\pgfqkeys{/tkzmkangle}{#1}

\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
\tkzNormalizeAngle(\tkz@dirOne,\tkz@dirTwo)

% les marques, aucune si mktype = none
\def\tkz@mymark{\pgfsetplotmarksize{\tkz@mksize}\pgfuseplotmark{\tkz@markang}}
% draw the arcs
\begin{scope}[decoration= {markings,
	                      mark=at position \tkz@mkpos with {\tkz@mymark}}]
  \ifx\tkz@arc\tkz@arcsimple
		\tkzDrawArcRAN[#1,fill=none,postaction={decorate}]%
		(#3,\tkz@size)(\tkz@FirstAngle,\tkz@SecondAngle)
  \else
    \ifx\tkz@arc\tkz@arcdouble   
   
	   \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size-1.5\pgflinewidth)%
	   				(\tkz@FirstAngle,\tkz@SecondAngle) 
       \tkzPathArcRAN[#1,fill=none,postaction={decorate}]%
	 				 (#3,\tkz@size)(\tkz@FirstAngle,\tkz@SecondAngle)%
	   \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size+1.5\pgflinewidth)%
                     (\tkz@FirstAngle,\tkz@SecondAngle)% 
    \else
       \ifx\tkz@arc\tkz@arctriple
          \tkzDrawArcRAN[#1,fill=none,postaction={decorate}]%
					(#3,\tkz@size)(\tkz@FirstAngle,\tkz@SecondAngle)%   
          \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size-2.5\pgflinewidth)%
                    (\tkz@FirstAngle,\tkz@SecondAngle)%
          \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size+2.5\pgflinewidth)%
                    (\tkz@FirstAngle,\tkz@SecondAngle)%   
       \fi
     \fi
  \fi
\end{scope}
\endgroup
}
%<--------------------------------------------------------------------------–>
% multiple
\def\tkz@multiMA#1 #2\@nil{%
 \protected@edef\tkz@temp{
   \noexpand \tkzMarkAngle[\tkz@optma](#1)}\tkz@temp%    
   \def\tkz@nextArg{#2}%
   \ifx\tkzutil@empty\tkz@nextArg
     \let\next\@gobble
   \fi
   \next#2\@nil
}
%<--------------------------------------------------------------------------–>
\def\tkzMarkAngles{\pgfutil@ifnextchar[{\tkz@MarkAngles}{\tkz@MarkAngles[]}}   
\def\tkz@MarkAngles[#1](#2){% 
\xdef\tkz@optma{#1} 
  \begingroup
   \let\next\tkz@multiMA
   \next#2 \@nil %    
\endgroup 
} 
% fin de \tkzMarkAngle
%<--------------------------------------------------------------------------–>
%                        FillAngle
%<--------------------------------------------------------------------------–>
\pgfkeys{/tkzFill/.cd,
  	size/.store in       	= \tkz@size,
	size					=	1 cm,
  	/tkzFill/.search also={/tikz}
  } 

\def\tkzFillAngle{\pgfutil@ifnextchar[{\tkz@FillAngle}{\tkz@FillAngle[]}}   
\def\tkz@FillAngle[#1](#2,#3,#4){% 
\begingroup
\pgfqkeys{/tkzFill}{#1}   
	\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}   
	\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}   
	\tkzNormalizeAngle(\tkz@dirOne,\tkz@dirTwo)
    \path[shift  = {(#3)},/tkzFill/.cd,#1]%
          (#3) -- (\tkz@FirstAngle:\tkz@size) arc%
          (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@size)--cycle;
\endgroup 
}
%<--------------------------------------------------------------------------–>
% multiple
\def\tkz@multiFA#1 #2\@nil{\protected@edef\tkz@temp{%
   \noexpand \tkzFillAngle[\tkz@optfa](#1)}%
   \tkz@temp%    
   \def\tkz@nextArg{#2}%
   \ifx\tkzutil@empty\tkz@nextArg
     \let\next\@gobble
   \fi
   \next#2\@nil
}
%<--------------------------------------------------------------------------–>
\def\tkzFillAngles{\pgfutil@ifnextchar[{\tkz@MFillAngles}{\tkz@MFillAngles[]}}   
\def\tkz@MFillAngles[#1](#2){% 
\xdef\tkz@optfa{#1} 
\begingroup
   \let\next\tkz@multiFA
   \next#2 \@nil %    
\endgroup 
} 
%<------------------------- Label on angle -------------------------------–>
\pgfkeys{/tkzlabelangle/.cd,
		dist/.store in                  = \tkzlabeldist, 
		angle/.store in                 = \tkzlabelangle, 
  	dist  							            = 1,
		angle 							            = {},
  /tkzlabelangle/.search also={/tikz}   
}  
\def\tkzLabelAngle{\pgfutil@ifnextchar[{\tkz@LabelAngle}{\tkz@LabelAngle[]}}
\def\tkz@LabelAngle[#1](#2,#3,#4)#5{%2016 added normalize from karu's code
\begingroup
  \pgfqkeys{/tkzlabelangle}{#1}
  \ifx\tkzutil@empty\tkzlabelangle% no value so calc angle of bisector
  		\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
  	  	\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
  	  	\tkzNormalizeAngle(\tkz@dirOne,\tkz@dirTwo)
		\edef\tkzlabelAngle{\fpeval{(\tkz@SecondAngle+\tkz@FirstAngle)/2}}
  \fi
  \path  (#3) --+(\tkzlabelAngle:\tkzlabeldist) node[/tkzlabelangle/.cd,#1] {#5};
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
% multiple labels
\def\tkz@multiLBA#1 #2\@nil{%
 \protected@edef\tkz@temp{
   \noexpand \tkzLabelAngle[\tkz@optlba](#1){\tkz@labelangle}}\tkz@temp%
   \def\tkz@nextArg{#2}%
   \ifx\tkzutil@empty\tkz@nextArg
     \let\next\@gobble
   \fi
   \next#2\@nil
}
% %<---------------------------------------------------------------------
\def\tkzLabelAngles{\pgfutil@ifnextchar[{\tkz@LabelAngles}{%
                                         \tkz@LabelAngles[]}}
\def\tkz@LabelAngles[#1](#2)#3{% 
 \def\tkz@optlba{#1}
 \def\tkz@labelangle{#3} 
   \begingroup
      \let\next\tkz@multiLBA
      \next#2 \@nil %
 \endgroup
}
%<-----------------------------------------------------------------------
%                     Symbole droites perpendiculaires      
%<---------------------------------------------------------------------- 
\pgfkeys{/tkzrightangle/.cd,
	       norm tkz code/.is if            = normtkzcode@execute,
  	     german/.code                    = \normtkzcode@executefalse,
  	     size/.store in                  = \tkz@ra@size,
  	     dotsize/.store in               = \tkz@dotsize,
         size    					               = .25,
		     dotsize 					               = 3 pt,
  /tkzrightangle/.search also={/tikz},
}
\newcommand*{\tkzMarkRightAngle}[1][]{\tkz@RightAngle[#1]}
\def\tkz@RightAngle[#1](#2,#3,#4){% 
\begingroup
\normtkzcode@executetrue
\pgfqkeys{/tkzrightangle}{#1} 
    \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#3}{center}}{%
                                      \pgfpointanchor{#2}{center}}} 
    \tkz@ax=\pgf@x\relax%
    \tkz@ay=\pgf@y\relax%    
    \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#3}{center}}{%
                                      \pgfpointanchor{#4}{center}}} 
    \tkz@bx=\pgf@x\relax%
    \tkz@by=\pgf@y\relax%
	\ifnormtkzcode@execute%
	    \draw[/tkzrightangle/.cd,#1]  
		(#3) --++( 28.45274*\tkz@ra@size\tkz@ax , 28.45274*\tkz@ra@size\tkz@ay) 
			 --++( 28.45274*\tkz@ra@size\tkz@bx , 28.45274*\tkz@ra@size\tkz@by)
			 --++(-28.45274*\tkz@ra@size\tkz@ax ,-28.45274*\tkz@ra@size\tkz@ay)
			 -- (#3);   
	\else%
  		   % find angles
  		   \tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
		   \tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
  	 	   \tkzNormalizeAngle(\tkz@dirOne,\tkz@dirTwo)
			\edef\tkzCircleAngle{\fpeval{(\tkz@SecondAngle+\tkz@FirstAngle)/2}}			
 		   \tkzDrawArcRAN[/tkzrightangle/.cd,#1](#3,\tkz@ra@size)%
		  				(\tkz@FirstAngle,\tkz@SecondAngle)
  		\path (#3) --+ (\tkzCircleAngle:\tkz@ra@size/2)
              node[fill,circle,minimum size=\tkz@dotsize,inner sep=0 pt] {};
\fi%
\endgroup
}
%<--------------------------------------------------------------------------–>
\def\tkz@multiRA#1 #2\@nil{% 
\protected@edef\tkz@temp{
	\noexpand \tkzMarkRightAngle[\tkz@optRA](#1)}\tkz@temp% 
\def\tkz@nextArg{#2}%
   \ifx\tkzutil@empty\tkz@nextArg
     	\let\next\@gobble
   \fi
\next#2\@nil
}
%<--------------------------------------------------------------------------–>
\def\tkzMarkRightAngles{\pgfutil@ifnextchar[{\tkz@RightAngles}{%
                                         \tkz@RightAngles[]}} 
\def\tkz@RightAngles[#1](#2){% 
\xdef\tkz@optRA{#1} 
\begingroup
   	\let\next\tkz@multiRA
   	\next#2 \@nil %    
\endgroup 
}    
 
\makeatother
\endinput 
 