% tkz-obj-eu-draw-lines.tex % Copyright 2020 Alain Matthes % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status “maintained”. % % The Current Maintainer of this work is Alain Matthes. % utf8 encoding \def\fileversion{3.06c} \def\filedate{2020/03/18} \typeout{2020/03/18 3.06c tkz-obj-eu-draw-lines.tex} \makeatletter \def\tkz@numdl{0} \pgfkeys{/tkzdrawl/.cd, median/.code = \def\tkz@numdl{0}, altitude/.code = \def\tkz@numdl{1}, bisector/.code = \def\tkz@numdl{2}, none/.code = \def\tkz@numdl{3}, none, /tkzdrawl/.search also={/tikz} } %<--------------------------------------------------------------------------–> % Drawing a line > %<--------------------------------------------------------------------------–> \def\tkzDrawLine{\pgfutil@ifnextchar[{\tkz@DrawLine}{\tkz@DrawLine[]}} \def\tkz@DrawLine[#1](#2){% \begingroup \pgfqkeys{/tkzdrawl}{#1} \ifcase\tkz@numdl% \tkzDrawMedian[#1](#2) \or% 1 \tkzDrawAltitude[#1](#2) \or% 2 \tkzDrawBisector[#1](#2) \or% 3 \tkzDrawSLine[#1](#2) \fi \endgroup } %<--------------------------------------------------------------------------–> % Droites particulières d'un triangle %<--------------------------------------------------------------------------–> % %<--------------------------------------------------------------------------–> \def\tkzDrawSLine{\pgfutil@ifnextchar[{\tkz@DrawSLine}{\tkz@DrawSLine[]}} \def\tkz@DrawSLine[#1](#2,#3){% \begingroup \draw[line style,#1] (#2) to (#3); \endgroup }% %<--------------------------------------------------------------------------–> % median %<--------------------------------------------------------------------------–> \def\tkzDrawMedian{\pgfutil@ifnextchar[{\tkz@Median}{\tkz@Median[]}} \def\tkz@Median[#1](#2,#3,#4){% \begingroup \tkzDefMidPoint(#2,#4) \tkzDrawSLine[add= 0 and 0,/tkzdrawl/.cd,#1](#3,tkzPointResult) \endgroup } %<--------------------------------------------------------------------------–> % altitude %<--------------------------------------------------------------------------–> \def\tkzDrawAltitude{\pgfutil@ifnextchar[{\tkz@Altitude}{\tkz@Altitude[]}} \def\tkz@Altitude[#1](#2,#3,#4){% \begingroup \tkzUProjection(#2,#4)(#3) \tkzDrawSLine[add= 0 and 0,/tkzdrawl/.cd,#1](#3,tkzPointResult) \endgroup } %<--------------------------------------------------------------------------–> % bisector %<--------------------------------------------------------------------------–> \def\tkzDrawBisector{\pgfutil@ifnextchar[{\tkz@Bisector}{\tkz@Bisector[]}} \def\tkz@Bisector[#1](#2,#3,#4){% \begingroup \tkzDefBisectorLine(#2,#3,#4) \tkzInterLL(#2,#4)(#3,tkzPointResult) \tkzDrawSLine[add= 0 and 0,/tkzdrawl/.cd,#1](#3,tkzPointResult) \endgroup } %<--------------------------------------------------------------------------–> %<--------------------------------------------------------------------------–> % \def\tkz@recuplast(#1,#2){\def\tkz@last{#1}} % \def\tkz@stop{\tkz@stop} %<--------------------------------------------------------------------------–> % medians %<--------------------------------------------------------------------------–> \def\tkz@@Medians(#1,#2,#3)(#4,#5){% \def\tkz@tmp{#5}% \ifx\tkz@tmp\tkz@stop\else\tkz@@Medians(#2,#3)(#5)\fi \tkz@recuplast(#3) \pgfcoordinate{#4}{\pgfpointscale{0.5}{% \pgfpointadd{\pgfpointanchor{#2}{center}}{% \pgfpointanchor{\tkz@last}{center}}% }}% \protected@edef\tkz@temp{\noexpand \tkzDrawLine[add= 0 and 0,/DrawTLines/.cd,\tkz@opttline](#4,#1)}\tkz@temp% \ifx\tkzutil@empty\tkz@newpoint@name \else \coordinate (\tkz@newpoint@name#4) at (#4); \fi } \def\tkzDrawMedians{\pgfutil@ifnextchar[{\tkz@Medians}{\tkz@Medians[]}} \def\tkz@Medians[#1](#2)#3{% \begingroup \xdef\tkz@opttline{#1} \tkz@@Medians(#2,#2)(#3,\tkz@stop) \endgroup } %<--------------------------------------------------------------------------–> % Altitudes %<--------------------------------------------------------------------------–> \def\tkz@@Altitudes(#1,#2,#3)(#4,#5){% \def\tkz@tmp{#5}% \ifx\tkz@tmp\tkz@stop\else\tkz@@Altitudes(#2,#3)(#5)\fi \tkz@recuplast(#3) \tkzUProjection(#2,\tkz@last)(#1) \pgfnodealias{tkz@tmp@pt}{tkzPointResult} \protected@edef\tkz@temp{% \noexpand \tkzDrawLine[add= 0 and 0,/DrawTLines/.cd,\tkz@opttline](#1,tkz@tmp@pt)}\tkz@temp% \ifx\tkzutil@empty\tkz@newpoint@name \else \coordinate (\tkz@newpoint@name#4) at (tkz@tmp@pt); \fi } \def\tkzDrawAltitudes{\pgfutil@ifnextchar[{\tkz@DrawAltitudes}{\tkz@DrawAltitudes[]}} \def\tkz@DrawAltitudes[#1](#2)#3{% \begingroup \xdef\tkz@opttline{#1} \tkz@@Altitudes(#2,#2)(#3,\tkz@stop) \endgroup } %<--------------------------------------------------------------------------–> % bisectors %<--------------------------------------------------------------------------–> \def\tkz@@Bisectors(#1,#2,#3)(#4,#5){% \def\tkz@tmp{#5}% \ifx\tkz@tmp\tkz@stop\else\tkz@@Bisectors(#2,#3)(#5)\fi \tkz@recuplast(#3) \tkzDefBisectorLine(\tkz@last,#1,#2) \tkzInterLL(#2,\tkz@last)(#1,tkzPointResult) \pgfnodealias{tkz@tmp@pt}{tkzPointResult} \protected@edef\tkz@temp{ \noexpand \tkzDrawLine[add= 0 and 0, /DrawTLines/.cd, \tkz@opttline](#1,tkz@tmp@pt)}\tkz@temp \ifx\tkzutil@empty\tkz@newpoint@name \else \coordinate (\tkz@newpoint@name#4) at (tkz@tmp@pt); \fi } \def\tkzDrawBisectors{\pgfutil@ifnextchar[{\tkz@DrawBisectors}{\tkz@DrawBisectors[]}} \def\tkz@DrawBisectors[#1](#2)#3{% \begingroup \xdef\tkz@opttline{#1} \tkz@@Bisectors(#2,#2)(#3,\tkz@stop) \endgroup } %<-------------------------------------------------------------------------– %<-------------------------------------------------------------------------– %<-------------------------------------------------------------------------– \def\tkz@numdtls{0} \pgfkeys{/DrawTLines/.cd, median/.code = \def\tkz@numdtls{0}, altitude/.code = \def\tkz@numdtls{1}, bisector/.code = \def\tkz@numdtls{2}, median, name/.store in = \tkz@newpoint@name, name/.initial = {}, name = {}, /DrawTLines/.search also={/tikz} } %<--------------------------------------------------------------------------–> % Drawing tr lines > %<--------------------------------------------------------------------------–> \def\tkzDrawTLines{\pgfutil@ifnextchar[{\tkz@DrawTLines}{\tkz@DrawTLines[]}} \def\tkz@DrawTLines[#1](#2)#3{% \begingroup \pgfqkeys{/DrawTLines}{#1} \ifcase\tkz@numdtls% \tkzDrawMedians[#1](#2){#3} \or% 1 \tkzDrawAltitudes[#1](#2){#3} \or% 2 \tkzDrawBisectors[#1](#2){#3} \fi \endgroup } %<-------------------------------------------------------------------------– % tkzDrawLines %<-------------------------------------------------------------------------– \def\tkz@@multiLines#1 #2\@nil{% \protected@edef\tkz@temp{ \noexpand \tkzDrawLine[\tkz@optline](#1)}\tkz@temp% \def\tkz@nextArg{#2}% \ifx\tkzutil@empty\tkz@nextArg \let\next\@gobble \fi \next#2\@nil } %<--------------------------------------------------------------------------–> \def\tkzDrawLines{\pgfutil@ifnextchar[{\tkz@DrawLines}{% \tkz@DrawLines[]}} \def\tkz@DrawLines[#1](#2){% \xdef\tkz@optline{#1} \begingroup \let\next\tkz@@multiLines \next#2 \@nil % \endgroup }% %<-------------------------------------------------------------------------–> % Label %<-------------------------------------------------------------------------–> \def\tkzLabelLine{\pgfutil@ifnextchar[{\tkz@AddLabelLine}{\tkz@AddLabelLine[]}} \def\tkz@AddLabelLine[#1](#2,#3)#4{\path (#2) to node[#1]{#4}(#3);} %<--------------------------------------------------------------------------–> % Setup Line %<--------------------------------------------------------------------------–> \pgfkeys{% tkzsuline/.cd, line width/.code = {\xdef\tkz@line@lw{#1}}, color/.code = {\xdef\tkz@line@color{#1}}, style/.code = {\xdef\tkz@line@style{#1}}, add/.code args = {#1 and #2} {\xdef\tkz@line@left{#1}% \xdef\tkz@line@right{#2}}, /tkzsuline/.search also={/tikz}% } %<--------------------------------------------------------------------------–> \def\tkzSetUpLine{\pgfutil@ifnextchar[{\tkz@SetUpLine}{% remove tkzActivOff 3.03 \tkz@SetUpLine[]}} \def\tkz@SetUpLine[#1]{% \pgfkeys{% tkzsuline/.cd, line width = \tkz@euc@linewidth, color = \tkz@euc@linecolor, style = \tkz@euc@linestyle, add = {\tkz@euc@lineleft} and {\tkz@euc@lineright}} \pgfqkeys{/tkzsuline}{#1} %<--------------------------------------------------------------------------–> % Line style %<--------------------------------------------------------------------------–> \tikzset{% line style/.style ={% color = \tkz@line@color, line width = \tkz@line@lw, style = \tkz@line@style, add = {\tkz@line@left} and {\tkz@line@right} }}}% end setup %<--------------------------------------------------------------------------–> % draw segment (s) %<--------------------------------------------------------------------------–> \pgfkeys{/tkzdraws/.cd, /tkzdraws/.search also={/tikz}, } \def\tkzDrawSegment{\pgfutil@ifnextchar[{\tkz@DrawSegment}{% \tkz@DrawSegment[]}} \def\tkz@DrawSegment[#1](#2,#3){% \begingroup \pgfqkeys{/tkzdraws}{#1} \draw[line style,add=0 and 0,#1] (#2) to (#3); \endgroup }% \def\tkz@multiDrawSeg#1 #2\@nil{% \protected@edef\tkz@temp{ \noexpand \tkzDrawSegment[\tkz@optseg](#1)}\tkz@temp% \def\tkz@nextArg{#2}% \ifx\tkzutil@empty\tkz@nextArg \let\next\@gobble \fi \next#2\@nil } \def\tkzDrawSegments{\pgfutil@ifnextchar[{\tkz@DrawSegments}{% \tkz@DrawSegments[]}} \def\tkz@DrawSegments[#1](#2){% \def\tkz@optseg{#1} \begingroup \let\next\tkz@multiDrawSeg \next#2 \@nil % \endgroup } %<--------------------------------------------------------------------------–> % Mark Segment %<--------------------------------------------------------------------------–> \pgfkeys{ /@tkzmarkoptions/.cd, pos/.store in = \tkz@mkpos, color/.store in = \tkz@mkcolor, mark/.store in = \tkz@markseg, size/.store in = \tkz@mksize, size = 4pt, color = \tkz@mk@color, pos = .5, mark = |, /@tkzmarkoptions/.search also={/tikz}, } \def\tkzMarkSegment{\pgfutil@ifnextchar[{\tkz@MarkSegment}{\tkz@MarkSegment[]}} \def\tkz@MarkSegment[#1](#2,#3){% \begingroup \pgfqkeys{/@tkzmarkoptions}{#1} \def\tkz@mymark{\pgfsetplotmarksize{\tkz@mksize}\pgfuseplotmark{\tkz@markseg}} \begin{scope} [decoration={markings,mark=at position \tkz@mkpos with {\tkz@mymark}}] \path [\tkz@mkcolor,/@tkzmarkoptions/.cd,#1,postaction={decorate}] (#2) -- (#3); \end{scope} \endgroup } %<--------------------------------------------------------------------------–> % multiple \def\tkz@multiMS#1 #2\@nil{% \protected@edef\tkz@temp{ \noexpand \tkzMarkSegment[\tkz@optsg](#1)}\tkz@temp% \def\tkz@nextArg{#2}% \ifx\tkzutil@empty\tkz@nextArg \let\next\@gobble \fi \next#2\@nil } %<--------------------------------------------------------------------------–> \def\tkzMarkSegments{\pgfutil@ifnextchar[{\tkz@MarkSegments}{\tkz@MarkSegments[]}} \def\tkz@MarkSegments[#1](#2){% \def\tkz@optsg{#1} \begingroup \let\next\tkz@multiMS \next#2 \@nil % \endgroup } %<-------------------------------------------------------------------------–> % Label on segment %<-------------------------------------------------------------------------–> \def\tkzLabelSegment{\pgfutil@ifnextchar[{\tkz@LabelSegment}% {\tkz@LabelSegment[]}} \def\tkz@LabelSegment[#1](#2,#3)#4{% \begingroup \path (#2) to node[label seg style,#1]{#4} (#3) ; \endgroup } %<--------------------------------------------------------------------------–> % multiple \def\tkz@multiLS#1 #2\@nil{% \protected@edef\tkz@temp{ \noexpand \tkzLabelSegment[\tkz@optls](#1){\tkz@labelseg}}\tkz@temp% \def\tkz@nextArg{#2}% \ifx\tkzutil@empty\tkz@nextArg \let\next\@gobble \fi \next#2\@nil } %<--------------------------------------------------------------------------–> \def\tkzLabelSegments{\pgfutil@ifnextchar[{\tkz@LabelSegments}{\tkz@LabelSegments[]}} \def\tkz@LabelSegments[#1](#2)#3{% \def\tkz@optls{#1} \def\tkz@labelseg{#3} \begingroup \let\next\tkz@multiLS \next#2 \@nil % \endgroup } %<--------------------------------------------------------------------------–> % PolySeg %<--------------------------------------------------------------------------–> \def\tkzDrawPolySeg{\pgfutil@ifnextchar[{\tkz@DrawPolySeg}{\tkz@DrawPolySeg[]}} \def\tkz@DrawPolySeg[#1](#2,#3){% \begingroup \draw[line style,#1] (#2) \foreach \pt in {#2,#3}{--(\pt)};% \endgroup } %<--------------------------------------------------------------------------–> % add dim % \draw[dim={5cm,7pt,}] (A) -- (B); % \draw[dim={7cm,10pt,transform shape}] (B) -- (C); % \draw[dim={X,,}] (A) -- (C); %<--------------------------------------------------------------------------–> \pgfkeys{/pgf/decoration/.cd, distance/.initial = 10pt} \pgfdeclaredecoration{add dim}{final}{ \state{final}{% \pgfmathsetmacro{\dist}{\pgfkeysvalueof{/pgf/decoration/distance}} \pgfpathmoveto{\pgfpoint{0pt}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{1.2*\dist}} \pgfpathmoveto{\pgfpoint{\pgfdecoratedpathlength}{0pt}} \pgfpathlineto{\pgfpoint{(\pgfdecoratedpathlength}{1.2*\dist}} \pgfsetarrowsstart{latex} \pgfsetarrowsend{latex} \pgfpathmoveto{\pgfpoint{0pt}{\dist}} \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength}{\dist}} \pgfusepath{stroke} \pgfpathmoveto{\pgfpoint{0pt}{0pt}} \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength}{0pt}} }} \tikzset{ dim/.style args={#1,#2,#3}{% decoration = {add dim,distance=\ifx&0pt\else#2\fi}, decorate, postaction = {% decorate, decoration={% raise=#2, markings, mark=at position .5 with {% \node[inner sep=0pt, font=\footnotesize, fill=\tkz@fillcolor, #3] at (0,0) {#1};} } } }, dim/.default={,0pt,} } %<--------------------------- style line ---------------------------------> \tikzset{add/.style args={#1 and #2}{to path={% ($(\tikztostart)!-#1!(\tikztotarget)$)--($(\tikztotarget)!-#2!(\tikztostart)$)% \tikztonodes}} } %<--------------------------------------------------------------------------–> \makeatother \endinput