diff options
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/README | 12 | ||||
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/repere-doc.pdf | bin | 0 -> 621123 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/repere-doc.tex | 1363 | ||||
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 1944 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 2 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-metapost.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/repere.tlpsrc | 0 |
7 files changed, 3321 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/metapost/repere/README b/Master/texmf-dist/doc/metapost/repere/README new file mode 100644 index 00000000000..b4fe5d2ceb0 --- /dev/null +++ b/Master/texmf-dist/doc/metapost/repere/README @@ -0,0 +1,12 @@ +repere.mp + +This package provides MetaPost macros for drawing in a coordinate system : +- axis, grids +- points, vectors +- functions (curves, tangents, integrals, sequences) +- statistic diagrams + +The doc is in french, sorry for that + +License LPPL + diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf Binary files differnew file mode 100644 index 00000000000..4ebe22e1ee5 --- /dev/null +++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex new file mode 100644 index 00000000000..b51602fd4f9 --- /dev/null +++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex @@ -0,0 +1,1363 @@ +\documentclass[11pt,a4paper,french]{article} +% to compile this doc (needs geometriesyr16.mp http://melusine.eu.org/syracuse/poulecl/macros/): +% (pdf)latex repere-doc.tex +% mpost repere-doc.mp +% mpost repere-doc.mp +% (pdf)latex repere-doc.tex + + \usepackage{calc,ifthen} + + \usepackage[utf8]{inputenc} + \usepackage[T1]{fontenc} + \usepackage{lmodern} + \usepackage{textcomp} + + \usepackage{geometry} + \geometry{twoside,hmargin=2cm,vmargin={1.5cm,1.8cm},includefoot} + + \usepackage{mflogo} + + \usepackage[output-decimal-marker={,}]{siunitx} + + \usepackage{multicol} + \setlength{\multicolsep}{3pt} + \setlength{\columnsep}{0pt} + + \usepackage[toc]{multitoc} + + \usepackage{enumitem} + \setlist[description]{font=\ttfamily\bfseries\color{blue}} + + \usepackage[svgnames]{xcolor} + + \usepackage{graphicx} + \usepackage{ifpdf} + \ifpdf + \DeclareGraphicsRule{*}{mps}{*}{} + \fi + + \usepackage{url} + \usepackage{verbatim} + \usepackage{fancyvrb} + + \usepackage{array} + \usepackage{tabularx} + \renewcommand{\tabularxcolumn}[1]{>{\arraybackslash}m{#1}} + + \usepackage{tcolorbox} + \tcbset{colframe=black,boxsep=0pt,left=3pt,right=3pt,top=0pt,bottom=0pt,boxrule=0.4pt,colback=LightGoldenrod} + + \usepackage{listings} + \lstset{columns=flexible,% + language=MetaPost,% + showstringspaces=false,% + basicstyle=\ttfamily} + + + \usepackage{babel} + \usepackage[colorlinks=true,urlcolor=blue]{hyperref} + + + +%%%%%%%%%%%%%%%%%%% moreverb.sty +\makeatletter +\newwrite\verbatim@out + \immediate\openout \verbatim@out \jobname.mp +\newwrite\temp@code +\def\verbatimwrite{% + \@bsphack + \immediate\openout \temp@code figtmp.mp + \let\do\@makeother\dospecials + \catcode`\^^M\active \catcode`\^^I=12 + \def\verbatim@processline{% + \immediate\write\verbatim@out + {\the\verbatim@line}% + \immediate\write\temp@code + {\the\verbatim@line} + }% + \verbatim@start} + +\def\endverbatimwrite{% + \immediate\closeout\temp@code + \@esphack + }% +\makeatother +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newlength{\largeurcode} +\newlength{\largeurfig} +\newcounter{numfig} +\setcounter{numfig}{0} + +\newcommand{\codedeuxcol}{% + \begin{tcolorbox} + \begin{minipage}[c]{\largeurcode} + \begin{multicols}{2} + \lstinputlisting{figtmp.mp} + \end{multicols} + \end{minipage} + \end{tcolorbox} + \par\noindent + } + + +\newcommand{\codehoriz}{% + \begin{minipage}[c]{\largeurcode} + \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp} + \end{minipage} + \hfill + } + +\newcommand{\codevert}{% + {\centering + \begin{minipage}[c]{\largeurcode} + \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp} + \end{minipage} + \par\noindent} + } + +\newenvironment{codefigure}[3]% + {% + \refstepcounter{numfig} + \setlength{\largeurcode}{#2\linewidth} + \ifnum#1=0 + \setlength{\largeurfig}{\linewidth-\largeurcode-2\fboxsep-2\fboxrule} + \def\inscode{\codehoriz} + \else + \setlength{\largeurfig}{\linewidth} + \def\inscode{\codevert} + \ifnum#3=1 + \relax + \else + \def\inscode{\codedeuxcol} + \fi + \fi + \verbatimwrite + }% + {% + \endverbatimwrite + \par + \noindent + \inscode + \IfFileExists{\jobname.\thenumfig}% + {\begin{minipage}[c]{\largeurfig} + \centering \includegraphics{\jobname.\thenumfig}\par + \end{minipage}}{} + \par} + + +\newenvironment{codecache}% + {\verbatimwrite}{\endverbatimwrite} + +\newcounter{reptmp} + +\newenvironment{codefigureinter}[2][1]% + {% + \setcounter{reptmp}{\value{numfig}+#2} + \setlength{\largeurcode}{#1\linewidth} + \def\inscode{\codevert} + \verbatimwrite + }% + {\endverbatimwrite + \par + \noindent + \inscode + \whiledo{\value{numfig}<\value{reptmp}} + {\refstepcounter{numfig} + \IfFileExists{\jobname.\thenumfig}% + {\includegraphics{\jobname.\thenumfig} + \qquad}{} + } + \par} + + +\newcounter{repexemple} +\setcounter{repexemple}{0} + +\newcommand{\debutexemple}{\par\vspace{2ex} + \refstepcounter{repexemple} + \noindent {\bfseries \color{blue!20!black} + Exemple \arabic{repexemple}} + \par\nopagebreak\vspace{1ex} + } + + +\newenvironment{exemple}[1][0.5]% + {\debutexemple + \codefigure{0}{#1}{1} + }% + {\endcodefigure + \par\vspace{2ex}} + +\newenvironment{exemplev}[2][1]% + {\debutexemple + \codefigure{1}{#1}{#2} + }% + {\endcodefigure + \par\vspace{2ex}} + +\newenvironment{exemplefiginter}[2][1]% + {\debutexemple + \codefigureinter[#1]{#2} + }% + {\endcodefigureinter + \par\vspace{2ex}} + +\newenvironment{figreperedoc}% + {\refstepcounter{numfig} + \verbatimwrite}% + {% + \endverbatimwrite% + \IfFileExists{\jobname.\thenumfig}% + {\includegraphics{\jobname.\thenumfig}}{} + } + + +\newcommand{\vect}[1]{\overrightarrow{#1\rule{0.1em}{0ex}}} + +\begin{document} +\title{Documentation de \texttt{repere.mp}} +\date{\today} +\author{Olivier \textsc{Péault}% +\footnote{E-mail : \href{mailto:o.peault@gmail.com}{\texttt{o.peault@gmail.com}}}} +\maketitle + +\setcounter{tocdepth}{2} + +\setlength{\columnsep}{25pt} +\tableofcontents +\setlength{\columnsep}{10pt} + + + + +\begin{codecache} +input geometriesyr16; +input latexmp; +input repere; +\end{codecache} + + +\section{Utilisation du fichier} +Les macros du fichier \verb+repere.mp+ ont pour but de simplifier la création de figures dans un repère du plan avec \MP{}. L'idée de départ est de coller le plus possibles aux besoins de l'enseignement secondaire de mathématiques. + +Il est possible d'utiliser \verb+repere+ et \verb+geometriesyr+ (les macros de Christophe \textsc{Poulain} pour la géométrie disponibles à l'adresse \url{http://melusine.eu.org/syracuse/poulecl/macros/}) dans une même figure comme le montrent les exemples page \pageref{exgeom}. + +Le fichier \verb+repere.mp+ doit être placé dans un répertoire accessible à \MP{} (Par ex. le répertoire \verb+metapost+ du \verb+texmf+ local). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures. + + +Certaines des étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} mais la compilation peut devenir assez longue pour un nombre important de figures car un fichier est créé et compilé automatiquement par \MP{} pour chaque étiquette. Il est alors possible d'utiliser le fichier \verb+latexmp.mp+ à condition de placer l'instruction \verb+input latexmp;+ avant l'instruction \verb+input repere;+. Attention, utiliser \verb+latexmp.mp+ oblige à compiler deux fois les documents. + + +\section{Repère utilisateur} + +\subsection{Numérotation des figures} +Chaque figure devra débuter par une instruction \verb|repere()| et se terminer par \verb|fin| (voir ci-dessous). Si ces instructions se trouvent en dehors d'un environnement \verb|beginfig()|-\verb|endfig| la numérotation est automatique : + +\bigskip +\begin{minipage}[c]{0.3\linewidth} +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}] +beginfig(2); +repere(...); +<instructions de dessin> +fin; +endfig; +\end{lstlisting} +\end{minipage} +\hfill +\begin{minipage}[c]{0.6\linewidth} +La figure porte le numéro 2 +\end{minipage} + +\bigskip +\begin{minipage}[c]{0.3\linewidth} +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}] +repere(...); +<instructions de dessin> +fin; +\end{lstlisting} +\end{minipage} +\hfill +\begin{minipage}[c]{0.6\linewidth} +La numérotation est automatique. La figure porte le numéro qui suit la figure précédemment dessinée. S'il s'agit de la première, elle porte le numéro 1. +\end{minipage} + + + +\subsection{Définition du repère} +\begin{description} +\item[repere(xmin,xmax,ux,ymin,ymax,uy,theta)] débute une figure et définit le repère utilisateur : axe des abscisses de \verb+xmin+ à \verb+xmax+, unité \verb+ux+, axe des ordonnées de \verb+ymin+ à \verb+ymax+, unité \verb+uy+ et \verb+theta+ est l'angle en degrés entre les axes. Le paramètre \verb+theta+ est optionnel. Il est égal à 90 par défaut. + +\item[repere.larg(xmin,xmax,Lx,ymin,ymax,Ly,theta)] définit un repère tel que la largeur totale de la figure produite soit \verb+Lx+ et sa hauteur \verb+Ly+. + +\item[repere.orth(xmin,xmax,Lx,ymin,ymax)] définit un repère orthonormé de largeur totale \verb+Lx+. + +\item[interaxes(x,y)] définit les coordonnées du point d'intersection des axes. Par défaut ces coordonnées sont $(0,0)$. + +\item[cadre] chemin fermé qui fait le tour du repère. + +\item[fin] termine la figure et la découpe pour ne garder que la partie limitée par le repère utilisateur. +\end{description} + + + + +\subsection{Axes} + +\subsubsection{Généralités} +\begin{description} +\item[axex.pos(grad,val)] axe des abscisses gradué avec un pas de \verb+grad+ et étiqueté avec un pas de \verb+val+. + +Si \verb+grad+ est négatif ou nul, l'axe n'est pas gradué et si \verb+val+ est négatif ou nul, l'axe n'est pas étiqueté. + +\verb+pos+ est un paramètre optionnel qui désigne la position (au sens de \MP : \verb+rt+, \verb+urt+, \verb+top+, \verb+ulft+, \verb+lft+, \verb+llft+, \verb+bot+ ou \verb+lrt+) des étiquettes. \verb+pos+ peut être omis, la valeur par défaut est \verb+bot+. + +Les étiquettes qui ne sont pas entièrement à l'intérieur du cadre ne sont pas dessinées. + +\item[axey.pos(grad,val)] axe des ordonnées. La valeur par défaut de \verb+pos+ est \verb+lft+. +\end{description} + + +Au niveau de l'intersection des axes, les étiquettes sont tracées à la position \verb+pos+ si l'abscisse est différente de l'ordonnée ou si un seul axe est tracé. Dans le cas contraire, une seule étiquette est tracée pour les deux axes à une position \og intermédiaire \fg{} (pour \verb+axex.bot+ et \verb+axey.lft+, on obtient la position \verb+llft+) + +\begin{description} +\item[axes.pos(grad,val)] figure formée par les deux axes gradués avec le même pas \verb+grad+ et étiquetés avec le même pas \verb+val+. \verb+pos+ désigne la position de l'étiquette de l'intersection des axes, sa valeur par défaut est \verb|llft|. La position des étiquettes des axes est définie à partir de \verb+pos+ (pour \verb+urt+ on obtient \verb+top+ pour l'axe des abscisses et \verb+rt+ pour l'axe des ordonnées. + +\end{description} + +Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes : + + + +\begin{exemple} +repere(-3,3,1cm,-1,1,1cm); +draw axex(1,1); +fin; +\end{exemple} + +\begin{exemple} +repere(-3,3,1cm,-1,1,1cm); +draw axex.top(1,1); +fin; +\end{exemple} + +\begin{exemple} +repere(-3,3,0.8cm,-2.5,2.5,1cm); +draw axes(1,1) withcolor pourpre; +draw cadre; +fin; +\end{exemple} + +\begin{exemple} +repere(-3,3,0.8cm,-2.5,2.5,1cm,60); +draw axes.lrt(1,1); +draw cadre; +fin; +\end{exemple} + +\begin{exemple} +repere.orth(-3,3,5cm,-2.5,2.5); +draw axex.top(0.5,1) withcolor bleu; +draw axey(1,1) withcolor bleu; +fin; +\end{exemple} + +\subsubsection{Réglages des axes} + +Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes : + + +\begin{description} +\item[setaxes(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les axes. + +\item[setgrad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les graduations. + +\item[setval(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour l'étiquetage. + +\item[flecheaxe] booléen égal à \verb|true| par défaut qui permet de dessiner, ou non, des flèches au bout des axes. +\end{description} + +\begin{exemple} +repere.larg(110,160,5cm,2000,7000,5cm); +interaxes(120,3000); +setaxes(120,160,3000,7000); +setgrad(120,160,3000,7000); +draw axex(10,10); +draw axey(1000,1000); +fin; +\end{exemple} + + +\begin{description} + \item[axexo.pos(grad,val), axeyo.pos(grad,val), axeso.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée. + + \item[axexn.pos(grad,val), axeyn.pos(grad,val), axesn.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée. +\end{description} + + +\begin{exemple} +repere(-0.5,3,0.8cm,-0.5,2.5,1cm); +setaxes(0,3,0,2.5); +draw axeso(1,1); +fin; +\end{exemple} + +\begin{exemple} +repere.larg(-3,3,6cm,-3,4,3.5cm,60); +draw axexn(1,2) withcolor rouge; +draw axeyn(1,1) withcolor olive; +draw cadre; +fin; +\end{exemple} + +\subsubsection{Graduations multiples de $\pi$} + +\begin{description} +\item[axexpi.pos(n,d)] axe des abscisses gradué et étiqueté avec un pas de $\frac{n\pi}{d}$. Les fractions sont composées en mode normal. Pour les obtenir en mode \og displaystyle \fg, la variable de type booléen \verb+displayfrac+ doit être égale à \verb+true+. + +\item[axeypi.pos(n,d)] axe des ordonnées gradué et étiqueté avec un pas de $\frac{n\pi}{d}$. + +\item[axespi.pos(n,d)] les deux axes gradués et étiquetés avec un pas de $\frac{n\pi}{d}$. + +\item[axexpio.pos(n,d), axeypio.pos(n,d), axespio.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée. + +\item[axexpin.pos(n,d), axeypin.pos(n,d), axespin.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée. +\end{description} + + +\begin{exemple} +repere(-2.5,2.5,1.3cm,-3.5,3.5,0.8cm); +draw axexpi(1,6) withcolor grisfonce; +draw axeypi(1,4) withcolor grisfonce; +draw cadre; +fin; +\end{exemple} + +\subsubsection{Graduations isolées} + +\begin{description} +\item[axexpart.pos(x1,lab1,x2,lab2,...)] graduation et étiquetage partiels de l'axe des abscisses pour les valeurs \verb+x1+, \verb+x2+... et les étiquettes \verb+lab1+, \verb+lab2+... à la position \verb+pos+. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+bot+. Les étiquettes peuvent être soit des chaînes de caractères ("aa", "bonjour"), soit des expressions du type \verb+btex $\pi$ etex+ (ou \verb|LaTeX("$\pi$")| voir page \pageref{latex}), soit d'autres figures. Si \verb+labn+ est omis, la valeur de \verb+xn+ sera utilisée comme étiquette. Pour obtenir une graduation sans étiquette, on peut utiliser la chaîne vide \verb+""+. + +\item[axeypart.pos(y1,lab1,y2,lab2,...)] même chose sur l'axe des ordonnées. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+lft+. +\end{description} + + + +\begin{exemple}[0.55] +repere.orth(-4,5,6cm,-3,4.5); +setgrad(0,5,0,3); +setval(0,5,0,3); +draw axex(1,2); +draw axey(1,0); +draw axexpart(-1.8,-pi,LaTeX("$-\pi$")) + withcolor bleu; +draw axeypart.rt(-2.5,"dd",-1,2.5,"") + withcolor rouge; +fin; +\end{exemple} + +\subsubsection{Ajout de texte sur les graduations} + +\begin{description} +\item[extranumx] chaine de caractères qui sera ajoutée après les valeurs des graduations sur l'axe des abscisses avant d'être composée avec la commande \verb|\num| de \verb|siunitx|. +\item[extranumy] même chose sur l'axe des ordonnées. + +\end{description} + +\begin{exemple} +repere(-1,4,1.2cm,-1,3.5,1cm); +extranumx:="e3"; +extranumy:="0000"; +draw axes(1,1); +draw cadre; +fin; +\end{exemple} + + +\subsection{Quadrillages} +\begin{description} +\VerbatimFootnotes +\item[setquad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour le tracé des quadrillages.\footnote{Il existe une macro \verb|settout| qui appelle successivement \verb+setaxes+, \verb+setgrad+, \verb+setval+ et \verb+setquad+.} + +\item[quadrillage(x,y)] quadrillage avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. L'épaisseur des traits par défaut est \verb+0.3bp+ et la couleur par défaut est \verb+0.7white+. +\end{description} + + +\begin{exemple} +repere(-3,3,0.8cm,-2.5,2.5,1cm); +draw quadrillage(1,0.5); +draw axes(1,1); +draw cadre; +fin; +\end{exemple} + +\begin{exemple} +repere(-3,3,0.8cm,-2.5,2.5,1cm); +draw quadrillage(1,1) dashed evenly + withcolor (1,0.5,0.5); +draw axes(1,1) withcolor marine; +draw cadre; +fin; +\end{exemple} + +\begin{description} +\item[papiermillimetre] comme son nom l'indique... Les couleurs et les épaisseurs des traits sont stockées dans \verb+pm_coula+, \verb+pm_coulb+, \verb+pm_coulc+ et \verb+pm_epa+, \verb+pm_epb+, \verb+pm_epc+. +\end{description} + + +\begin{exemple} +repere(-2.5,2.5,1cm,-2.5,2.5,1cm); +setquad(-2,2,-2,2); +draw papiermillimetre; +draw axes(1,1); +fin; +\end{exemple} + +\begin{description} +\item[papierpointe(x,y)] quadrillage formé de points avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. La taille des points par défaut est \verb+2bp+. +\end{description} + + +\begin{exemple} +repere(-3,3,0.8cm,-2.5,2.5,1cm); +setquad(0,3,0,2.5); +draw papierpointe(0.5,0.5); +setquad(-3,0,-2.5,2.5); +draw quadrillage(1,1) dashed + withdots withcolor magenta; +draw axes(1,1); +draw cadre; +fin; +\end{exemple} + +\subsection{Base} +\begin{description} +\item[base(O,i,j)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux vecteurs de la base et leurs noms (\verb+i+ et \verb+j+ surmontés d'une flèche). Si les noms sont de la forme \og lettre + nombre\fg, le nombre est affiché en indice. + +\item[basep(O,I,J)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux points qui définissent le repère. +\end{description} + + +\begin{exemple} +repere(-1.5,3.5,0.8cm,-1,3,1cm); +flecheaxe:=false; +draw axesn(1,1); +drawoptions(withcolor marine); +draw base(O,i,j); +interaxes(2,1); +draw base(I,e1,e2); +drawoptions(); +draw cadre; +fin; +\end{exemple} + +\begin{exemple} +repere(-1,2.5,0.8cm,-1,2,1cm); +flecheaxe:=false; +draw axes(1,0); +draw basep(O,I,J); +draw cadre; +fin; +\end{exemple} + +\section{Points, vecteurs} + +\subsection{Points} +\label{points} +\begin{description} +\item[\_c(x,y)] désigne le point (ou le vecteur) de coordonnées cartésiennes \verb+x+ et \verb+y+ dans le repère utilisateur. + +\item[pol(r,t)] désigne le point (ou le vecteur) de coordonnées $(r\cos t;r\sin t)$ dans le repère utilisateur. + +\item[pold(r,t)] même chose avec l'angle donné en degrés. +\end{description} + +Les macros suivantes sont directement inspirées des macros similaires de \verb+geometriesyr16.mp+. + + +\begin{description} +\item[MarquePoint(A)] marque le point \verb+A+. Le style de marque est contrôlé par le paramètre \verb+marque_p+ qui peut prendre les valeurs \verb+"plein"+ (valeur par défaut), \verb+"creux"+ ou \verb+"croix"+. Une autre valeur que celles-ci ne produira aucune marque. + +\item[pointe(A,B,C...)] permet de marquer plusieurs points. + +\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice. +\end{description} + + +\begin{exemple}[0.6] +repere(-3,3,0.9cm,-2.5,5,0.9cm); +pair A,B,C[],D,E,F; +A=_c(1,1);B=_c(2,3); +D=_c(-2,-1);E=_c(-1,-1);F=_c(-1,-2); +draw axes(1,0); +marque_p:="";drawoptions(withcolor magenta); +nomme.llft(A);nomme.top(B);draw A--B; +marque_p:="croix";drawoptions(withcolor rouge); +pointe(D,E,F); +marque_p:="creux";drawoptions(withcolor orange); +nomme.bot(pol(sqrt(2),-pi/4), + LaTeX("$\sqrt{2}e^{-i\frac{\pi}{4}}$")); +nomme.bot(_c(-1.5,1),LaTeX("$(-1,5;1)$")); +marque_p:="plein";drawoptions(withcolor violet); +for i=2 upto 4: + C[i]=_c(-3+i/2,i);nomme.lft(C[i]); +endfor +draw cadre; +fin; +\end{exemple} + +\subsection{Vecteurs} +\begin{description} +\item[vecteur.pos(A,u,nom)] figure formée du représentant du vecteur \verb+u+ d'origine \verb+A+ ainsi que de \verb+nom+ placé à la position \verb+pos+ par rapport au milieu de la flèche. Si \verb+nom+ est une chaine de caractère, il sera affiché avec une flèche. Si \verb+nom+ est omis, \verb+u+ surmonté d'une flèche est utilisé. S'il s'agit d'un élément d'un tableau de points (\verb+u1+, \verb+u2+...), le nombre est affiché en indice. +\end{description} + + +\begin{exemple}[0.6] +repere(-1,5.5,0.7cm,-4,4,0.8cm); +pair A,B,C[],u,v,w[]; +u=_c(2,2);v=_c(2,-1); +A=_c(1,1);B=A+u; +draw axes(1,0); +draw base(O,i,j); +drawoptions(withcolor cyan); +nomme.llft(A);nomme.top(B); +draw vecteur.ulft(A,u,"AB"); +draw vecteur.urt(B,v); +draw vecteur.bot(A,u+v,% + LaTeX("$\vect{u}+\vect{v}$")); +drawoptions(withcolor marine); +for i=1 upto 3: + C[i]=_c(1,i-4);w[i]=_c(1.5,0.5*i-1); +draw vecteur.bot(C[i],w[i]); +endfor +draw cadre; +fin; +\end{exemple} + + +\section{Droites, courbes...} + +\subsection{Droites} +\begin{description} +\item[droite(A,B)] droite $(AB)$. + +\item[droite(a,b,c)] droite d'équation $ax+by+c=0$ dans le repère utilisateur. + +\item[droite(a,b)] droite d'équation $y=ax+b$ dans le repère utilisateur. + +\item[droite(c)] droite d'équation $x=c$ dans le repère utilisateur. +\end{description} + + +\begin{exemple}[0.65] +repere(-2,3,1cm,-2,3,1cm); +pair A,B; +A=_c(-0.5,-1);B=_c(1.5,1.5); +draw axes(1,0); +nomme.ulft(A); +nomme.lrt(B); +drawoptions(withpen pencircle scaled 1); +draw droite(A,B) withcolor olive; +draw droite(1) withcolor vertfonce; %x=1 +draw droite(1/3,3/2) withcolor vertfonce; %y=(1/3)x+3/2 +draw droite(2,3,-1) withcolor vertfonce; %2x+3y-1=0 +fin; +\end{exemple} + +\subsection{Courbes et fonctions} +\MP{} permet de définir simplement des fonctions (en utilisant par exemple la syntaxe suivante : +\verb|vardef f(expr x)=2x+1 enddef;|) et de définir des courbes passant par des points donnés (\verb+A..B..C+). Ces possibilités sont utilisées dans les macros qui suivent. + +\begin{description} +\item[courbefonc(f,xmin,xmax,n) ou courbefonc(f)(xmin,xmax,n)] courbe représentant la fonction \verb+f+ entre \verb+xmin+ et \verb+xmax+ en utilisant \verb+n+ points d'interpolation. + +\item[courbepoints(f,xmin,xmax,n)] ne trace que les \verb+n+ points sans les relier. Les points sont dessinés en fonction de la valeur de \verb+marque_p+ (voir \ref{points}). + +\item[fonccourbe.p(x)] image de \verb+x+ par la fonction dont la courbe représentative est le chemin \verb+p+. La macro renvoie 0 si la fonction n'est pas définie. + +\item[nomme.pos(p,x,nom)] affiche \verb+nom+ au point d'abscisse \verb+x+ de la courbe \verb+p+ à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+p+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+p1+, \verb+p2+...), le nombre est affiché en indice. +\end{description} + + +\begin{exemple}[0.5] +repere(-2,5,0.7cm,-3,3,0.7cm); +vardef f(expr x)=-0.5(x**2)+2*x enddef; +vardef g(expr x)=exp(x)/10-3 enddef; +path C_f; +draw axes(1,1); +drawoptions(withcolor moutarde); +C_f=courbefonc(f)(-2,5,50); +draw C_f withpen pencircle scaled 1; +nomme.llft(C_f,4.7); +drawoptions(withcolor beige); +draw courbepoints(g,0,4,9); +fin; +\end{exemple} + +\begin{description} +\item[intercourbes(P,p,q)] stocke dans le tableau de points \verb+P+ les points d'intersection des chemins \verb+p+ et \verb+q+. \verb+P1+ est un des points d'intersection, \verb+P2+ un autre etc. Il faut, avant d'utiliser cette macro, déclarer le tableau \verb+P+ de la façon suivante : \verb+pair P[];+ + +\item[ptantecedents(P,y,p)] stocke dans le tableau de points \verb+P+ les points du chemin \verb+p+ d'ordonnée \verb+y+. De même que précédemment, le tableau \verb+P+ doit être déclaré avant d'utiliser cette macro. + +\item[antecedents(X,y,p)] stocke dans le tableau de nombres \verb+X+ les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+. De même que précédemment, le tableau \verb+X+ doit être déclaré avant d'utiliser cette macro. +\end{description} + + +\begin{exemple} +repere(-2.5,4.5,1cm,-3.5,2.5,1cm); +path p,C_f; +pair I[],A[]; +vardef f(expr x)= x**2-2x enddef; +p=_c(-2,-2).._c(-1,1).._c(0,2).._c(1,1) + .._c(2,-2).._c(3,-3).._c(3.5,-2.5) + .._c(4,-1); +C_f=courbefonc(f,-2,4,40); +draw axes(1,1); +drawoptions(withpen pencircle scaled 1); +draw p withcolor bleu; +draw C_f withcolor rouge; +intercourbes(I,C_f,p); +drawoptions(withcolor violet); +nomme.lft(I1);nomme.rt(I2); +draw droite(0,-1.5) dashed evenly; +ptantecedents(A,-1.5,p); +nomme.lrt(A1);nomme.llft(A2); +nomme.lrt(A3); +fin; +\end{exemple} + +\begin{description} +\item[marquepointcourbe(p,x1,x2,...)] marque les points de la courbe \verb+p+ d'abscisses \verb+x1+, \verb+x2+... La marque dépend de la valeur de \verb+marque_p+. + +\item[marquepointchemin(p,n1,n2,...)] dans le cas d'un chemin défini par \verb+A..B..C..+, marque le \verb+n1+ème point, le \verb+n2+ième point... La marque dépend de la valeur de \verb+marque_p+. Attention, le premier point est numéroté 0. + +\end{description} + + + +\begin{exemple} +repere(-2.5,4.5,1cm,-3.5,2.5,1cm); +path p,C_f; +pair I[],A[]; +vardef f(expr x)= x**2-2x enddef; +p=_c(-2,-2).._c(-1,1).._c(0,2) + .._c(1,1).._c(2,-2).._c(3,-3) + .._c(3.5,-2.5).._c(4,-1); +C_f=courbefonc(f,-2,4,40); +draw axes(1,1); +drawoptions(withpen pencircle scaled 1); +draw p withcolor bleu; +draw C_f withcolor rouge; +drawoptions(withcolor violet); +marquepointcourbe(C_f,-0.5,0.8,2.2,2.6); +marquepointchemin(p,0,2,3,5); +fin; +\end{exemple} + + +\subsection{Dérivée et tangentes} +\begin{description} +\item[der.p(x)] image de \verb+x+ par la dérivée de la fonction dont la courbe représentative est \verb+p+. +%\item[der2.f(x)] image de \verb+x+ par la dérivée de la fonction \verb+f+. + +\item[tangente(p,x)] tangente à la courbe \verb+p+ au point d'abscisse \verb+x+. + +\item[tangente.gauche(p,x,long)] flèche de longueur \verb+long+ représentant la demi-tangente gauche à la courbe \verb+p+ au point d'abscisse \verb+x+. Le paramètre \verb+long+ est optionnel. Sa valeur par défaut est \verb+20bp+. + +\item[tangente.droite(p,x,long)] idem à droite. + +\item[tangente.double(p,x,long)] idem des deux côtés. +\end{description} + + +\begin{exemple} +repere(-2.5,4.5,1cm,-3.5,2.5,1cm); +path p,q; +p=_c(-2,-2){dir 60}.._c(-1,1) + .._c(0,2){right}.._c(1,1).._c(2,-2) + .._c(3,-3){right}.._c(4,-2){(1,2)}; +q=courbefonc(der.p,-1,4,40); +draw axes(1,1); +drawoptions(withpen pencircle scaled 1); +draw p withcolor bleu; +nomme.rt(p,0.7,LaTeX("$y=f(x)$")); +draw q withcolor rouge; +nomme.lft(q,3.7,LaTeX("$y=f'(x)$")); +drawoptions(withpen pencircle scaled 1 + withcolor violet); +draw tangente.double(p,0); +draw tangente.droite(p,-2,40); +draw tangente.gauche(p,4,30); +draw tangente(p,2.5); +fin; +\end{exemple} + + + +\section{Suites} +\begin{description} +\item[suite(u,deb,fin)] figure formée des points $(i;u_i)$ pour $i$ variant entre \verb+deb+ et \verb+fin+. +\end{description} + + +\begin{exemple} +repere(-0.9,7,0.8cm,-1.2,1.2,1.5cm); +vardef u(expr n)=(-1)**n/n enddef; +taillepoint:=4; +draw axes(1,1); +draw suite(u,1,6) withcolor vertfonce; +fin; +\end{exemple} + +\begin{description} +\item[suiterec(f,deb,fin,init)] ligne brisée (\og escalier \fg{} ou \og escargot \fg) permettant de visualiser les termes de la suite définie par $u_{n+1}=f(u_n)$ de premier terme $u_{deb}=init$ et de dernier terme $u_{fin}$. + +\item[suiterecprojx.pos(lab,min,max)] figure formée des segments joignant les points $(u_n;u_n)$ et $(u_n;0)$ pour $n$ compris entre \verb+min+ et \verb+max+. La suite $u$ et sa valeur initiale sont définies par le dernier appel de la macro \verb+suiterec+. \verb+lab+ désigne l'étiquette au niveau de l'axe des abscisse placée à la position \verb+pos+. Si \verb+lab+ est la chaîne vide \verb+""+, rien n'est écrit ; si \verb+lab+ est une autre chaîne de caractère (par ex. \verb+"u"+), elle est utilisée comme nom de la suite (on obtiendra $u_0$, $u_1$...) ; si \verb+lab+ est un nombre, les valeurs de la suites seront affichées et arrondies à \verb+lab+ décimales. Les valeurs \verb+min+ et \verb+max+ sont facultatives et égales par défaut aux valeurs \verb+deb+ et \verb+fin+ passées à la macro \verb+suiterec+. + +\item[suiterecprojy.pos(lab,min,max)] même chose sur l'axe des ordonnées. + +\item[suiterecproj(lab,min,max)] même chose sur les deux axes. Les positions sont \verb+bot+ sur l'axe des abscisses et \verb+lft+ sur l'axe des ordonnées. + + +\begin{exemple}[0.55] +repere(-2,4.5,1cm,-1,4,1cm); +vardef f(expr x)=sqrt(2*x+4) enddef; +path C_f,sr; +C_f=courbefonc(f,-2,5,50); +sr=suiterec(f,0,3,-1.2); +draw axes(1,0); +drawoptions(withpen pencircle scaled 1); +draw C_f withcolor bleu; +draw droite(1,0); +drawoptions(withcolor rouge); +draw suiterecprojx.bot(1) dashed evenly; +draw suiterecprojy.lft("") dashed evenly; +draw sr withcolor rouge; +fin; +\end{exemple} + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +vardef f(expr x)=4-0.8*x enddef; +path C_f,sr; +C_f=courbefonc(f,-1,5,10); +sr=suiterec(f,0,5,0.2); +draw axes(1,0); +drawoptions(withpen pencircle scaled 1); +draw C_f withcolor bleu; +draw droite(1,0); +drawoptions(withcolor rouge); +draw suiterecproj("u",1,3) dashed evenly; +draw sr withcolor rouge; +fin; +\end{exemple} + + + +\end{description} + + + + +\section{Surfaces} + +\subsection{Calcul intégral} +\begin{description} +\item[entrecourbes(p,q,xmin,xmax)] chemin fermé délimitant la zone comprise entre les courbes \verb+p+ et \verb+q+ et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$. Il peut donc être dessiné, rempli... + +\item[souscourbe(p,xmin,xmax)] chemin fermé délimitant la zone comprise entre la courbe \verb+p+, l'axe des abscisses et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$. +\end{description} + + +\begin{exemple} +repere(-3.5,6,0.7cm,-2.5,4.5,0.7cm); +vardef f(expr x)= -(x/4)**3+0.75x enddef; +vardef g(expr x)= -((x-2)**2)/9+4 enddef; +path C_f,C_g,p,q; +C_f:=courbefonc(f,-3.5,6,40); +C_g:=courbefonc(g,-3.5,6,40); +p:=entrecourbes(C_f,C_g,-2,1); +q:=souscourbe(C_f,3,5); +fill p withcolor 0.5Violet; +draw p withpen pencircle scaled 2 + withcolor Violet; +fill q withcolor 0.5Bleu; +draw q dashed evenly withcolor Bleu; +draw axes(1,1); +drawoptions(withpen pencircle scaled 1); +draw C_f withcolor Bleu; +draw C_g withcolor Rouge; +draw cadre; +fin; +\end{exemple} + +\begin{description} +\item[rectangles.type(p,a,b,n)] figure formée de \verb+n+ rectangles s'appuyant sur la courbe \verb+p+ entre les abscisses \verb+a+ et \verb+b+. \verb+type+ peut être \verb+min+, \verb+max+, \verb+droite+ ou \verb+gauche+. +\end{description} + + +\begin{exemple} +repere(-2.5,6,0.8cm,-2,5,0.8cm); +vardef f(expr x)= + -((x-2)**4)/32+((x-2)**2)/2+1 +enddef; +path Cf,r[]; +Cf=courbefonc(f,-2.5,6.5,50); +r1=rectangles.max(Cf,2,5.5,8); +r2=rectangles.min(Cf,2,5.5,8); +r3=rectangles.droite(Cf,-2,1,10); +fill r1 withcolor 0.8Rouge; +fill r2 withcolor 0.4Rouge; +fill r3 withcolor 0.5Bleu; +draw r1;draw r2 withcolor 0.8Rouge; +draw r3; +draw axes(1,0); +draw Cf withcolor Bleu + withpen pencircle scaled 1; +fin; +\end{exemple} + +\subsection{Demi-plans} +\begin{description} + \item[demiplaninf(d)] chemin fermé délimité par la droite \verb+d+ et par la partie inférieure de \verb+cadre+ (ou la partie gauche si \verb+d+ est parallèle à l'axe des ordonnées. + \item[demiplansup(d)] chemin fermé délimité par la droite \verb+d+ et par la partie supérieure de \verb+cadre+ (ou la partie droite si \verb+d+ est parallèle à l'axe des ordonnées. +\end{description} + + +\begin{exemple} +repere(-2.5,3.5,1cm,-2.5,3.5,1cm); +numeric qqw;qqw=6; +path d[],dp[]; +d1=droite(2); +d2=droite(1,1); +d3=droite(-0.5,-0.5); +dp1=demiplansup(d1); +dp2=demiplansup(d2); +dp3=demiplaninf(d3); +for i=1 upto 3: +fill dp[i] withcolor 0.7Lime; +endfor +draw axes(1,1); +drawoptions(withpen pencircle scaled 1 + withcolor Vertfonce); +draw d1;draw d2; +draw d3 dashed evenly; +drawoptions(); +draw cadre; +fin; +\end{exemple} + +\subsection{Remplissage} +Pour remplir des chemins fermés avec autre chose que de la couleur, \verb+repere+ permet l'utilisation de la syntaxe \verb+fill p avec motif+ où \verb+motif+ est un des motifs décrits ci-dessous. Cette instruction peut être complétée par des options de dessin (\verb+withpen+, \verb+withcolor+...). + +\begin{description} +\item[hachures(pas,angle)] hachures espacées de \verb+pas+ et formant un angle en degrés de \verb+angle+ avec l'horizontale. Si les valeurs sont omises, \verb|pas| vaut 5 et \verb+angle+ vaut 60. + + +\item[briques(larg,haut,dec)] briques de largeur \verb+larg+, de hauteur \verb+haut+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|larg| vaut 12, \verb|haut| vaut 6 et \verb+dec+ vaut 6. + + +\item[vagues(per,amp,dec)] (d'après le manuel de l'utilisateur) \og vagues \fg{} de période \verb+per+, d'amplitude \verb+amp+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|per| vaut 20, \verb|amp| vaut 3 et \verb+dec+ vaut 10. +\end{description} + + + +\begin{exemple}[0.55] +repere(-1.5,4.5,1cm,-1.5,7.5,1cm); +path c[];picture lab;numeric u;u:=3cm; +c1=fullcircle scaled 2.5cm; +for k=1 upto 6: + i:=(k-1) mod 2;j:=(k-1) div 2; + c[k]:=c1 shifted (u*i,u*j); +endfor; +fill c1 withcolor lime; +fill c1 avec hachures(10,30) dashed evenly; +fill c2 withcolor lime; +fill c2 avec hachures(); +fill c3 withcolor (0,0.65,0.8,0.48); +fill c3 avec briques(15,5,4); +fill c4 withcolor (0,0.65,0.8,0.48); +fill c4 avec briques(); +fill c5 withcolor (1,0,0,0.2); +fill c5 avec vagues(30,10,20) + withpen pencircle scaled 2; +fill c6 withcolor (1,0,0,0.2); +fill c6 avec vagues(); +for k=1 upto 6: + i:=(k-1) mod 2;j:=(k-1) div 2; + draw c[k]; + lab:=thelabel("c"&decimal(k),u*(i,j)); + unfill bbox lab;draw lab; +endfor; +fin; +\end{exemple} + + + +\section{Projections sur les axes} + +\subsection{Projetés} +\begin{description} +\item[projetex(A)] projeté de \verb+A+ sur l'axe des abscisses parallèlement à l'axe des ordonnées. + +\item[projetey(A)] projeté de \verb+A+ sur l'axe des ordonnées parallèlement à l'axe des abscisses. + +\item[projectionx.pos(A,lab,dec)] figure constituée du segment joignant \verb+A+ à son projeté sur l'axe des abscisses ainsi que de l'étiquette \verb+lab+ placée à la position \verb+pos+ par rapport à ce projeté. La valeur \verb+dec+ indique un décalage par rapport à l'axe des abscisses. L'étiquette et le décalage sont optionnels. + +\item[projectiony.pos(A,lab,dec)] même chose sur l'axe des ordonnées. + +\item[projectionaxes(A,labx,laby,dec)] figure constituée des segments joignant \verb+A+ à ses projetés sur les axes ainsi que des étiquettes \verb+labx+ et \verb+laby+ positionnées automatiquement avec un décalage \verb+dec+ par rapport aux axes. Les étiquettes et le décalage sont optionnels. +\end{description} + + + +\begin{exemple}[0.6] +repere(-1.5,3.5,1cm,-2.2,2.5,1cm); +path Cf; pair A[]; +vardef f(expr x)= x**2-2x-0.5 enddef; +Cf=courbefonc(f,-2,4,40); +ptantecedents(A,2,Cf); +draw axes(1,1); +draw Cf withpen pencircle scaled 1 withcolor bleu; +drawoptions(dashed evenly withcolor rouge); +draw projectionaxes(_c(1.3,f(1.3)), + LaTeX("$x$"),LaTeX("$f(x)$")); +draw projectionx.urt(A1,LaTeX("$x_1$")); +draw projectionx.llft(A2,LaTeX("$x_2$"),-6); +draw A1--A2; +fin; +\end{exemple} + +\subsection{Intervalles} +\begin{description} +\item[intervallex.bornes(a,b)] intervalle dessiné sur l'axe des abscisses entre \verb+a+ et \verb+b+ avec une épaisseur par défaut de \verb+1.5bp+. \verb+bornes+ peut être \verb+OO+ (ouvert à gauche, ouvert à droite), \verb+OF+, \verb+FO+ ou \verb+FF+. + +\item[intervalley.bornes(a,b)] même chose sur l'axe des ordonnées. +\end{description} + + +\begin{exemple}[0.6] +repere(-1,5,0.9cm,-1,4.5,1cm); +vardef f(expr x)=x**2-5x+7 enddef; +draw axes(1,1); +draw courbefonc(f,-1,5,50) + withpen pencircle scaled 1 withcolor bleu; +drawoptions(dashed evenly withcolor rouge); +draw projectionx.bot(_c(1,f(1))); +draw projectiony.llft(_c(2.5,f(2.5)),"0,75"); +draw projectionaxes(_c(4,f(4))); +drawoptions(withcolor violet); +draw intervallex.OF(1,4); +draw intervalley.FF(0.75,3); +label(LaTeX("$f(]1;4])=[0,75;3]$"),_c(2.5,4)); +draw cadre; +fin; +\end{exemple} + + + +\section{Statistiques} + +\subsection{Boite à moustache} +\begin{description} +\item[boitemoustache(min,Q1,Me,Q3,max,dec,larg)] \og Boite à moustache \fg{} correspondant aux données en argument. Elle est située à un distance \verb|dec| de l'axe des abscisses et le rectangle a une largeur de \verb|larg|. Ces deux dernières valeurs sont optionnelles et valent par défaut \SI{1,5}{cm} et \SI{1}{cm}. + +\item[projboitemoustache(t)] Figure formée des lignes joignant les cinq valeurs du dernier diagramme en boite dessiné à son projeté sur l'axe des abscisses ainsi que de certaines étiquettes : Si \verb|t| est vide, les textes $X_{min}$, $Q_1$, $M_e$, $Q_3$ et $X_{max}$ sont affichés ; si \verb|t| est un entier, les valeurs arrondies à $10^{-t}$ sont affichées ; si \verb|t| est une liste de cinq textes (ou valeurs), ceux-ci sont affichés. +\end{description} + + +\begin{exemple} +repere(-0.5,10,0.7cm,-1,5,0.7cm); + setaxes(0,10,0,1); + draw axex(1,0); + draw boitemoustache(1,4,5,7,9) + withcolor marine; + draw projboitemoustache.bot() + withcolor 0.7rouge dashed evenly; +fin; +\end{exemple} + +\begin{exemplev}[1]{1} +repere(-1,11,0.8cm,-1,5,0.7cm); + settout(-0.5,10.5,0,1); + draw axex(1,0); + drawoptions(withcolor rouge); + draw boitemoustache(1.22,3.9,5,7.18,9.05,1cm,0.7cm); + draw projboitemoustache.bot(1) dashed evenly; + drawoptions(withcolor blue); + draw boitemoustache(0,3.14,6,8,10,2cm,0.7cm); + draw projboitemoustache.bot(0.00456,"$\pi$","$\num{2x3}$","$x$","Max") + dashed evenly; +fin; +\end{exemplev} + +\section{Divers} +\subsection{Composition des étiquettes} +Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous. Cette macro utilise \verb+latexmp+ si ce fichier est chargé ou l'écriture dans un fichier externe (adaptation de la macro \verb+TEX+) dans le cas contraire. +\begin{description} + \item[LaTeX(ch)] \label{latex} Figure formée de la chaîne \verb+ch+ composée avec \LaTeX. Il est donc possible d'utiliser la macro \verb|decimal()| de \MP. +\end{description} + + +\begin{exemple}[0.65] +repere(-1,7,1cm,-1,1,1cm); +for i=2 upto 6: +label(LaTeX("$\frac{1}{"&decimal(i)&"}$"),(i*cm,0)); +endfor +fin; +\end{exemple} + + +\subsection{Couleurs} +Certaines couleurs sont définies par leur nom et peuvent être utilisées directement : + +\begin{center} +\begin{figreperedoc} +repere(0,18,1cm,-3,1,1cm); + path rectangle; + save a,b,dech,decv; + a:=25;b:=12;dech:=70;decv:=-20; + rectangle = (0,0)--(a,0)--(a,b)--(0,b)--cycle; + vardef couleur(expr t)= + image(% + fill rectangle withcolor scantokens(t); + label.rt(LaTeX("\smash{" & t & "}"),(a,b/4)) + ) + enddef; + draw couleur("rouge"); + draw couleur("vert") shifted (dech,0); + draw couleur("bleu") shifted (2*dech,0); + draw couleur("cyan") shifted (3*dech,0); + draw couleur("magenta") shifted (4*dech,0); + draw couleur("jaune") shifted (5*dech,0); + draw couleur("noir") shifted (6*dech,0); + draw couleur("marron") shifted (0,decv); + draw couleur("lime") shifted (dech,decv); + draw couleur("orange") shifted (2*dech,decv); + draw couleur("rose") shifted (3*dech,decv); + draw couleur("pourpre") shifted (4*dech,decv); + draw couleur("olive") shifted (5*dech,decv); + draw couleur("violet") shifted (6*dech,decv); + draw couleur("beige") shifted (0,2decv); + draw couleur("marine") shifted (dech,2decv); + draw couleur("moutarde") shifted (2*dech,2decv); + draw couleur("grisclair") shifted (3*dech,2decv); + draw couleur("gris") shifted (4*dech,2decv); + draw couleur("grisfonce") shifted (5*dech,2decv); + draw couleur("vertfonce") shifted (6*dech,2decv); +fin; +\end{figreperedoc} +\end{center} + +Toutes ces couleurs sont définies selon le modèle \og rgb \fg. Pour les obtenir selon le modèle \og cmyk \fg, remplacer la première lettre par une majuscule. + +\subsection{Figures pour une présentation} +\begin{description} +\item[figureinter] exporte la figure telle qu'elle est au moment où cette commande apparait. La numérotation est incrémentée et la figure peut continuer. +\end{description} + L'exemple ci-dessous crée trois figures : + + \begin{exemplefiginter}[0.7]{3} + repere(-3,3,0.7cm,-1,5,0.7cm); + path C_f; + vardef f(expr x)=x**2 enddef; + C_f=courbefonc(f,-3,3,50); + draw quadrillage(1,1); + draw axes(1,1); + draw cadre; + figureinter; + draw courbepoints(f,-2,2,9) withcolor rouge; + figureinter; + draw C_f withcolor bleu withpen pencircle scaled 1; + fin; + \end{exemplefiginter} + + +Si ces trois figures s'appellent \verb|mafigure.1|, \verb|mafigure.2| et \verb|mafigure.3|, elles peuvent être incluses dans un document de la classe \verb|beamer| avec le code ci-dessous : + +\begin{center} +\begin{minipage}{0.6\linewidth} +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}] +\documentclass{beamer} + \ifpdf % Pour utiliser pdflatex + \DeclareGraphicsRule{*}{mps}{*}{} + \fi +\begin{document} +\begin{frame} +\includegraphics<+>{mafigure.1}% +\includegraphics<+>{mafigure.2}% +\includegraphics<+>{mafigure.3}% +\end{frame} +\end{document} +\end{lstlisting} +\end{minipage} +\end{center} + +\subsection{Code embarqué dans un document \LaTeX} + +Certains packages permettent d'écrire du code \MP{} directement dans un document \LaTeX. \verb|repere| est compatible avec, entre autres, \verb|emp| et \verb|mpgraphics|. + +\medskip + +\begin{minipage}[t]{0.45\linewidth} +{\centering \textbf{Utilisation du package \texttt{emp}}\par} + + + +\verb|pdflatex monfichier.tex| + +\verb|mpost monfichier.mp| + +\verb|mpost monfichier.mp| + +\verb|pdflatex monfichier.tex| + + +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}] +\documentclass{article} +\usepackage{emp} +\usepackage{ifpdf} + \ifpdf % Pour utiliser pdflatex + \DeclareGraphicsRule{*}{mps}{*}{} + \fi +\begin{document} +\begin{empfile} +\begin{empcmds} + input latexmp; + input repere; +\end{empcmds} +\begin{emp}(0,0) + repere(-3,3,0.8cm,-2.5,2.5,1cm); + draw axes(1,1); + fin; +\end{emp} +\end{empfile} +\end{document} +\end{lstlisting} +\end{minipage} +\hfill +\begin{minipage}[t]{0.45\linewidth} +{\centering \textbf{Utilisation du package \texttt{mpgraphics}}\par} + + +\verb|pdflatex -shell-escape monfichier.tex| + +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}] +\documentclass{article} +\usepackage[runs=2]{mpgraphics} +\begin{document} +\begin{mpdefs} + input latexmp; + input repere; +\end{mpdefs} +\begin{mpdisplay} + repere(-3,3,0.8cm,-2.5,2.5,1cm); + draw axes(1,1); + fin; +\end{mpdisplay} +\end{document} +\end{lstlisting} +\end{minipage} + + +\section{Exemples d'utilisation simultanée de \texttt{repere} et \texttt{geometriesyr}} + +\label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser certaines macros de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere|. + +\begin{exemple}[0.6] +repere(-1,10,0.5cm,-1,9,0.5cm); +pair A,B,C,A',B',C',u; +A=_c(3,1);B=_c(5,2);C=_c(1,5);u=_c(3,3); +A'-A=B'-B=C'-C=u; +draw projectionaxes(A,LaTeX("$x_A$"), + LaTeX("$y_A$")) dashed evenly; +draw axes(0,0); +drawoptions(withcolor pourpre); +draw triangle(A,B,C);draw triangle(A',B',C'); +draw codeperp(B,A,C,7);draw codeperp(B',A',C',7); +draw codesegments(B,C,B',C',2); +nomme.llft(A);nomme.lrt(B);nomme.ulft(C); +nomme.llft(A');nomme.lrt(B');nomme.ulft(C'); +drawoptions(withcolor vertfonce); +draw vecteur.lrt(B,u);draw vecteur.lrt(C,u); +fin; +\end{exemple}% + +\vspace{2em} + + +\begin{exemplev}[1]{2} +repere(-9.5,6,1cm,-1.25,1.25,2cm); +%cercle +pair O,A,A',B,B',M,S,C; +numeric x;x=pi/4; +O=_c(-7,0);A=_c(-5,0); +B=_c(-7,1);A+A'=B+B'=2O; +M=rotation(A,O,180*x/pi); +C=projection(M,A,A'); +S=projection(M,B,B'); +draw cerclepoint(O,A); +drawarrow A'--A;drawarrow B'--B; +nomme.rt(A);nomme.top(B);nomme.llft(O); +drawoptions(withcolor rouge); +draw O--M;draw C--M--S dashed evenly; +draw codeperp(M,C,O,5); +draw codeperp(O,S,M,5); +draw codeangle.urt(A,O,M,0, + LaTeX("$x$")); +marque_p:=""; +nomme.urt(M); +label.lft(LaTeX("$\sin x$"),S); +%repere +settout(-4.5,6,-1.25,1.25); +path C_f; +C_f=courbefonc(sin,-4.5,6,80); +pair m;m=_c(x,sin(x)); +drawoptions(); +draw axexpi.bot(1,2); +draw axey(0.5,1); +drawoptions(withcolor bleu); +draw C_f withpen pencircle scaled 1.5; +nomme.urt(C_f,2.5,LaTeX("$y=\sin x$")); +drawoptions(withcolor rouge); +draw projectionx.bot(m,LaTeX("$x$")) + dashed evenly; +% +draw M--m dashed evenly; +fin; +\end{exemplev} + +\vspace{3em} + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +coulpoint:=blue;coullabel:=blue; +pair A,B,C,D; +A=_c(0.5,0.5);B=_c(4,1);C=_c(3,4); +typetrace:="mainlevee"; +draw axes(1,1); +drawoptions(withcolor violet); +draw triangle(A,B,C); +nomme.llft(A);nomme.lrt(B); +nomme.top(C); +draw marqueangle(B,A,C,0); +drawoptions(withcolor vertfonce); +draw cercles(CentreCercleC(A,B,C),A); +fin; +\end{exemple} + + + + + +\begin{codecache} +end +\end{codecache} + +\makeatletter +\immediate\closeout\verbatim@out +\makeatother +%\addtocontents{toc}{\protect\end{multicols}} +\end{document} + + diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp new file mode 100644 index 00000000000..1d8b70c73a5 --- /dev/null +++ b/Master/texmf-dist/metapost/repere/repere.mp @@ -0,0 +1,1944 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% repere.mp %% +%% Macros pour la construction de figures dans un repère %% +%% o.peault@gmail.com %% +%% Version 13.12 (Décembre 2013) %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% 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 +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +input format; + +warningcheck:=0; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% REPERE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +numeric _nfig,_nbaxes,theta,taillegrad,taillepoint,taillecroix,facteurx,facteury; +boolean flecheaxe,displayfrac,coupe; +_nfig:=1; +path cadre; +numeric _diag,_largcadre,_hautcadre,_tfig; +pair _O,_I,_J; +transform _T; +picture _axorlab; pair poslabO; + +string marque_p,fraction; + +facteury:=1; + +boolean rep_groupe; +rep_groupe:=false; + + +let oldbeginfig=beginfig; +let oldendfig=endfig; + +def beginfig(expr c)= + oldbeginfig(c); + _nfig:=c; + rep_groupe:=true +enddef; + +def endfig= + oldendfig; + _nfig:=_nfig+1; + rep_groupe:=false +enddef; + +vardef repere@#(text t)= + if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"): +% _nfig:=_nfig+1;definitionrepere@#(t) + definitionrepere@#(t) + else: + reperenum@#(t) + fi +enddef; + + +vardef reperenum[]@#(text t)= + _nfig:=@; + definitionrepere@#(t) +enddef; + +boolean bf; +bf:=false; + +vardef definitionrepere@#(text t) = + save i,_def; + if not rep_groupe: oldbeginfig(_nfig);bf:=true fi; + numeric _def[],i,unitex,unitey,unite; + _def[7]:=90;i:=1; + for _i=t: _def[i]:=_i; i:=i+1; endfor; + Xmin:=_def1; Xmax:=_def2; Ymin:=_def4; Ymax:=_def5; theta:=_def7; + if str @#="larg": _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta)) + elseif str @#="orth": _def3:=_def3/(Xmax-Xmin); _def6:=_def3;theta:=90 + elseif str @#="prop": _def3:=_def3/(Xmax-Xmin); _def6:=_def6*_def3;theta:=90 + fi; + Ux:=_def3;Uy:=_def6; + _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta); + _defcadre; + settout(Xmin,Xmax,Ymin,Ymax); + _O:=_c(0,0); xO:=0 ; yO:=0; + _I:=_c(1,0); _J:=_c(0,1); + taillegrad:=0.8mm;taillepoint:=3;taillecroix:=1mm;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0); + marque_p := "plein";displayfrac:=false;flecheaxe:=true;coupe:=true; + defaultscale:=1; + unitex:=abs(_I);unitey:=abs(_J);unite:=unitex; + facteurx:=1;facteury:=1; + string extranumx,extranumy; + extranumx=extranumy=""; +enddef; + +def setaxes(expr a,b,c,d)= + AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d +enddef; + +def setgrad(expr a,b,c,d)= + GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d +enddef; + +def setval(expr a,b,c,d)= + ValXmin:=a;ValXmax:=b;ValYmin:=c;ValYmax:=d +enddef; + +def setquad(expr a,b,c,d)= + QuadXmin:=a;QuadXmax:=b;QuadYmin:=c;QuadYmax:=d +enddef; + +def settout(expr a,b,c,d)= + setaxes(a,b,c,d); + setgrad(a,b,c,d); + setval(a,b,c,d); + setquad(a,b,c,d); +enddef; + +let setall=settout; + +def fin = + if _nbaxes=1: draw _axorlab fi; + if coupe: clip currentpicture to cadre fi; + if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi; +enddef; + +def _defcadre= + cadre:=_c(Xmin,Ymin)--_c(Xmin,Ymax)--_c(Xmax,Ymax)--_c(Xmax,Ymin)--cycle; + _diag:=abs(llcorner cadre - urcorner cadre); + _largcadre:=abs(llcorner cadre - lrcorner cadre); + _hautcadre:=abs(llcorner cadre - ulcorner cadre); + _tfig:=max(_largcadre,_hautcadre); % compatibilité geometriesyr +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% ORIGINE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +def interaxes(expr a,b) = + _O:=_c(a,b); + xO:=a; + yO:=b; +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% AXES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pair _posgradx, _posgradx.lft, _posgradx.rt, _posgradx.ulft, _posgradx.top, _posgradx.urt, _posgradx.llft, _posgradx.bot, _posgradx.lrt; +_posgradx=_posgradx.bot=_posgradx.lft=_posgradx.rt=-_posgradx.top=(0,-1); +-_posgradx.llft=_posgradx.urt=(0.5,0.5);_posgradx.lrt=-_posgradx.ulft=(0.5,-0.5); + + +pair _posgrady, _posgrady.lft, _posgrady.rt, _posgrady.ulft, _posgrady.top, _posgrady.urt, _posgrady.llft, _posgrady.bot, _posgrady.lrt; +_posgrady=_posgrady.bot=_posgrady.lft=_posgrady.top=-_posgrady.rt=(-1,0); +-_posgrady.llft=_posgrady.urt=(0.5,0.5);_posgrady.lrt=-_posgrady.ulft=(0.5,-0.5); + +vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses + save pic; + picture pic; + if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$") + elseif string st: pic:=LaTeX(st) + else: pic:=st fi; + thelabel.@#(pic,_c(ab,yO) shifted (dec*_posgradx@#)) +enddef; + +vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées + save pic; + picture pic; + if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$") + elseif string st: pic:=LaTeX(st) + else: pic:=st fi; + thelabel.@#(pic,_c(xO,ro) shifted (dec*_posgrady@#)) +enddef; + + +vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses + ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _c(x,yO) +enddef; + + +vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées + ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,y) +enddef; + +vardef etiquettex@#(expr x)= + _etiqx_@#(x,taillegrad,x*facteurx) +enddef; + + +vardef etiquettey@#(expr y)= + _etiqy_@#(y,taillegrad,y*facteury) +enddef; + + +vardef dessinaxex=_c(AxeXmin,yO)--_c(AxeXmax,yO) enddef; + +vardef dessinaxey=_c(xO,AxeYmin)--_c(xO,AxeYmax) enddef; + + +vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses + save $;picture $; + $=image(% + imax:=floor((GradXmax-xO)/grad);imin:=ceiling((GradXmin-xO)/grad); + for i=imin upto imax-1: + draw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp; + endfor + % dernière graduation + if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: draw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi); + $ +enddef; + +vardef graduationsaxey(expr grad)= %%%% ensemble des graduations ordonnées + save $;picture $; + $=image(% + imax:=floor((GradYmax-yO)/grad);imin:=ceiling((GradYmin-yO)/grad); + for i=imin upto imax-1: + draw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp; + endfor; + % dernière graduation + if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: draw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi); + $ +enddef; + + +vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses + save $,imin,imax,labmin,labmax; + picture $,labmin,labmax; + numeric imin,imax; + $=image(% + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettex.@#(arrondimil(imin*val)+xO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettex.@#(arrondimil(imax*val)+xO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettex.@#(arrondimil(i*val)+xO) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + ); + $ +enddef; + +vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées + save $,imin,imax,labmin,labmax; + picture $,labmin,labmax; + numeric imin,imax; + $=image(% + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettey.@#(arrondimil(imin*val)+yO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettey.@#(arrondimil(imax*val)+yO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettey.@#(arrondimil(i*val)+yO) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + ); + $ +enddef; + +vardef _axex_@#(expr grad,val,nn)= + save $; + picture $; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxex; + % graduations + if grad>0: draw graduationsaxex(grad) fi; + % étiquettes + if val>0: + if nn=1: + if str @#<>"": + draw etiquettesaxex@#(val); + _axorlab:=etiquettex@#(xO) + else: + draw etiquettesaxex.bot(val); + _axorlab:=etiquettex.bot(xO) + fi; + poslabO:=poslabO + unitvector(0,ypart _posgradx@#); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxex@#(val); + draw etiquettex@#(xO) + else: + draw etiquettesaxex.bot(val); + draw etiquettex.bot(xO) + fi + else: + if str @#<>"": + draw etiquettesaxex@#(val) + else: + draw etiquettesaxex.bot(val) + fi + fi + fi + ); + $ +enddef; + +vardef _axey_@#(expr grad,val,nn)= + save $; + picture $; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxey; + % graduations + if grad>0: draw graduationsaxey(grad) fi; + % étiquettes + if val>0: + if nn=1: + if str @#<>"": + draw etiquettesaxey@#(val); + _axorlab:=etiquettey@#(yO) + else: + draw etiquettesaxey.lft(val); + _axorlab:=etiquettey.lft(yO) + fi; + poslabO:=poslabO + unitvector(xpart _posgrady@#,0); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxey@#(val); + draw etiquettey@#(yO) + else: + draw etiquettesaxey.lft(val); + draw etiquettey.lft(yO) + fi + else: + if str @#<>"": + draw etiquettesaxey@#(val) + else: + draw etiquettesaxey.lft(val) + fi + fi + fi + ); + $ +enddef; + +vardef axex@# (expr grad,val)= %%%%%%axe des abscisses avec gestion graduation origine + _nbaxes:=_nbaxes+1; + _axex_@#(grad,val,1) +enddef; + +vardef axey@# (expr grad,val)= %%%%%%axe des ordonnées avec gestion graduation origine + _nbaxes:=_nbaxes+1; + _axey_@#(grad,val,1) +enddef; + +vardef axexo@#(expr grad,val)= %%%%%%axe des abscisses avec graduation origine + _axex_@#(grad,val,2) +enddef; + +vardef axeyo@#(expr grad,val)= %%%%%%axe des ordonnées avec graduation origine + _axey_@#(grad,val,2) +enddef; + +vardef axexn@#(expr grad,val)= %%%%%%axe des abscisses sans graduation origine + _axex_@#(grad,val,3) +enddef; + +vardef axeyn@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine + _axey_@#(grad,val,3) +enddef; + +vardef axes@# (expr grad,val)= %%%% les deux axes + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axex.top(grad,val) else: draw axex.bot(grad,val) fi; + if posy>0: draw axey.rt(grad,val) else: draw axey.lft(grad,val) fi + ); + $ +enddef; + +vardef axeso@# (expr grad,val)= %%%% les deux axes avec origine + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexo.top(grad,val) else: draw axexo.bot(grad,val) fi; + if posy>0: draw axeyo.rt(grad,val) else: draw axeyo.lft(grad,val) fi + ); + $ +enddef; + +vardef axesn@# (expr grad,val)= %%%% les deux axes sans origine + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexn.top(grad,val) else: draw axexn.bot(grad,val) fi; + if posy>0: draw axeyn.rt(grad,val) else: draw axeyn.lft(grad,val) fi + ); + $ +enddef; + +% axes gradués avec multiples de pi + +vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d + save nn,dd,s,fr,$,fraction; + string s,fr,fraction; + picture $; + numeric nn,dd; + nn:=abs((n)/pgcd(n,d));dd:=d/pgcd(n,d); + if displayfrac: + fraction:="d" + else: fraction:="" + fi; + if dd=1: + if nn=1: + fr:=tt + else: fr:=decimal nn & tt + fi + else: + if nn=1: + fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}" + else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}" + fi + fi; + if n<0: + s:="-" + else: s:=""; + if n=0: + fr:= "0" + fi + fi; + $=LaTeX("$" & s & fr & "$"); + $ +enddef; + +vardef fracmultpi(expr n,d)= + fracmulttext(n,d,"\pi") +enddef; + + +vardef etiquettexpi@#(expr n,d)= + _etiqx_@#(n*pi/d,taillegrad,fracmultpi(n,d)) +enddef; + +vardef etiquetteypi@#(expr n,d)= + _etiqy_@#(n*pi/d,taillegrad,fracmultpi(n,d)) +enddef; + + +vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi abscisses + save $,imin,imax,labmin,labmax,val; + picture $,labmin,labmax; + numeric imin,imax,val; + val:=n*pi/d; + $=image(% + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettexpi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettexpi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettexpi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + ); + $ +enddef; + +vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi ordonnées + save $,imin,imax,labmin,labmax,val; + picture $,labmin,labmax; + numeric imin,imax,val; + val:=n*pi/d; + $=image(% + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquetteypi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquetteypi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquetteypi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + ); + $ +enddef; + +vardef _axexpi_@#(expr num,den,nn)= + save $,grad; + numeric grad; + picture $; + grad:=num*pi/den; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxex; + % graduations + if grad>0: draw graduationsaxex(grad) fi; + % étiquettes + if nn=1: + if str @#<>"": + draw etiquettesaxexpi@#(num,den); + _axorlab:=etiquettexpi@#(xO/pi,1) + else: + draw etiquettesaxexpi.bot(num,den); + _axorlab:=etiquettexpi.bot(xO/pi,1) + fi; + poslabO:=poslabO + unitvector(0,ypart _posgradx@#); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxexpi@#(num,den); + draw etiquettexpi@#(xO/pi,1) + else: + draw etiquettesaxexpi.bot(num,den); + draw etiquettexpi.bot(xO/pi,1) + fi + else: + if str @#<>"": + draw etiquettesaxexpi@#(num,den) + else: + draw etiquettesaxexpi.bot(num,den) + fi + fi + ); + $ +enddef; + +vardef _axeypi_@#(expr num,den,nn)= + save $,grad; + numeric grad; + picture $; + grad:=num*pi/den; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxey; + % graduations + if grad>0: draw graduationsaxey(grad) fi; + % étiquettes + if nn=1: + if str @#<>"": + draw etiquettesaxeypi@#(num,den); + _axorlab:=etiquetteypi@#(yO/pi,1) + else: + draw etiquettesaxeypi.lft(num,den); + _axorlab:=etiquetteypi.lft(yO/pi,1) + fi; + poslabO:=poslabO + unitvector(xpart _posgrady@#,0); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) +% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxeypi@#(num,den); + draw etiquetteypi@#(yO/pi,1) + else: + draw etiquettesaxeypi.lft(num,den); + draw etiquetteypi.lft(yO/pi,1) + fi + else: + if str @#<>"": + draw etiquettesaxeypi@#(num,den) + else: + draw etiquettesaxeypi.lft(num,den) + fi + fi + ); + $ +enddef; + +vardef axexpi@# (expr n,d)= %%%%%%axe des abscisses avec gestion graduation origine mult pi + _nbaxes:=_nbaxes+1; + _axexpi_@#(n,d,1) +enddef; + +vardef axeypi@# (expr n,d)= %%%%%%axe des ordonnées avec gestion graduation origine mult pi + _nbaxes:=_nbaxes+1; + _axeypi_@#(n,d,1) +enddef; + +vardef axexpio@#(expr n,d)= %%%%%%axe des abscisses avec graduation origine mult pi + _axexpi_@#(n,d,2) +enddef; + +vardef axeypio@#(expr n,d)= %%%%%%axe des ordonnées avec graduation origine mult pi + _axeypi_@#(n,d,2) +enddef; + +vardef axexpin@#(expr n,d)= %%%%%%axe des abscisses sans graduation origine mult pi + _axexpi_@#(n,d,3) +enddef; + +vardef axeypin@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine mult pi + _axeypi_@#(n,d,3) +enddef; + +vardef axespi@# (expr n,d)= %%%% les deux axes mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpi.top(n,d) else: draw axexpi.bot(n,d) fi; + if posy>0: draw axeypi.rt(n,d) else: draw axeypi.lft(n,d) fi + ); + $ +enddef; + +vardef axespio@# (expr n,d)= %%%% les deux axes avec origine mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpio.top(n,d) else: draw axexpio.bot(n,d) fi; + if posy>0: draw axeypio.rt(n,d) else: draw axeypio.lft(n,d) fi + ); + $ +enddef; + +vardef axespin@# (expr n,d)= %%%% les deux axes sans origine mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpin.top(n,d) else: draw axexpin.bot(n,d) fi; + if posy>0: draw axeypin.rt(n,d) else: draw axeypin.lft(n,d) fi + ); + $ +enddef; + + +%%%%%%%% graduations isolées + +vardef axexpart@#(text t)= + save $,tmp,var; + picture $; + numeric tmp; + boolean var; + var:=false; + $=image(% + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi; +% draw ((0,taillegrad)--(0,-taillegrad)) shifted _c(_i,yO) withpen pencircle scaled 0.8bp; + draw graduationx(_i) withpen pencircle scaled 0.8bp; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; + if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi); + $ +enddef; + +vardef axeypart@#(text t)= + save $,tmp,var; + picture $; + numeric tmp; + boolean var; + var:=false; + $=image(% + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi; + draw ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,_i) withpen pencircle scaled 0.8bp; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; + if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi); + $ +enddef; + + +vardef axesunit= + save $; + picture $; + $=image(% + draw axes(0,0); + draw axexpart(1); + draw axeypart(1); + label.llft(LaTeX("$0$"),_c(0,0)); + % label.llft("0",_c(0,0)); + ); + $ +enddef; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% POINTS - VECTEURS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef _ccoord(expr xA,yA)= + (xA,yA) transformed _T +enddef; + +vardef _cobjet(expr obj)= + obj transformed _T +enddef; + +vardef _c(text t)= + if long_texte(t)=2: _ccoord(t) + else: _cobjet(t) + fi +enddef; + +vardef pol(expr r,theta)= + _c(r*cos(theta),r*sin(theta)) +enddef; + +vardef pold(expr r,theta)= + _c(r*cosd(theta),r*sind(theta)) +enddef; + +color coulpoint,coullabel,coullabelfonc; +coulpoint:=black;coullabel:=black;coullabelfonc:=black; + + +vardef MarquePointFig(expr pp)= % compatibilité geometriesyr15 + save $; + picture $; + if marque_p = "plein": + $:=image(fill fullcircle scaled taillepoint shifted pp withcolor coulpoint); + elseif marque_p = "creux": + $:=image(% + fill fullcircle scaled taillepoint shifted pp withcolor background; + draw fullcircle scaled taillepoint shifted pp withcolor coulpoint); + elseif marque_p = "croix": + $:=image(% + draw ((-taillecroix,0)--(taillecroix,0)) shifted pp withcolor coulpoint; + draw ((0,-taillecroix)--(0,taillecroix)) shifted pp withcolor coulpoint) + else: $:=nullpicture + fi; + $ +enddef; + +def MarquePoint(expr pp)= % compatibilité geometriesyr15 + draw MarquePointFig(pp) +enddef; + + +vardef pointe(text t) = %geometriesyr15 + for p_ = t: if pair p_: MarquePoint(p_); fi endfor; +enddef; + + +vardef nommepoint@#(text t)= + save $,ch,dess,latch; + pair $; + string ch,latch; + picture dess; + if long_texte(t)=1: + dess:=image(draw MarquePointFig(t); + ch:=_chaine(t); + label@#(LaTeX("$" & ch & "$"),t) withcolor coullabel) + else: + dess:=image(% + for PP=t: + if pair PP: MarquePoint(PP); $:=PP + else: if string PP: label@#(PP,$) else: label@#(PP scaled defaultscale,$) fi withcolor coullabel + fi; + endfor) + fi; + dess +enddef; + +vardef nommecourbe@#(suffix p)(text t)= + save A,ch,dess; + pair A; + string ch; + picture dess; + if long_texte(t)=1: + dess:=image(ch:=_chaine(p); + A:=_c(t,fonccourbe.p(t)); + label@#(LaTeX("$" & ch & "$"),A) withcolor coullabelfonc) + else: + dess:=image(% + for _a=t: + if numeric _a: A:=_c(_a,fonccourbe.p(_a)) + else: if string _a: label@#(_a,A) else: label@#(_a scaled defaultscale,A) fi withcolor coullabelfonc + fi; + endfor) + fi; + dess +enddef; + + + +vardef nommeobj@#(text t)= + save $; + picture $; + for i=t: + if pair i: $:=nommepoint@#(t) + else: $:=nommecourbe@#(t) + fi; + exitif true; + endfor + $ +enddef; + +def nomme = draw nommeobj enddef; + + +vardef vecteur@#(expr A)(text t)= + save $,ch,m; + picture $; + pair m; + string ch; + $=image(% + if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#(LaTeX("$\vect{" & ijmath(ch) & "}$"),A+t/2) + else: + for u=t: + if pair u: drawarrow A--A+u; m:=A+u/2 + else: if string u: if u<>"": label@#(LaTeX("$\vect{" & u & "}$"),m) fi else: label@#(u,m) fi + fi; + endfor + fi); + $ +enddef; + +vardef marquepointcourbefig(suffix p)(text t)= + save $; + picture $; + $=image(% + for i=t: + MarquePoint(_c(i,fonccourbe.p(i))); + endfor); + $ +enddef; + +def marquepointcourbe= draw marquepointcourbefig enddef; + +vardef marquepointcheminfig(suffix p)(text t)= + save $; + picture $; + $=image(% + for i=t: + MarquePoint(point i of p); + endfor); + $ +enddef; + +def marquepointchemin= draw marquepointcheminfig enddef; + +vardef marquecheminouvertdroitefig(expr p)= + halfcircle shifted (0,-0.5) + scaled (2*taillepoint) + rotated (90+angle(direction infinity of p)) + shifted (point infinity of p) +enddef; + +def marquecheminouvertdroite= draw marquecheminouvertdroitefig enddef; + +vardef marquecheminouvertgauchefig(expr p)= + halfcircle shifted (0,-0.5) + scaled (2*taillepoint) + rotated (-90+angle(direction 0 of p)) + shifted (point 0 of p) +enddef; + +def marquecheminouvertgauche= draw marquecheminouvertgauchefig enddef; + +vardef marquecheminouvert(expr p)= + marquecheminouvertdroite(p); + marquecheminouvertgauche(p) +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% BASE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef ijmath(suffix s)= + if (substring (0,1) of s)="i": s:="\imath" & substring (1,infinity) of s fi; + if (substring (0,1) of s)="j": s:="\jmath" & substring (1,infinity) of s fi; + s +enddef; + + +color coulbase; +coulbase:=black; + +vardef base(suffix a,b,c)= + save O,I,J,$; + string O,I,J; + picture $; + O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); + $:=image(% + draw vecteur.bot(_O,_c(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase; + draw vecteur.lft(_O,_c(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase; + nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase + ); + $ +enddef; + + +vardef basep(suffix a,b,c)= + save O,I,J,$; + string O,I,J; + picture $; + O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); + $:=image(% + nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase; + draw axexpart(1,LaTeX("$" & I & "$")) withcolor coulbase; + draw axeypart(1,LaTeX("$" & J & "$")) withcolor coulbase; + ); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% QUADRILLAGE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + numeric ep; color coul; + ep:= .2bp; %%%%%%%% épaisseur du trait + coul := .7white; %%%%%%%% couleur du trait + def quadstyle= enddef; + + vardef quadrillage(expr quadx,quady) = + save $; + picture $; + $=image(if quadx>0: + for i=ceiling((QuadXmin-xO)/quadx) upto floor((QuadXmax-xO)/quadx): + draw _c(arrondimil(i*quadx)+xO,QuadYmin)--_c(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul; + endfor; + fi; + if quady>0: + for i=ceiling((QuadYmin-yO)/quady) upto floor((QuadYmax-yO)/quady): + draw _c(QuadXmin,arrondimil(i*quady)+yO)--_c(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle; + endfor; + fi); + $ + enddef; + + vardef papierpointe(expr quadx,quady) = + save $; + picture $; + $=image(if (quadx>0) and (quady>0): + for i=ceiling(QuadXmin/quadx) upto floor(QuadXmax/quadx): + for j=ceiling(QuadYmin/quady) upto floor(QuadYmax/quady): + draw (0,0) shifted _c(i*quadx,j*quady) withpen pencircle scaled 2; + endfor; + endfor; + fi); + $ + enddef; + + numeric pm_epa, pm_epb, pm_epc; + color pm_coula, pm_coulb, pm_coulc; + pm_epa := .2bp; pm_epb := .3bp; pm_epc := .4bp; %%%%%%%%%% épaisseurs des traits + pm_coula := .6*white; pm_coulb := .4*white; pm_coulc := black; %%%%%%%%%% couleurs des traits + +vardef papiermillimetre = + save $; + picture $; + $=image(% + for i= ceiling(QuadXmin*Ux*10/cm) upto floor(QuadXmax*Ux*10/cm): + if i mod 5 <> 0: draw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi; + endfor + for i= ceiling(QuadYmin*Uy*10/cm) upto floor(QuadYmax*Uy*10/cm): + if i mod 5<> 0: draw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi; + endfor + % + for i= ceiling(QuadXmin*Ux/cm)*2+1 step 2 until floor(QuadXmax*Ux/cm)*2-1: + draw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb; + endfor + for i= ceiling(QuadYmin*Uy/cm)*2+1 step 2 until floor(QuadYmax*Uy/cm)*2-1: + draw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb; + endfor + % + for i= ceiling(QuadXmin*Ux/cm) upto floor(QuadXmax*Ux/cm): + draw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc; + endfor + for i= ceiling(QuadYmin*Uy/cm) upto floor(QuadYmax*Uy/cm): + draw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc; + endfor); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% FONCTIONS - COURBES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef courbefonc(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction + save $,x; + path $; + $=( _c(xmin,f(xmin)) + for i=1 upto n-1: + .._c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))) + endfor ); + $ +enddef; + +%%%%%%%%%% TEST %%%%%%%%%%%%% +vardef courbefonct@#(expr xmin, xmax, n) = %Courbe représentative d'une fonction + save $,x; + path $; + $=( _c(xmin,@#(xmin)) + for i=1 upto n-1: + .._c(xmin+i*(xmax-xmin)/(n-1),@#(xmin+i*(xmax-xmin)/(n-1))) + endfor ); + $ +enddef; +%%%%%%%%%% FINTEST %%%%%%%%%%%%% + +vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés + save $,x; + picture $; + $=image(MarquePoint(_c(xmin,f(xmin))); + for i=1 upto n-1: + MarquePoint(_c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))); + endfor ); + $ +enddef; + +vardef fonccourbe@#(expr x)= %Ordonnée du point de la courbe @# d'abscisse x (dans le repère utilisateur) + ypart ((pointcourbe@#(x)) transformed inverse _T) +enddef; + +vardef pointcourbe@#(expr x)= %Point de la courbe @# d'abscisse x dans le repère utilisateur +save _P_,t; + numeric t; pair _P_; + (t,whatever)=@# intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); + if t=-1: _P_:=_c(x,0) + else: _P_:=point t of @# + fi; + _P_ +enddef; + +vardef der@#(expr x)= %Fonction dérivée + save pp,t,v,w,d; + path pp; + pair v,w; + pp:=@#; + (t,whatever) = pp intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); + v:=direction t of pp; + w:=unitvector(v transformed inverse _T); + if xpart w = 0: d:=0 else: d:= (ypart w)/(xpart w) fi; + d +enddef; + +vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de p et q dans P[] + save i,pp; + numeric i; + path pp; + pp:=p; + i:=1; + forever: + exitif xpart(pp intersectiontimes q)=-1; + P[i]:=point xpart(pp intersectiontimes q) of pp; + pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp; + %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin... + i:=i+1; + endfor; +enddef; + +vardef ptantecedents(suffix P)(expr y,p)= + intercourbes(P,_c(Xmin,y)--_c(Xmax,y),p) +enddef; + +vardef antecedents(suffix P)(expr y,p)= + pair PP[]; + ptantecedents(PP,y,p); + for i=1 upto 10: P[i]:=xpart (PP[i] transformed inverse _T); endfor +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% TANGENTES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +numeric longtan; +longtan:=20; + +vardef tangentefleche@# (suffix p)(text tt) = + save t,$,pp,i,N; +pair senstan.gauche,senstan.droite,senstan.double; +senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1); + numeric N[],i; + i:=0; + pair _v,M; + picture $; + for n=tt: i:=incr i ; N[i]:=n; endfor; + if i=1: N2:=longtan fi; + (t,whatever) = p intersectiontimes (_c(N1,Ymin)--_c(N1,Ymax)); + M:=point t of p; + _v:=N2*unitvector(direction t of p); + $=image(% + MarquePoint(M); + if (xpart senstan@#) <> 0: drawarrow M--M-_v*(xpart senstan@#) fi; + if (ypart senstan@#) <> 0: drawarrow M--M+_v*(ypart senstan@#) fi; + ); + $ +enddef; + +vardef tangentedroite(expr p,a) = + save $,m,M,t; + path $; + numeric m,t; + pair M; + (t,whatever) = p intersectiontimes (_c(a,Ymin)--_c(a,Ymax)); + M:=point t of p; + $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p); + $ +enddef; + +vardef tangente@#(suffix p)(text tt) = + if str @#="": tangentedroite(p)(tt) + else: tangentefleche@#(p)(tt) + fi +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% CALCUL INTÉGRAL %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef entrecourbes(expr p,q,xmin,xmax)= + buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),q) +enddef; + +vardef souscourbe(expr p,xmin,xmax)= + buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),_c(Xmin,0)--_c(Xmax,0)) +enddef; + + +vardef rectangles@#(suffix p)(expr a,b,n)= %Riemann, renvoie un chemin fermé + save pas,_rect_; + numeric pas; + path _rect_; + pas=(b-a)/n; + _rect_ = + for i=0 upto n-1: + _c(a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)-- + endfor + _c(b,yO)--cycle; + _rect_ +enddef; + +numeric _typerect.min,_typerect.max,_typerect.droite,_typerect.gauche; +_typerect.min=1;_typerect.max=2;_typerect.droite=3;_typerect.gauche=4; + +vardef _segmrect_@#(suffix p)(expr a,pas)= + save _sousp; + path _sousp; + _sousp=subpath (xpart(p intersectiontimes droiteeqx(a)),xpart(p intersectiontimes droiteeqx(a+pas))) of p; + if _typerect@#=1: llcorner _sousp -- lrcorner _sousp + elseif _typerect@#=2: ulcorner _sousp -- urcorner _sousp + elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted _c(pas,0)) + elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted _c(-pas,0))--(pointcourbe.p(a+pas)) + fi +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DROITES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef droiteeqred(expr a,b)= + save $; + path $; + if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a): + $:=_c(Xmin,a*Xmin+b)--_c(Xmax,a*Xmax+b); + else: + $:=_c(Ymin/a-b/a,Ymin)--_c(Ymax/a-b/a,Ymax); + fi; + $ +enddef; + +vardef droiteeqx(expr c)= + _c(c,2*Ymin-Ymax)--_c(c,2*Ymax-Ymin) +enddef; + +vardef droiteeqcart(expr a,b,c)= + save $; + path $; + if b=0: + $=droiteeqx(-c/a) + else: + $:=droiteeqred(-a/b,-c/b) + fi; + $ +enddef; + +vardef droiteeq(text t)= + save $; + path $; + if long_texte(t)=1: $:= droiteeqx(t) fi; + if long_texte(t)=2: $:= droiteeqred(t) fi; + if long_texte(t)=3: $:= droiteeqcart(t) fi; + $ +enddef; + + +vardef droitept(expr A,B)= %geometrie15syr + (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B] +enddef; + +vardef droite(text t)= + save $; + path $; + for i=t: + if pair i: $:=droitept(t) else: $:=droiteeq(t) fi; + exitif true; + endfor; + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DEMI-PLANS %%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef demiplaninf(expr d)= + save $,A,B; + path $; + pair A,B; + if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1: + A:=point 0 of d; B:= point infinity of d + else: B:=point 0 of d; A:= point infinity of d + fi; + $=A-- + if ypart A>=ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi + if ypart A>ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi + if ypart B>ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi + if ypart B>=ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi + B--cycle; + $ +enddef; + +vardef demiplansup(expr d)= + save $,A,B; + path $; + pair A,B; + if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1: + A:=point 0 of d; B:= point infinity of d + else: B:=point 0 of d; A:= point infinity of d + fi; + $=A-- + if ypart A<=ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi + if ypart A<ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi + if ypart B<ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi + if ypart B<=ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi + B--cycle; + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% PROJECTIONS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef projetex(expr A)= + _c(xpart (A transformed inverse _T),yO) +enddef; + +vardef projetey(expr A)= + _c(xO,ypart (A transformed inverse _T)) +enddef; + +vardef projectionx@#(text t)= + save $,_a,_fg,dec; + picture $,_fg;_fg:=nullpicture; + numeric dec;dec=0; + pair _a; + $=image(% + for i=t: + if pair i: draw i--projetex(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetex(_a)) fi; + endfor; + draw _fg shifted (0,dec)); + $ +enddef; + +vardef projectiony@#(text t)= + save $,_a,_fg,dec; + picture $,_fg;_fg:=nullpicture; + numeric dec;dec=0; + pair _a; + $=image(% + for i=t: + if pair i: draw i--projetey(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetey(_a)) fi; + endfor; + draw _fg shifted (dec,0)); + $ +enddef; + + +vardef projectionaxes(text t)= + save $,_A,n; + picture $,_fg[];_fg1=_fg2=nullpicture; + pair _A; + numeric n,dd;n=1;dd=0; + $=image(% + for i=t: if numeric i: dd:=i fi; endfor + for i=t: + if not numeric i: + if pair i: _A:=i; + elseif n=1: if ypart _A > ypart _O: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1 + else: if xpart _A > xpart _O: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1 + fi; + fi; + endfor; + if n<=2: draw projectiony(_A) fi; if n=1: draw projectionx(_A) fi); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%% SUITES %%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef suite(suffix u)(expr deb,fin)= + save $; + picture $; + $=courbepoints(u,deb,fin,fin-deb+1); + $ +enddef; + +vardef _suiterecfonc_(expr x)=0 enddef; +numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_; + +vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init + vardef _suiterecfonc_(expr x)=f(x) enddef; + _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation + save $,un; + path $; + numeric un; + un=init; + $=_c(un,yO) + for i=deb upto fin-1: + --_c(un,f(un))--_c(f(un),f(un)) + hide(un:=f(un)) + endfor; + $ +enddef; + +vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec + save $,deb,fin,nom,_qw_,un; + picture $,lab; + string nom; + numeric deb,fin,_qw_,un,_prec; + deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; + _qw_:=1; + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; + elseif _qw_=2: + deb:=i; + for j=_suiterecdeb_ upto i-1: + un:=_suiterecfonc_(un); + endfor + elseif _qw_=3: fin:=i + fi; + _qw_:=_qw_+1; + endfor; + $=image(% + if nom="": + if deb=_suiterecdeb_: + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: + draw projectionx.@#(_c(un,un)); + un:=_suiterecfonc_(un); + endfor + elseif nom="_val": + if deb=_suiterecdeb_: +% label.@#(format("%10f",arrondi(10**_prec,un)),_c(un,yO)); + draw etiquettex.@#(arrondi(10**_prec,un)); + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: +% draw projectionx.@#(_c(un,un),format("%10f",arrondi(10**_prec,un))); + lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + draw projectionx.@#(_c(un,un),lab,-taillegrad); + un:=_suiterecfonc_(un); + endfor + else: + if deb=_suiterecdeb_: + label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),_c(un,yO)); + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: + lab:=LaTeX("$" & nom & "_{" & decimal(i) & "}" & "$"); + draw projectionx.@#(_c(un,un),lab); + un:=_suiterecfonc_(un); + endfor + fi); + $ +enddef; + +vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec + save $,deb,fin,nom,_qw_,un; + picture $,lab; + string nom; + numeric deb,fin,_qw_,un,_prec; + deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; + _qw_:=1; + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; + elseif _qw_=2: + deb:=i; + for j=_suiterecdeb_ upto i-2: + un:=_suiterecfonc_(un); + endfor + elseif _qw_=3: fin:=i + fi; + _qw_:=_qw_+1; + endfor; + $=image(% + if nom="": + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + draw projectiony.@#(_c(un,_suiterecfonc_(un))); + un:=_suiterecfonc_(un); + endfor + elseif nom="_val": + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab,-taillegrad); + un:=_suiterecfonc_(un); + endfor + else: + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + lab:=LaTeX("$" & nom & "_{" & decimal(i+1) & "}" & "$"); + draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab); + un:=_suiterecfonc_(un); + endfor + fi); + $ +enddef; + + +vardef suiterecproj(text t)= + save $; + picture $; + $=image(% + draw suiterecprojx.bot(t); + draw suiterecprojy.lft(t)); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% INTERVALLES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef bornex[](expr val)= + ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _c(val,xO) +enddef; + +vardef borney[](expr val)= + ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _c(yO,val) +enddef; + +pair sensborne.FF,sensborne.FO,sensborne.OF,sensborne.OO; +sensborne.FF=-sensborne.OO=(1,-1);sensborne.FO=-sensborne.OF=(1,1); + +vardef intervallex@#(expr vmin,vmax)= + save $; + picture $; + $=image(% + draw _c(vmin,xO)--_c(vmax,xO) withpen pencircle scaled 2pt; + draw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + draw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + $ +enddef; + +vardef intervalley@#(expr vmin,vmax)= + save $; + picture $; + $=image(% + draw _c(yO,vmin)--_c(yO,vmax) withpen pencircle scaled 2pt; + draw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + draw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%% STATISTIQUES %%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +numeric _decboitemoustache_,_largboitemoustache_; + + +vardef boitemoustache(text t)= + _decboitemoustache_:=1.5cm; + _largboitemoustache_:=1cm; + save $,n; + picture $; + numeric n,_valeursboitemoustache_[]; + n:=1; + for i=t: + _valeursboitemoustache_[n]:=i; + n:=n+1; + endfor; + if known _valeursboitemoustache_[6]: _decboitemoustache_:=_valeursboitemoustache_[6] fi; + if known _valeursboitemoustache_[7]: _largboitemoustache_:=_valeursboitemoustache_[7] fi; + $=image(% + fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[1],yO); + draw _c(_valeursboitemoustache_[1],yO)--_c(_valeursboitemoustache_[2],yO); + draw _c(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle; + draw _c(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2); + draw _c(_valeursboitemoustache_[4],yO)--_c(_valeursboitemoustache_[5],yO); + fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[5],yO)% + ) shifted (0,_decboitemoustache_); + $ +enddef; + +vardef projboitemoustache@#(text t)= + save $,n,_lab_,_comp_,A,tmp; + pair A; + picture $,_lab_[]; + numeric n_comp_,tmp; + n:=long_texte(t); + if n=0: + _lab_[1]:=LaTeX("$X_{min}$"); + _lab_[2]:=LaTeX("$Q_1$"); + _lab_[3]:=LaTeX("$M_e$"); + _lab_[4]:=LaTeX("$Q_3$"); + _lab_[5]:=LaTeX("$X_{max}$"); + elseif n=1: + if t=0: for i=1 upto 5: _lab_[i]:=nullpicture; endfor + else: + tmp:=floor(t); + for i=1 upto 5: + _lab_[i]:=LaTeX("\num{" & decimal(arrondi(10**tmp,_valeursboitemoustache_[i])) & "}"); + endfor + fi + else: _comp_:=1; for i=t: + if numeric i: _lab_[_comp_]:=LaTeX("\num{" & decimal(i) & "}") + elseif string i: _lab_[_comp_]:=LaTeX(i) + else: _lab_[_comp_]:=i + fi; + _comp_:=_comp_+1; + endfor + fi; + $=image(% + for i=1 upto 5: + if (i=1) or (i=5): + A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_) + else: A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2) + fi; + draw projectionx@#(A,_lab_[i]); + endfor); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% FONCTIONS USUELLES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pi:=3.141592654; +e:=2.718281828; + +vardef sin(expr x) = sind(180*x/pi) enddef; + +vardef cos(expr x) = cosd(180*x/pi) enddef; + +vardef tan(expr x) = sin(x)/cos(x) enddef; + +vardef exp(expr x) = mexp(x*256) enddef; + +vardef ln(expr x) = mlog(x)/256 enddef; + +vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; + +vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; + +vardef Arctan(expr x)= pi*angle(1,x)/180 enddef; + +vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef; + +vardef Arccos(expr x)= pi/2-Arcsin(x) enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% REMPLISSAGE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +let _fill_ = fill; + +def fill expr c= +if path c: _fill_ c else: draw c fi +enddef; + +numeric largbriques,hautbriques,decbriques; +largbriques=12;hautbriques=6;decbriques=6; + +vardef briques(text t)= + if long_texte(t)=0: + repbriques(largbriques,hautbriques,decbriques) + else: + repbriques(t) + fi +enddef; + + + +vardef repbriques(expr larg,haut,dec)= + numeric d;d=0; + image(% + for j=0 upto _hautcadre/haut: + draw ((0,0)--(_largcadre,0)) shifted (0,j*haut); + d:=d+dec;if d>larg: d:=d-larg fi; + for i=0 upto _largcadre/larg: + draw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut); + endfor; + endfor) shifted llcorner cadre +enddef; + + +numeric pashach,anglehach; +pashach=5;anglehach=60; + +vardef hachures(text t)= + if long_texte(t)=0: + rephachures(pashach,anglehach) + else: + rephachures(t) + fi +enddef; + +vardef rephachures(expr pas,angle)= + image(% + for i=floor(-_diag/(2*pas)) upto ceiling(_diag/(2*pas)): + draw ((-_diag/2,0)--(_diag/2,0)) shifted (0,i*pas); + endfor) rotated angle shifted center cadre +enddef; + +numeric pervagues,ampvagues,decvagues; +pervagues=20;ampvagues=3;decvagues=10; + +vardef vagues(text t)= + if long_texte(t)=0: + repvagues(pervagues,ampvagues,decvagues) + else: + repvagues(t) + fi +enddef; + + +vardef repvagues(expr per,amp,dec)= %D'après le manuel de l'utilisateur de MetaPost + image(% + for j=0 upto _hautcadre/dec: + for i=0 upto _largcadre/amp: + draw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec); + endfor; + endfor) shifted llcorner cadre +enddef; + + +primarydef p avec c = + begingroup + save _des_; + picture _des_; + _des_:=c; + clip _des_ to p; + _des_ + endgroup +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DIVERS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +string LaTeX_packages[],LaTeX_preamble,LaTeX_inputenc; +LaTeX_preamble:="";LaTeX_inputenc:=""; + +numeric n_packages; +n_packages:=0; + +def LaTeX_AjoutPackage(expr t)= + if known latexmp_module: + latexmp_packages:=latexmp_packages & "," & t + else: + n_packages:=n_packages+1; + LaTeX_packages[n_packages]:=t + fi +enddef; + +def LaTeX_AjoutCommande(expr t)= + LaTeX_preamble:=LaTeX_preamble & t +enddef; + +def LaTeX_Encodage(expr t)= + LaTeX_inputenc:= t +enddef; + + + +boolean LaTeXprem; +LaTeXprem:=true; + +def LaTeXsetup = + if LaTeXprem: + LaTeXprem:=false; + latexmp_preamble:=LaTeX_preamble; + latexmp_inputenc:=LaTeX_inputenc; + if latexmp_inputenc="": latexmp_inputenc:="utf8" fi; + if latexmp_packages="": latexmp_packages:="fourier" fi; + latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[frenchb]"; + latexmp_preamble:=latexmp_preamble & "\newcommand{\vect}[1]{\vv{#1}}" & "\newcommand{\calc}{\mathscr{C}}" & "\newcommand{\calp}{\mathscr{P}}" & "\DecimalMathComma" ; + fi +enddef; + +vardef LaTeX primary sc = %D'après TEX.mp + if known latexmp_module: LaTeXsetup; textext(sc) scaled defaultscale + else: + save n_p; + numeric n_p; + write "verbatimtex" to "mptextmp.mp"; + write "%&latex" to "mptextmp.mp"; + write "\documentclass[10pt]{article}" to "mptextmp.mp"; + if LaTeX_inputenc="": + write "\usepackage[utf8]{inputenc}" to "mptextmp.mp" + else: + write "\usepackage[" & LaTeX_inputenc &"]{inputenc}" to "mptextmp.mp" + fi; + write "\usepackage[T1]{fontenc}" to "mptextmp.mp"; + if known LaTeX_packages[1]: + n_p:=1; + forever: exitunless known LaTeX_packages[n_p]; + write "\usepackage{" & LaTeX_packages[n_p] &"}" to "mptextmp.mp"; + n_p:=n_p+1; + endfor + else: + write "\usepackage{fourier}" to "mptextmp.mp" + fi; + write "\usepackage{amsmath}" to "mptextmp.mp"; + write "\usepackage{mathrsfs}" to "mptextmp.mp"; + write "\usepackage[e]{esvect}" to "mptextmp.mp"; + write "\usepackage[output-decimal-marker={,}]{siunitx}" to "mptextmp.mp"; + write "\usepackage[frenchb]{babel}" to "mptextmp.mp"; + write LaTeX_preamble to "mptextmp.mp"; + write "\newcommand{\vect}[1]{\vv{#1}}" to "mptextmp.mp"; + write "\newcommand{\calc}{\mathscr{C}}" to "mptextmp.mp"; + write "\newcommand{\calp}{\mathscr{P}}" to "mptextmp.mp"; + write "\begin{document}" to "mptextmp.mp"; + write "etex" to "mptextmp.mp"; + write "btex "& sc &" etex" to "mptextmp.mp"; + write EOF to "mptextmp.mp"; + scantokens "input mptextmp" scaled defaultscale + fi +enddef; + +%%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%% +def figureinter= + clip currentpicture to cadre; + shipit; + _nfig:=_nfig+1; + charcode:=charcode+1; +enddef; + + +vardef arrowhead expr p = %redéfinition flèches + save q,e; path q; pair e; + e = point length p of p; + q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) + cuttings; + (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e +enddef; + +def epaisseur=withpen pencircle scaled enddef; +def couleur=withcolor enddef; + + +vardef long_texte(text t)= + save i; + numeric i; + i:=0; + for n=t: i:=i+1; endfor + i +enddef; + +vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre + save c,d; + string c,d; + d:= str s; + if length(d)=1: + c:=d + elseif isdigit (substring (1,2) of d): + c:= (substring (0,1) of d) & "_{" & substring (1,infinity) of d & "}" + else: c:=str s + fi; + c +enddef; + + +vardef arrondi(expr p,x)= %arrondi de x au p-ième + round((x-floor(x))*p)/p+floor(x) +enddef; + +vardef arrondimil(expr x)= + arrondi(1000,x) +enddef; + +vardef pgcd(expr a,b)= + save r_,a_,b_; + numeric r_,a_,b_; + a_=a;b_=b; + forever: + r_:=a_ mod b_; + exitif r_=0; + a_:=b_; + b_:=r_; + endfor; + b_ +enddef; + +%%%%%%%%%%%%%%% COULEURS %%%%%%%%%%%%%%%%%%% +cmykcolor Rouge,Vert,Bleu,Marron,Lime,Orange,Rose,Pourpre,Violet,Cyan,Magenta,Jaune,Olive,Noir,Grisfonce,Gris,Grisclair,Blanc,Beige,Marine,Moutarde,Vertfonce; + +Rouge:=(0,1,1,0); +Vert:=(1,0,1,0); +Bleu:=(1,1,0,0); +Marron:=(0,0.53,1,0.65); +Lime:=(0.38,0,0.78,0.01); +Orange:=(0,0.5,1,0); +Rose:=(0,0.57,0.38,0.01); +Pourpre:=(0,0.91,0.59,0.38); +Violet:=(0.5,1,0,0.4); +Cyan:=(1,0,0,0); +Magenta:=(0,1,0,0); +Jaune:=(0,0,1,0); +Olive:=(0.21,0,0.75,0.45); +Noir:=(0,0,0,1); +Grisfonce:=(0,0,0,0.75); +Gris:=(0,0,0,0.5); +Grisclair:=(0,0,0,0.25); +Blanc:=(0,0,0,0); +Beige:=(0,0.14,0.37,0.22); +Marine:=(1,1,0,0.5); +Moutarde:=(0.04,0,1,0.19); +Vertfonce:=(1,0,1,0.5); + + +vardef conversion_cmyn_rvb(expr coul)= + ((1-cyanpart coul)*(1-blackpart coul),(1-magentapart coul)*(1-blackpart coul),(1-yellowpart coul)*(1-blackpart coul)) +enddef; + +color rouge,vert,bleu,marron,lime,orange,rose,pourpre,violet,cyan,magenta,jaune,olive,noir,grisfonce,gris,grisclair,blanc,beige,marine,moutarde,vertfonce; + +rouge:=conversion_cmyn_rvb(Rouge); +vert:=conversion_cmyn_rvb(Vert); +bleu:=conversion_cmyn_rvb(Bleu); +marron:=conversion_cmyn_rvb(Marron); +lime:=conversion_cmyn_rvb(Lime); +orange:=conversion_cmyn_rvb(Orange); +rose:=conversion_cmyn_rvb(Rose); +pourpre:=conversion_cmyn_rvb(Pourpre); +violet:=conversion_cmyn_rvb(Violet); +cyan:=conversion_cmyn_rvb(Cyan); +magenta:=conversion_cmyn_rvb(Magenta); +jaune:=conversion_cmyn_rvb(Jaune); +olive:=conversion_cmyn_rvb(Olive); +noir:=conversion_cmyn_rvb(Noir); +grisfonce:=conversion_cmyn_rvb(Grisfonce); +gris:=conversion_cmyn_rvb(Gris); +grisclair:=conversion_cmyn_rvb(Grisclair); +blanc:=conversion_cmyn_rvb(Blanc); +beige:=conversion_cmyn_rvb(Beige); +marine:=conversion_cmyn_rvb(Marine); +moutarde:=conversion_cmyn_rvb(Moutarde); +vertfonce:=conversion_cmyn_rvb(Vertfonce); + diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index f4444a199bc..19fe3da9e02 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -398,7 +398,7 @@ my @TLP_working = qw( readarray realboxes realscripts rec-thy recipe recipecard recycle rectopma refcheck refenums reflectgraphics refman refstyle regcount regexpatch register regstats - relenc relsize reotex repeatindex resphilosophica + relenc relsize reotex repeatindex repere resphilosophica resumecls resumemac reverxii revtex ribbonproofs rjlparshap rlepsf rmpage robustcommand robustindex romanbar romande romanneg romannum diff --git a/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc b/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc index 8638db4f1d5..987993bd33a 100644 --- a/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc @@ -33,6 +33,7 @@ depend mpcolornames depend mpattern depend mpgraphics depend piechartmp +depend repere depend roex depend slideshow depend splines diff --git a/Master/tlpkg/tlpsrc/repere.tlpsrc b/Master/tlpkg/tlpsrc/repere.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/repere.tlpsrc |