% Copyright 2011 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{1.16 c}
\def\filedate{2011/06/01}   

  %<-------------------------------------------------------------------------–>
\def\tkzGetAngle#1{%
\global\expandafter\edef\csname #1\endcsname{\tkzAngleResult}}  

%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
   
%<--------------------------------------------------------------------------–>
%                          Angle 
% Recherche l'angle formé par #1 et #2 par rapport à l'horizontale
%<--------------------------------------------------------------------------–>
\def\tkzFindSlopeAngle(#1,#2){%
\begingroup
\tkzmathanglebetweenpoints{\pgfpointanchor{#1}{center}}{%
                           \pgfpointanchor{#2}{center}} 
\global\let\tkzAngleResult\pgfmathresult  
\endgroup
}
%<--------------------------------------------------------------------------–>
%                          Angle  avec trois nodes
%<--------------------------------------------------------------------------–>
\def\tkzFindAngle(#1,#2,#3){%
\begingroup
      \tkzFindSlopeAngle(#2,#1)\tkzGetAngle{tkz@FirstAngle}  
      \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@SecondAngle}
      \FPadd\tkz@Angle{\tkz@SecondAngle}{-\tkz@FirstAngle} 
     \global\let\tkzAngleResult\tkz@Angle 
\endgroup
} 
%<--------------------------------------------------------------------------–>
% Find angle
%<--------------------------------------------------------------------------–>
\def\tkzGetAngle#1{%
\global\expandafter\edef\csname #1\endcsname{\tkzAngleResult}}     

%<--------------------------------------------------------------------------–>
%                        FillAngle
%<--------------------------------------------------------------------------–>
\pgfkeys{/tkzFill/.cd,
  size/.code       = \global\def\tkz@size{#1},
  /tkzFill/.unknown/.code   = {\let\searchname=\pgfkeyscurrentname
                              \pgfkeysalso{\searchname/.try=#1,
                                   /tikz/\searchname/.retry=#1}}} 
%<--------------------------------------------------------------------------–>
\def\tkzFillAngle{\pgfutil@ifnextchar[{\tkz@FillAngle}{\tkz@FillAngle[]}}   
\def\tkz@FillAngle[#1](#2,#3,#4){% 
\begingroup
\pgfkeys{tkzFill/.cd,size=0.4 cm}  
\pgfqkeys{/tkzFill}{#1}   
\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}   
\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}   
\pgfmathgreaterthan{\tkz@dirOne}{\tkz@dirTwo}
  \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathsubtract{\tkz@dirOne}{360}
     \edef\tkz@dirOne{\pgfmathresult}%
  \fi

 \path[shift  = {(#3)},/tkzFill/.cd,#1]%
  (#3) -- (\tkz@dirOne:\tkz@size) arc%
               (\tkz@dirOne:\tkz@dirTwo:\tkz@size)--cycle;
\endgroup 
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcRAN[#1](#2,#3)(#4,#5){% 
 \begingroup    
 \pgfmathparse{#4}\edef\tkz@FirstAngle{\pgfmathresult}% 
 \pgfmathparse{#5}\edef\tkz@SecondAngle{\pgfmathresult}%  
  \pgfmathgreaterthan{\tkz@FirstAngle}{0}   
  \ifdim\pgfmathresult pt=1 pt\relax%  
    \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathsubtract{\tkz@FirstAngle}{360}
     \edef\tkz@FirstAngle{\pgfmathresult}%
 \fi 
 \else
     \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathadd{\tkz@SecondAngle}{360}
     \edef\tkz@SecondAngle{\pgfmathresult}%
 \fi 
 \fi 
     \draw[shift = {(#2)},/drawarc/.cd,#1]%
       (\tkz@FirstAngle:#3) arc (\tkz@FirstAngle:\tkz@SecondAngle:#3); 
\endgroup  
}
%<--------------------------------------------------------------------------–>
%                \tkzMarkAngle(B, A, C)
%
% Marque d'angle
% arc de cercle (simple/double/triple) et marque d'églité.
%
% Par défaut: 
%                 arc       = simple
%                 longueur  = 1cm (rayon de l'arc)
%                 style traits pleins
%                 position: 0.5 (position de la marque)
%                 mark rien du tout (ignoré si type est utilisé)
%
% Paramètres (optionnels)
%             arc     : l, ll, lll
%             length  : 1cm
%             gap     : 2pt
%             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
%<--------------------------------------------------------------------------–>
\edef\tkz@arcsimple{l} 
\edef\tkz@arctriple{lll} 
\edef\tkz@arcdouble{ll}
\tikzset{lbstyle/.style ={color=\tkz@mainlinecolor}}

\pgfkeys{/tkzmkangle/.cd,
mark/.code                   = {\global\def\tkz@mark{#1}},
size/.code                   = {\global\def\tkz@size{#1}},
mkpos/.code                  = {\global\edef\tkz@mkpos{#1}},
mksize/.code                 = {\global\def\tkz@mksize{#1}},
mkcolor/.code                = {\global\def\tkz@mkcolor{#1}},
label/.code                  = {\global\def\tkz@mklabel{#1}},
arc/.code                    = {\global\def\tkz@arc{#1}},
dist/.code                   = {\global\def\tkz@dist{#1}},
label style/.code            = {\tikzset{lbstyle/.append style ={#1}}},
/tkzmkangle/.unknown/.code   = {\let\searchname=\pgfkeyscurrentname
                                \pgfkeysalso{\searchname/.try=#1,
                                 /tikz/\searchname/.retry=#1}
                                 }
}                         \def\tkzMarkAngle{\pgfutil@ifnextchar[{\tkz@MarkAngle}{\tkz@MarkAngle[]}}   
\def\tkz@MarkAngle[#1](#2,#3,#4){%
\begingroup
\pgfkeys{tkzmkangle/.cd,
         arc      = l,
         size     = 1,
         mksize   = 4pt,
         mkcolor  = \tkz@mainlinecolor,
         mkpos    = 0.5,
         mark     = none,
         dist     = 1,
         label     = {}
         }

\pgfqkeys{/tkzmkangle}{#1}
%<--------------------------------------------------------------------------–>
\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}   
\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
\begin{scope}
  \ifx\tkz@arc\tkz@arcsimple 
      \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size)(\tkz@dirOne,\tkz@dirTwo)
  \else    
    \ifx\tkz@arc\tkz@arcdouble   
       \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size-1.5\pgflinewidth)%
                     (\tkz@dirOne,\tkz@dirTwo) 
       \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size+1.5\pgflinewidth)%
                     (\tkz@dirOne,\tkz@dirTwo)  
    \else
       \ifx\tkz@arc\tkz@arctriple
          \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size)(\tkz@dirOne,\tkz@dirTwo)   
          \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size-2\pgflinewidth)%
                    (\tkz@dirOne,\tkz@dirTwo) 
          \tkzDrawArcRAN[#1,fill=none](#3,\tkz@size+2\pgflinewidth)%
                    (\tkz@dirOne,\tkz@dirTwo)    
       \fi
     \fi
  \fi  
\end{scope}
\FPeval\labelangle{(\tkz@dirTwo + \tkz@dirOne)/2} 
\tkz@@extractxy{#3}
 \tkz@ax=\pgf@x%
 \tkz@ay=\pgf@y%
\begin{scope}
  \node[lbstyle,shift={(\tkz@ax,\tkz@ay)}] at (\labelangle:\tkz@dist ){\tkz@mklabel};
\end{scope}

%<--------------------------------------------------------------------------–>
% les marques, aucune si mktype = none 
\global\def\tkz@mymark{%
 \pgfsetplotmarksize{\tkz@mksize} 
 \pgfuseplotmark{\tkz@mark}
} 
\begin{scope}[decoration={markings,mark=at position \tkz@mkpos with {\tkz@mymark}}]
 \pgfmathgreaterthan{\tkz@dirOne}{\tkz@dirTwo}
  \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathsubtract{\tkz@dirOne}{360}
  \edef\tkz@dirOne{\pgfmathresult}%
  \fi
  \path [\tkz@mkcolor,postaction={decorate},/tkzmkangle/.cd,#1]%
(#3)--++(\tkz@dirOne:\tkz@size) arc(\tkz@dirOne:\tkz@dirTwo:\tkz@size)--cycle; 
\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){% 
\global\edef\tkz@optma{#1} 
  \begingroup
   \let\next\tkz@multiMA
   \next#2 \@nil %    
\endgroup 
} 
%<--------------------------------------------------------------------------–>
% % % fin de \tkzMarkAngle
% %<--------------------------------------------------------------------------–> 
%<--------------------------------------------------------------------------–>
%<------------------------- Label on angle -------------------------------–>
%<--------------------------------------------------------------------------–>
\pgfkeys{tkzlabelangle/.cd,
dist/.code                    = {\global\def\labeldist{#1}},   
/tkzlabelangle/.unknown/.code  = {\let\searchname=\pgfkeyscurrentname
                                \pgfkeysalso{\searchname/.try=#1,
                                 /tikz/\searchname/.retry=#1}
                                 }    
}  
\def\tkzLabelAngle{\pgfutil@ifnextchar[{\tkz@LabelAngle}{%
                                        \tkz@LabelAngle[]}}
\def\tkz@LabelAngle[#1](#2,#3,#4)#5{%
\begingroup 
\pgfkeys{tkzlabelangle/.cd,
         dist  = 1}
\pgfqkeys{/tkzlabelangle}{#1}
\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
\FPeval\labelAngle{( \tkz@dirOne +\tkz@dirTwo)/2}
\path (#3) --+(\labelAngle:\labeldist) node[/tkzmkangle/.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{% 
 \global\edef\tkz@optlba{#1}
 \global\def\tkz@labelangle{#3} 
   \begingroup
      \let\next\tkz@multiLBA
      \next#2 \@nil %
 \endgroup
} 
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
%                     Symbole droites perpendiculaires      MAUVAIS
%<--------------------------------------------------------------------------–>
 \pgfkeys{tkzright/.cd,
  size/.code    = {\global\def\tkz@ra@size{#1}},
  /tkzright/.unknown/.code   = {\let\searchname=\pgfkeyscurrentname
                                  \pgfkeysalso{\searchname/.try=#1,
                                   /tikz/\searchname/.retry=#1}
                                   }
}

\newcommand*{\tkzMarkRightAngle}[1][]{\tkz@RightAngle[#1]}
\def\tkz@RightAngle[#1](#2,#3,#4){% 
\begingroup
\pgfkeys{tkzright/.cd,
          size   = .22}
\pgfqkeys{/tkzright}{#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%
    \path[]%
      (#3)--++%
      ( 28.45274*\tkz@ra@size\tkz@ax , 28.45274*\tkz@ra@size\tkz@ay)%
        coordinate (tkz@ra1)--++%
      ( 28.45274*\tkz@ra@size\tkz@bx ,28.45274*\tkz@ra@size\tkz@by)
      coordinate (tkz@ra2)--++%
      (-28.45274*\tkz@ra@size\tkz@ax ,-28.45274*\tkz@ra@size\tkz@ay)
      coordinate (tkz@ra3);%      
  \draw[/tkzright/.cd,#1]  (#3)--(tkz@ra1)--(tkz@ra2)--(tkz@ra3)--cycle;
\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){% 
\global\edef\tkz@optRA{#1} 
  \begingroup
   \let\next\tkz@multiRA
   \next#2 \@nil %    
\endgroup 
} 
\endinput 
 