\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[charter]{mathdesign}
\usepackage[margin=2.5cm]{geometry}
\usepackage{xspace}
\usepackage[svgnames]{xcolor}
\usepackage{multicol}
\usepackage{listings}
\usepackage{showexpl} % examples
\usepackage{mflogo}
\usepackage[frenchb]{babel}

\renewcommand{\ttdefault}{lmtt}


\definecolor{hellgelb}{rgb}{1,1,0.85}
\definecolor{colKeys}{rgb}{0,0,1}
\definecolor{colIdentifier}{rgb}{0,0,0}
\definecolor{colComments}{rgb}{1,0,0}
\definecolor{colString}{rgb}{0,0.5,0}


\lstset{%
  language=metapost,%
  float=hbp,%
  basicstyle=\ttfamily\small, %
  identifierstyle=\color{DarkSlateGrey}, %
  keywordstyle=\color{DarkBlue}\itshape, %
  stringstyle=\color{Green}, %
  commentstyle=\color{colComments}, %
  columns=flexible, %
  tabsize=4, %
  frame=single, %
  extendedchars=true, %
  showspaces=false, %
  showstringspaces=false, %
  numbers=left,
  numbersep=0.8em,
  numberstyle=\tiny, %
  breaklines=true, %
  breakautoindent=true,
  captionpos=b,
  xleftmargin=1em,
  sensitive=true,
  morekeywords=[7]{Point,Vecteur},
  keywordstyle=[7]\color{FireBrick},
  morekeywords=[8]{gddO,gddA,gddB,gddC,gddT},
  keywordstyle=[8]\color{Sienna},
  morekeywords=[9]{PointImp},
  keywordstyle=[9]\color{Olive}
}
\lstset{explpreset={pos=t,wide=false,rframe={},preset=\centering}}
\lstdefinestyle{syntax}{backgroundcolor=\color{blue!15},numbers=none,xleftmargin=0pt,xrightmargin=0pt,
  frame=single}
\lstdefinestyle{code}{backgroundcolor=\color{red!15},%numbers=left,
  xleftmargin=0pt,xrightmargin=0pt,
  frame=single}


\newcommand\mpgdd{\texttt{mpgdd}\xspace}
\newcommand\fichier[1]{\texttt{#1}}
\newcommand\variable[1]{\texttt{#1}}
\newcommand\typeMP[1]{\texttt{#1}}
\newcommand\typeGDD[1]{\texttt{#1}}
\newcommand\foncGDD[1]{\texttt{#1}}

\begin{document}

\section{Introduction}

\mpgdd est un ensemble d'outils pour la géométrie plane avec \MP. Cet
ensemble se compose de plusieurs fichiers :

\begin{enumerate}
\item \fichier{gdd.mp} : c'est le fichier principal, il contient
  les structures et fonctions générales.
\item \fichier{gdd-arc.mp} :
  contient tout ce qui concerne les arcs de cercles.
\item \fichier{gdd-c2d.mp} :
  contient tout ce qui concerne les courbes du second degré.
\item \fichier{gdd-fct.mp} :
  contient quelques fonctions mathématiques usuelles.
\item \fichier{gdd-lbl.mp} :
  contient les fonctions relatives aux labels.
\item \fichier{gdd-plt.mp} :
  contient des fonctions facilitant la représentation de fonctions
  mathématiques.
\item \fichier{gdd-rep.mp}
  contient différents outils pour le tracé de figure dans un repère.
\item \fichier{gdd-tra.mp}
  contient les fonction permettant de gérer la transparence (code
  emprunté à Anthony \bsc{Phan}).
\end{enumerate}

Nous allons, dans la suite, décrire plus en détails chacune de ces
fonctions. Il est à noté aussi que certaines fonctions s'appuient sur
l'extension \fichier{graph.mp} présent dans toutes les bonnes
distributions \TeX.

\section{Objectif}

\mpgdd a été écrit avec le but de proposer des macros \MP{} permettant
de réaliser une figure de géométrie \emph{en collant} d'assez près
à une description impérative:
\begin{quote}\itshape
Soit \(A\) le point de coordonnées (2,3).\\
Soit \(B\) le point de coordonnées (4,5).\\
Trace la droite \((A,B)\).\\
....
\end{quote}
Dans ce cadre, les objets géométriques sont le plus souvent nommés
(\(A\), \(B\), etc.) ou désignés par leur nature et leurs attributs
(droite \((A,B)\), etc.). Pour ne pas avoir à dépasser ce mode de
description, en particulier pour éviter d'avoir à déclarer le
\emph{type} de ces objets, le choix a été fait de les identifier par
un \emph{index}\footnote{Le type \typeMP{numeric}, qui est le type par
défaut dans \MP, ne demande pas de déclaration préalable.} dans des
tables qui en précisent les caractéristiques.

\textbf{Note} -- À ce jour, l'objectif n'est pas atteint, le
développement est loin d'être achevé; il est encore nécessaire de
faire appel à des commandes \MP{} ou à des \emph{macros
intermédiaires} pour décrire une figure. Cela évoluera sans doute
avec le temps, le temps de trouver une syntaxe satisfaisante...

\section{Principe général de fonctionnement}

\mpgdd utilise des tables comme structure principale. Chaque objet est
numéroté via le compteur \variable{gddO}, son type\footnote{Les types
sont propres à \mpgdd et seront décrits plus tard.} est stocké dans
la table \variable{gddT[]} à la place \variable{gddT[gddO]}. Les
propriétés des objets sont définies dans, là encore, des tables de
type \typeMP{numeric} qui sont \variable{gddA[]}, \variable{gddB[]},
\dots, \variable{gddF[]}.

Par exemple, pour un \typeGDD{Point} (type \mpgdd), la première coordonnée
se trouve dans \variable{gddA[]} et la seconde dans \variable{gddB[]}
(les autres table ne sont pas utilisées pour un tel objet).

Il y a deux tables particulières \variable{gddP[]} qui est du type
\typeMP{path} et \variable{gddS[]} qui est du type
\typeMP{string}. Nous verrons plus tard quelle est leur utilité.

Bien entendu, lors d'une utilisation classique de \mpgdd, l'appel à
toutes ces tables n'est pas chose courante. Les fonctions que nous
allons décrire dans la suite de ce documents permettent de ne pas
avoir recours trop précisément à cette machinerie.

\section{Les types}

On peut, avec \mpgdd, construire plusieurs types
d'objets. Rappelons le, tout est \emph{objet} dont le nombre est
enregistré dans la variable \variable{gddO}. Le type d'objet, lui, est
stocké dans la table \variable{gddT[]}, et les tables \variable{gddA[]}
à \variable{gddF[]} contiennent les propriétés des objets.

Nous allons ici décrire chaque type de l'extension \mpgdd ainsi que
leurs propriétés respectives.

\paragraph{Le type \typeGDD{Point}} Ce type correspond au point de
l'espace euclidien. Pour être plus clair voici la fonction principale
pour créer un tel objet :
%
\begin{lstlisting}
vardef Point(expr a,b) =
  gddT[incr gddO] = "point";
  gddA[gddO] = a; gddB[gddO] = b; gddO
enddef;
\end{lstlisting}

Cette fonction «retourne» le compteur \variable{gdd0} et crée dans la
table de type une entrée \typeGDD{point} et les attributs (coordonnées)
correspondants \variable{a} et \variable{b} dans les tables
\variable{gddA} et \variable{gddB}.

Avec un tel type de fonctionnement, la plupart des manipulations se
fait sur des \typeMP{numeric}s. En effet, pour déclarer un
\typeGDD{point}, il suffit d'écrire
\begin{lstlisting}
A = Point(2,3);
\end{lstlisting}
\variable{A} prend alors la valeur courante de \variable{gddO}. C'est
l'identifiant du point.

\paragraph{Le type \typeGDD{Vecteur}} Ce type correspond aux vecteurs
définis à l'aide de deux points de l'espace euclidien. La fonction
créatrice d'un tel objet est celle-ci
%
\begin{lstlisting}
vardef Vecteur(expr a,b) =
  save n; n = incr gddO;
  gddT[n] = "vecteur"; gddA[n] = PointImp(a); gddB[n] = PointImp(b); n
enddef;
\end{lstlisting}
Cette fonction a la même architecture que celle correspondante au
\typeGDD{point} : elle retourne la valeur courante de \variable{gddO}
après incrémentation, puis affecte le type \typeGDD{vecteur} à
l'entrée correspondante dans la table \variable{gddT}. Par contre, les
entrées des tables \variable{gddA} et \variable{gddB} sont
différentes. En effet, on stock ici les identifiants  des points
formant le vecteur. La fonction \foncGDD{PointImp} s'assure que
l'entrée correspond bien à un identifiant de point et non pas une
\typeMP{pair} \MP. Elle sera décrite plus en détail ultérieurement.



\section{Fonctions générales}

\subsection{Relatives aux \typeGDD{Point}s}

\subsection{Un peu de géométrie}




\end{document}
