From 628c0a8ab5e4b3003d81d49732f20d3d51f4e292 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 9 Jan 2020 22:10:39 +0000 Subject: pst-eucl (9jan20) git-svn-id: svn://tug.org/texlive/trunk@53354 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/pst-eucl/Changes | 9 + .../doc/generic/pst-eucl/pst-eucl-doc.pdf | Bin 1688997 -> 1708406 bytes .../doc/generic/pst-eucl/pst-eucl-doc.tex | 97 +++++++- Master/texmf-dist/dvips/pst-eucl/pst-eucl-alt.pro | 132 ----------- Master/texmf-dist/dvips/pst-eucl/pst-eucl.pro | 2 +- .../texmf-dist/tex/generic/pst-eucl/pst-eucl.tex | 257 ++++++++++++++++----- Master/texmf-dist/tex/latex/pst-eucl/pst-eucl.sty | 2 +- 7 files changed, 300 insertions(+), 199 deletions(-) delete mode 100644 Master/texmf-dist/dvips/pst-eucl/pst-eucl-alt.pro diff --git a/Master/texmf-dist/doc/generic/pst-eucl/Changes b/Master/texmf-dist/doc/generic/pst-eucl/Changes index eb8fab448ec..31cbe6c090a 100644 --- a/Master/texmf-dist/doc/generic/pst-eucl/Changes +++ b/Master/texmf-dist/doc/generic/pst-eucl/Changes @@ -1,10 +1,19 @@ pst-eucl.pro -------- +1.03 2020/01/09 - some new functions for 1.69 1.02 2019/11/21 - add DeterminantTwo,DeterminantThree,DeterminantFour,DeterminantFive. 1.01 2012/09/21 - fix for introduced bug 1.00 2011/08/05 - fix bug in /InterLines pst-eucl.tex -------- +1.69 2020/01/09 - add macro to get the chord with specified length, \pstCircleChordNode. + - add macro to draw the center of the triangle's escribed circle, \pstTriangleEC. + - add macro to draw the orthocenter of triangle, \pstTriangleHC. + - add macro to draw the gravity center of triangle, \pstTriangleGC. + - update macro \pstTriangleIC and \pstTriangleOC how to control the output points. + - update macro \pstMediatorAB to work with option PointSymbolA and PointSymbolB. + - update macro \pstLineAB to group the parameters as local to avoid affected the other macros. + - update macro \pstTriangle to group the parameters as local to avoid affected the other macros. 1.68 2019/11/21 - add macros to construct a triangle by SSS, SAS, ASA, AAS, \pstTriangleSSS, \pstTriangleSAS, etc. - add macro to get the bisector node of angle AOB, \pstBisectorAOB, refer to pstBissectBAC, pstOutBissectBAC. - add macro to get the Golden Mean node of a given segment, \pstGoldenMean. diff --git a/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.pdf b/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.pdf index 703c91b79ee..5a40bbc7af1 100644 Binary files a/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.pdf and b/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.pdf differ diff --git a/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.tex b/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.tex index b9000b9750e..f719f56f39b 100644 --- a/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.tex +++ b/Master/texmf-dist/doc/generic/pst-eucl/pst-eucl-doc.tex @@ -1,6 +1,5 @@ \documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings, headexclude,footexclude,oneside,english]{pst-doc} -\usepackage[utf8]{inputenc} \usepackage{pst-eucl} \let\pstEuclideFV\fileversion \usepackage{multicol} @@ -8,8 +7,8 @@ \newtheorem{theorem}{Theorem} \usepackage{pst-func,pst-plot,paralist} \usepackage[mathscr]{eucal} -\lstset{pos=l,wide=false,language=PSTricks, - morekeywords={multidipole,parallel},basicstyle=\footnotesize\ttfamily} + +\lstset{pos=l,wide=false,basicstyle=\footnotesize\ttfamily,explpreset={language=[PSTricks]{TeX}}} % \def\Argsans#1{$\langle$#1$\rangle$} \def\DefaultVal#1{(by default #1)} @@ -463,7 +462,7 @@ and outer circle of triangle $ABC$. \pstTriangle[PointSymbol=square,PointSymbolC=o, linecolor=blue,linewidth=1.5\pslinewidth] (1.5,-1){A}(0,1){B}(-1,-.5){C} -\pstTriangleIC[linecolor=red]{A}{B}{C} +\pstTriangleIC[linecolor=cyan]{A}{B}{C} \pstTriangleOC[linecolor=red]{A}{B}{C} \end{pspicture} \end{LTXexample} @@ -479,9 +478,41 @@ For example: \begin{lstlisting} \pstTriangleIC[PosAngle={-90,160},PointName={I,none},PointSymbol={*,none}]{A}{B}{C}[I][D] +\pstTriangleIC[PosAngle=-90,PointName=I,PointSymbol=*]{A}{B}{C}[I] \pstTriangleOC[PosAngle=90,PointSymbol=*,PointName=X]{A}{B}{C}[X] \end{lstlisting} +The macros \Lcs{pstTriangleGC}, \Lcs{pstTriangleHC} and \Lcs{pstTriangleEC} are used to draw the barycenter $G$, the orthocentre $H$ and the escenter $E$ of the triangle $ABC$. + +\begin{BDef} +\Lcs{pstTriangleGC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\Largb{G}\OptArg{$M_1$}\OptArg{$M_2$}\\ +\Lcs{pstTriangleHC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\Largb{H}\OptArg{$H_1$}\OptArg{$H_2$}\\ +\Lcs{pstTriangleEC}\OptArgs\Largb{A}\Largb{B}\Largb{C}\Largb{E}\OptArg{$T_1$} +\end{BDef} + +You can use the options of node like as \verb|PointName=...|, \verb|PosAngle=...|, \verb|PointSymbol=...| to control the output nodes $G,H,E$. But if you give the optional output parameters $M_1,M_2$, or $H_1,H_2$ or $T_1$, then you should pass the option value in list like as \verb|PointName={...}|, \verb|PosAngle={...}|, \verb|PointSymbol={...}|. +For example, + +\begin{LTXexample}[width=6cm,pos=l] +\begin{pspicture}[showgrid=true](-3,-3)(3,2) +\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize +\pstGeonode[PosAngle=90](0,1){A} +\pstGeonode[PosAngle=-90](-1,-0.6){B} +\pstGeonode[PosAngle=-90](1.5,-0.6){C} +\pstTriangleGC[PointSymbol={*,none,*},PosAngle={150,-80,30}]{A}{B}{C}{G}[M_1][M_2] +\pstTriangleHC[PointSymbol={*,*,none},PosAngle={-30,-100,30}]{A}{B}{C}{H}[H_1][H_2] +\pstTriangleEC[PointSymbol={*,none},PosAngle={90,30}]{A}{B}{C}{E_1}[T_1] +\pstTriangleEC[PointSymbol=*,PosAngle=0]{B}{C}{A}{E_2} +\pstTriangleEC[PointSymbol=*,PosAngle=180]{C}{A}{B}{E_3} +\pstLineAB{A}{B}\pstLineAB{B}{C}\pstLineAB{C}{A} +\pstCircleOA[linestyle=dashed,linecolor=gray!40]{E_1}{T_1}[30][150] +\pstLineAB[linestyle=dashed,linecolor=blue!40]{A}{M_1} +\pstLineAB[linestyle=dashed,linecolor=blue!40]{B}{M_2} +\pstLineAB[linestyle=dashed,linecolor=red!40]{A}{H_1} +\pstLineAB[linestyle=dashed,linecolor=red!40]{B}{H_2} +\end{pspicture} +\end{LTXexample} + \subsection{Angles} Each angle is defined with three points. The vertex is the second @@ -808,7 +839,7 @@ It create a new node $X$ on the same line, but when $A,B,C$ are not collinear, w If you want to draw a node like \textsf{'Given $EF$, please find node $C$ on $AB$ such that $AC=EF$'}, you can use the macro \Lcs{pstLocateAB} to do this, it can seek the node $C$ from $A$ to $B$ with the -specified length, which can be got from \Lcs{pstDist}, \Lcs{pstDistConst}, \Lcs{pstDistAdd}, \Lcs{pstDistSub}, +specified length $L$, which can be got from \Lcs{pstDist}, \Lcs{pstDistConst}, \Lcs{pstDistAdd}, \Lcs{pstDistSub}, etc. \begin{BDef} @@ -845,7 +876,7 @@ Note that seek from $B$ will get the node $C$ in the reverse order, for example, If you want to draw a node like \textsf{'Given $EF$, please extend $AB$ to $C$ such that $BC=EF$'}, you can use the macro \Lcs{pstExtendAB} to do this, it can extend $AB$ from $B$ to one node with the -specified length, which can be got from \Lcs{pstDist}, \Lcs{pstDistConst}, \Lcs{pstDistAdd}, \Lcs{pstDistSub}, +specified length $L$, which can be got from \Lcs{pstDist}, \Lcs{pstDistConst}, \Lcs{pstDistAdd}, \Lcs{pstDistSub}, etc. \begin{BDef} @@ -942,11 +973,18 @@ In fact, we use the macro \Lcs{pstLocateAB} to implement this macro by passing the value $\dfrac{\sqrt{5}-1}{2}|AB|$ to parameter length. \begin{LTXexample}[width=6cm,pos=l] -\begin{pspicture}[showgrid=true](0,0)(4,3) +\begin{pspicture}[showgrid=true](0,1)(4,4) \psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize -\pstGeonode[PosAngle=90](0,1){A}(4,2){B} -\pstGoldenMean[PosAngle=90,PointSymbol=o]{A}{B}{C} -\pstLineAB{A}{B} +\pstGeonode[PosAngle=-90,CurveType=polyline](0,1){A}(4,2){B} +\pstGoldenMean[PosAngle=-90,PointSymbol=o]{A}{B}{C} +% geometrical method to draw the golden point +\pstMiddleAB[PosAngle=-90]{A}{B}{M} +\pstRotation[RotAngle=-90,PosAngle=90]{B}{M}[N] +\pstLineAB[linestyle=dashed,linecolor=gray!60]{A}{N} +\pstLineAB[linestyle=dashed,linecolor=gray!60]{B}{N} +\pstInterLC[PointNameA=,PosAngleB=90]{N}{A}{N}{B}{B0}{E} +\pstCircleOA[linecolor=green!60,linestyle=dashed]{N}{B}[190][300] +\pstCircleOA[linecolor=purple!60,linestyle=dashed]{A}{E}[0][60] \end{pspicture} \end{LTXexample} @@ -1225,7 +1263,7 @@ and the parameter to fill the circle. \pstCircleOA[linecolor=red,Radius=\pstDistAddVal{A}{B}{1.0}{\pstDistConst{0.5}}]{A}{} % R=|AB|+0.5 \pstCircleOA[linecolor=blue,Radius=\pstDistAddCoef{A}{B}{0.5}{A'}{B'}{1.5}]{A}{} % R=0.5|AB|+1.5|A'B'| \pstCircleOA[linecolor=green,Radius=\pstDistSub{A}{B}{A'}{B'}]{B'}{} % R=|AB|-|A'B'| -\pstCircleOA[linecolor=brown,Radius=\pstDistSubCoef{A}{B}{1.8}{A'}{B'}{0.5}]{A}{} R=1.8|AB|-0.5|A'B'| +\pstCircleOA[linecolor=brown,Radius=\pstDistSubCoef{A}{B}{1.8}{A'}{B'}{0.5}]{A}{} % R=1.8|AB|-0.5|A'B'| \pnode(-1.5,-2){D} \pstCircleOA[linecolor=pink,fillstyle=solid,fillcolor=pink!40,Radius=\pstDistMul{A}{B}{0.8}]{D}{} % R=0.8|AB| \psdot(D)\uput{0.2}[-45](D){$D$} @@ -1297,6 +1335,41 @@ The circle is defined by center $O$ and point $A$ on the circle or \Lkeyword{Rad \end{pspicture} \end{LTXexample} +Sometimes we need to draw a chord with the given length from the start node, +it is not possible to get the end node via the already defined macros, +so we provide the macro \Lcs{pstCircleChordNode} to do this work. +This macro find the node $X$ on the circle such that the length of chord $AX$ is the given value $L$, +which can be got from \Lcs{pstDist}, \Lcs{pstDistConst}, \Lcs{pstDistAdd}, \Lcs{pstDistSub}, etc. + +\begin{BDef} +\Lcs{pstCircleChordNode}\OptArgs\Largb{O}\Largb{A}\Largb{$L$}\Largb{X} +\end{BDef} + +The circle is just defined by center $O$ and point $A$ in this macro, +so you can't omit the parameter $A$. + +The direction to find node $X$ is anti-clockwise by default. +The parameter \Lkeyword{CurvAbsNeg}\DefaultVal{false} can change this behavior. + +At last, the chord length $L$ chouldn't large than the diameter of the circle, +else we will put the node $X$ at origin. + +\begin{LTXexample}[width=6cm,pos=l] +\begin{pspicture}[showgrid=true](-1,-1)(3,3) +\psset{dotscale=0.5}\psset{PointSymbol=*}\footnotesize +\pstGeonode[PosAngle={180,0}](1,1){O}(2.5,1){A} +\pstCircleOA[linecolor=red]{O}{A} +\pstCircleChordNode[PosAngle=60]{O}{A}{\pstDistConst{1}}{B} +\pstCircleChordNode[PosAngle=90]{O}{A}{\pstDistConst{2}}{C} +\pstCircleChordNode[PosAngle=-30,CurvAbsNeg=true]{O}{A}{\pstDistConst{1}}{B'} +\pstCircleChordNode[PosAngle=-90,CurvAbsNeg=true]{O}{A}{\pstDistConst{2}}{C'} +\pstLineAB{O}{A}\pstLineAB{O}{B}\pstLineAB{O}{C} +\pstLineAB{O}{B'}\pstLineAB{O}{C'} +\pstLineAB{A}{B}\pstLineAB{A}{C} +\pstLineAB{A}{B'}\pstLineAB{A}{C'} +\end{pspicture} +\end{LTXexample} + \vspace{10pt} A point can be positioned on a circle using its absolute abscissa or ordinate too. @@ -1937,7 +2010,7 @@ are same with \Lcs{pstGeneralEllipseFle}. They are set to zero if the coeffients \pstGeneralEllipseCoef[PosAngle=-100,CodeFigColor=red!50]{2,-2,3,6,5,8}{O_1}{R_1}{MajorRotAngle1} \pstGeneralEllipse[linecolor=red!60](O_1)(R_1)[MajorRotAngle1] %3x^2-2xy+2y^2-3x+6y+3=0 -\pstGeneralEllipseCoef[PosAngle=-80,CodeFigColor=purple!50]{3,-2,2,-3,5,2}{O_2}{R_2}{MajorRotAngle2} +\pstGeneralEllipseCoef[PosAngle=-80,CodeFigColor=purple!50]{3,-2,2,-3,6,3}{O_2}{R_2}{MajorRotAngle2} \pstGeneralEllipse[linecolor=purple!60](O_2)(R_2)[MajorRotAngle2] %x^2-xy+y^2+x-3y+1=0 \pstGeneralEllipseCoef[PosAngle=-90,CodeFigColor=green!50]{1,-1,1,1,-3,1}{O_3}{R_3}{MajorRotAngle3} diff --git a/Master/texmf-dist/dvips/pst-eucl/pst-eucl-alt.pro b/Master/texmf-dist/dvips/pst-eucl/pst-eucl-alt.pro deleted file mode 100644 index 64f01641148..00000000000 --- a/Master/texmf-dist/dvips/pst-eucl/pst-eucl-alt.pro +++ /dev/null @@ -1,132 +0,0 @@ -%! -% PostScript prologue for pst-eucl.tex. -% Version 1.00 2011/08/04 -% For distribution, see pstricks.tex. -% -/tx@EcldDict 40 dict def tx@EcldDict begin -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Pi -/Pi 3.14159265359 def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% e -/E 2.718281828459045 def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x -> true (if |x| < 1E-6) -/ZeroEq { abs 1E-6 lt } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x1 y1 x2 y2 -> a b c (ax-by+c=0 with a^2+b^2=1) -/EqDr { - 4 copy 3 -1 roll sub 7 1 roll exch sub 5 1 roll 4 -1 roll - mul 3 1 roll mul exch sub - 2 index dup mul 2 index dup mul add sqrt - 4 -1 roll 1 index div exch - 4 -1 roll 1 index div exch - 4 -1 roll 1 index div exch pop -} bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% orthogonal projection of M1 onto (OM2) -%% x1 y1 x2 y2 -> x3 y3 -/Project { - 2 copy dup mul exch dup mul add 5 1 roll 2 copy 5 -1 roll mul exch - 5 -1 roll mul add 4 -1 roll div dup 4 -1 roll mul exch 3 -1 roll mul -} bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% a b c (ax2+bx+c=0) -> x1 y1 -/SolvTrin { - /c exch def /b exch def /a exch def - b dup mul a c mul 4 mul sub dup 0 lt - { pop 0 0 } %% no solutions - {sqrt dup b neg add a 2 mul div exch b add neg 2 a mul div } - ifelse } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x1 y1 x2 y2 -> Dist -/ABDist { 3 -1 roll sub dup mul 3 1 roll sub dup mul add sqrt } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x1 y1 x2 y2 -> x1-x2 y1-y2 -/ABVect { 3 -1 roll exch sub 3 1 roll sub exch } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x1 y1 x2 y2 x3 y3 x4 y4 -> x y -/InterLines { - EqDr /D1c exch def /D1b exch def /D1a exch def - EqDr /D2c exch def /D2b exch def /D2a exch def - D1a D2b mul D1b D2a mul sub dup ZeroEq -% { pop pop pop 0 0 } %% parallel lines % --- hv 20110714 - { pop 0 0 } %% parallel lines --- hv 20110714 - { - /Det exch def - D1b D2c mul D1c D2b mul sub Det div - D1a D2c mul D2a D1c mul sub Det div - } ifelse } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% a b c R -> x1 y1 x2 y2 -/InterLineCircle { - /CR exch def /Dc exch def neg /Db exch def /Da exch def - ABVect /Vy exch def /Vx exch def - %% Dc==0 then O belong to the line - %% First project O on the line -> M (-ca;-cb) - %% l'abscisse de M sur (OM) divisée par R donne le cosinus - %Dc neg dup Db mul exch Da mul 2 copy 0 0 - %ABDist dup CR gt { pop pop pop 0 0 0 0 } - %{ ZeroEq { pop pop Db Da } if Atan /alpha exch def - Dc abs CR gt { 0 0 0 0 } - { Db neg Da neg Atan /alpha exch def - Dc CR div dup dup mul 1 exch sub sqrt exch Atan /beta exch def - alpha beta add dup cos CR mul exch sin CR mul - alpha beta sub dup cos CR mul exch sin CR mul - 4 copy ABVect Vy mul 0 le exch Vx mul 0 le and - { 4 2 roll } if } ifelse - } def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% R R' OO' -> x1 y1 x2 y2 -/InterCircles { - /OOP exch def /CRP exch def /CR exch def - OOP dup mul CRP dup mul sub CR dup mul add OOP div 2 div - dup dup mul CR dup mul exch sub dup - 0 lt { pop pop 0 0 0 0 } { sqrt 2 copy neg } ifelse -} bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x y theta -> x' y' (rotation of theta) -/Rotate { - dup sin /sintheta exch def cos /costheta exch def /y exch def /x exch def - x costheta mul y sintheta mul sub - y costheta mul x sintheta mul add -} def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% N -> x y -/GetNode { - tx@NodeDict begin - tx@NodeDict 1 index known { load GetCenter } { pop 0 0 } ifelse - end -} bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x -> ch(x) -/ch { dup Ex exch neg Ex add 2 div } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x -> sh(x) -/sh { dup Ex exch neg Ex sub 2 div } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x -> e^(x) -/Ex { E exch exp } bind def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% x f g -> x y n -/NewtonSolving { - /g exch def /f exch def 0 - { %%% STACK: x0 n - 1 add exch %% one more loop - dup ZeroEq - { dup 0.0005 add fgeval - 1 index 0.0005 sub fgeval sub .001 div } - { dup 1.0005 mul fgeval - 1 index 0.9995 mul fgeval sub .001 2 index mul div } ifelse %%% STACK: n x0 fg'(x0) - %%% compute x1=x0-fg(x0)/fg'(x0) - 1 index fgeval exch div dup 4 1 roll sub exch %% stack: dx x0 n - 3 -1 roll ZeroEq %% exit if root found - 1 index 100 eq or { exit } if %% or looping for more than 100 times - } loop - dup 100 lt { exch dup /x exch def f } { pop 0 0 } ifelse - 3 -1 roll -} def -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/fgeval { /x exch def f g sub } bind def -end -% END ps-euclide.pro diff --git a/Master/texmf-dist/dvips/pst-eucl/pst-eucl.pro b/Master/texmf-dist/dvips/pst-eucl/pst-eucl.pro index 3d2fe93c80c..503ed9c9a24 100644 --- a/Master/texmf-dist/dvips/pst-eucl/pst-eucl.pro +++ b/Master/texmf-dist/dvips/pst-eucl/pst-eucl.pro @@ -1,6 +1,6 @@ %! % PostScript prologue for pst-eucl.tex. -% Version 1.02 2012/11/21 +% Version 1.03 2020/01/09 % For distribution, see pstricks.tex. % /tx@EcldDict 40 dict def tx@EcldDict begin diff --git a/Master/texmf-dist/tex/generic/pst-eucl/pst-eucl.tex b/Master/texmf-dist/tex/generic/pst-eucl/pst-eucl.tex index c4b7b532963..6cc2f9b54e9 100644 --- a/Master/texmf-dist/tex/generic/pst-eucl/pst-eucl.tex +++ b/Master/texmf-dist/tex/generic/pst-eucl/pst-eucl.tex @@ -20,8 +20,8 @@ \csname PSTEuclideLoaded\endcsname \let\PSTEuclideLoaded\endinput % -\def\fileversion{1.68} -\def\filedate{2019/11/21} +\def\fileversion{1.69} +\def\filedate{2020/01/09} %% \message{`PST-Euclide v\fileversion, \filedate\space (dr,hv)}% %% prologue for postcript @@ -533,8 +533,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% #2 #4 #6 -> coordinates for nodes %% #3 #5 #7 -> nodes name -\def\pstTriangle{\pst@object{pstTriangle}}% -\def\pstTriangle@i{\@ifnextchar(\pstTriangle@ii{\pstTriangle@ii(0,0)}}% +\def\pstTriangle{\@ifnextchar[\Pst@Triangle{\Pst@Triangle[]}} +\def\Pst@Triangle[#1]{% + \begingroup + \psset{#1}% + \@ifnextchar(\pstTriangle@ii{\pstTriangle@ii(0,0)}% +} \def\pstTriangle@ii(#1)#2(#3)#4(#5)#6{% \pst@killglue %%begin modif alaindelplanque 11/2003 @@ -597,7 +601,7 @@ \Pst@Geonode@i[](#5){#6}%%NEW DR 15112001 \pst@TraceTriangle{#2}{#4}{#6}% \egroup -}% +\endgroup}% % \def\pst@TraceTriangle#1#2#3{\pspolygon(#1)(#2)(#3)}% % @@ -1055,8 +1059,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Line, circle, Arc %% #2 #3 -> 2 nodes defining the line -\def\pstLineAB{\ncline}%@ifnextchar[\Pst@LineAB{\Pst@LineAB[]}}% -%\def\Pst@LineAB[#1]#2#3{\ncline[#1]{#2}{#3}}% +\def\pstLineAB{\@ifnextchar[\Pst@LineAB{\Pst@LineAB[]}}% +\def\Pst@LineAB[#1]#2#3{% + \begingroup + \psset{#1}% + \ncline{#2}{#3} + \endgroup% +}% % %% \pstCircleOA[Options]{O}{A}[angleA][angleB] %% Draw a Circle with center O from angleA to angleB, going counter clockwise. @@ -1986,13 +1995,12 @@ \def\Pst@MediatorAB[#1]#2#3#4#5{% \bgroup\psset{#1}% % Affectation of local parameters \bgroup - \let\PointSymbol=\psk@PointSymbolA + \ifx\psk@PointSymbolA\@none\let\psk@PointSymbol=\@none\else\let\psk@PointSymbol=\psk@PointSymbolA\fi \ifx\psk@PointNameA\@undef\else\psset{PointName=\psk@PointNameA}\fi - %\Pst@HomO[HomCoef=.5]{#2}{#3}{#4} - \Pst@MiddleAB[]{#2}{#3}{#4} + \Pst@MiddleAB[]{#2}{#3}{#4} \egroup \bgroup - \let\PointSymbol=\psk@PointSymbolB + \ifx\psk@PointSymbolB\@none\let\psk@PointSymbol=\@none\else\let\psk@PointSymbol=\psk@PointSymbolB\fi \ifx\psk@PointNameB\@undef\else\psset{PointName=\psk@PointNameB}\fi \expandafter\ifx\csname psteucl@old\endcsname\relax% \Pst@Rotation[RotAngle=90, CodeFig=false]{#4}{#3}[#5]%%%DR 26032005 @@ -2107,22 +2115,6 @@ \expandafter\pscurve\@@GenCourbe \egroup% }% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Parallel line -%% #2 #3 -> nodes defining the line -%% #3 -> antecedent node -%% #4 -> node name of the image -%% #5 -> label -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Orthogonal line -%% #2 #3 -> nodes defining the line -%% #3 -> antecedent node -%% #4 -> node name of the image -%% #5 -> label -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Special macros for parameters -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% \pstTriangleIC[Options]{A}{B}{C}[I][D] %% Draw the inner circle of triangle ABC @@ -2132,34 +2124,45 @@ %% #3 -> [input] the node B %% #4 -> [input] the node C %% #5 -> [output] optional, the inner circle center I -%% #6 -> [output] optional, the node on inner circle +%% #6 -> [output] optional, the node D on inner circle \def\pstTriangleIC{\@ifnextchar[\Pst@TriangleIC{\Pst@TriangleIC[]}} \def\Pst@TriangleIC[#1]#2#3#4{% \begingroup \@InitListMng % - % we should output none point name and symbol as default - % to compat with the old version. - \psset{PointName=none,PointSymbol=none} - % then comes the user local options. \psset{#1}% \def\pst@triangle@node@a{#2} \def\pst@triangle@node@b{#3} \def\pst@triangle@node@c{#4} - \@ifnextchar[\Pst@TriangleIC@i{\Pst@TriangleIC@i[IC_O]}} + \@ifnextchar[\Pst@TriangleIC@i{\Pst@TriangleIC@j[IC_O]}} \def\Pst@TriangleIC@i[#1]{% \def\pst@triangle@inner@center{#1} - \@ifnextchar[\Pst@TriangleIC@j{\Pst@TriangleIC@j[IC_OAB]}} -\def\Pst@TriangleIC@j[#1]{% - \begingroup - \psset{PointSymbol=none,PointName=none,linestyle=none,CodeFig=false} - \pstBissectBAC{\pst@triangle@node@c}{\pst@triangle@node@a}{\pst@triangle@node@b}{@PST@TRIANGLE@IC_BC} - \pstBissectBAC{\pst@triangle@node@b}{\pst@triangle@node@c}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_AB} - \pstInterLL{\pst@triangle@node@c}{@PST@TRIANGLE@IC_AB}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_BC}{\pst@triangle@inner@center} - \pstProjection{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@inner@center}[#1] - \endgroup - \pstCircleOA{\pst@triangle@inner@center}{#1} + \@ifnextchar[\Pst@TriangleIC@ii{\Pst@TriangleIC@ij[IC_OAB]}} +\def\Pst@TriangleIC@ii[#1]{% display both I and D + \def\pst@triangle@inner@IBC{#1} + \Pst@TriangleIC@k% \Pst@ManageParamList{\pst@triangle@inner@center}% - \Pst@ManageParamList{#1}% + \Pst@ManageParamList{\pst@triangle@inner@IBC}% + \endgroup +}% +\def\Pst@TriangleIC@ij[#1]{% display I only + \def\pst@triangle@inner@IBC{#1} + \Pst@TriangleIC@k% + \Pst@ManageParamList{\pst@triangle@inner@center}% + \endgroup +}% +\def\Pst@TriangleIC@j[#1]{% display none point + \def\pst@triangle@inner@center{#1} + \def\pst@triangle@inner@IBC{IC_OAB} + \Pst@TriangleIC@k% + \endgroup +}% +\def\Pst@TriangleIC@k{% display none point + \begingroup + \pstBissectBAC[PointSymbol=none,PointName=none,linestyle=none,CodeFig=false]{\pst@triangle@node@c}{\pst@triangle@node@a}{\pst@triangle@node@b}{@PST@TRIANGLE@IC_BC} + \pstBissectBAC[PointSymbol=none,PointName=none,linestyle=none,CodeFig=false]{\pst@triangle@node@b}{\pst@triangle@node@c}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_AB} + \pstInterLL[PointSymbol=none,PointName=none]{\pst@triangle@node@c}{@PST@TRIANGLE@IC_AB}{\pst@triangle@node@a}{@PST@TRIANGLE@IC_BC}{\pst@triangle@inner@center} + \pstProjection[PointSymbol=none,PointName=none]{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@inner@center}[\pst@triangle@inner@IBC] + \pstCircleOA{\pst@triangle@inner@center}{\pst@triangle@inner@IBC} \endgroup }% % @@ -2174,23 +2177,132 @@ \def\pstTriangleOC{\@ifnextchar[\Pst@TriangleOC{\Pst@TriangleOC[]}} \def\Pst@TriangleOC[#1]#2#3#4{% \begingroup - % we should output none point name and symbol as default - % to compat with the old version. - \psset{PointName=none,PointSymbol=none} - % then comes the user local options. \psset{#1}% \def\pst@triangle@node@a{#2} \def\pst@triangle@node@b{#3} \def\pst@triangle@node@c{#4} - \@ifnextchar[\Pst@TriangleOC@i{\Pst@TriangleOC@i[OC_O]}} + \@ifnextchar[\Pst@TriangleOC@i{\Pst@TriangleOC@j[OC_O]}} \def\Pst@TriangleOC@i[#1]{% - \begingroup - \psset{PointSymbol=none,PointName=none,CodeFig=false} - \pstCircleABC{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@node@c}{#1} - \endgroup + \pstCircleABC[PointSymbol=none,PointName=none,CodeFig=false]{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@node@c}{#1} \Pst@geonodelabel{#1}% \endgroup }% +\def\Pst@TriangleOC@j[#1]{% don't output the center point + \pstCircleABC[PointSymbol=none,PointName=none,CodeFig=false]{\pst@triangle@node@a}{\pst@triangle@node@b}{\pst@triangle@node@c}{#1} + \endgroup +}% +% +%% \pstTriangleGC[Options]{A}{B}{C}{G}[M1][M2] +%% Draw the gravity center of triangle ABC +%% Parameters: +%% #1 -> options +%% #2 -> [input] the node A +%% #3 -> [input] the node B +%% #4 -> [input] the node C +%% #5 -> [output] the output gravity center G +%% #6 -> [output] the optional output Middle of BC +%% #7 -> [output] the optional output Middle of CA +\def\pstTriangleGC{\@ifnextchar[\Pst@TriangleGC{\Pst@TriangleGC[]}} +\def\Pst@TriangleGC[#1]#2#3#4#5{% + \begingroup + \@InitListMng % + \psset{#1}% + \def\pst@triangle@node@A{#2} + \def\pst@triangle@node@B{#3} + \def\pst@triangle@node@C{#4} + \def\pst@triangle@node@G{#5} + \@ifnextchar[\Pst@TriangleGC@i{\Pst@TriangleGC@j[BC_M][CA_M]}} +\def\Pst@TriangleGC@i[#1][#2]{% + \pstMiddleAB[PointName=none,PointSymbol=none]{\pst@triangle@node@B}{\pst@triangle@node@C}{#1} + \pstMiddleAB[PointName=none,PointSymbol=none]{\pst@triangle@node@C}{\pst@triangle@node@A}{#2} + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{#1}{\pst@triangle@node@B}{#2}{\pst@triangle@node@G} + \Pst@ManageParamList{\pst@triangle@node@G}% + \Pst@ManageParamList{#1}% + \Pst@ManageParamList{#2}% + \endgroup +}% +\def\Pst@TriangleGC@j[#1][#2]{% + \pstMiddleAB[PointName=none,PointSymbol=none]{\pst@triangle@node@B}{\pst@triangle@node@C}{#1} + \pstMiddleAB[PointName=none,PointSymbol=none]{\pst@triangle@node@C}{\pst@triangle@node@A}{#2} + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{#1}{\pst@triangle@node@B}{#2}{\pst@triangle@node@G} + \Pst@ManageParamList{\pst@triangle@node@G}% + \endgroup +}% +% +%% \pstTriangleHC[Options]{A}{B}{C}{H}[H1][H2] +%% Draw the orthocenter of triangle ABC +%% Parameters: +%% #1 -> options +%% #2 -> [input] the node A +%% #3 -> [input] the node B +%% #4 -> [input] the node C +%% #5 -> [output] the output orthocenter H +%% #6 -> [output] the optional output perpendicular on BC +%% #7 -> [output] the optional output perpendicular on CA +\def\pstTriangleHC{\@ifnextchar[\Pst@TriangleHC{\Pst@TriangleHC[]}} +\def\Pst@TriangleHC[#1]#2#3#4#5{% + \begingroup + \@InitListMng % + \psset{#1}% + \def\pst@triangle@node@A{#2} + \def\pst@triangle@node@B{#3} + \def\pst@triangle@node@C{#4} + \def\pst@triangle@node@H{#5} + \@ifnextchar[\Pst@TriangleHC@i{\Pst@TriangleHC@j[BC_H][CA_H]}} +\def\Pst@TriangleHC@i[#1][#2]{% + \pstProjection[PointName=none,PointSymbol=none]{\pst@triangle@node@B}{\pst@triangle@node@C}{\pst@triangle@node@A}[#1] + \pstProjection[PointName=none,PointSymbol=none]{\pst@triangle@node@C}{\pst@triangle@node@A}{\pst@triangle@node@B}[#2] + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{#1}{\pst@triangle@node@B}{#2}{\pst@triangle@node@H} + \Pst@ManageParamList{\pst@triangle@node@H}% + \Pst@ManageParamList{#1}% + \Pst@ManageParamList{#2}% + \endgroup +}% +\def\Pst@TriangleHC@j[#1][#2]{% + \pstProjection[PointName=none,PointSymbol=none]{\pst@triangle@node@B}{\pst@triangle@node@C}{\pst@triangle@node@A}[#1] + \pstProjection[PointName=none,PointSymbol=none]{\pst@triangle@node@C}{\pst@triangle@node@A}{\pst@triangle@node@B}[#2] + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{#1}{\pst@triangle@node@B}{#2}{\pst@triangle@node@H} + \Pst@ManageParamList{\pst@triangle@node@H}% + \endgroup +}% +% +%% \pstTriangleEC[Options]{A}{B}{C}{E}[H] +%% Draw the center of the escribed circle which lying out of BC of triangle ABC. +% +%% Parameters: +%% #1 -> options +%% #2 -> [input] the node A +%% #3 -> [input] the node B +%% #4 -> [input] the node C +%% #5 -> [output] the output excenter E +%% #6 -> [output] the optional output perpendicular on BC +\def\pstTriangleEC{\@ifnextchar[\Pst@TriangleEC{\Pst@TriangleEC[]}} +\def\Pst@TriangleEC[#1]#2#3#4#5{% + \begingroup + \@InitListMng % + \psset{#1}% + \def\pst@triangle@node@A{#2} + \def\pst@triangle@node@B{#3} + \def\pst@triangle@node@C{#4} + \def\pst@triangle@node@E{#5} + \@ifnextchar[\Pst@TriangleEC@i{\Pst@TriangleEC@j[BC_H]}} +\def\Pst@TriangleEC@i[#1]{% + \pstBissectBAC[PointName=none,PointSymbol=none,linestyle=none]{\pst@triangle@node@B}{\pst@triangle@node@A}{\pst@triangle@node@C}{@PST@TRIANGLE@EC_BC} + \pstOutBissectBAC[PointName=none,PointSymbol=none,linestyle=none]{\pst@triangle@node@C}{\pst@triangle@node@B}{\pst@triangle@node@A}{@PST@TRIANGLE@EC_CA} + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{@PST@TRIANGLE@EC_BC}{\pst@triangle@node@B}{@PST@TRIANGLE@EC_CA}{\pst@triangle@node@E} + \pstProjection[PointName=none,PointSymbol=none]{B}{C}{\pst@triangle@node@E}[#1] + \Pst@ManageParamList{\pst@triangle@node@E}% + \Pst@ManageParamList{#1}% + \endgroup +}% +\def\Pst@TriangleEC@j[#1]{% + \pstBissectBAC[PointName=none,PointSymbol=none,linestyle=none]{\pst@triangle@node@B}{\pst@triangle@node@A}{\pst@triangle@node@C}{@PST@TRIANGLE@EC_BC} + \pstOutBissectBAC[PointName=none,PointSymbol=none,linestyle=none]{\pst@triangle@node@C}{\pst@triangle@node@B}{\pst@triangle@node@A}{@PST@TRIANGLE@EC_CA} + \pstInterLL[PointName=none,PointSymbol=none]{\pst@triangle@node@A}{@PST@TRIANGLE@EC_BC}{\pst@triangle@node@B}{@PST@TRIANGLE@EC_CA}{\pst@triangle@node@E} + \pstProjection[PointName=none,PointSymbol=none]{B}{C}{\pst@triangle@node@E}[#1] + \Pst@ManageParamList{\pst@triangle@node@E}% + \endgroup +}% % %% Distance between two points \def\pstDist#1#2{% @@ -3102,6 +3214,45 @@ \endgroup% }% % +%% \pstCircleChordNode[Options]{O}{A}{L}{B} +%% Create a new node B on the Circle O such that the length of chord AB is the given value L. +%% The circle O is defined by center O and point A on the circle. +%% The direction can be controled by parameter CurvAbsNeg. +%% Parameters: +%% #1 -> options +%% #2 -> [input] the circle center O +%% #3 -> [input] the point A on the circle +%% #4 -> [input] the given chord length +%% #5 -> [output] the target node name B +\def\pstCircleChordNode{\@ifnextchar[\Pst@CircleChordNode{\Pst@CircleChordNode[]}} +\def\Pst@CircleChordNode[#1]{% + \begingroup + \psset{#1}% + \Pst@CircleChordNode@i} +\def\Pst@CircleChordNode@i#1#2#3#4{% + \pst@getcoor{#1}\pst@tempO% + \pst@getcoor{#2}\pst@tempA% + \pnode(! + \pst@tempO \tx@UserCoor % x0,y0 + \pst@tempA \tx@UserCoor % x1,y1 + 1 index 4 index sub dup mul 1 index 4 index sub dup mul add sqrt % R + 1 index 4 index sub 3 index 6 index sub atan % RotAngle of A + #3 \pst@number\psxunit\space div % chord length in user screen + 2 index 2 mul 1 index lt { + pop pop pop pop pop pop pop 0 0 + } { + 0 index 3 index dup mul 4 mul 2 index dup mul sub sqrt atan 2 mul % tan(AOB/2)=d/sqrt(4r^2-d^2) + \ifPst@CurvAbsNeg 2 index exch sub \else 2 index add \fi % RotAngle of B = RotAngle of A +/-