\documentclass[12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[dvips,a4paper,margin=1.5cm,nohead]{geometry}
\usepackage[dvips]{graphicx}
\usepackage{amsmath,amssymb,pst-all}
\input christ5.tex
\title{Metapost et les inéquations}
\author{Christophe Poulain}
\date{\today}
\begin{document}
\maketitle
\section{Présentation}
Cela fait longtemps que je voulais produire avec MetaPost des représentations graphiques des solutions d'inéquations du 1\ier{} degré à 1 inconnue telles que celles ci-dessous.\\
\begin{figure}[h]
$$\includegraphics{\jobname.1}$$
\caption{$x\geqslant2$}
\label{fig1}
\end{figure}
\begin{figure}[h]
$$\includegraphics{\jobname.2}$$
\caption{$x<7$}
\label{fig2}
\end{figure}
\par Je voulais parvenir en une seule macro à faire afficher le résultat. Pourquoi ne pas faire une figure puis l'adapter ensuite suivant les cas car, finalement, les inéquations du 1\ier{} degré à une inconnue n'interviennent qu'à partir de la 3\ieme{} et leurs représentations graphiques relativement peu ; donc le nombre de cas à traiter reste faible.
\\C'est exact mais les corrections de devoirs dans lesquelles intervenaient des inéquations me laissaient un goût d'inachevé car les élèves devaient faire ces représentations graphiques eux-mêmes\footnote{Cela peut-être un bon exercice mais lors d'une correction de Brevet Blanc, il y a déjà beaucoup de choses à corriger\ldots}. Et puis, j'ai crée une fiche d'exercices\footnote{Disponible à l'adresse {\sl www.melusine.eu.org/syracuse/poulecl/college/3/}} et pour la correction, j'aurais bien aimé un transparent avec la correction des représentations graphiques.
\section{Détail des commandes de la macro}
Avant toute chose, cette macro dépend de quatre fichiers\footnote{C'est un inconvénient mais libre ensuite à chacun d'adapter à ses propres pratiques} :
\begin{itemize}
\item les fichiers personnels\footnote{Disponibles à l'adresse {\sl www.melusine.eu.org/syracuse/poulecl/macros/}} geometriesyr13.mp, papiers2.mp, constantes.mp
\item le fichier TEX.mp livré avec MetaPost.
\end{itemize}
Il y a 3 paramètres de présentations qui sont :\\
%\psframebox[fillstyle=solid,fillcolor=yellow,framearc=0.15]{\begin{minipage}{\linewidth}
\begin{description}
\item[style] qui peut prendre les valeurs {\bf hachures} (par défaut, voir figure n°\ref{fig1}) ou {\bf repasse} (voir figure n°\ref{fig2}).
\item[affichagesol] qui peut prendre les valeurs {\bf non} (par défaut, voir figure n°\ref{fig1}) ou {\bf oui} (voir figure n°\ref{fig2}).
\item[affichagevaleur] qui peut prendre les valeurs {\bf oui} (par défaut, voir figures n°\ref{fig1} et n°\ref{fig2}) ou {\bf non}. Ce dernier cas peut se présenter lorsque l'on a des valeurs particulières ($\pi$, $\sqrt2$,\ldots) à placer : il faut alors utiliser\\
\verb+label.top(btex $\pi$ etex,placepoint(valeur,0.5))+
\end{description}
%\end{minipage}}
et deux paramètres pour la représentation graphique en elle-même :
\begin{description}
\item[pos] qui prend les valeurs {\bf inf} (voir figure n°\ref{fig2}) ou {\bf sup} (voir figure n°\ref{fig1}).
\item[sol] qui prend les valeurs {\bf oui} (voir figuren°\ref{fig2}) ou {\bf non} (voir figure n°\ref{fig1}).
\end{description}
Finalement, on appelle la macro par
\begin{center}
\verb+draw soline(7,120,red)+
\end{center}
où 7 représente la valeur \og{}limite\fg{}, 120 l'angle des hachures (en degré) et {\em red} la couleur.
\section{Exemples}
\subsection{Exemple 1}
$$\includegraphics{\jobname.1}$$
\begin{verbatim}
figure(0,0,10cm,2cm);
trace grille(0.5) withcolor gris;
origine((10,2));
pos:="sup";
sol:="non";
draw soline(2,120,bleu);
fin;
\end{verbatim}
La grille définit les unités : ici, $0,5\,cm$ sur chacun des axes.
L'origine est définie dans les unités de la grille à partir de l'origine du cadre (en l'occurence, le coin en bas à gauche).
\subsection{Exemple 2}
$$\includegraphics{\jobname.2}$$
\begin{verbatim}
figure(0,0,10cm,2cm);
z.origine=u*(3,1);
x.u:=5mm;
style:="repasse";
affichagesolu:="oui";
pos:="inf";
sol:="oui";
draw soline(7,60,violet);
fin;
\end{verbatim}
Lorsque la grille (ou le papier millimétré, ou le papier cahier,...) ne définissent par les unités, il faut utiliser {\bf z.origine} pour définir l'origine de la droite graduée et {\bf x.u} pour définir l'unité de longueur sur cette droite graduée. L'unité \og{}verticale\fg{} pour le placement des hachures, du crochet,\ldots est de toutes façons réglée à 5mm.
\\On remarquera également le changement de style.
\subsection{Exemple 3}
$$\includegraphics{\jobname.3}$$
\begin{verbatim}
figure(0,0,10u,2u);
trace papiercahier withcolor gris;
origine((4,1.5));
style:="hachures";
affichagesolu:="oui";
affichageval:="non";
pos:="sup";
sol:="non";
draw soline(pi,120,bleu);
label.top(btex $\pi$ etex,placepoint(pi,0.5));
fin;
\end{verbatim}
Un exemple avec du papier cahier (pour ressembler au travail des élèves) avec un panachage (hachurage et affichage de l'intervalle solution). Egalement présent le cas de la valeur délicate à afficher.
\subsection{Exemple 4}
$$\includegraphics{\jobname.4}$$
\begin{verbatim}
figure(0,0,10u,2u);
trace grille(0.5) withcolor gris;
origine((4,2));
style:="hachures";
affichagesolu:="rien";%ou autre chose que oui ou non
affichageval:="oui";
pos:="sup";
sol:="non";
draw soline(2,120,bleu);
pos:="inf";
sol:="oui";
draw soline(5,120,rouge);
fin;
\end{verbatim}
On peut même résoudre graphiquement les systèmes d'inéquations du 1\ier{} degré à 1 inconnue.
\section{La macro}
\begin{verbatim}
input geometriesyr13;
input TEX;

string pos,sol,style,affichagesolu,affichageval;

style="hachures";
affichagesolu="non";
affichageval="oui";

%Macro pour représenter graphiquement les solutions d'une inéquation
vardef soline(expr valeur,ang,couleur)=
  save $;
  picture dep,$;
  pair ww;
  y.u:=5mm;
  dep=image(
    drawarrow (xpart(z.so),ypart(placepoint(0,0)))
    --(xpart(z.ne),ypart(placepoint(0,0))) withpen pencircle scaled 2bp;
    graduantx.bot;
    pair O;
    O=placepoint(0,0);
    marque_p:="plein";
    pointe(O);
    label.bot(btex $O$ etex,O);
    );
  $=image(
    trace dep;
    ww=placepoint(valeur,0);
    pointe(ww);
    marque_p:="non";
    if pos="inf":
      if style="hachures":
        draw hachurage(placepoint(valeur,0.4)--placepoint(valeur,-0.4)--
          (xpart(z.ne),ypart(placepoint(0,-0.4)))--
          (xpart(z.ne),ypart(placepoint(0,0.4)))--cycle,ang,0.3,0)
        withcolor couleur
      elseif style="repasse":
        draw (xpart(z.so),ypart(placepoint(0,0)))--(placepoint(valeur,0))
        withpen pencircle scaled 2bp withcolor couleur
      fi;
      if sol="non":
        draw placepoint(valeur+0.3,0.5)--placepoint(valeur,0.5)
        --placepoint(valeur,-0.5)--placepoint(valeur+0.3,-0.5)
        withpen pencircle scaled 2bp withcolor couleur
      elseif sol="oui":
        draw placepoint(valeur-0.3,0.5)--placepoint(valeur,0.5)
        --placepoint(valeur,-0.5)--placepoint(valeur-0.3,-0.5)
        withpen pencircle scaled 2bp withcolor couleur
      fi;
      if affichagesolu="non":
        long:=abs((xpart(z.ne),ypart(placepoint(0,-0.4)))-
          placepoint(valeur,-0.4));
        label.bot(TEX("$\underbrace{\hbox to"&
            decimal(long)&"pt{}}_{\hbox{Ce qui ne convient pas}}$"),
          iso(placepoint(valeur,-0.4),(xpart(z.ne),
              ypart(placepoint(0,-0.4)))));
      elseif affichagesolu="oui":
        long:=abs((xpart(z.so),ypart(placepoint(0,-0.4)))-
          placepoint(valeur,-0.4));
        label.bot(TEX("$\underbrace{\hbox to"&
            decimal(long)&"pt{}}_{\hbox{Nombres solutions}}$"),
          iso(placepoint(valeur,-0.4),(xpart(z.so),
              ypart(placepoint(0,-0.4)))));
      fi;
      if affichageval="oui":
        label.top(TEX("$"&decimal(valeur)&"$"),placepoint(valeur,0.5));
      fi;
    elseif pos="sup":
      if style="hachures":
        draw hachurage(placepoint(valeur,0.4)--placepoint(valeur,-0.4)
          --(xpart(z.so),ypart(placepoint(0,-0.4)))--
          (xpart(z.so),ypart(placepoint(0,0.4)))--cycle,ang,0.3,0)
        withcolor couleur
      elseif style="repasse":
        draw placepoint(valeur,0)--(x.ne,ypart(placepoint(0,0)))
        withpen pencircle scaled 2bp withcolor couleur
      fi;
      if sol="non":
        draw placepoint(valeur-0.3,0.5)--placepoint(valeur,0.5)
        --placepoint(valeur,-0.5)--placepoint(valeur-0.3,-0.5)
        withpen pencircle scaled 2bp withcolor couleur
      elseif sol="oui":
        draw placepoint(valeur+0.3,0.5)--placepoint(valeur,0.5)
        --placepoint(valeur,-0.5)--placepoint(valeur+0.3,-0.5)
        withpen pencircle scaled 2bp withcolor couleur
      fi;
      if affichagesolu="non":
        long:=abs((xpart(z.so),ypart(placepoint(0,-0.4)))-
          placepoint(valeur,-0.4));
        label.bot(TEX("$\underbrace{\hbox to"&
            decimal(long)&"pt{}}_{\hbox{Ce qui ne convient pas}}$"),
          iso(placepoint(valeur,-0.4),(xpart(z.so),
              ypart(placepoint(0,-0.4)))));
      elseif affichagesolu="oui":
        long:=abs((xpart(z.ne),ypart(placepoint(0,-0.4)))-
          placepoint(valeur,-0.4));
        label.bot(TEX("$\underbrace{\hbox to"&
            decimal(long)&"pt{}}_{\hbox{Nombres solutions}}$"),
          iso(placepoint(valeur,-0.4),(xpart(z.ne),
              ypart(placepoint(0,-0.4)))));
      fi;
      if affichageval="oui":
        label.top(TEX("$"&decimal(valeur)&"$"),placepoint(valeur,0.5));
      fi;
    fi;
    );
  $
enddef;
\end{verbatim}
\end{document}