% \iffalse meta-comment
% Time-stamp: <2009-06-22T14:58:16 (cest) [yvon sur hypatie]>
% Copyright (C) 2009 by Yvon Henel 
% dit «le TeXnicien de surface» <le.texnicien.de.surface@wanadoo.fr>
% ------------------------------------------------------------------
% 
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% of this license or (at your option) any later version.
% The latest version of this license is in:
%
%    http://www.latex-project.org/lppl.txt
%
% and version 1.2 or later is part of all distributions of LaTeX 
% version 1999/12/01 or later.
% \fi
%
% \iffalse
%<package|suite|taupe>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\def\PackageName{tdsfrmath}  
%<package|suite|taupe>\def\fileversion{v1.3}  
%<package|suite|taupe>\def\filedate{2009/06/22} 
%<package>\def\fileinfo{macros pour les maths
%<package>              par Le TeXnicien de surface} 
%<package>\ProvidesPackage{tdsfrmath}
%<package>   [\filedate\space\fileversion\space\fileinfo] 
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}  
\usepackage{array}
\usepackage{xspace}
\usepackage{url}
\usepackage{fixltx2e}
\usepackage{float} 
\usepackage[tame]{paresse}
\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
\usepackage[np]{numprint}
\usepackage[taupe,suite]{tdsfrmath}[2008/08/11]
\usepackage[english,frenchb]{babel}
\usepackage[pdfpagelabels,
            colorlinks=true,
            linkcolor=blue,
            urlcolor=blue,
            citecolor=blue]{hyperref}
% commentez la ligne suivante pour avoir un document avec le code
% \OnlyDescription
\EnableCrossrefs         
\CodelineIndex
\RecordChanges
\makeatletter
%%% quelques redéfinition de commande de la classe ltxdoc.cls ou de
%%% l'extension doc.sty pour une documentation en français.
\GlossaryPrologue{%
  \section*{{Changements}}%
  \markboth{{Changements}}{{Changements}}}
\IndexPrologue{\section*{Index}\markboth{Index}{Index}%
  Les nombres en italique ou en bleu renvoient à la page où l'entrée
  est décrite; les nombres soulignés renvoient à la ligne de code de
  la définition; les nombres en caractères romains renvoient à la
  ligne de code où l'entrée est utilisée.}
\renewcommand{\SpecialMainEnvIndex}[1]{%
  \@bsphack\special@index{%
    #1\actualchar {\string\ttfamily\space#1} (environnement)%
    \encapchar main}%
  \special@index{environnements:\levelchar{%
      \string\ttfamily\space#1}\encapchar main}\@esphack}
\def\generalname{Général}
%%% fin de la francisation
\newcommand\DescribeOptionCle[1]{\@bsphack \marginpar{\raggedleft
    \OptionclePresent{#1}}\index{#1 (\textsc{clé})}\@esphack}
\newcommand\DescribeOptionVal[2]{\@bsphack \marginpar{\raggedleft
     \OptionvalPresent{#1}}\index{#1 [#2]}\@esphack}
\newcommand\IndexVal[2]{\index{#1 [#2]}}
\makeatother 
\newcommand\mlabel[1]{\phantomsection\label{macro#1}}
\newcommand\clabel[1]{\phantomsection\label{cle#1}}
\newcommand\Page[1]{page~\pageref{macro#1}}
\newcommand\Voir[1]{cf.~page~\pageref{macro#1}}
\newlength\xttlarge
\newcommand\Alinea[1][12]{\hspace*{#1\xttlarge}}
\newcommand\DonneMath{\framebox{\footnotesize\grastab{M}}\xspace}
\newcommand\CleVal[2]{\framebox{\footnotesize\texttt{[#1=#2]}}}
\newcommand{\CAD}{c.-à-d.\xspace}
\newcommand{\PX}{p.~ex.\xspace}
\newcommand{\TO}{\textemdash~\ignorespaces}
\newcommand{\TF}{\unskip~\textemdash\xspace}
\newcommand{\BOP}{\discretionary{}{}{}}
\newcommand{\Pkg}[1]{\texttt{#1.sty}}
\newcommand{\fctt}{\texttt{fr.comp.text.tex}\xspace}
\newcommand{\Sourire}{\texttt{;-)}\xspace}
\newcommand\OptionclePresent[1]{\texttt{\textbf{#1}}}
\newcommand\Optioncle[1]{\OptionclePresent{#1}}
\newcommand\OptionvalPresent[1]{\texttt{\textit{#1}}}
\newcommand\Optionval[2]{\OptionvalPresent{#1}\IndexVal{#1}{#2}}
\newcommand\SignalNouveau[1]{%
  \marginpar{\raggedleft\framebox{\textbf{N v#1}}\hspace*{2em}}}
\newcommand\Nouveau[3][***]{%
%  \SignalNouveau{#3}%
  \emph{#2}\footnote{Nouveauté de la version #3%
    \ifthenelse{\equal{#1}{***}}{.}{, #1}}}
%%% fin de la personalisation
\begin{document}
  \settowidth{\xttlarge}{\texttt{x}}
  \DocInput{tdsfrmath.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{1100}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \GetFileInfo{tdsfrmath.sty}
%
% \changes{v1}{2008/06/01}{1\iere version publique.}
% \changes{v1.1}{2008/08/11}{Correction de l'avertissement éronné en cas
% de chargement d'une police pour le gras de tableau.}
% \changes{v1.1}{2008/08/11}{Correction de l'oubli de la clé CharPoGdT
% dans l'exemple de chargement de dsfont}
% \changes{v1.1}{2008/08/11}{Changement du mécanisme de définition du
% gras de tableau pour permettre l'utilisation d'un gras \og
% normal\fg.} 
% \changes{v1.2}{2008/09/17}{Création de la clé
% \texttt{avecmathdesign} pour permettre l'utilisation de mathdesign.}
%
% \DoNotIndex{\newcommand,\newenvironment,\ae,\oe,\DeclareOption,^^A
%   \alpha, \beta, \gamma, \delta, \epsilon,^^A
%   \varepsilon, \zeta, \eta, \theta, \vartheta, \iota, \kappa,^^A
%   \lambda, \mu, \nu, \xi, \pi, \varpi, \rho, \varrho, \sigma,^^A
%   \varsigma, \tau, \upsilon, \phi, \varphi, \chi, \psi, \omega,^^A
%   \upalpha, \upbeta, \upgamma, \updelta, \upepsilon,^^A
%   \upvarepsilon, \upzeta, \upeta, \uptheta, \upvartheta, \upiota, \upkappa,^^A
%   \uplambda, \upmu, \upnu, \upxi, \uppi, \upvarpi, \uprho, \upvarrho, \upsigma,^^A
%   \upvarsigma, \uptau, \upupsilon, \upphi, \upvarphi, \upchi, \uppsi, \upomega,^^A
%   \Delta, \Gamma, \Theta, \Lambda, \Xi, \Pi, \Phi, \Psi \Sigma,^^A
%   \Upsilon, \ExecuteOptions, \providecommand, \newif,^^A  
%   \fi, \if, \or, \ifnum, \ifinner, \ifcase, \def, \expandafter,^^A
%   \RequirePackage, \@ctrerr, \ProcessOptions,\relax,^^A
%   \AtEndOfPackage, \AtBeginDocument,\,, \{, \}, \`, \',^^A 
%   \DeclareMathOperator, \InputIfFileExists,^^A 
%   \@ifstar, \@gobble, \@ifdefinable, \@nil,^^A 
%   \ifthenelse, \equal, \value,^^A 
%   \frac, \geqslant, \leqslant, \dfrac,\ast, \imath, \jmath, \binom,^^A 
%   \displaystyle, \ifx, \infty, \int, \langle, \left, \let, \llbracket,^^A 
%   \longmapsto, \longrightarrow, \lVert, \lvert, \MakeUppercase, \mathbb,^^A 
%   \mathscr, \MessageBreak, \mspace, \newtoks, \overrightarrow,^^A 
%   \PackageError, \PackageInfo, \PackageWarningNoLine, \partial, \rangle,^^A 
%   \renewcommand, \right, \rrbracket, \rVert, \rvert, \string, \the,^^A 
%   \varnothing, \xrightarrow, \xspace,^^A 
%   \text, \textup \csname, \endcsname, \value, \else, \Omega,^^A 
%   \ensuremath, \newcommandx, \@ifundefined, \edef, \long,^^A 
%   \DeclareRobustCommand,\IfFileExists, \ExecuteOptionsX,^^A  
%   \define@boolkey, \define@choicekey, \define@cmdkey,^^A 
%   \count, \count@, \mathcal, \newboolean, \newmcodes@,^^A 
%   \newmuskip, \ProcessOptionsX, \qopname, \setboolean,^^A 
%   \boolean, \textup, \WithSuffix, \ProvidesFile^^A 
%   }
% 
% \title{L'extension \textsf{tdsfrmath}\thanks{Ce document correspond
%        au fichier \textsf{tdsfrmath}~\fileversion, du \filedate.}}  
% \author{Le \TeX nicien de surface\thanks{%
%                 \texttt{le.texnicien.de.surface@wanadoo.fr}}}  
%
% \maketitle
%
% \begin{abstract}
%   Cette extension veut fournir des macros à \og l'utilisateur
%   final\fg pour créer des documents mathématiques ayant un aspect
%   français. 
% \end{abstract}
% \begin{otherlanguage}{english}
%   \begin{abstract}
%     This package provides a bunch of macros to help the ``final
%     user'' to produce maths texts with a definite french look. For
%     there is a marked aspect of localisation, I don't provide any
%     English documentation.   
%   \end{abstract}
% \end{otherlanguage}
% 
% \tableofcontents{}
% \newpage
%\section{Introduction}
%\label{secIntro}
% Le but de cette extension est de fournir des macros prètes à l'usage
% à des professeurs de mathématiques des collèges, lycées \TO et plus
% si affinités\TF qui voudraient bien utiliser \LaTeX\ sans trop
% mettre le nez dans la programmation ni devoir retenir des choses
% aussi barbares que \cs{overrightarrow} pour faire un vecteur
% \Sourire
% 
% De plus elle tente de donner aux mathématiques un aspect vraiment
% plus français. On aura par exemple \og \(\D x\)\fg au lieu de \og
% \(dx\)\fg dans les intégrales et les dérivées.
% 
% \Pkg{tdsfrmath} s'appuie lourdement sur \texttt{amsmath} qu'il
% requiert. On n'aura donc pas besoin de le charger avec un
% \cs{usepackage} si l'on utilise \texttt{tdsfrmath}.
% 
% \textbf{Remarque}: depuis la version~1.2, \texttt{amssymb} est
% utilisé si l'option
% \Optioncle{avecmathde}\BOP\OptionclePresent{sign} est fausse comme
% c'est le cas par défaut. 
% Si on utilise \Pkg{mathdesign}, on donnera la valeur
% \OptionvalPresent{true} à \Optioncle{avecmathdesign} et, dans ce
% cas, \texttt{amssymb} ne sera pas chargé. Voir la
% section~\ref{nouveau12}, page~\pageref{nouveau12}.
% 
% \medbreak
% 
% À l'origine de cette extension, je trouve un vieux fichier
% \texttt{.sty} que je m'étais concocté, par petits bouts, lorsque je
% sévissais encore dans le secondaire. Ayant appris un peu de \LaTeX\
% depuis, j'ai pensé à en améliorer les macros. J'ai aussi consacré
% quelques heures à la francisation de l'aspect, chose à laquelle je
% n'avais accordé que peu d'attention jusqu'ici car, je dois l'avouer,
% je m'étais beaucoup servi de \LaTeX\ pour produire des textes
% mathématiques en anglais. 
% 
% En tout cas, pour en rassurer certains qui pourraient considérer
% qu'ils ne pourraient jamais arriver à un tel niveau (\emph{sic})
% d'écriture de macros: ceci est le résultat de nombreuses heures
% étalées sur plus de 15~ans. Je dois par ailleurs remercier
% publiquement tous ceux qui sur \fctt ont répondu à mes questions,
% pas toujours très profondes d'ailleurs, et m'ont apporté une aide
% précieuse jusqu'aujourd'hui même dans l'utilisation de notre outil
% préféré de création de document.
% 
% \section{Utilisation}
% 
% Pour la première fois, plutôt que des options, j'utilise le système
% de clés et valeurs que permet \Pkg{xkeyval}. De même, j'utilise
% \Pkg{xargs} qui permet la définition de commandes admettant
% plusieurs arguments par défaut. 
% 
% Dans le cours du texte une clé est écrite \OptionclePresent{clé} et
% une valeur \OptionvalPresent{val}. Les clés dont les noms comportent
% des majuscules sont booléennes \CAD que leur valeur est soit
% \OptionvalPresent{true} \TO vrai\TF soit \OptionvalPresent{false}
% \TO faux. Les clés marquées \og choix\fg dans la
% table~\ref{TABcles}, page~\pageref{TABcles}, permettent de choisir
% entre quelques valeurs prédéfinies. D'autres enfin attendent un
% texte avec plus ou moins de restrictions suivant ce à quoi servira
% le texte.
% 
% J'ai amplement (\string?) commenté la partie contenant le code, et
% on s'y reportera pour les détails d'impémentation, mais je commence
% ici par présenter toutes les options et toutes les macros de cette
% extension.
% 
% \subsection{À propos des clés booléennes}
% 
% Nouveauté de la version 1.3. 
% 
% Les clés booléennes, comme \Optioncle{taupe} p.~ex., sont des clés
% qui n'admettent pour valeur que |true| ou |false|. L'extension
% \Pkg{xkeyval} me permet de leur donner une valeur \emph{par défaut}
% et une valeur \emph{d'origine}: la valeur d'origine est celle que
% possède la clé lorsque l'on charge \Pkg{tdsfrmath} sans aucune
% option avec |\usepackage|\BOP|{tdsfrmath}|. La valeur par défaut est
% celle que l'on obtient en mentionnant la clé sans lui donner de
% valeur comme avec |\usepackage|\BOP|[taupe]|\BOP|{tdsfrmath}| qui
% revient au même que |\usepackage|\BOP|[taupe| |=|
% |true]|\BOP|{tdsfrmath}| car la valeur par défaut de la clé
% \Optioncle{taupe} est \OptionvalPresent{true}. 
% 
% \subsection{Chargement optionnel}
%
% \Pkg{tdsfrmath} permet de charger du code de manière optionnelle. Ce
% code est placé dans des fichiers d'extension \texttt{.sto}, à
% savoir: \texttt{taupe.sto} contenant des macros destinée plutôt à
% une utilisation en classe prépa; \texttt{suite.sto} dont les macros
% ne traitent que des suites. 
% 
% \DescribeOptionCle{taupe}\clabel{taupe}
% À chacun de ces fichiers correspond une clé booléenne, de même nom,
% dont la valeur d'origine est \OptionvalPresent{false} ce qui
% \DescribeOptionCle{suite}\clabel{suite}
% entraine que ces fichiers ne sont pas chargés.
% 
% Si on veut utiliser les macros définies dans \texttt{taupe.sto}, on
% appelera \texttt{tdsfrmath} par:
% |\usepackage[taupe=true]{tdsfrmath}| ou encore avec
% |\usepackage|\BOP|[taupe]|\BOP|{tdsfrmath}| depuis la version
% 1.3\SignalNouveau{1.3} puisque la valeur par défaut de
% \Optioncle{taupe} est \OptionvalPresent{true}.
% 
% \bigbreak
% 
% Le fichier \texttt{taupe.sto} contient des définitions qui dépendent
% de la clé \Optioncle{ArgArcMaj} \TO
% \DescribeOptionCle{ArgArcMaj}\clabel{ArgArcMaj} \textbf{arg} et
% \textbf{arc} avec \textbf{maj}uscule\TF dont la valeur d'origine est
% \Optionval{false}{ArgArcMaj} ce qui entraine que les noms des
% fonctions circulaires et hyperboliques réciproques \TO comme
% \(\argch x\)\TF sont écrites en minuscule. En donnant la valeur
% \Optionval{true}{ArgArcMaj}, valeur par défaut, à la clé
% \Optioncle{ArgArcMaj}, ils prennent une majuscule \TO on a alors
% \(\operatorname{Argch}x\).
% 
% \subsection{Réglage de la police calligraphique}
% 
% Trois clés règlent le choix de la police calligraphique en mode
% mathématique. D'origine la clé booléenne \Optioncle{CharPoCal} \TO
% pour \OptionclePresent{Char}ger
% \DescribeOptionCle{CharPoCal}\clabel{CharPoCal} une
% \OptionclePresent{Po}lice \OptionclePresent{Cal}ligraphique\TF est
% \OptionvalPresent{true} ce qui permet de définir la police
% calligraphique pour remplacer \cs{mathcal} qui serait celle que l'on
% obtiendrait si \Optioncle{CharPoCal} avait la valeur
% \OptionvalPresent{false}.
% 
% Lorsque \Optioncle{CharPoCal} vaut \OptionvalPresent{true} \TO ce
% qui est également sa valeur par défaut \TF, il faut définir les clés
% \Optioncle{calpack} et \Optioncle{calcomd}.
% 
% La clé \Optioncle{calpack}, qui contient
% \DescribeOptionCle{calpack}\clabel{calpack}
% \OptionvalPresent{mathrsfs} par défaut, prend pour valeur le nom,
% sans l'extension \texttt{sty}, d'un module donnant accès à une
% \DescribeOptionVal{mathrsfs}{calpack}
% police calligraphique, \PX, \texttt{mathrsfs} ou \texttt{eucal}.
% 
% La clé \Optioncle{calcomd}, qui contient
% \DescribeOptionCle{calcomd}\clabel{calcomd}
% \OptionvalPresent{mathscr} par défaut, prend pour valeur le nom
% d'une macro \textbf{sans} la barre oblique initiale. C'est la macro
% \DescribeOptionVal{mathscr}{calcomd}
% permettant de \emph{passer} en police calligraphique. L'extension
% \Pkg{mathrsfs} contient bien la macro \cs{mathscr}. 
% 
% \bigbreak
% 
% En résumé, si l'on veut utiliser le \cs{mathcal} tel que proposé par
% \LaTeX\ plus \Pkg{amsmath}, on chargera: 
% 
% \noindent|\usepackage[CharPoCal=false]{tdsfrmath}|
% 
% \noindent\TO ce que l'on fera également pour utiliser \Pkg{fourier}
% si on veut bénéficier de la redéfinition de \cs{mathcal} qu'opère
% cette extension \TF et si l'on veut utiliser \Pkg{eucal} et sa
% commande \cs{mathcal} \TO eh oui! cette extension redéfinit
% \cs{mathcal}\TF il faudra
% 
% \noindent|\usepackage[calpack=eucal,|
% |cal|\BOP|comd=|\BOP|math|\BOP|cal]|\BOP|{tdsfrmath}| 
% 
% \noindent on remarquera que |CharPoCal=true| n'est pas nécessaire
% puisque c'est la valeur par défaut.
% 
% Si nécessaire, on peut passer une option à l'extension \emph{passée}
% à \Optioncle{calpack}, en renseignant la clé \Optioncle{caloptn}
% \DescribeOptionCle{caloptn}\clabel{caloptn}
% comme dans, \PX
% 
% \noindent|\usepackage[calpack=euscript,|\\
% \Alinea |caloptn=mathcal,|\\
% \Alinea |calcomd=mathcal]{tdsfrmath}|
% 
% \noindent dans lequel on remarquera qu'il faut bien donner une
% valeur à \Optioncle{calcomd} comme je l'ai déjà écrit
% ci-dessus.
% 
% \texttt{Remarque}: j'ai introduit dans la version 1.2 une clé
% permettant d'utiliser conjointement \Pkg{tdsfrmath} et
% \Pkg{mathdesign}, cf.~\pageref{nouveau12}. Dans ce cas, les clés
% \Optioncle{CharPoCal}, \Optioncle{calpack}, \Optioncle{caloptn} et
% \Optioncle{calcomd} sont ignorées donc inutiles.
% 
% \bigbreak
% 
% \DescribeMacro{\manus} Dans tous les cas, on accède à la police
% calligraphique avec la macro \cs{manus}, à un seul argument
% obligatoire, qui est définie de telle sorte que l'on puisse saisir
% \og |et dans \manus{c} on trouve|\fg pour obtenir \og et dans
% \manus{c} on trouve\fg.
% 
% \subsection{Réglage de la police \og gras de tableau\fg}
% 
% Par défaut, le \og gras de tableau\fg (\emph{blackboard bold}) est
% celui de \LaTeX\ plus \Pkg{amsmath} \CAD \(\mathbb{G}\). Il en
% existe bien d'autres versions que l'on trouvera dans le fameux
% \texttt{symbols-a4.pdf} disponible généralement dans votre
% distribution, et donc sur votre disque, dans
% \texttt{texmf-doc/doc/english/comprehensive/}.
% 
% Pour permettre de redéfinir la police du gras de tableau, je fournis
% un mécanisme similaire à celui qui précède. On utilisera alors la
% macro \cs{grastab} pour obtenir le \og gras de tableau\fg choisi. 
% 
% La clé booléenne \Optioncle{CharPoGdT} \TO pour
% \OptionclePresent{Char}ger
% \DescribeOptionCle{CharPoGdT}\clabel{CharPoGdT} une
% \OptionclePresent{Po}lice \OptionclePresent{G}ras
% \OptionclePresent{d}e \OptionclePresent{T}ableau\TF vaut
% \OptionvalPresent{false} à l'origine mais a \OptionvalPresent{true}
% pour valeur par défaut.
% 
% En fixant \Optioncle{CharPoGdT} à \OptionvalPresent{true}, on peut
% \DescribeOptionCle{gdtpack}\clabel{gdtpack}
% définir la clé \Optioncle{gdtpack} en lui donnant le nom de l'extension
% qui fournira le gras désiré, on peut éventuellement lui passer une
% \DescribeOptionCle{gdtoptn}\clabel{gdtoptn}
% option avec \Optioncle{gdtoptn} et, toujours éventuellement, fixer
% \Optioncle{gdtcomd} avec le nom de la macro désirée \TO toujours
% sans barre oblique inverse\TF seulement, cette fois, du fait du
% \DescribeOptionCle{gdtcomd}\clabel{gdtcomd}
% choix de la valeur par défaut de \Optioncle{gdtcomd}, on n'aura pas
% besoin de fixer la valeur de \Optioncle{gdtcomd} si la macro est
% encore \cs{mathbb}.
% 
% Voici ce que l'on écrira pour obtenir le gras de tableau tel que
% fournit par \Pkg{dsfont} avec l'option \texttt{sans} et la commande
% \cs{mathds} \TO tous les goûts sont dans la nature \TF
% 
% \noindent|\usepackage[CharPoGdT=true,| |gdtpack=dsfont,| |gdtoptn=sans,|\\
% \Alinea |gdtcomd=mathds]{tdsfrmath}|%
% 
% \noindent ou encore: 
% 
% \noindent|\usepackage[CharPoGdT,| |gdtpack=dsfont,| |gdtoptn=sans,|\\
% \Alinea |gdtcomd=mathds]{tdsfrmath}|%
% 
% \noindent et \cs{grastab} donnera ce que l'on voit dans
% \texttt{symbols-a4.pdf}. 
% 
% On peut également\footnote{Ce changement à lui seul justifie le
%   passage à la version 1.1. C'est à la demande générale de Maxime
%   \textsc{Chupin} sur \texttt{fctt} que je procède à la redéfinition
%   du mécanisme du choix du gras de tableau \Sourire}, lorsque la clé
% \Optioncle{CharPoGdT} vaut \OptionvalPresent{true} ne pas définir la
% clé \Optioncle{gdtpack} mais définir la clé \Optioncle{gdtcomd}
% comme précédemment. Ce mécanisme permet d'utiliser \PX le gras \og
% normal\fg pour le \og gras de tableau\fg avec
% 
% \noindent|\usepackage[CharPoGdT=true,| |gdtcomd=textbf]{tdsfrmath}|
% 
% \noindent ou encore: 
% 
% \noindent|\usepackage[CharPoGdT,| |gdtcomd=textbf]{tdsfrmath}|
% 
% \noindent et on aura alors, \PX, \(\textbf{R}\) avec |\R|. 
% 
% \bigbreak
% 
% \DescribeMacro{\grastab} La macro \cs{grastab} prend également un
% seul argument obligatoire. Elle ne passe pas son argument en
% majuscule car certaines extensions fournissent aussi des minuscules
% en gras de tableau. Cependant elle assure le mode mathématique. On
% peut donc saisir \og |et comme \grastab{M} est unifère|\fg pour
% obtenir \og et comme \grastab{M} est unifère\fg.
% 
% \subsection{Utilisation de \Pkg{tdsfrmath} avec \Pkg{mathdesign}}
% \label{nouveau12}
% 
% À la demande d'un utilisateur\footnote{Eh oui! C'est encore Maxime
% \textsc{Chupin}. Si vous aussi, vous voulez voir votre nom dans
% cette documentation, n'hésitez pas à me faire part de vos
% désidératas. Sait-on jamais, vous pourriez motiver le passage à la
% version suivante \Sourire} de \Pkg{mathdesign} qui voulait
% pouvoir utiliser \Pkg{tdsfrmath} j'ai passé cette extension à la
% version~1.2 dans laquelle j'introduis un mécanisme plutôt
% simplissime pour assurer la cohabitation la plus harmonieuse
% possible entre ces deux extensions.
% 
% La clé booléenne \Optioncle{avecmathdesign}\label{avecMD} vaut
% \Optionval{false}{avecmathdesign} à l'origine.
% \DescribeOptionCle{avecmathdesign} Lorsqu'on lui donne, au
% chargement de \Pkg{tdsfrmath}, la valeur \OptionvalPresent{true} \TO
% qui est sa valeur par défaut \TF, on n'a plus besoin de spécifier
% quoique ce soit concernant la police calligraphique car
% \Pkg{tdsfrmath} se repose entièrement sur \Pkg{mathdesign} qu'il
% faut charger explicitement avec \cs{usepackage} en lui passant les
% options adéquates comme l'explique le manuel \TO
% \texttt{mathdesign-doc.pdf}\TF de l'extension.
% 
% Cette option ne change rien au mécanisme de gestion du gras de
% tableau. C'est dû au fait agréable que la macro de \Pkg{mathdesign}
% qui crée le gras de tableau s'appelle également \cs{mathbb} ce que
% \Pkg{tdsfrmath} considère comme la valeur par défaut. Cela permet de
% répondre à moindre frais aux deux demandes de Maxime
% \textsc{Chupin}. 
%  
% \subsection{Des n-uplets, de leur saisie et de leur présentation}
% 
% La clé \Optioncle{nupletsep}
% \DescribeOptionCle{nupletsep}\clabel{nupletsep} peut prendre la
% valeur \Optionval{virgule}{nupletsep}, qui est le réglage par
% défaut, ou \Optionval{pointvirgule}{nupletsep}. Toute autre valeur
% provoque un avertissement et on se retrouve avec le réglage par
% défaut.
% 
% Le réglage par défaut\DescribeOptionVal{virgule}{nupletsep},
% \Optionval{virgule}{nupletsep} compose les \(n\)-uplets comme ceci:
% \nuplet{a b}. Avec l'autre réglage possible
% \Optionval{pointvirgule}{nupletsep}, on aurait \((a\,\string;\,
% b)\). J'ai longtemps utilisé cette dernière\footnote{Pour tout dire,
%   à l'époque, mon fichier de macros ne ressemblait à celui-ci que de
%   très loin mais on apprend avec l'age \TO au moins pendant un
%   moment.} pour écrire des textes à destination des élèves du
% secondaire car on est souvent amené à utiliser des nombres décimaux
% et, dans ce cas, le mélange de virgule ne m'a jamais paru très
% heureux.
% 
% \bigbreak
% 
% La macro \cs{TdSMnuplet} \DescribeMacro{\TdSMnuplet}prend un
% argument obligatoire qui est une liste dont les éléments sont
% séparés par des espaces. Avec \og |\TdSMnuplet{a b c d}|\fg on
% obtient \og \TdSMnuplet{a b c d}\fg. C'est une macro auxiliaire
% aussi lui ai-je donné un nom qui commence par |TdSM| mais elle peut
% reservir, directement ou dans la définition d'une commande dont je
% n'ai pas vu l'utilité, aussi je n'ai pas mis de |@| dans son nom.
% 
% La macro \emph{ordinaire} est \cs{nuplet}.\DescribeMacro{\nuplet}
% Avec elle on obtient la présentation \emph{classique} des
% \(n\)-uplets: |\nuplet{a b 3 c 8}| compose \nuplet{a b 3 c 8}.
% 
% La définition de \cs{TdSMnuplet} permet de coder
% \verb*|\nuplet{ a b}| pour \nuplet{ a b}.
% 
% Bien entendu, comme d'habitude, on ne peut avoir le beurre et
% l'argent d'icelui. On peut coder 
% \verb*|\nuplet{ a\times b+c a\cap b}| pour obtenir \nuplet{ a\times
% b+c a\cap b} mais avec 
% \verb*|\nuplet{ a + b + c }| on aura \nuplet{ a + b + c }. Vous êtes
% prévenus! \Sourire%
% 
% En fait, la présentation obtenue avec \cs{nuplet} repose sur
% \cs{EncloreExtensible} \DescribeMacro{\EncloreExtensible} dont la
% syntaxe est: 
% 
% \noindent\cs{EncloreExtensible}\oarg{md}\marg{délim-gauche}\BOP%
% \marg{délim-droite}\marg{texte}
% 
% \noindent\meta{md} vaut |1| par défaut, s'il vaut |0| les
% mathématiques sont composées en mode hors-texte \TO
% \cs{displaystyle}.  Je sais bien que c'est une mauvaise pratique,
% que ça bousille l'interligne, que ça fiche en l'air l'uniformité du
% gris typo, \&c. \textsc{mais}, hélas, parfois, c'est bien
% utile. Alors je le permets mais avec \(0\) qui rappelle ce qu'il
% faut penser d'une telle pratique \Sourire.
% 
% \meta{délim-gauche} est quelque chose qui peut être précédé de
% \cs{left} comme |(| ou |\Vert|, \meta{délim-droite} est quelque
% chose qui peut être précédé de \cs{right} comme |)| ou |\Vert|, Si
% on ne veut rien de visible à gauche ou à droite, il faut que le
% 1\ier ou le 2\ieme argument obligatoire soit un
% point. \meta{texte} est ce qui sera placé entre les délimiteurs,
% en mode mathématique.
% 
% \bigbreak
% 
% La macro \cs{EncloreExtensible} nous place en mode mathématique. 
% 
% En voici un exemple un rien bête: 
% \cs{EncloreExtensible}\BOP|{(}|\BOP|{\rangle}|\BOP|{x^{2}}| produit
% \EncloreExtensible{(}{\rangle}{x^{2}}. 
% 
% Le comportement des délimiteurs varient suivant qu'on est \TO de
% manière forcée par l'argument optionnel ou de manière
% \emph{naturelle} parce que l'on est dans une formule composée
% hors-texte\TF en mode mathématique hors-texte ou en mode
% mathématique en ligne. Dans le 1\ier cas, les délimiteurs sont
% extensibles, dans le second ils ne le sont pas. On verra plus bas,
% \Page{repere}, le rendu des parenthèses dans la macro \cs{repere}.
% 
% Cette macro \cs{EncloreExtensible} me sert à en définir plusieurs
% autres que voici. Toutes ont la même syntaxe: 
% 
% \noindent\cs{Macro}\oarg{md}\marg{texte}
% 
% \noindent où \meta{md} et \meta{texte} \DescribeMacro{\parent} ont
% le même sens que ci-dessus. Ce sont \cs{parent} pour obtenir des
% parenthèses, \cs{accol} pour des accolades \DescribeMacro{\accol} et
% \cs{crochet} pour des \dots\ oui, des crochets! Voici, \PX,
% |\parent{a}| qui produit \parent{a}; |\accol{\vide}| qui produit
% \accol{\vide}; \DescribeMacro{\crochet} |\crochet{8\cdot9}| qui
% produit \crochet{8\cdot9}.
% 
% Dans le même genre, on a \cs{varabs} pour obtenir la valeur absolue
% comme ici: \DescribeMacro{\varabs} \varabs{-12} codé |\varabs{-12}|.
% 
% Dans la même veine, toujours, \cs{norme} pour écrire la norme comme
% suit: \DescribeMacro{\norme} \norme{\vecti} codé |\norme{\vecti}|.
% 
% \bigbreak
% 
% Revenons aux \(n\)-uplets. Les macros qui les produisent acceptent,
% elles aussi, toutes un argument optionnel qui force le mode
% hors-texte quand il vaut |0|.
% 
% \DescribeMacro{\nuplet} On obtient, comme déjà vu ci-dessus,
% \nuplet{c d} avec \verb*|\nuplet{c d}| \TO j'insiste sur l'espace,
% non?\TF et avec \verb*|\anuplet{c d}| on a \anuplet{c d}. Cette
% \DescribeMacro{\anuplet}
% dernière doit son nom à ce qu'elle utilise des \textbf{a}ccolades.
% 
% Toutes les deux, comme je l'ai déjà signalé, peuvent traiter
% un\label{nupletrem} nombre quelconque d'arguments séparés par des
% espaces comme, \PX, \anuplet{a b c d e f} obtenu avec 
% |\anuplet{a b c d e f}|. 
% Il faut toutefois remarquer que si l'on veut utiliser
% un macro à l'intérieur, \PX \cs{alpha}, il faudra la faire suivre ou
% l'entourer d'une paire d'accolades pour préserver l'espace, sinon
% c'est l'erreur assurée et \TeX\ proférera une de ces habituelles
% remarques absconces \Sourire
% 
% On codera donc |\nuplet{a \alpha{} \beta}| pour obtenir \nuplet{a
%   \alpha{} \beta}. Mais, coquèterie d'auteur, je me suis arrangé
% pour que l'on puisse coder directement |\nuplet{a §a §b}| pour avoir
% {\ActiveLaParesse\nuplet{a §a §b}} lorsque l'extension
% \Pkg{paresse}, de votre serviteur, est chargée.
% 
% Avec |\nuplet{\frac{1}{2} \frac{3}{4}}| on produit
% \nuplet{\frac{1}{2} \frac{3}{4}}.
% 
% \bigbreak
% 
% Je ne suis pas allé plus loin car je pense que je couvre largement
% les besoins du secondaire avec tout ça. Qui voudrait obtenir
% une macro du même genre, pourra toujours la définir à l'aide de
% \cs{EncloreExtensible}  et \cs{TdMnuplet} qui font le travail
% principal.  
% 
% Cependant, je fournis la macro \cs{rnuplet}, prévue pour être
% utilisée dans le cas de l'écriture d'une fonction, \PX En effet,
% elle précède la composition du \(n\)-uplet d'une espace négative ce
% qui a pour effet de rapprocher la première parenthèse de ce qui
% précède. Comparer \(f\rnuplet{x y}\), obtenu avec 
% |\(f\rnuplet{x y}\)|, à \(f\nuplet{x y}\), |\(f\nuplet{x y}\)|, 
% et à \(f\rnuplet{x y}[5]\), |\(f\rnuplet{x y}[5]\)|.
% 
% \DescribeMacro{\rnuplet}
% Cette macro  a pour syntaxe 
% 
% \noindent\cs{rnuplet}\oarg{md}\marg{texte}\oarg{écart}
%
% \noindent le seul argument nouveau est \meta{écart} qui règle
% l'espacement entre ce qui précède la macro et la parenthèse. Par
% défaut cet argument vaut \cs{TdSMReculParenthese} dont la valeur
% est~\(-2\), \meta{écart} doit être un nombre. 
% 
% Le |r| est là pour faire penser (\string?) à \emph{recul}.
% 
% On pourrait donc écrire mais, bien sûr, on \textbf{ne le fera pas}, 
% |\(f|\BOP|\rnuplet|\BOP|[0]|\BOP|{\frac{1}|\BOP|{2}|
% |3}|\BOP|[10]|\BOP|\)| pour obtenir l'horreur: 
% \(f\rnuplet[0]{\frac{1}{2} 3}[10].\) 
% 
% \vspace{\baselineskip}
% 
% \DescribeMacro{\TdSMReculParenthese}\mlabel{TdSMReculParenthese}
% C'est la macro qui fixe, de manière générale, l'espace entre le
% texte qui précède et la parenthèse \TO ou délimiteur équivalent\TF
% ouvrante. On peut la redéfinir avec \cs{renewcommand}. 
% 
% \textsf{Remarque}:  Elle n'est pas \emph{secrète} donc son nom ne
% comporte pas de |@| mais on n'est pas sensé l'utiliser toutes les
% trois secondes d'où les capitales. C'est la convention
% générale\footnote{Il faut prendre ces conventions pour ce qu'elles
% sont et on n'aurait pas trop de peine à trouver des exceptions à
% cette \emph{règle}, exceptions qui ne survivent que par la force de
% l'habitude.} de nommage des macros.
% 
% \subsection{De la définition des ensembles}
% 
% Je fournis la macro \cs{ensemble}, \Voir{ensemble}, qui permet
% d'écrire, \PX, \og \ensemble{x\in\R}{x^{2}\pgq 2}\fg avec
% \DescribeOptionCle{SepDefEnsExt}\clabel{SepDefEnsExt}
% |\ensemble|\BOP|{x\in\R}|\BOP|{x^{2}\pgq 2}|. Le rendu en est
% controllé par la clé \Optioncle{SepDefEnsExt} \TO
% \DescribeOptionVal{true}{SepDefEnsExt}
% \textbf{sép}arateur de la \textbf{déf}inition d'un \textbf{ens}emble
% \textbf{ext}ensible\TF qui vaut \Optionval{true}{SepDefEnsExt} par
% défaut. Par ailleurs, la macro \cs{TdSMsepdefens} contient le
% \DescribeMacro{\TdSMsepdefens}\mlabel{TdSMsepdefens}
% séparateur et peut-être redéfinie à l'aide d'un \cs{renewcommand}.
% 
% Si, comme c'est le cas à l'origine et par défaut, la clé
% \Optioncle{SepDefEnsExt} vaut \Optionval{true}{SepDefEnsExt}, la
% définition de \cs{TdSMsepdefens} doit être \emph{quelque chose}
% supportant l'action de \cs{middle} \TO qui est à un délimiteur
% central ce que \cs{left} et \cs{right} sont à ceux de gauche et
% droite\TF comme, \PX, \cs{vert}. Ce qui fait que si l'on veut un
% séparateur qui ne supporte pas cela, comme |:|, les deux-points, il
% faut passer explicitement la valeur \OptionvalPresent{false} à la
% clé \Optioncle{SepDefEnsExt}.
% 
% \subsection{Des noms des ensembles classiques}
% 
% Il s'agit ici des macros qui permettent d'obtenir \R et \Q[*] ou
% encore \C[-3]. 
% 
% \DescribeMacro{\TdSM@Decoration} Cette macro \emph{secrète} place
% les étoiles et signe plus ou moins, ce que j'appelle ici la
% décoration du nom de l'ensemble. Par défaut on a \R[*+] mais cette
% disposition est controlée par la clé
% \DescribeOptionCle{ensdeco}\clabel{ensdeco} \Optioncle{ensdeco} qui
% peut prendre les valeurs \Optionval{ehsb}{ensdeco},
% \Optionval{ehsh}{ensdeco}, \Optionval{sheh}{ensdeco},
% \Optionval{ebsb}{ensdeco}, \Optionval{sbeb}{ensdeco} et
% \Optionval{ebsh}{ensdeco}.
% 
% \DescribeOptionVal{ebsh}{ensdeco}
% Par défaut, on a |[ensdeco=ebsh]|. Toute autre valeur provoque un
% avertissement et on se retrouve avec le réglage par défaut.
% 
% La valeur par défaut \Optionval{ehsb}{ensdeco} place
% l'\OptionclePresent{é}toile en \OptionclePresent{h}aut et le
% \OptionclePresent{s}igne en \OptionclePresent{b}as. On pourra
% retenir que, quand l'ordre importe peu, on commence par l'étoile
% d'où \Optionval{ehsb}{ensdeco} et \Optionval{ebsh}{ensdeco} et que,
% sinon, l'ordre d'apparition de \OptionvalPresent{e} et
% \OptionvalPresent{s} règle la place de l'étoile \(\ast\) et du
% signe.
% 
% Grace au mécanisme de \cs{define@choice*+} de l'extension
% \texttt{xkeyval}, on pourra passer les valeurs en capitales. Donc
% |[ensdeco=EHSB]| est une écriture valide.
% 
% \medbreak
% 
% \DescribeMacro{\TdSM@PlaceSigne} Cette macro tout aussi
% \emph{secrète} place le signe plus ou moins quand il est seul. Par
% défaut on a \R[+] mais cette disposition est controlée par la clé
% \DescribeOptionCle{placesigne}\clabel{placesigne}
% \Optioncle{placesigne} qui peut prendre les valeurs
% \Optionval{haut}{placesigne} et \Optionval{bas}{placesigne}.
% 
% \DescribeOptionVal{haut}{placesigne} Par défaut, on a
% |[placesigne=haut]|. Toute autre valeur provoque un avertissement et
% on se retrouve avec le réglage par défaut.
% 
% 
% \bigbreak
% 
% \DescribeMacro{\EnsembleDeNombre} Cette macro fait le gros boulot de
% composition.\SignalNouveau{1.3} Elle prend 4~arguments obligatoires:
% le 1\ier donne la lettre majuscule symbolisant l'ensemble comme \og
% R\fg pour \R; le \DescribeMacro{\C} comportement de la macro varie
% suivant que le 2\ieme est égal à \(1\), \Nouveau{est égal
%   à~\(0\)}{1.3}, l'une de ces sept chaines de caractères |*|, |+|,
% |-|, \DescribeMacro{\N} |*+|, |+*|, |-*| et |-*| \TO ou
% \Nouveau{sinon suivant qu'il commence par un signe moins ou
%   pas}{1.3}. C'est ce qui permet d'obtenir plus tard, \PX, \Q[+*]
% avec |\Q[+*]|\TF; le 3\ieme argument est utilisé \DescribeMacro{\Q}
% pour dénoter les ensembles de polynômes comme \C[-3] et dans ce cas
% le 2\ieme doit commencer par un signe moins; enfin le 4\ieme doit
% être un \DescribeMacro{\R} entier qui donne le nombre de |mu| \TO
% unité de longueur spécifique \DescribeMacro{\Z} au mode
% mathématique\TF qui séparent la majuscule du crochet ouvrant.
% 
% Je rappelle au passage que |mu| \TO pour \emph{maths unit}\TF est
% une unité de longueur définie uniquement en mode mathématique. Elle
% vaut 1/18 d'un |em| qui est \TO approximativement\TF la largeur d'un
% M dans la fonte courante.
% 
% Avec la version 1.3\SignalNouveau{1.3} j'opère un changement de
% doctrine! Si le 2\ieme argument n'est pas |*|, |+|, |-|, |*+|, |+*|,
% |-*|, |-*|, |0| ou |1|, la seule chose qui compte est de savoir s'il
% commence par un signe \og \(-\)\fg ou pas. Ce qui fait que |\R[--4]|
% donne désormais le (douteux?) \R[--4]. Toutefois, on a maintenant
% \R[n] avec |\R[n]| et \R[-m] avec |\R[-m]| et c'est bien cela dont
% j'avais besoin ces derniers temps! On peut même laisser des blancs
% devant le signe moins: \verb*+\R[ -3]+ donne \R[ -3] grâce à une
% réponse de Manuel \textsc{Pégourié-Gonnard} sur \fctt.
% 
% Comme il serait fastidieux d'avoir à taper
% \cs{EnsembleDeNombre}\BOP|{N}|\BOP|{1}|\BOP|{}|\BOP|{}| pour obtenir
% simplement \N, je fournis maintenant des commandes courtes
% auxquelles j'ai déjà fait allusion ci-dessus. Ce sont \cs{N}
% pour~\N, \cs{Z} pour~\Z, \cs{Q} pour~\Q, \cs{R} pour~\R, \cs{C}
% pour~\C et, enfin, si on a passé la valeur \Optionval{true}{taupe} à
% la clé \Optioncle{taupe}, \cs{K} pour~\K.
% 
% \bigbreak
% 
% Je ne fournis pas \cs{D} pour les décimaux car, d'une part, je doute
% finalement de l'utilité de cet ensemble et, d'autre part, je réserve
% cette macro pour plus tard.
% 
% \bigbreak
% 
% J'utilise ici, avec beaucoup de satisfactions, l'extension
% \Pkg{xargs} afin que ces macros prennent deux arguments optionnels
% qui fourniront, dans l'ordre, les 2\ieme et 3\ieme arguments de
% \cs{EnsembleDeNombre}. Par défaut, le 1\ier argument vaut~|1| et le
% 2\ieme~|X|. 
% 
% Voici toutes les façons d'utiliser \cs{R}, \PX, et ce qu'elles
% produisent: 
% \begin{itemize}\mlabel{nomsens}
% \item |\R| donne \R;
% \item |\R[*]| donne \R[*];
% \item |\R[+]| donne \R[+];
% \item |\R[-]| donne \R[-];
% \item |\R[+*]| ou |\R[*+]| donne \R[+*];
% \item |\R[-*]| ou |\R[*-]| donne \R[-*];
% \item |\R[1]| donne \R[1];
% \item |\R[5]| donne \R[5];
% \item |\R[n]| donne \R[n];
% \item |\R[0]| donne \R[0];
% \item |\R[-6]| donne \R[-6];
% \item |\R[-m]| donne \R[-m];
% \item |\R[-6][Y]| donne \R[-6][Y]. 
% \end{itemize}
% On notera que l'on ne peut pas donner le 2\ieme argument optionnel
% sans donner d'abord le premier.
% 
% \bigbreak
% 
% Cependant, pour des raisons que l'on peut voir \Page{suite*} à
% propos de \cs{suite*}, je fournis quelques macros supplémentaires
% qui, du coup, peuvent abréger la saisie. 
% 
% \DescribeMacro{\R*} \cs{N}, \cs{Z}, \cs{Q}, \cs{R} et \cs{C} ont une
% forme étoilée qui fait la même chose que la macro avec une |*| pour
% 1\ier argument. On aura donc, \PX, \N* avec |\N*| comme avec
% |\N[*]|. Il en est de même avec \cs{K} si \texttt{taupe.sto} est
% chargé.
% 
% \DescribeMacro{\R+} \cs{Q} et \cs{R} ont une forme
% \emph{plussée} et une forme \emph{moinsée} qui font, respectivement,
% la même chose que \DescribeMacro{\R-} la macro avec |+| et |-| pour
% 1\ier argument optionnel. On aura donc, \PX, \Q+ avec |\Q+| comme
% avec |\Q[+]| et \R- avec |\R-| comme avec |\R[-]|.\mlabel{plusse}
% 
% \DescribeMacro{\R>} \cs{R} bénéficie de deux autres raccourcis, à
% savoir \cs{R>} qui produit \R> \CAD la même chose que |\R[+*]|
% \DescribeMacro{\R<} et \cs{R<} qui produit \R< \CAD comme |\R[-*]|.
% Si l'on veut définir d'autres raccourcis du même genre on pourra
% regarder le code page~\pageref{suffixe}.
% 
% Toutefois, si pour une raison quelconque, on voulait \og \(\Q{} +
% \Q\)\fg on devra coder |\(\Q{} + \Q\)|. Il arrive que certaines
% épines aient des roses\dots
% 
% À la demande\SignalNouveau{1.3} de Maxime Chupin, on dispose
% désormais de la macro |\R/| qui donne \R/ et |\R/+| qui donne \R/+.
% 
% \subsection{Des vecteurs, des bases et des repères}
% \label{SSECvecteursutil}
%
% \DescribeMacro{\definirvecteur}\mlabel{definirvecteur}
% Cette macro permet, comme son nom l'indique presque, de définir 
% des macros qui produisent des vecteurs. Sa syntaxe est: 
% 
% \noindent\cs{definirvecteur}\oarg{bb}\BOP\marg{a}\BOP%
% \marg{n}\BOP\marg{m} 
% 
% Avec \cs{definirvecteur}\BOP\marg{a}\BOP\marg{n}\BOP\marg{m} on
% obtient une macro qui s'appelle \cs{vecta} et qui produit, en se
% plaçant dans le mode mathématique, la lettre |a| surmontée de la
% flèche que donne \cs{overrightarrow} avec un décalage de |n|~|mu|s
% devant et |m|~|mu|s derrière le texte.
% 
% L'argument optionnel \meta{bb} permet d'obtenir le nom
% \cs{vectbb} ce qui est indispensable quand le 1\ier argument
% obligatoire est lui-même une macro comme \PX \cs{imath}.
% 
% Cette macro fait appel à \cs{TdSM@fairevecteur} décrite
% \Page{TdSMAfairevecteur}.
% 
% \DescribeMacro{\redefinirvecteur}\mlabel{redefinirvecteur}
% Elle teste l'existence d'une macro du même nom et produit une erreur
% s'il en existe déjà une. Si l'on veut redéfinir une commande comme
% \cs{vecti}, on utilisera \cs{redefinirvecteur} qui a la même syntaxe
% que sa grande s½ur et qui, elle, produira une erreur si on tente de
% redéfinir un vecteur qui ne l'est pas encore.  
% 
% \bigbreak
% 
% \DescribeMacro{\vecti}
% Grâce à \cs{definirvecteur}, je définis quelques vecteurs courants
% \DescribeMacro{\vectj}
% et utiles: \cs{vecti} \vecti; \cs{vectj} \vectj; \cs{vectk} \vectk; 
% \DescribeMacro{\vectk}
% \cs{vectu} \vectu et enfin \cs{vectv} \vectv.  
% 
% On pourra comparer la composition que permet d'obtenir
% \DescribeMacro{\vectu}
% \cs{TdSM@faire}\BOP|vec|\BOP|teur|, à l'aide des 2\ieme et 3\ieme
% arguments qui 
% \DescribeMacro{\vectv}
% définissent un nombre de |mu|s, avec ce que donne une composition
% directe comme ici: \vecti obtenu avec |\vecti| et
% \(\overrightarrow\imath\) produit par |\(\overrightarrow\imath\)|. 
% 
% \bigbreak
% 
% \DescribeMacro{\vecteur}\mlabel{vecteur}
% Cette macro peut être suivie par une étoile. Elle prend un argument
% optionnel, valant |1| par défaut, qui détermine l'espace placé
% devant le texte sous la flèche.
% 
% Elle prend un argument obligatoire qui donne le \meta{texte} qui
% sera placé sous la flèche du vecteur. Avec la version sans étoile,
% le texte est composé \emph{normalement} en mode mathématique comme
% dans \vecteur{AB} produit par |\vecteur{AB}|. Avec la version
% étoilée le texte est en caractères romains, ou, plus exactement, est
% composé dans la police en vigueur pour l'argument de \cs{text} de
% l'extension \Pkg{amstext}, chargée ici par l'intermédiaire de
% \Pkg{amsmath}. On a donc \vecteur*{CD} avec |\vecteur*{CD}|.
% 
% Enfin, le troisième argument, optionnel, règle l'espace
% supplémentaire, toujours en nombre de |mu|s, qui suit le
% texte. Comparez 
% \vecteur{AB} produit par |\vecteur{AB}| avec 
% \vecteur[10]{AB} produit par |\vecteur[10]{AB}|, 
% \vecteur{AB}[20] produit par |\vecteur{AB}[20]| et 
% \vecteur[10]{AB}[20] produit par |\vecteur[10]{AB}[20]|. 
% 
% \DescribeMacro{\V}
% Ce n'est qu'un raccourci de \cs{vecteur}. Il a donc la même syntaxe:
% 
% \noindent\cs{V}|*|\oarg{espace-avant}\marg{texte}\oarg{espace-après}
% 
% où \meta{espace-avant} et \meta{espace-après} sont des nombres.
% 
% \bigbreak
% 
% \DescribeMacro{\base}\mlabel{base}
% La macro \cs{base} admet un seul argument, optionnel, qui ne doit
% prendre que les valeurs |1|, |2| \TO valeur par défaut\TF ou |3|. On
% obtient alors \base[1] avec |\base[1]|, \base avec |\base| ou
% |\base[2]|, \base[3] avec |\base[3]|. 
% 
% \bigbreak
% 
% \DescribeMacro{\repere}\mlabel{repere}
% La macro \cs{repere} fournit un repère à la française. Elle est
% construite sur \cs{base} et son 1\ier argument optionnel a le même
% rôle que celui de \cs{base}. Le 2\ieme argument optionnel de
% \cs{repere} définit le centre du repère, c'est |O| par défaut.
% 
% On a donc \repere ou \repere[3] ou \repere[2][O'] avec |\repere| ou
% |\repere[3]| ou |\repere[2][O']|. On a même \repere[1] avec
% |\repere[1]|.  
% 
% Je rappelle qu'il faut le 1\ier argument optionnel si l'on veut
% préciser le 2\ieme.
% 
% Voyons maintenant le rendu des repères dans une formule hors-texte: 
% \[\repere[1] \quad \repere \quad \repere[3]\]
% 
% \bigbreak
% 
% Viennent maintenant des macros qui servent essentiellement
% d'abréviations.
% 
% \DescribeMacro{\rog}\mlabel{rog}
% Tout d'abord ce qu'il faut pour écrire \og \rog\fg avec \cs{rog}
% puis \og \ron\fg avec \cs{ron} \DescribeMacro{\ron}\mlabel{ron} et
% enfin \og \rond\fg avec \cs{rond}.\DescribeMacro{\rond}\mlabel{rond}
% 
% Ces trois commandes acceptent les mêmes arguments que \cs{repere} ce
% qui fait que l'on peut obtenir \og \rond[3][A]\fg avec
% |\rond[3][A]|. On \textbf{ne} doit \textbf{pas} les utiliser en mode
% mathématiques.
% 
% \DescribeMacro{\repcom}\mlabel{repcom} 
% Je fais de même avec les repères pour le plan complexe, où, en
% général, on utilise \vectu et \vectv pour la base.
% \DescribeMacro{\roncom}\mlabel{roncom} On a donc \og \repcom\fg avec
% \cs{repcom}, \DescribeMacro{\rondcom}\mlabel{rondcom} \og \roncom\fg
% avec \cs{roncom} et enfin \og \rondcom\fg avec \cs{rondcom}.
% 
% Je fournis de quoi écrire les repères à la mode du
% collège\footnote{Enfin, c'est comme cela que j'y pensais du temps où
% j'enseignais en lycée. Est-ce bien encore le cas?} mais je ne traite
% que le cas d'un repère du plan. 
% 
% \medbreak
% 
% \DescribeMacro{\Repere}\mlabel{Repere}
% Cette macro a une forme étoilée. Sans étoile, on obtient \og
% \DescribeMacro{\Repere*}
% \Repere\fg et avec l'étoile \TO \CAD avec \cs{Repere*}\TF c'est \og
% \Repere*\fg.
% 
% \DescribeMacro{\Rog}
% Viennent ensuite des abréviations, construites sur le même modèle
% que les précédentes: \cs{Rog} pour \og \Rog\fg, \cs{Ron} pour \og
% \DescribeMacro{\Ron}
% \Ron\fg et enfin \cs{Rond} pour \og \Rond\fg. Elles ont toutes une
% forme étoilée qui permet d'obtenir les lettres \og droites\fg \TO
% \DescribeMacro{\Rond}
% avec les mêmes remarques qu'à propos de \cs{vecteur*},
% \Voir{vecteur}. On a donc, \PX, \og \Rond*\fg avec |\Rond*|. 
% 
% \subsection{L'exponentielle}
% \label{SSECfonctionsutil}
%
% \DescribeMacro{\E}\mlabel{E}
% La macro \cs{E} permet d'obtenir un \og e\fg droit quelque soit
% l'environnement: \og \emph{Le nombre \E vaut approximativement
% \(\np{2,7}\)}\fg codé |\emph{Le nombre| |\E| |vaut|
% |approximativement| |\(\np{2,7}\).}| grace à \cs{textup} mais il
% n'est en \emph{romain} que si l'environnement est en romain: \og
% \textsl{\textsf{Le nombre \E vaut approximativement
% \(\np{2,7}\)}}\fg où j'ai utilisé \cs{textsl} pour obtenir des
% caractères sans empattements. 
% 
% \DescribeMacro{\eu}\mlabel{eu}
% La macro \cs{eu} prend un argument obligatoire qui sera placé en
% exposant. On saisit |\eu{2x+3}| pour obtenir \eu{2x+3}. Une fois
% encore, grace à \cs{ensuremath}, on n'a pas besoin de passer
% explicitement en mode mathématique.  
% 
% \subsection{Le nombre i}
% 
% \DescribeMacro{\I}\mlabel{I} Je définis \cs{I} pour qu'elle donne un
% \og i\fg droit qui est ce que l'on devrait utiliser en français pour
% noter \og la racine carrée de \(-1\)\fg \TO pour parler comme les
% anciens.
% 
% On a donc \og le nombre \I qui vérifie \(\I^{2}=-1\)\fg avec
% le code \og |le| |nombre| |\I| |qui| |vérifie| |\(\I^{2}=-1\)|\fg.
% 
% Les remarques faites ci-dessus à propos de~\cs{E} s'appliquent
% également à~\cs{I}.
% 
% \subsection{Intégrales}
% \label{SSECintegralesutil}
%
% \[\intabfx \qquad \text{plutôt que ça:}\qquad \int_{a}^{b}f(x)dx\]
%
% \DescribeMacro{\FixeReculIntegrande}\mlabel{FixeReculIntegrande}
% Ces deux macros prennent un \textbf{nombre} pour unique argument
% obligatoire.  
% \DescribeMacro{\FixeAvanceDx}\mlabel{FixeAvanceDx}
% Elles permettent de \emph{fixer} le nombre de |mu|s dont
% l'intégrande sera rapproché du signe somme et celui dont
% l'intégrande et le \(\D x\) seront séparés. 
% 
% \medbreak
% 
% \DescribeMacro{\D}\mlabel{D}
% Je fournis la macro \cs{D} avec un \cs{providecommand} car elle est
% déjà définie par \Pkg{kpfonts} de Christophe \textsc{Caignaert},
% avec le même effet mais par un autre tour. Cela permet d'utiliser
% \Pkg{kpfonts} et \Pkg{tdsfrmath} sans craindre un conflit de nom. 
% 
% \bigbreak
% 
% \DescribeMacro{\intgen}\mlabel{intgen}
% C'est la macro la plus générale pour écrire une intégrale. Sa
% syntaxe est:
%  
% \noindent\cs{intgen}\BOP\oarg{md}\BOP\oarg{recul}\BOP\marg{inf}%
% \BOP\marg{sup}\BOP\marg{intégrande}
% 
% \noindent où \meta{md} est le mode dans lequel sera composé la
% formule, par défaut le mode mathématique courant, valeur |1|, avec
% |0| on est en mode hors-texte \TO je ne fais pas de rappel sur ce
% qu'il faut penser de cette man½uvre \Sourire
% 
% \meta{recul} vaut par défaut |6mu| ou la valeur fixée par
% \cs{FixeReculIntegrande}, sinon ce doit être un nombre de |mu|s \TO
% explicitement on écrira |[1][-8mu]|, et je rappelle que le 2\ieme
% argument optionnel ne peut être donné que si le 1\ier est donné
% également. \meta{inf} et \meta{sup} sont les bornes inférieure et
% supérieure de l'intégrale, \meta{intégrande} est \TO surprise!\TF
% l'intégrande.
% 
% On l'utilise lorsque l'intégrande et le \(\D x\) sont
% \emph{mélangés} comme dans \[\intgen{2}{5}{\dfrac{\D x}{\ln x}}\]
% codé avec |\[\intgen{2}{5}{\dfrac{\D x}{\ln x}}\]|.
% 
% \bigbreak
% 
% \DescribeMacro{\integrer}\mlabel{integrer} Vient la macro pour le
% cas où l'intégrande est séparé de \(\D x\). Sa syntaxe est:
%  
% \noindent\cs{integrer}\BOP\oarg{md}\BOP\oarg{recul}\BOP\marg{inf}%
% \BOP\marg{sup}\BOP\marg{integrande}\BOP\marg{var}%
% \BOP\oarg{avance}.
% 
% On retrouve les arguments de \cs{intgen} mais on trouve un argument
% obligatoire supplémentaire \meta{var}, qui est le symbole de la
% variable, et un argument optionnel final \meta{avance} qui règle
% la distance entre l'intégrande et le |\D|; \meta{avance} est
% soumis aux mêmes règles que le \meta{recul}. Par défaut
% \meta{avance} vaut |4mu|. 
% 
% On code |\[\integrer{0}{\pi}{\cos 2x}{x}\]| pour
% avoir \[\integrer{0}{\pi}{\cos 2x}{x}\] 
% 
% \bigbreak
% 
% \DescribeMacro{\integrale}\mlabel{integrale}
% La macro suivante est construite sur \cs{integrer} mais est conçue
% pour être un raccourci de
% \cs{integrer}|{a}|\BOP|{b}|\BOP|{f(x)}|\BOP|{x}| avec 
% \cs{integrale}|{a}|\BOP|{b}|\BOP|{f}|\BOP|{x}|. 
% 
% À l'exception du 3\ieme argument obligatoire qui est un
% \emph{symbole} de fonction \TO comme \(f\), \(g\) \&c\TF tous ses
% arguments sont ceux de \cs{integrer}. 
% 
% \DescribeMacro{\intabfx}\mlabel{intabfx}
% Enfin, raccourci du raccourci \cs{intabfx} remplace
% \cs{integrale}|{a}|\BOP|{b}|\BOP|{f}|\BOP|{x}| et compose \intabfx
% dans le cours du texte et \[\intabfx\] en hors-texte.
% 
%
% \subsection{Au bonheur du mathématicien, bazar}
% \label{SSECbazarutil}
%
% Je regroupe ici plusieurs macros qui me facilitent la vie dans la
% saisie des mathématiques. J'y fais une utilisation intense de
% \cs{ensuremath} et \cs{xspace}. 
% 
%
% \subsubsection{De l'infini}
% \label{SSSECinfiniutil}
% 
% \DescribeMacro{\plusinf}\mlabel{plusinf} J'ai mis très longtemps à
% retenir le nom de \cs{infty}, aussi je me
% \DescribeMacro{\moinsinf}\mlabel{moinsinf}suis fait \cs{plusinf},
% \plusinf, et \cs{moinsinf}, \moinsinf. J'espère que leurs seuls noms
% me dispense d'en dire plus sauf qu'il me faut préciser qu'elles
% assurent le mode mathématique et s'occupe de l'espace derrière ce
% qui permet d'écrire |et| |en| |\moinsinf| |on| |trouve| pour
% composer \og et en \moinsinf on trouve\fg.
% 
% \subsubsection{\texorpdfstring{Des intervalles de
% \(\mathbb{R}\)}{Des intervalles de R}} 
% \label{SSSECintervalesdeRutil}
% 
% \DescribeMacro{\interff}\mlabel{interff} 
% On peut écrire les différents intervalles avec les macros
% \cs{interff}, \cs{interoo}, \cs{interof} et
% \DescribeMacro{\interoo}\mlabel{interoo}\cs{interfo}. Leur
% syntaxe commune est
% \cs{int...}\BOP\oarg{md}\BOP\oarg{avant}\BOP\marg{a b}%
% \BOP\oarg{après}.
% On retiendra que \cs{inter} est mis pour \texttt{intervalle} puis
% que la première lettre donne le \emph{sens} du crochet gauche et la
% suivante celui du crochet droit avec \texttt{f} pour \emph{fermé} et
% \texttt{o} pour \emph{ouvert}. 
% 
% Le premier argument \meta{md} est optionnel est règle le mode
% \DescribeMacro{\interfo} mathématique, il vaut |1| par défaut. Le
% 2\ieme \meta{avant}, optionnel, vaut |0| par défaut et donne le
% nombre de~|mu|s qui sépare le délimiteur ouvrant du texte.  Le
% 4\ieme et dernier \meta{après}, qui vaut |0| par défaut, est
% également optionnel. Il définit, en nombre
% \DescribeMacro{\interof} de~|mu|s, la distance qui sépare le texte
% intérieur du délimiteur fermant.
% 
% Le 3\ieme argument \meta{a b} est obligatoire, il fournit le texte à
% placer entre les délimiteurs. L'espace sépare les deux valeurs
% extrèmes de l'intervalle. On code donc \verb*|\interff{12 37/5}|
% pour obtenir \interff{12 37/5} mais il faudra coder
% |\interoo|\BOP\verb*|{\moinsinf{} |\BOP|\plusinf}| pour avoir
% \interoo{\moinsinf{} \plusinf}.
% 
% Le séparateur des valeurs extrèmes de l'intervalle est soumis à la
% clé \Optioncle{nupletsep}.
% 
% \subsubsection{La réserve du bazar, miscellanées}
% 
% \DescribeMacro{\mdfrac}\mlabel{mdfrac}
% Deux macros pour fainéant donc pour moi \Sourire: \cs{mdfrac} et
% \DescribeMacro{\mfrac}\mlabel{mfrac}
% \cs{mfrac} permettent de saisir les fractions comme si on utilisait
% |\(\dfrac{...}{...}\)| et |\(\frac{...}{...}\)| respectivement. On
% pourra donc coder |\mfrac{1}{2}| pour obtenir \mfrac{1}{2}. 
% 
% \medbreak
% 
% \DescribeMacro{\cnp}\mlabel{cnp}
% Il fut une époque où, en France, on ne notait pas le nombre de
% combinaisons comme dans le monde anglo-saxon, d'où \cs{cnp}. La
% tradition s'est perdue mais la macro est restée pour fournir la
% notation \emph{nouvelle vague}. Avec |\cnp{n}{p}| on a
% \cnp{n}{p}. Là encore il n'est pas nécessaire de passer
% explicitement en mode mathématique. 
% 
% \medbreak
% 
% \DescribeMacro{\dans}\mlabel{dans}
% Deux abréviations pour écrire les définitions de fonctions. Je
% trouve que \cs{dans} est plus court et plus facile à retenir que
% \DescribeMacro{\donne}\mlabel{donne} \cs{longrightarrow} et qu'il en
% est de même de \cs{donne} vis-à-vis de \cs{longmapsto}. De fait
% |\(f\):| |\(\R \dans \R\);| |\(x \donne 2x\)| compose: \og \(f\):
% \(\R \dans \R\); \(x \donne 2x\)\fg\footnote{Début seconde,
% peut-être \Sourire}. 
% 
% \medbreak
% 
% \DescribeMacro{\vide}\mlabel{vide}
% Je préfère \vide à \(\emptyset\)\footnote{Celui-là je m'en sers
% tellement que j'avais oublié son nom. Ce n'est pas \cs{nothing} mais
% \cs{emptyset} pour faciliter le travail de la mémoire.} et par
% paresse encore, je me suis fait une \cs{vide} qui permet de saisir
% |\vide et autre| pour obtenir \og \vide et autre\fg. Merci
% \cs{ensuremath} \emph{et} \cs{xspace}.  
% 
% \medbreak
% 
% \DescribeMacro{\ppq}\mlabel{ppq}
% Je veux ceci \(0 \ppq 1\) et \(2 \pgq 1\). Comme \cs{leqslant} et
% \DescribeMacro{\pgq}\mlabel{pgq}
% \cs{geqslant}, c'est pas beau, je me suis fait \cs{ppq} \TO \textbf{p}lus
% \textbf{p}etit \textbf{q}ue\TF et \cs{pgq} \TO \textbf{g}rand.
% 
% \medbreak
% 
% \DescribeMacro{\ensemble}\mlabel{ensemble}
% La macro \cs{ensemble} a deux arguments obligatoires, elle sert à
% écrire la définition d'un ensemble comme \og
% \ensemble{x\in\R}{f(x)\pgq \frac{1}{2}}\fg obtenu avec 
% |\ensemble|\BOP|{x\in\R}|\BOP|{f(x)\pgq \frac{1}{2}}| et dont l'aspect est
% \[\ensemble{x\in\R}{f(x)\pgq \frac{1}{2}}\] 
% en hors-texte, du fait de la présence de \cs{middle}, lorsque la clé
% booléenne \Optioncle{SepDefEnsExt} vaut \OptionvalPresent{true}
% comme c'est le cas par défaut. 
% 
% Sa syntaxe complète est: 
% 
% \noindent\cs{ensemble}\oarg{avant}\marg{1\ier texte}\marg{2\ieme
% texte}\oarg{après} 
% 
% \noindent où \meta{avant} et \meta{après} doivent être des
% nombres. Leur valeur par défaut est |3|. Ces arguments optionnels
% règlent la distance avant et après le symbole de séparation, en
% nombre de |mu|s.
% 
% \subsection{Pour les taupes, taupins et taupines} 
% 
% Les macros de cette section ne sont définies que si l'on a passé la
% valeur \Optionval{true}{taupe} à la clé \Optioncle{taupe}. Je ne
% pense pas que ces macros soient utiles avant le supérieur. Cependant
% aucun mécanisme n'est prévu pour s'assurer de la destination du
% document final \Sourire
% 
% \DescribeMacro{\K}\mlabel{K}
% La macro \cs{K} donne \K, le corps bien connu, alias de \R ou \C.  
% 
% \medbreak
% 
% \DescribeMacro{\prodscal}\mlabel{prodscal}
% Cette macro permet d'écrire le produit scalaire comme on le trouve
% assez souvent dans les bouquins pour taupins. Elle ne prend qu'un
% seul argument obligatoire qui est une liste dont les éléments sont
% séparés par des espaces. Les remarques formulées à propos de
% \cs{nuplet} s'appliquent donc ici. 
% 
% Avec |\prodscal{u v}| on obtient \og \prodscal{u v}\fg et avec
% |\prodscal{\vectu{}| |\vectv|\BOP|}| ou |\prodscal{{\vectu}| 
% |\vectv}| on obtient \og \prodscal{{\vectu} \vectv}\fg.
% 
% \bigbreak
% 
% Je redéfinis quelques macros classiques pour leur donner un aspect
% français comme on le trouve encore souvent.\label{fonctiontaupe}
% 
% Ce sont les fonctions taupiques usuelles \cs{sinh}, \cs{cosh},
% \cs{tanh} auxquelles j'ajoute \cs{cot} parce que j'ai dû en avoir
% besoin un jour.
% 
% On aura donc, \PX, \og \(\cosh x\)\fg en codant |\(\cosh x\)|.
% 
% Je crée les macros \cs{argsh}, \cs{argch} et \cs{argth} pour les
% fonctions hyperboliques réciproques. Par défaut elles ont l'aspect
% suivant: \(\argch x\), \(\argsh y\) et \(\argth z\). 
% 
% \medbreak
% 
% Si on a passé la valeur \Optionval{true}{ArgArcMaj} à la clé
% \Optioncle{ArgArcMaj} alors je définis les macros \cs{argsh},
% \cs{argch} et \cs{argth} pour qu'elles soient écrites avec une
% majuscule comme \(\operatorname{Argsh}x\). Dans ce cas, je redéfinis
% également les macros \cs{arccos}, \cs{arcsin} et \cs{arctan} pour
% qu'elles aient le même aspect.
% 
% \begin{table}[h,t]
%   \centering
%   \caption{Macros redéfinies dans \texttt{taupe.sto}}
%   \label{TABmacrosredeftaupe}
%   \begin{tabular}[c]{*{2}{l >{\(}l<{\)}}}
%     \cs{sinh} & \sinh x &  \cs{cosh} & \cosh x\\
%     \cs{tanh} & \tanh x &  \cs{cot} & \cot y\\
%   \end{tabular}
% \end{table}
% 
% \begin{table}[h,t]
%   \centering
%   \caption{Macros dont l'aspect dépend de la clé
%   \OptionclePresent{ArgArcMaj} --- aspect par défaut} 
%   \label{TABmacrosdefdouble}
%   \begin{tabular}[c]{*{2}{l >{\(}l<{\)}}}
%     \cs{arccos} & \arccos x &  \cs{arcsin} & \arcsin x\\
%     \cs{arctan} & \arctan x &  \cs{argsh}  & \argsh x\\
%     \cs{argch}  & \argch x  &  \cs{argth}  & \argth x\\
%   \end{tabular}
% \end{table}
% 
% Pour noter le noyau et l'image avec une majuscule, je fournis
% \cs{Ker} \TO \(\Ker f\) avec |\(\Ker f\)| à comparer à \(\ker f\)
% avec |\(\ker f\)|\TF et \cs{Img} qui donne \(\Img f\) avec 
% |\(\Img f\)| \TO \cs{Im} est déjà prise pour noter la partie
% imaginaire d'un complexe.
% 
% \medbreak
% 
% \DescribeMacro{\tendversen}\mlabel{tendversen}
% Pour écrire \(f(x)\tendversen{0} \plusinf\), je fournis
% \cs{tendversen}\marg{en} à utiliser \textbf{en mode
% mathématique}. J'ai codé 
% |\(f(x)|\BOP|\tendversen{0}| |\plusinf\)| l'exemple ci-avant. 
% 
% \medbreak
% 
% \DescribeMacro{\devlim}\mlabel{devlim}
% Je fournis \cs{devlim}\oarg{en}\marg{ordre} à utiliser en mode
% mathématique pour obtenir \devlim{4} avec |\devlim{4}| et
% \devlim[1]{7} avec |\devlim[1]{7}|. On remarque donc que \meta{en}
% vaut |0| par défaut. N'est-ce pas étrange? 
% 
% \medbreak
% 
% \DescribeMacro{\parties}\mlabel{parties} 
% Pour écrire \parties{E}, je fournis \cs{parties} utilisable en mode
% texte. Sa syntaxe est \cs{parties}\oarg{n}\marg{ensemble} où
% \emph{n} est un nombre de~|mu|s qui permet de régler la distance
% entre \manus{p} et la parenthèse ouvrante, \emph{n} vaut |-2| par
% défaut; \emph{ensemble} est le nom de l'ensemble dont on considère
% l'ensemble des parties, étonnant, non? 
% 
% \medbreak
% 
% \DescribeMacro{\drv}\mlabel{drv}
% Pour écrire \og \drv{f(x)}{x}\fg, je fournis
% \cs{drv}\BOP\marg{fonction}\BOP\marg{var} utilisable en mode
% texte. J'ai codé |\drv{f(x)}{x}| l'exemple ci-dessus.
% 
% Cette macro admet désormais --- depuis la version
% 1.3\SignalNouveau{1.3} --- un argument optionnel avec
% |\drv[3]{f(x)}{x}| on obtient \og \drv[3]{f(x)}{x}\fg.
% 
% \medbreak
% 
% \DescribeMacro{\ddrv}\mlabel{ddrv} \cs{ddrv} est à \cs{drv}, ce que
% \cs{dfrac} est à \cs{frac} et donc \og |et| |\ddrv{f(x)}{x}|
% |vaut|\fg compose \og et \ddrv{f(x)}{x} vaut \fg, en bousillant
% l'interligne comme prévu! Elle admet également un argument optionnel
% qui joue le même rôle que celui de~\cs{drv}.
% 
% \medbreak
% 
% \DescribeMacro{\interent}\mlabel{interent}
% Avec |\interent{3 12}| on obtient \interent{3 12}. Cette macro a
% pour syntaxe complète:
% \cs{interent}\BOP\oarg{md}\BOP\oarg{avant}\BOP\marg{n m}%
% \BOP\oarg{après}, les arguments jouant le même rôle que ceux des
% macros pour intervalles, \Voir{interff}.
% 
% Sa définition utilise \cs{llbracket} et \cs{rrbracket} fournis par
% \Pkg{stmaryrd} chargé quand \Optioncle{taupe} vaut
% \Optionval{true}{taupe}.   
% 
% \DescribeMacro{\interzn}\mlabel{interzn}
% Cette macro permet d'obtenir \interzn avec \cs{interzn}. Sa syntaxe
% est dérivée de celle de \cs{interent} et prend les mêmes arguments
% \emph{optionnels} avec la même signification. Sa syntaxe est donc
% \cs{interzn}\oarg{md}\oarg{avant}\oarg{après}.
% 
% \bigbreak
% 
% Je consacre quelques lignes à la macro \cs{derpart} qui permet
% d'obtenir \TO et je passe en mode mathématique hors-texte pour
% l'occasion\TF 
% \[\derpart{f\rnuplet{x y z}}{xxyyyz}\]
% avec le code |\[\derpart{f\rnuplet{x y z}}{xxyyyz}\]|. 
% 
% \DescribeMacro{\TdSMDerPartSepar}\mlabel{TdSMDerPartSepar}
% Cette macro contient ce qui sépare, \PX, un \(\partial x^{2}\) du
% \(\partial y\) qui le suit. Par défaut, elle est définie comme étant
% égale à |\,| ce qui, à mon sens, améliore le rendu. Mais on peut la
% redéfinir avec un coup de \cs{renewcommand}.
% 
% \DescribeMacro{\derpart}\mlabel{derpart}
% Comme on vient de le voir cette macro permet d'obtenir l'écriture de
% la dérivée partielle. Sa syntaxe est:
% 
% \noindent\cs{derpart}\marg{dessus}\marg{dessous}
% 
% \noindent où \meta{dessus} est le texte qui sera composé à coté du
% \(\partial\) au numérateur et \meta{dessous} est une liste de
% lexèmes \TO à priori des lettres mais on peut y placer une macro
% comme \cs{alpha} en la faisant suivre d'un espace\TF qui formeront
% le dénominateur.
% 
% Cette macro assure le passage en mode mathématique si nécessaire.
% 
% Allez, encore un petit exemple, 
% |\[|\BOP|\derpart|\BOP|{f}|\BOP\verb*|{xyz  zz\alpha\alpha x}|%
% \BOP|\]| compose 
% \[\derpart{f}{x y z  z z\alpha\alpha x}\] 
% et on voit que l'on peut se permettre de placer des espaces inutiles
% \Sourire 
% 
% \textsf{Remarque}: pour les utilisateurs de \Pkg{paresse}. On ne
% peut pas utiliser |§a| comme raccourci de \cs{alpha} dans le 2\ieme
% argument de \cs{derpart}. Ça serait analysé comme |§| puis |a| ce
% qui n'est peut-être pas tout à fait ce que l'on veut. 
% 
% \subsection{Des suites pour le secondaire}
% 
% Lorsque l'on passe la valeur \Optionval{true}{suite} à la clé
% \Optioncle{suite}, on charge le fichier \texttt{suite.sto} qui donne
% accès à quelques macros concernant les suites.
% 
% Depuis la version 1.3\SignalNouveau{1.3}, on obtient le chargement
% de \texttt{suite.sto} en écrivant simplement
% |\usepackage[suite]{tdsfrmath}|.
% 
% \DescribeMacro{\suite}\mlabel{suite}
% La première macro \cs{suite} a pour syntaxe \cs{suite}\oarg{texte}
% et la valeur par défaut de \meta{texte} est |u|. Elle assure le mode
% mathématique et on peut donc coder |\suite| pour avoir \og
% \suite\fg. 
% 
% \DescribeMacro{\suite*}\mlabel{suite*}
% La version étoilée a pour syntaxe
% \cs{suite}|*|\oarg{deco}\oarg{texte} où \meta{texte} a la même
% fonction que dans la version sans étoile et où \meta{deco} vaut
% \cs{N} \CAD \N par défaut. On a donc \og \suite*\fg avec |\suite*|, 
% \og \suite*[\N*]\fg avec |\suite*[\N*]| et \og
% \suite*[\N][w]\fg avec |\suite*[\N][w]|. 
% 
% \medbreak
% 
% \LaTeX\ ne supporte pas les arguments optionnels imbriqués, les
% parenthèses dans |\suite*[{\N[*]}]| sont absolument indispensables,
% c'est pourquoi j'ai défini les macros étoilées, plussées et moinsées
% présentées en \Page{plusse}. 
% 
% \medbreak
% 
% \DescribeMacro{\suitar}\mlabel{suitar} La commande \cs{suitar} \TO
% \texttt{ar} pour \emph{arithmétique}\TF a pour syntaxe
% 
% \noindent\cs{suitar}\oarg{texte}\marg{raison}\oarg{rang}\marg{prem}%
% \oarg{entre}
% 
% \noindent où la valeur par défaut de \meta{texte} est encore |u|,
% \meta{raison} donne la valeur de la raison de la suite et
% \meta{prem} la valeur du premier terme dont \meta{rang} est le
% rang. Enfin \meta{entre}, qui vaut |{}| par défaut, compose le
% texte entre la suite et sa description. 
% 
% En codant |\suitar{3}{5}|, on compose \og \suitar{3}{5}\fg et,
% avec |\suitar[w]{3}{5}|, on obtient \og \suitar[w]{3}{5}\fg, enfin,
% avec |\suitar{3}[1]{5}|, on obtient \og \suitar{3}[1]{5}\fg. 
% 
% Avec \verb*|\suitar{3}{5}[ est]| on compose \og \suitar{3}{5}[
% est]\fg, on fera attention à laisser un blanc devant le texte ici.
% Avec \verb*|\suitar{3}{5}[,]| on compose \og \suitar{3}{5}[,]\fg. 
% 
% \medbreak
% 
% \DescribeMacro{\suitgeo}\mlabel{suitgeo} La commande \cs{suitgeo} a
% la même syntaxe que \cs{suitar} mais cette fois elle concerne les
% suites géométriques. En codant |\suitgeo{3}{5}|, on compose \og
% \suitgeo{3}{5}\fg et, avec |\suitgeo[w]{3}{5}|, on obtient \og
% \suitgeo[w]{3}{5}\fg, enfin, avec |\suitgeo[w]{3}[2]{5}|, on obtient
% \og \suitgeo[w]{3}[2]{5}\fg.
% 
% \DescribeMacro{\suitar*}\mlabel{suitar*}
% Les versions étoilées, \cs{suitar*} et \cs{suitgeo*} ont la syntaxe
% suivante: 
% 
% \noindent\cs{suitar}|*|\oarg{deco}\oarg{texte}\marg{raison}\oarg{rang}%
% \marg{prem}\oarg{entre}
% 
% \noindent où on retrouve l'argument optionnel \meta{deco} de
% \cs{suite*} avec la même signification, \Voir{suite*}.
% 
% On a donc \og \suitar*[\N*][v]{3}[1]{9}\fg avec le code
% |\suitar*[\N*][v]{3}[1]{9}|. On prendra garde au fait que la macro
% ne cherche pas à assurer la cohérence entre l'ensemble des indices
% et le rang du premier terme \Sourire 
% 
% \bigbreak
% 
% Ce que je viens de décrire est le comportement par défaut de ces
% \DescribeOptionCle{suitedeco}\clabel{suitedeco} macros \cs{suite},
% \cs{suitar}, \cs{suitgeo}, \cs{suite*}, \cs{suitar*} et
% \cs{suitgeo*}, comportement obtenu lorsque la clé
% \DescribeOptionVal{false}{suitedeco} \Optioncle{suitedeco} a la
% valeur \Optionval{false}{suitedeco}, sa valeur d'origine. Lorsque
% l'on passe la valeur \Optionval{true}{suitedeco}, sa valeur par
% défaut, à la clé \Optioncle{suitedeco} le comportement des macros
% avec et sans étoile est inversé.
% 
% \medbreak
% 
% Quitte à être un peu lourd, avec |suitedeco=false| on a \og
% \suite\fg avec |\suite| et \og \suite*\fg avec |\suite*|. Avec
% |suitedeco=true| \TO ou simplement |suitedeco|\TF on a \og
% \suite*\fg avec |\suite| et \og \suite\fg avec |\suite*|.
% 
% On fera attention que, si l'on a donné explicitement les premiers
% arguments optionnels de \cs{suitar}, \PX, dans le cas où
% |suitedeco=true| on ne pourra pas tout bonnement repasser à
% |suitedeco=false| sans remplacer les formes sans étoiles par des
% formes étoilées et vice-versa en faisant, de plus, attention au
% 2\ieme argument optionnel donnant le \og nom\fg de la suite. Bref,
% on choisira une fois pour toute la forme de base et on s'y tiendra! 
% 
% 
%\section{Récapitulatif}
%\label{SECrecapitulatif}
% 
% \subsection{Extensions chargées}
% 
% L'appel de \texttt{tdsfrmath} avec \cs{usepackage} entraine le
% chargement des extensions suivantes: 
% \texttt{ifthen},
% \texttt{xkeyval},
% \texttt{amsmath}, 
% \texttt{amssymb} \TO si \Optioncle{avecmathdesign} a la valeur
% \Optionval{false}{avecmathdesign}\TF,  
% \texttt{xspace}, 
% \texttt{xargs}, 
% \texttt{suffix},
% \texttt{xstring}
% et, si la clé \Optioncle{taupe} a la valeur \Optionval{true}{taupe},  
% \texttt{stmaryrd} .    
% 
% Il n'est donc pas nécessaire de les appeler avec \cs{usepackage}
% dans le préambule d'un document chargeant \texttt{tdsfrmath}. 
%
% \subsection{Options}
% 
% Dans la table~\ref{TABcles}, page~\pageref{TABcles}, je note \og
% texte \TeX\fg pour dire que la valeur passée à la clé doit être une
% chaine de \emph{lettres} au sens de \TeX, \CAD les minuscules et
% majuscules non accentuées de l'ASCII comme on le trouve pour le nom
% des macros. Le \og texte\fg tout court est ce qui sert à écrire les
% noms des extensions, on ne devrait donc pas y trouver de caractères
% \emph{bizarres} mais on peut y voir des chiffres.
% 
%\begin{table}[h,t]
%  \centering
%  \renewcommand{\arraystretch}{1.1}
%  \caption{les clés de \Pkg{tdsfrmath}}
%  \label{TABcles}
%  \begin{tabular}{*{2}{l} *{2}{>{\ttfamily}l} l}\hline
%   clé   & type & \multicolumn{2}{c}{valeur}&\multicolumn{1}{l}{référence} \\
% \multicolumn{1}{l}{}&\multicolumn{1}{l}{}&d'origine&par défaut&voir page\\
% \hline\hline
% avecmathdesign & booléen & false & true& \pageref{avecMD}\\ \hline
%   taupe  & booléen & false & true &\pageref{cletaupe} \\
%   ArgArcMaj & booléen & false & true & \pageref{cleArgArcMaj} \\ \hline
%   suite  & booléen & false & true &\pageref{clesuite} \\
%   suitedeco & booléen & false & true &\pageref{clesuitedeco} \\ \hline
% SepDefEnsExt& booléen & true & true &\pageref{cleSepDefEnsExt} \\ \hline
% CharPoCal & booléen & true& true &\pageref{cleCharPoCal} \\
% calpack & texte & mathrsfs& &\pageref{clecalpack} \\
% calcomd & texte \TeX & mathscr& &\pageref{clecalcomd} \\ 
% caloptn & texte \TeX & ***& &\pageref{clecaloptn} \\ \hline
% CharPoGdT & booléen & false& true &\pageref{cleCharPoGdT} \\
% gdtpack & texte & ***& &\pageref{clegdtpack} \\
% gdtcomd & texte \TeX & ***& &\pageref{clegdtcomd} \\
% gdtoptn & texte \TeX & ***& &\pageref{clegdtoptn} \\ \hline
% placesigne & choix & haut& &\pageref{cleplacesigne} \\
% ensdeco & choix & ebsh& &\pageref{cleensdeco} \\ \hline
% nupletsep & choix & virgule &  &\pageref{clenupletsep}\\ \hline
%  \end{tabular}
%\end{table}
% 
% 
% 
% \StopEventually{\listoftables}
% \section{Le code}
% \label{secCode}
%
%\subsection{Options et macros de service}
%\label{SSECoptions}
% 
% \iffalse
%<*package>
% \fi
% Je commence par charger une extension bien utile tout de suite. 
%    \begin{macrocode}
\RequirePackage{ifthen}
%    \end{macrocode}
% et une autre qui ne l'est pas moins. 
%    \begin{macrocode}
\RequirePackage{xkeyval}
%    \end{macrocode}
% 
% Depuis la version 1.3\SignalNouveau{1.3}, je charge aussi
% \changes{v1.3}{2009/06/04}{Chargement de \Pkg{xstring}}
%    \begin{macrocode}
\RequirePackage{xstring}
%    \end{macrocode}
% 
% \Pkg{tdsfrmath} est la première extension où je fais usage de
% \Pkg{xkeyval} et de sa gestion de clés pour les options de
% l'extension.
%
%\subsubsection{Séparateur des n-uplets}
%
% \begin{macro}{\TdSM@separateur}
%   Cette macro, déterminée par la clé \Optioncle{nupletsep}, fournit
%   le séparateur utilisé dans l'écriture des \(n\)-uplets comme dans
%   \nuplet{a b}.
% 
%   J'en profite pour signaler que toutes les macros \og secrètes\fg
%   de cette extension commence par \cs{TdSM@}.
% 
%   Pour que, plus bas, \cs{ExecuteOptionsX} ait le bon gout de
%   considérer les options de l'extension, il faut utiliser le 2\ieme
%   argument de \cs{define@choicekey} en lui passant le nom complet du
%   fichier contenant l'extension. 
% 
%   Pour des raisons de tranquilité je regroupe toutes les clés
%   définies au niveau de l'extension dans le \emph{trousseau} \TO la
%   documentation de \texttt{xkeyval} parle simplement d'un préfixe\TF
%   \texttt{TdSM}, c'est la raison du 1\ier argument. 
% 
%   Le 3\ieme argument contient le nom de la clé. Le 4\ieme contient
%   deux macros qui prendront pour la première la valeur passée à la
%   clef si elle est valide et pour la deuxième un nombre valant
%   \(-1\) si la valeur est invalide sinon le numéro de la valeur dans
%   la liste \TO aux valeurs séparées par des virgules\TF constituant
%   le 5\ieme argument. Les valeurs sont numérotées en partant de |0|.
% 
%   Le 6\ieme argument contient du code qui est exécuté quand la
%   valeur passée à la clé est valide. Ici, je me sers de \cs{nr} dans
%   le \cs{ifcase} pour définir \cs{TdSM@separateur} congrument au
%   choix de l'utilisateur: le 0\ieme cas est celui de la
%   \OptionvalPresent{virgule}, \&c. 
% 
%   Le 7\ieme argument contient le code exécuté quand la valeur est
%   invalide. Ici ça consiste en un avertissement \TO erreur non
%   fatale\TF inscrit à la console et dans le \texttt{.log}. 
% 
%   Grace au \texttt{+} on peut utiliser un 7\ieme argument. Grace au
%   \texttt{*}, la vérification de la validité de la valeur passée à
%   la clé est faite après que l'entrée et la liste ont été passée en
%   minuscules. L'utilisateur peut donc saisir |[nupletsep=Virgule]|
%   sans troubler l'extension. 
% 
%   À la sortie du traitement, on met \cs{val}  à \cs{relax}
%   pour éviter de le rendre inutilisable alors que l'on n'en a plus
%   besoin. On fera la même chose avec \cs{nr} après l'exécution des
%   options. 
% \changes{v1.3}{2009/01/08}{Réécriture du code pour l'option
% nupletsep}
%    \begin{macrocode}
\newcommand{\TdSM@separateur}{\string,\,}
\define@choicekey*+[TdSM]{tdsfrmath.sty}{nupletsep}[\val\nr]%
  {virgule,pointvirgule}{%
    \ifcase\nr\relax
    \renewcommand{\TdSM@separateur}{\string,\,}\or
    \renewcommand{\TdSM@separateur}{\,\string;\,}\fi
  }{%
    \PackageWarningNoLine{tdsfrmath}{la clef <<nupletsep>> ne connait pas
      <<\val>>\MessageBreak <<nupletsep=virgule>> en vigueur}
  }
\let\val\relax
%    \end{macrocode}
% \end{macro}
% 
% \subsubsection{De l'aspect des noms des ensembles classiques}
% 
% \begin{macro}{\TdSM@Decoration}
%   Cette macro place la décoration. Elle est réglée par
%   \Optioncle{ensdeco}. C'est par la déclaration de cette clé que je
%   commence. La macro \cs{TdSM@DecoChoix} sert à conserver la trace
%   de la valeur passée à la clé. On s'en servira au moment de définir
%   la macro \cs{TdSM@Decoration}
%    \begin{macrocode}
\define@choicekey*+[TdSM]{tdsfrmath.sty}{ensdeco}[\TdSM@DecoChoix\nr]%
  {ehsb,ebsb,ehsh,ebsh,sbeb,sheh}{%
    \PackageInfo{tdsfrmath}{Vous avez choisi \TdSM@DecoChoix\@gobble}
  }{%
    \PackageWarningNoLine{tdsfrmath}{la clef <<ensdeco>> ne connait pas
      <<\TdSM@DecoChoix>>\MessageBreak <<ensdeco=ehsb>> en vigueur}%
    \def\TdSM@DecoChoix{ehsb}}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\TdSM@PlaceSigne}
%   Cette macro place le signe seul. Elle est réglée par
%   \Optioncle{placesigne}. La macro \cs{TdSM@PlaSiChoix} sert à
%   conserver la trace de la valeur passée à la clé. On s'en servira
%   au moment de définir la macro \cs{TdSM@PlaceSigne}
%    \begin{macrocode}
\define@choicekey*+[TdSM]{tdsfrmath.sty}{placesigne}[\TdSM@PlaSiChoix\nr]%
  {haut,bas}{%
    \PackageInfo{tdsfrmath}{Vous avez choisi \TdSM@PlaSiChoix\@gobble}
  }{%
    \PackageWarningNoLine{tdsfrmath}{la clef <<placesigne>> ne connait pas
      <<\TdSM@PlaSiChoix>>\MessageBreak <<placesigne=haut>> en vigueur}%
    \def\TdSM@PlaSiChoix{haut}}
%    \end{macrocode}
% \end{macro}
% 
% \subsubsection{Du choix de la police calligraphique}
% 
% Le mécanisme de \texttt{xkeyval} crée la macro \cs{ifTdSM@CharPoCal}
% et ses s½urs \cs{TdSM@CharPoCaltrue} et \cs{TdSM@CharPoCalfalse}.
% Le 5\ieme argument contient \TO depuis la version
% 1.3\SignalNouveau{1.3} \TF la valeur par défaut |true| ce qui permet
% à l'utilisateur d'obtenir le même comportement de \Pkg{tdsfrmath}
% avec |\usepackage|\BOP|[CharPoCal]|\BOP|{tdsfrmath}| qu'avec
% |\usepackage|\BOP|[CharPoCal| |=| |true]|\BOP|{tdsfrmath}|. Il en
% sera de même avec toutes les clés booléennes de cette extension.
% \changes{v1.3}{2009/06/04}{Utilisation de la valeur par défaut des
%   clés booléennes}
% 
% On ne confondra pas cette valeur par défaut avec la valeur que la
% clé possède à l'exécution des options, autrement dit, la valeur de
% la clé lorsque l'extension est appelée avec un simple
% |\usepackage|\BOP|{tdsfrmath}|. Je parlerai alors de valeur
% \emph{d'origine}.
% 
%    \begin{macrocode}
\define@boolkey+[TdSM]{tdsfrmath.sty}[TdSM@]{CharPoCal}[true]{}%
  {\PackageWarningNoLine{tdsfrmath}{CharPoCal attend la valeur 
      << true >> ou << false >>}}
%    \end{macrocode}
% 
% Avec
% \cs{define@cmdkey}\BOP|[TdSM]|\BOP|{tdsfrmath.sty}|\BOP|[TdSM@]|%
% \BOP|{calpack}|\BOP|[]|\BOP|{}| je définis la clé
% \Optioncle{calpack} et conjointement une macro \cs{TdSM@calpack} qui
% contiendra la valeur passée à la clé. Le préfixe de la commande est
% le contenu du 3\ieme argument. La clé est \emph{attachée au trousseau}
% \texttt{TdSM} grace au 1\ier argument et, une fois encore, la
% famille est obligatoire pour le fonctionnement ultérieur du
% \cs{ExecuteOptionsX} et \cs{ProcessOptionsX}, c'est l'objet du
% 2\ieme argument. 
% 
% Le dernier pourrait contenir du code mais je m'occupe de la valeur
% passée à la clé plus bas, \emph{à la main}! 
%    \begin{macrocode}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{calpack}[]{}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{calcomd}[]{}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{caloptn}[]{}
%    \end{macrocode}
%    \begin{macrocode}
%    \end{macrocode}
% 
% \subsubsection{Du choix du gras de tableau}
% 
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{CharPoGdT}[true]{}
%    \end{macrocode}
%    \begin{macrocode}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{gdtpack}[]{}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{gdtcomd}[]{}
\define@cmdkey[TdSM]{tdsfrmath.sty}[TdSM@]{gdtoptn}[]{}
%    \end{macrocode}
% 
% \subsubsection{Un peu plus pour les taupes}
% 
% Avec la clé booléenne \Optioncle{taupe}, on charge le fichier
% \texttt{taupe.sto}. Cela permet de garder l'extension assez mince
% pour une utilisation dans le secondaire.
%
% Si la valeur passée à la clé est \texttt{true} alors
% \cs{ifTdSM@taupe} est définie comme valant \texttt{true} ce qui
% entrainera plus bas le chargement de l'extension \Pkg{stmaryrd} qui
% fournit des symboles mathématiques dont celui dont je me sers pour
% écrire les intervalles de~\N.
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{taupe}[true]{}
%    \end{macrocode}
% Clé fixant l'aspect des fonctions circulaires et hyperboliques
% réciproques.  
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{ArgArcMaj}[true]{}
%    \end{macrocode}
% 
% \subsubsection{Des macros pour les suites}
% 
% Avec la clé booléenne \Optioncle{suite}, on charge le fichier
% \texttt{suite.sto}.
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{suite}[true]{}
%    \end{macrocode}
% 
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{suitedeco}[true]{}
%    \end{macrocode}
% 
% \subsubsection{Séparateur de définition dans les ensembles}
% 
% La clé booléenne \Optioncle{SepDefEnsExt}. 
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{SepDefEnsExt}[true]{}
%    \end{macrocode}
%
% \subsubsection{Pour les utilisateurs de \Pkg{mathdesign}}
% 
% La clé booléenne \Optioncle{avecmathdesign}. 
%    \begin{macrocode}
\define@boolkey[TdSM]{tdsfrmath.sty}[TdSM@]{avecmathdesign}[true]{}
%    \end{macrocode}
% 
% \subsubsection{Exécutons les options}
% 
% Il est temps d'exécuter les options par défaut. Puis de s'occuper de
% celles fournies par l'utilisateur. Pour finir, on relache une macro
% qui n'a plus d'usage.
%    \begin{macrocode}
\ExecuteOptionsX[TdSM]{%
  avecmathdesign=false,%
  taupe=false,%
  ArgArcMaj=false,%
  suite=false,%
  suitedeco=false,%
  nupletsep=virgule,%
  SepDefEnsExt=true,%
  placesigne=haut,%
  ensdeco=ehsb,%
  CharPoCal=true,calpack=mathrsfs,calcomd=mathscr,caloptn=***,%
  CharPoGdT=false,gdtpack=***,gdtcomd=***,gdtoptn=***}
\ProcessOptionsX[TdSM]\relax
\let\nr\relax
%    \end{macrocode}
% 
% On charge maintenant les extensions nécessaires à cette
% extension. La moins connue, car la plus récente, est peut-être
% \Pkg{xargs} que l'on verra à l'½uvre plusieurs fois pour définir des
% macros acceptant plusieurs arguments optionnels.
% 
%    \begin{macrocode}
\RequirePackage{amsmath}
%    \end{macrocode}
% On ne charge \Pkg{amssymb} que si on déclare ne pas utiliser
% \Pkg{mathdesign}, c'est le comportement par défaut. 
%    \begin{macrocode}
\ifTdSM@avecmathdesign\else\RequirePackage{amssymb}\fi
\RequirePackage{xspace}
\RequirePackage{xargs}
\RequirePackage{suffix}
%    \end{macrocode}
% Si on a passé |[taupe=true]|, on charge \Pkg{stmaryrd}
%    \begin{macrocode}
\ifTdSM@taupe
\RequirePackage{stmaryrd}
%    \end{macrocode}
% puis, à la fin de l'extension, on inclut le fichier
% \texttt{taupe.sto} si on le trouve, sinon on grommèle. 
%    \begin{macrocode}
\AtEndOfPackage{%
  \InputIfFileExists{taupe.sto}{%
    \PackageInfo{tdsfrmath}{fichier taupe.sto inclus\@gobble}}{%
    \PackageWarningNoLine{tdsfrmath}{fichier taupe.sto introuvable}}}
\fi
%    \end{macrocode}
% 
% On traite la clé \Optioncle{suite} de même : 
%    \begin{macrocode}
\ifTdSM@suite
\AtEndOfPackage{%
  \InputIfFileExists{suite.sto}{%
    \PackageInfo{tdsfrmath}{fichier suite.sto inclus\@gobble}}{%
    \PackageWarningNoLine{tdsfrmath}{fichier suite.sto introuvable}}}
\fi
%    \end{macrocode}
% 
% On commence par définir \cs{TdSM@MathCalPol} dans le cas où 
% \Optioncle{avecmathdesign} est \OptionvalPresent{true}
%    \begin{macrocode}
\ifTdSM@avecmathdesign
\def\TdSM@MathCalPol{\mathscr}
\PackageInfo{tdsfrmath}{On compte sur mathdesign !\MessageBreak
  La police calligraphique est << mathscr >> \@gobble}
\else 
%    \end{macrocode}
% dans le cas contraire on traite la clé \Optioncle{CharPoCal}. 
% Si on a |CharPoCal=true|, on s'occupe de la police calligraphique 
%    \begin{macrocode}
\ifTdSM@CharPoCal
  \PackageInfo{tdsfrmath}{La clef CharPoCal est vraie \@gobble}
%    \end{macrocode}
% on s'inquiète de l'existence de l'extension réclamée, on la charge,
% avec l'éventuelle option, si on la trouve 
%    \begin{macrocode}
  \IfFileExists{\TdSM@calpack.sty}{%
    \ifthenelse{\equal{\TdSM@caloptn}{***}}%
      {\RequirePackage{\TdSM@calpack}}
      {\RequirePackage[\TdSM@caloptn]{\TdSM@calpack}}
    \def\TdSM@MathCalPol{\csname\TdSM@calcomd\endcsname}
%    \end{macrocode}
% et, une fois chargée l'extension, on teste l'existence de la
% commande demandée 
%    \begin{macrocode}
    \@ifundefined{TdSM@MathCalPol}%
%    \end{macrocode}
% on grommèle si la macro est inconnue
%    \begin{macrocode}
    {\PackageWarningNoLine{tdsfrmath}{La macro 
        << \TdSM@calcomd\space >> n'est pas connue\MessageBreak
        par l'extension \TdSM@calpack\space!\MessageBreak Revoyez
        la valeur de la clef << calcomd >> SVP}}%
%    \end{macrocode}
% ou on signale que tout s'est passé correctement. 
%    \begin{macrocode}
    {\PackageInfo{tdsfrmath}{La police calligraphique est obtenue via 
        << \TdSM@calcomd\space >>\@gobble}}}%
%    \end{macrocode}
% Vient le cas ou l'extension n'est pas présente: on grommèle et on
% définit la police calligraphique par défaut. 
%    \begin{macrocode}
  {\PackageWarningNoLine{tdsfrmath}
    {Extension \TdSM@calpack\space pas vue sur la
      machine.\MessageBreak 
      La police calligraphique est << mathcal >>} 
    \def\TdSM@MathCalPol{\mathcal}}
%    \end{macrocode}
% Cela dit, il faut bien définir \cs{TdSM@MathCalPol} dans le cas où
% on la veut sortie de boite \CAD égale à \cs{mathcal}. 
%    \begin{macrocode}
\else
  \PackageInfo{tdsfrmath}{La clef CharPoCal est fausse.\MessageBreak
    La police calligraphique est << mathcal >> \@gobble}
  \def\TdSM@MathCalPol{\mathcal}
\fi
\fi
%    \end{macrocode}
% Si on a |CharPoGdT=true|, on s'occupe de la police du gras de
% tableau en employant la même méthode \TO et le même code \Sourire\TF
% avec la différence qu'il faut tenir compte du fait que, par défaut,
% \cs{TdSM@gdtcomd} contient \texttt{***} et que l'on peut \TO depuis
% la version 1.1\TF définir une commande sans charger une extension
% supplémentaire. 
% 
% On commence avec deux macros auxiliaires pour raccourcir le code
% suivant.  
%    \begin{macrocode}
\newcommand\TdSM@DefinirGrasDefaut{%
  \def\TdSM@MathGdTPol{\mathbb}%
  \PackageInfo{tdsfrmath}{Gras de tableau obtenu par mathbb\@gobble}}
\newcommand\TdSM@SiDefaut[1]{\ifthenelse{\equal{#1}{***}}}
%    \end{macrocode}
% 
% On profite lachement du fait que la commande par défaut de
% \Pkg{mathdesign} pour obtenir du gras de tableau est aussi
% \cs{mathbb} ce qui fait que l'on n'a pas à traiter différemment ici
% le cas avec \Pkg{mathdesign} du cas sans ladite extension. 
% 
% On teste la clé booléenne |CharPoGdT|
%    \begin{macrocode}
\ifTdSM@CharPoGdT  
\PackageInfo{tdsfrmath}{La clef << CharPoGdT >> est vraie\@gobble}
\TdSM@SiDefaut{\TdSM@gdtpack}
%    \end{macrocode}
% Si on n'a pas passé de valeur à la clef |gdtpack| on regarde ce qui
% l'en est pour la clef |gdtcomd|: 
%    \begin{macrocode}
{\TdSM@SiDefaut{\TdSM@gdtcomd}
%    \end{macrocode}
% et si cette dernière clé n'est pas définie on demande à
% l'utilisateur de bien vouloir faire des choix cohérents! 
%    \begin{macrocode}
  {\PackageWarningNoLine{tdsfrmath}
    {Je ne comprends pas ce que vous voulez !\MessageBreak
      Vous demandez une autre police de gras de tableau\MessageBreak
      sans donner ni extension (clef gdtpack)\MessageBreak 
      ni commande (clef gdtcomd).\MessageBreak 
      Revoyez la documentation SVP}
    \TdSM@DefinirGrasDefaut}
%    \end{macrocode}
% Sinon, on définit \cs{TdSM@MathGdTPol}
%    \begin{macrocode}
  {\def\TdSM@MathGdTPol{\csname\TdSM@gdtcomd\endcsname}
%    \end{macrocode}
% et on teste la disponibilité de cette commande. 
%    \begin{macrocode}
    \@ifundefined{TdSM@MathGdTPol}%
%    \end{macrocode}
% Si elle n'est pas définie, on rouspète et on prend la valeur par
% défaut
%    \begin{macrocode}
   {\PackageWarningNoLine{tdsfrmath}
     {La macro << \TdSM@gdtcomd\space >> n'est pas connue !\MessageBreak
       Revoyez la valeur de la clef << gdtcomd >> SVP}
     \TdSM@DefinirGrasDefaut}%
%    \end{macrocode}
% sinon on informe, dans le |.log|,  du choix effectué. 
%    \begin{macrocode}
   {\PackageInfo{tdsfrmath}
     {Le gras de tableau est obtenu via << \TdSM@gdtcomd\space
       >>\@gobble}}}}
%    \end{macrocode}
% On passe au cas où la clé |gdtpack| a reçu une valeur
%    \begin{macrocode}
{\IfFileExists{\TdSM@gdtpack.sty}
%    \end{macrocode}
% On teste la présence de l'extension sur le système. Si le système
% est présent, on s'occupe de la clé |gdtoptn|. 
%    \begin{macrocode}
  {\TdSM@SiDefaut{\TdSM@gdtoptn}
%    \end{macrocode}
% Si elle a la valeur par défaut, on charge l'extension sans option
%    \begin{macrocode}
    {\RequirePackage{\TdSM@gdtpack}}
%    \end{macrocode}
% sinon on passe l'option à l'extension.
%    \begin{macrocode}
   {\RequirePackage[\TdSM@gdtoptn]{\TdSM@gdtpack}}
%    \end{macrocode}
% On regarde la clé |gtdcomd|
%    \begin{macrocode}
   \TdSM@SiDefaut{\TdSM@gdtcomd}   
%    \end{macrocode}
% si elle n'a pas reçu de valeur, on retombe dans le cas par défaut
%    \begin{macrocode}
   {\TdSM@DefinirGrasDefaut}
%    \end{macrocode}
% sinon on s'assure de la disponibilité de la commande demandée comme
% ci-dessus.  
%    \begin{macrocode}
   {\def\TdSM@MathGdTPol{\csname\TdSM@gdtcomd\endcsname}
     \@ifundefined{TdSM@MathGdTPol}
     {\PackageWarningNoLine{tdsfrmath}
       {La macro << \TdSM@gdtcomd\space >> n'est pas connue\MessageBreak
         par l'extension \TdSM@gdtpack\space!\MessageBreak 
         Revoyez la valeur de la clef << gdtcomd >> SVP.}}
    {\PackageInfo{tdsfrmath}
      {Le gras de tableau est obtenu via << \TdSM@gdtcomd\space
        >>\@gobble}}}}
%    \end{macrocode}
% On traite le cas où le fichier de style requis est introuvable. Dans
% ce cas on revient à la définition par défaut. 
%    \begin{macrocode}
  {\PackageWarningNoLine{tdsfrmath}
    {Extension \TdSM@gdtpack\space pas vue sur la machine}
    \TdSM@DefinirGrasDefaut}}
%    \end{macrocode}
% On en a fini avec la première branche du si \TO cas où la clé
% |CharPoGdT| est vraie\TF et on passe à la 2\ieme branche. 
%    \begin{macrocode}
\else
\PackageInfo{tdsfrmath}{La clef << CharPoGdT >> est fausse\@gobble}
\TdSM@DefinirGrasDefaut
\fi
%    \end{macrocode}
% 
% Les options étant traitées, \cs{TdSM@DecoChoix} contient la valeur
% passée à la clé \Optioncle{ensdeco}. On peut définir
% \cs{TdSM@Decoration} congrument.
%    \begin{macrocode}
\ifthenelse{\equal{\TdSM@DecoChoix}{ehsb}}%
  {\newcommand\TdSM@Decoration[2]{^{#1}_{#2}}}{%
\ifthenelse{\equal{\TdSM@DecoChoix}{sheh}}%
  {\newcommand\TdSM@Decoration[2]{^{#2#1}}}{%
\ifthenelse{\equal{\TdSM@DecoChoix}{ehsb}}%
  {\newcommand\TdSM@Decoration[2]{^{#1}_{#2}}}{%
\ifthenelse{\equal{\TdSM@DecoChoix}{ebsb}}%
  {\newcommand\TdSM@Decoration[2]{_{#1#2}}}{%
\ifthenelse{\equal{\TdSM@DecoChoix}{sbeb}}%
  {\newcommand\TdSM@Decoration[2]{_{#2#1}}}{%
\ifthenelse{\equal{\TdSM@DecoChoix}{ebsh}}%
  {\newcommand\TdSM@Decoration[2]{^{#2}_{#1}}}{%
}}}}}}
\let\TdSM@DecoChoix=\relax
%    \end{macrocode}
% 
% De même pour \cs{TdSM@PlaceSigne}: 
% 
%    \begin{macrocode}
\ifthenelse{\equal{\TdSM@PlaSiChoix}{haut}}%
  {\newcommand\TdSM@PlaceSigne[1]{^{#1}}}%
  {\newcommand\TdSM@PlaceSigne[1]{_{#1}}}
\let\TdSM@PlaSiChoix=\relax
%    \end{macrocode}
% 
%\subsection{Les noms des ensembles}
%\label{SSECnomsensembles}
%
% Pour pouvoir écrire \cs{R} afin d'obtenir \R, il faut quelques
% macros auxiliaires par lesquelles je commence.
% 
% \begin{macro}{\EnsembleDeNombre}
% \changes{v1.3}{2009/03/12}{Avec |0| en 1\ier argument, on obtient
% l'ensemble des polynômes}
% \changes{v1.3}{2009/06/04}{On analyse autrement le 1\ier argument,
% en utilisant \Pkg{xstring}}
% La suivante fait le boulot de composition.  
%    \begin{macrocode}
\newcommandx\EnsembleDeNombre[4]{%
  \ensuremath{%
    \grastab{#1}{%
    \edef\TdSM@arg{\@firstofone#2}%
    \ifthenelse{\equal{\TdSM@arg}{1}}{}{%
    \ifthenelse{\equal{\TdSM@arg}{0}}{\mspace{#4mu}\left[#3\right]}{%
    \ifthenelse{\equal{\TdSM@arg}{*}}{^{\ast}}{%
    \ifthenelse{\equal{\TdSM@arg}{+}}{\TdSM@PlaceSigne{+}}{%
    \ifthenelse{\equal{\TdSM@arg}{-}}{\TdSM@PlaceSigne{-}}{%
    \ifthenelse{\equal{\TdSM@arg}{+*}\or\equal{\TdSM@arg}{*+}}{%
      \TdSM@Decoration{\ast}{+}}{%
    \ifthenelse{\equal{\TdSM@arg}{-*}\or\equal{\TdSM@arg}{*-}}{%
      \TdSM@Decoration{\ast}{-}}{%
    \IfBeginWith{\TdSM@arg}{-}{%
      _{\StrBehind{\TdSM@arg}{-}}\mspace{#4mu}\left[#3\right]}{%
      ^{\TdSM@arg}}}}}}}}}}}\xspace}
%    \end{macrocode}
% \end{macro}
% 
%    \begin{macrocode} 
\newcommandx\N[2][1=1,2=X]%
     {\EnsembleDeNombre{N}{#1}{#2}{\TdSMReculParenthese}}
\newcommandx\Z[2][1=1,2=X]%
     {\EnsembleDeNombre{Z}{#1}{#2}{\TdSMReculParenthese}} 
\newcommandx\Q[2][1=1,2=X]%
     {\EnsembleDeNombre{Q}{#1}{#2}{\TdSMReculParenthese}}
\newcommandx\R[2][1=1,2=X]%
     {\EnsembleDeNombre{R}{#1}{#2}{\TdSMReculParenthese}}
\newcommandx\C[2][1=1,2=X]%
     {\EnsembleDeNombre{C}{#1}{#2}{\TdSMReculParenthese}}
%    \end{macrocode}
% 
% David \textsc{Kastrup} ayant écrit récemment que la commande \LaTeX\
% \cs{@ifstar} qui teste la présence d'une étoile |*| derrière une
% commande n'était pas des plus recommandables, j'utilise son
% extension \Pkg{suffix} pour définir les commandes étoilées et, tant
% que j'y suis, les commandes plussées, moinsées et autres sur le même
% modèle.\phantomsection\label{suffixe}
%    \begin{macrocode} 
\WithSuffix\newcommand\N*{\N[*]}
\WithSuffix\newcommand\Z*{\Z[*]}
\WithSuffix\newcommand\Q*{\Q[*]}
\WithSuffix\newcommand\R*{\R[*]}
\WithSuffix\newcommand\C*{\C[*]}
\WithSuffix\newcommand\Q+{\Q[+]}
\WithSuffix\newcommand\R+{\R[+]}
\WithSuffix\newcommand\Q-{\Q[-]}
\WithSuffix\newcommand\R-{\R[-]}
\WithSuffix\newcommand\R>{\R[+*]}
\WithSuffix\newcommand\R<{\R[-*]}
%    \end{macrocode}
% \begin{macro}{\R/}
% \changes{v1.3}{2009/03/12}{Ajout des commandes \cs{R/} et \cs{R/+}} 
%    \begin{macrocode}
\DeclareRobustCommand{\TdSM@Rcomplet}{\ensuremath{\overline{\R}}}
\WithSuffix\newcommand\TdSM@Rcomplet+{\ensuremath{\overline{\R+}}}
\WithSuffix\newcommand\R/{\TdSM@Rcomplet}
%    \end{macrocode}
% \end{macro}
% 
% \iffalse
%</package>
% \fi
% 
% \iffalse
%<*taupe>
% \fi
% Commençons par nous présenter puisque c'est la première fois que
% l'on rencontre ce fichier auxiliaire: 
%    \begin{macrocode}
\ProvidesFile{taupe.sto}%
[\filedate\space\fileversion\space Pour tdsfrmath -- option taupe]
%    \end{macrocode}
% 
%    \begin{macrocode}
\newcommandx\K[2][1=1,2=X]%
     {\EnsembleDeNombre{K}{#1}{#2}{\TdSMReculParenthese}}
\WithSuffix\newcommand\K*{\K[*]}
%    \end{macrocode}
% \iffalse
%</taupe>
% \fi
%
%\subsection{Couples, paires, triplets etc.}
%\label{SSECcouples}
%
% Il s'agit maintenant de définir les macros qui permettent d'obtenir,
% \PX, \nuplet{a b c} avec \verb*|\nuplet{a b c}|. On aura noté que
% la délimitation des arguments est obtenue avec des espaces.
% 
% Là encore, je commence par une macro auxiliaire. Elle a pour tâche
% de récupérer une liste d'arguments délimités par des espaces et de
% fournir une liste de ces mêmes arguments séparés par le séparateur
% fixé par \Optioncle{nupletsep}. Elle est basée sur une macro que
% Manuel \textsc{Pégourié-Gonnard}, l'auteur de \Pkg{xargs}, m'a, très
% aimablement, fourni en réponse à une mienne question sur \fctt.
% 
% La seule \og astuce\fg est l'utilisation de \verb*|#1#2 #3|, ou
% l'équivalent ensuite, pour récupérer ce que je veux. Comme |#1| est 
% immédiatement suivi de |#2|, \TeX\ le considère comme non-délimité
% et, quand on utilise la macro, il prendra le premier lexème
% \emph{différent d'un espace}. Le |#2| se chargera de récupérer alors
% tout ce qui suit jusqu'à l'espace suivant. Et s'il n'y a rien à
% récupérer il restera vide. Avec cette man½uvre, je permets de coder
% \verb*|\nuplet{ a b}| pour obtenir \nuplet{ a  b}.
% 
% \iffalse
%<*package>
% \fi
%    \begin{macrocode}
\newcommand\TdSMnuplet[1]{\TdSM@nuplet #1 \@nil}
%    \end{macrocode}
% 
%    \begin{macrocode}
\def\TdSM@nuplet #1#2 #3{%
  \ifx\@nil #3%
  #1#2%
  \else
  #1#2\TdSM@separateur%
  \TdSM@nupletaux #3\fi}
%    \end{macrocode}
%    \begin{macrocode}
\def\TdSM@nupletaux#1\fi{
  \fi\TdSM@nuplet#1}
%    \end{macrocode}
% 
% \begin{macro}{\EncloreExtensible}
% \changes{v1.3}{2008/11/26}{Ajout de \cs{mathopen} et
% % \cs{mathclose} pour régler les distances extérieures.}
% \changes{v1.3}{2009/06/03}{Changement de noms internes:
% \cs{@v@nt} et \cs{@pr@s} deviennent \cs{TdS@v@nt} et \cs{TdS@pr@s}}  
% Pour \emph{passer} le mode à l'intérieur de la macro, en vue de
% prendre la bonne définition des délimiteurs, j'ai besoin d'un
% booléen. 
%    \begin{macrocode}
\newboolean{TdSM@horstexterequis} 
\setboolean{TdSM@horstexterequis}{false}
\newcommandx{\EncloreExtensible}[4][1=1]{%
  \ifthenelse{#1=0}%
  {\setboolean{TdSM@horstexterequis}{true}}%
  {\setboolean{TdSM@horstexterequis}{false}}%
%    \end{macrocode}
% J'ai réglé le cas de l'argument optionnel. Il faut voir si on ne
% serait pas en mode mathématique (\cs{ifmmode}) interne
% (\cs{ifinner}) \CAD mathématique en ligne, ou, au contraire en mode
% mathématique hors-texte où il faut faire quelque chose: 
%    \begin{macrocode}
  \ifmmode\ifinner\else
    \setboolean{TdSM@horstexterequis}{true}%
  \fi\else\fi
%    \end{macrocode}
% On ouvre un groupe et on s'assure d'être en mode mathématique et on
% agit en accord avec la valeur du booléen
% \texttt{TdSM@horstexterequis} qui contient le renseignement
% nécessaire:  
%    \begin{macrocode}
  {\ensuremath{%
      \ifthenelse{\boolean{TdSM@horstexterequis}}%
      {\displaystyle\def\TdS@v@nt{\left #2}\def\TdS@pr@s{\right #3}}%
%    \end{macrocode}
% En hors-texte \TO naturel ou forcé\TF on a des délimiteurs
% extensibles,  
%    \begin{macrocode}
      {\ifthenelse{\equal{#2}{.}}%
        {\def\TdS@v@nt{\relax}}%
        {\def\TdS@v@nt{\mathopen#2}}%
       \ifthenelse{\equal{#3}{.}}%
         {\def\TdS@pr@s{\relax}}
         {\def\TdS@pr@s{\mathclose#3}}}%
%    \end{macrocode}
% il n'en est rien en mode en ligne mais il faut tenir compte du
% délimiteur fantome donné par le point. 
% 
% Et, pour finir, on compose le texte attendu.   
%    \begin{macrocode}
      \TdS@v@nt #4 \TdS@pr@s}}}
%    \end{macrocode}
% \end{macro}
% 
% Avec \cs{EncloreExtensible}, je définis maintenant plusieurs macros
% usuelles. 
%    \begin{macrocode}
\newcommandx{\parent}[2][1=1]{\EncloreExtensible[#1]{(}{)}{#2}}
\newcommandx{\accol}[2][1=1]{\EncloreExtensible[#1]{\{}{\}}{#2}}
\newcommandx{\crochet}[2][1=1]{\EncloreExtensible[#1]{[}{]}{#2}}
\newcommandx{\varabs}[2][1=1]{%
  \EncloreExtensible[#1]{\lvert}{\rvert}{#2}}
\newcommandx{\norme}[2][1=1]{\EncloreExtensible[#1]{\lVert}{\rVert}{#2}}
\newcommand{\nuplet}[2][1]{\parent[#1]{\TdSMnuplet{#2}}}
\newcommand{\anuplet}[2][1]{\accol[#1]{\TdSMnuplet{#2}}}
%    \end{macrocode}
% 
% \begin{macro}{\TdSMReculParenthese}
%    \begin{macrocode}
\newcommand\TdSMReculParenthese{-2}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\rnuplet}
%    \begin{macrocode}
\newcommandx\rnuplet[3][1=1,3=\TdSMReculParenthese]{%
  \mspace{#3mu}\nuplet[#1]{#2}} 
%    \end{macrocode}
% \end{macro}
%
%\subsection{Vecteurs, bases et repères}
%\label{SSECvecteurs}
%
% \begin{macro}{\definirvecteur}
%    \begin{macrocode}
\newcommand{\definirvecteur}[4][***]{%
  \ifthenelse{\equal{#1}{***}}%
  {\@ifundefined{vect#2}%
    {\expandafter\def\csname vect#2\endcsname{%
        \TdSM@fairevecteur{#2}{#3}{#4}\xspace}}%
    {\PackageError{tdsfrmath}%
      {Erreur il y a un vecteur de nom << #2 >>}%
      {Vous pouvez utiliser la macro << redefinivecteur >>
       \MessageBreak
       si c'est bien le nom que vous vouliez}}}%
  {\@ifundefined{vect#1}%
    {\expandafter\def\csname vect#1\endcsname{%
        \TdSM@fairevecteur{#2}{#3}{#4}\xspace}}%
    {\PackageError{tdsfrmath}%
      {Erreur il y a un vecteur de nom << #1 >>}%
      {Vous pouvez utiliser la macro << redefinivecteur >>
       \MessageBreak
       si c'est bien le nom que vous vouliez}}}}
\newcommand{\redefinirvecteur}[4][***]{%
  \ifthenelse{\equal{#1}{***}}%
  {\@ifundefined{vect#2}%
    {\PackageError{tdsfrmath}%
      {Erreur il n'y a pas de vecteur de nom << #2 >>}%
      {Vous pouvez utiliser la macro << definivecteur >>
       \MessageBreak
       si c'est bien le nom que vous vouliez}}
    {\expandafter\let\csname vect#1\endcsname=\relax%
     \definirvecteur[#1]{#2}{#3}{#4}}}%
  {\@ifundefined{vect#1}%
    {\PackageError{tdsfrmath}%
      {Erreur il n'y a pas de vecteur de nom << #1 >>}%
      {Vous pouvez utiliser la macro << definivecteur >>
       \MessageBreak
       si c'est bien le nom que vous vouliez}}
    {\expandafter\let\csname vect#1\endcsname=\relax%
     \definirvecteur[#1]{#2}{#3}{#4}}}}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\definirvecteur[i]{\imath}{-1}{3}
\definirvecteur[j]{\jmath}{0}{5}
\definirvecteur{k}{-1}{1}
\definirvecteur{u}{0}{3}
\definirvecteur{v}{0}{3}
%    \end{macrocode}
% La macro suivante fait le travail de
% composition.\mlabel{TdSMAfairevecteur}   
%    \begin{macrocode}
\newcommand\TdSM@fairevecteur[3]{%
  \ensuremath{\overrightarrow{\mspace{#2mu}{#1}\mspace{#3mu}}}}
%    \end{macrocode}
% 
% \begin{macro}{\vecteur}
%   J'utilise \Pkg{suffix} pour définir la commande \cs{vecteur*}
%   après avoir défini \cs{vecteur}.
% 
%   \cs{vecteur} et \cs{vecteur*} bénéficient eux aussi de
%   \cs{newcommandx} qui permet l'utilisation de plusieurs arguments
%   optionnels.
%    \begin{macrocode}
\newcommandx\vecteur[3][1=1,3=5]{\TdSM@fairevecteur{#2}{#1}{#3}}
%    \end{macrocode}
% 
% Nous voyons que le code suivant est placé sous l'égide de
% \textsc{Parmentier}: réutilisation des restes \Sourire
% 
%    \begin{macrocode}
\WithSuffix\newcommandx\vecteur*[3][1=1,3=5]{\vecteur{\text{#2}}}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\V}
%    \begin{macrocode}
\newcommand{\V}{\vecteur}
%    \end{macrocode}
% \end{macro}
% 
% La macro suivante gère les erreurs dans la macro d'après. C'est en
% français puisque cette extension est au bon gout de chez nous
% \Sourire La seule difficulté c'est de ne pas mettre de lettre
% accentuée dans le message sinon ça donne des hyéroglyphes \TO enfin,
% presque\TF lors de l'affichage tant dans le fichier \texttt{.log}
% qu'à l'écran. Petit exercice de style! 
%    \begin{macrocode}
\newcommand\TdSM@ErreurArgBase{%
  \PackageError{tdsfrmath}{Argument optionnel hors limites}{%
    L'argument optionnel vaut 2 par defaut\MessageBreak
    mais ne prend que les valeurs 1, 2 ou 3.}}
%    \end{macrocode}
% 
% \begin{macro}{\base}
% La macro \cs{base} admet un seul argument, s'il est nul ou s'il est
% plus grand que \(3\) la macro se plaint à l'aide de la macro
% précédente.  
%    \begin{macrocode}
\newcommand{\base}[1][2]{%
  \ifcase #1\TdSM@ErreurArgBase\or 
  \nuplet{\vecti}\or
  \nuplet{\vecti{} \vectj}\or          
  \nuplet{\vecti{} \vectj{} \vectk}\or
  \TdSM@ErreurArgBase\fi\xspace}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\repere}
% Reprend en le modifiant le code de \cs{base}. 
%    \begin{macrocode}
\newcommandx{\repere}[2][1=2,2=O]{%
  \ifcase #1\TdSM@ErreurArgBase\or 
  \nuplet{#2 \vecti}\or 
  \nuplet{#2 \vecti{} \vectj}\or 
  \nuplet{#2 \vecti{} \vectj{} \vectk}\or 
  \TdSM@ErreurArgBase\fi\xspace}
%    \end{macrocode}
% \end{macro}
% 
% Viennent maintenant des macros qui servent essentiellement
% d'abréviations. Comme je ne sais quel sera le codage choisi pour le
% document final, je place les accents à la \TeX, ce qui assure la
% \emph{portabilité}.
%    \begin{macrocode}
\newcommand{\rog}{rep\`ere orthogonal \repere}
\newcommand{\ron}{rep\`ere orthonormal \repere}
\newcommand{\rond}{rep\`ere orthonormal direct \repere}
\newcommand{\repcom}{\nuplet{O \vectu{} \vectv}\xspace}
\newcommand{\roncom}{rep\`ere orthonormal \repcom}
\newcommand{\rondcom}{rep\`ere orthonormal direct \repcom}
%    \end{macrocode}
% 
% \begin{macro}{\Repere}
% Pour la forme étoilée je reprends \cs{WithSuffix}. 
%    \begin{macrocode}
\newcommand{\Repere}{\nuplet{O I J}}
\WithSuffix\newcommand\Repere*{\nuplet{\text{O} \text{I} \text{J}}}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommand{\Rog}{rep\`ere orthogonal \Repere}
\newcommand{\Ron}{rep\`ere orthonormal \Repere}
\newcommand{\Rond}{rep\`ere orthonormal direct \Repere}
%    \end{macrocode}
% 
% \subsection{L'exponentielle}
% \label{SSECfonctions}
% \begin{macro}{\E}
% On peut penser que un \cs{DeclareMathOperator} pourrait suffire ici
% mais avec la définition choisie on peut utiliser la même macro dans
% le texte autant qu'en mode mathématique, sans passer explicitement
% en mode math, cela me semble suffisant pour justifier l'effort de
% codage \TO si tant est que ce soit un effort \Sourire
%    \begin{macrocode}
\newcommand*\E{\ensuremath{\textup{e}}\xspace}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\eu}
% et la fonction
%    \begin{macrocode}
\newcommand*\eu[1]{\ensuremath{\E^{#1}}}
%    \end{macrocode}
% \end{macro}
% 
% \subsection{Le nombre i}
% \begin{macro}{\I}
% Même opération qu'avec \cs{E}. 
%    \begin{macrocode}
\newcommand\I{\ensuremath{\textup{i}}\xspace}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Intégrales}
% \label{SSECintegrales}
%
% Je commence par définir des registres de dimensions mathématiques
% \TO dont on ne peut pas dire qu'on en abuse dans les différentes
% extensions de \LaTeX\TF pour régler des distances à l'intérieur des
% intégrales. Leurs noms me semblent assez parlants.
%    \begin{macrocode}
\newmuskip\TdSM@reculintegrande
\newmuskip\TdSM@avancedx
\TdSM@reculintegrande=6mu
\TdSM@avancedx=4mu
%    \end{macrocode}
%
% Je donne à l'utilisateur de quoi les modifier globalement.
%    \begin{macrocode}
\newcommand\FixeReculIntegrande[1]{\TdSM@reculintegrande=#1mu}
\newcommand\FixeAvanceDx[1]{\TdSM@avancedx=#1mu}
%    \end{macrocode}
% 
% Je fournis la macro \cs{D} avec un \cs{providecommand} \Voir{D} pour
% la raison. 
%    \begin{macrocode}
\providecommand*\D{\textup{d}}
%    \end{macrocode}
% 
% \begin{macro}{\intgen}
% Vient ensuite la macro la plus générale. 
%    \begin{macrocode}
\newcommandx{\intgen}[5][1=1,2=\the\TdSM@reculintegrande]{%
  \ensuremath{%
  \ifnum #1=0\displaystyle\fi
  \int_{#3}^{#4}\mspace{-#2}{#5}}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\integrer}
%    \begin{macrocode}
\newcommandx{\integrer}[7]%
[1=1,2=\the\TdSM@reculintegrande,7=\the\TdSM@avancedx]{%
  \ensuremath{%
  \ifnum #1=0\displaystyle\fi
  \int_{#3}^{#4}{\mspace{-#2}{#5}\mspace{#7}\D{#6}}}}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommandx{\integrale}[7]%
[1=1,2=\the\TdSM@reculintegrande,7=\the\TdSM@avancedx]{%
  \integrer[#1][#2]{#3}{#4}{#5(#6)}{#6}[#7]}
\newcommandx{\intabfx}[3]%
[1=1,2=\the\TdSM@reculintegrande,3=\the\TdSM@avancedx]{%
  \integrale[#1][#2]{a}{b}{f}{x}[#3]\xspace}
%    \end{macrocode}
%
% \subsection{Au bonheur du mathématicien, bazar}
% \label{SSECbazar}
%
%    \begin{macrocode}
\newcommand{\plusinf}{\ensuremath{+\infty}\xspace}
\newcommand{\moinsinf}{\ensuremath{-\infty}\xspace}
%    \end{macrocode}
% 
% La macro qui suit est une macro de service, elle place le texte à
% l'intérieur des délimiteurs des intervalles et assimilés. 
%    \begin{macrocode}
\newcommand{\TdSM@dedans}[3]{\mspace{#1mu}\TdSMnuplet{#2}\mspace{#3mu}}
%    \end{macrocode}
% Je m'en sers dans les quatre macros suivantes. 
% 
% \begin{macro}{\interff}
% La version précédente des macros \cs{inter..} était erronée car la
% valeur par défaut du premier argument, optionnel, était fixée à
% |0|. Il faut |1| car, par défaut, on ne veut pas forcer le style
% hors texte. 
% \changes{v1.2}{2008/09/17}{Correction de la valeur par défaut du
% 1\ier argument.}
%    \begin{macrocode}
\newcommandx{\interff}[4][1=1,2=1,4=0]%
  {\crochet[#1]{\TdSM@dedans{#2}{#3}{#4}}}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommandx{\interoo}[4][1=1,2=1,4=0]{%
  \EncloreExtensible[#1]{]}{[}{\TdSM@dedans{#2}{#3}{#4}}}
\newcommandx{\interof}[4][1=1,2=1,4=0]{%
  \EncloreExtensible[#1]{]}{]}{\TdSM@dedans{#2}{#3}{#4}}}
\newcommandx{\interfo}[4][1=1,2=1,4=0]{%
  \EncloreExtensible[#1]{[}{[}{\TdSM@dedans{#2}{#3}{#4}}}
\newcommandx{\intferab}[2][1=1,2=0]{\interff[#1]{a b}[#2]}
%    \end{macrocode}
% 
% Et maintenant quelque chose de complètement différent: 
%    \begin{macrocode}
\newcommand{\mdfrac}[2]{\ensuremath{\dfrac{#1}{#2}}}
\newcommand{\mfrac}[2]{\ensuremath{\frac{#1}{#2}}}
%    \end{macrocode}
% 
% Les fameuses polices: 
%    \begin{macrocode}
\newcommand*{\manus}[1]{%
  \ensuremath{\TdSM@MathCalPol{\MakeUppercase{#1}}}}
\newcommand*{\grastab}[1]{%
  \ensuremath{\TdSM@MathGdTPol{#1}}}
%    \end{macrocode}
% Des abréviations qu'elles sont utiles: 
%    \begin{macrocode}
\newcommand*{\cnp}[2]{\ensuremath{\binom{#1}{#2}}}
\newcommand*{\dans}{\longrightarrow}
\newcommand*{\donne}{\longmapsto}
\newcommand*{\vide}{\ensuremath{\varnothing}\xspace}
\newcommand*{\ppq}{\ensuremath{\leqslant}}
\newcommand*{\pgq}{\ensuremath{\geqslant}}
%    \end{macrocode}
% et pour écrire les définitions des ensembles
%    \begin{macrocode}
\newcommand*{\TdSMsepdefens}{/}
\ifTdSM@SepDefEnsExt
\newcommandx*{\ensemble}[4][1=3,4=3]{%
  \accol{{#2}%
    \mspace{#1mu}%
    \ifthenelse{\boolean{TdSM@horstexterequis}}{\middle}{}%
    \TdSMsepdefens
    \mspace{#4mu}%
    {#3}}}
\else
\newcommandx*{\ensemble}[4]{%
  \accol{{#2}\mspace{#1mu}\TdSMsepdefens\mspace{#4mu}{#3}}}
\fi
%    \end{macrocode}
% \iffalse
%</package>
% \fi
%
% \subsection{Le fichier \texttt{taupe.sto}}
% \label{SSECtaupesto}
%
% Ce qui suit n'est chargé, et donc défini, que si l'on a passé
% la valeur \Optionval{true}{taupe} à la clé \Optioncle{taupe}.
% \iffalse
%<*taupe>
% \fi
%    \begin{macrocode}
\newcommandx{\prodscal}[4][1=1,2=1,4=1]{%
  \EncloreExtensible[#1]{\langle}{\rangle}{\TdSM@dedans{#2}{#3}{#4}}}
%    \end{macrocode}
% 
% On pourra réutiliser l'astuce: pour redéfinir une macro créée avec
% des moyens \LaTeX iens, il faut d'abord la rendre équivalente \TO
% par \cs{let}\TF à \cs{relax}. La redéfinition devient alors possible
% avec les moyens \LaTeX iens classiques. 
% 
% Ici, cependant, pour me faciliter la tâche, j'écris une macro
% auxiliaire \cs{TdSM}\BOP|@Re|\BOP|Declare|\BOP|Math|\BOP|Operator|  
% qui fait bien ce que je demande avec toutefois un léger désavantage:
% elle ne vérifie pas que la macro \og redéfinie\fg existe bien au
% préalable. Du fait de ce fonctionnement pas très canonique, elle
% restera cachée \Sourire 
% 
%    \begin{macrocode}
\newcommand{\TdSM@ReDeclareMathOperator}{%
  \@ifstar{\@redeclmathop m}{\@redeclmathop o}}
\long\def\@redeclmathop#1#2#3{%
  \let#2=\relax%
  \DeclareRobustCommand{#2}{\qopname\newmcodes@#1{#3}}}
%    \end{macrocode}
% et je m'en sers
%    \begin{macrocode}
\TdSM@ReDeclareMathOperator{\cosh}{ch}
\TdSM@ReDeclareMathOperator{\sinh}{sh}
\TdSM@ReDeclareMathOperator{\tanh}{th}
\TdSM@ReDeclareMathOperator{\cot}{cotan}
%    \end{macrocode}
% et ensuite uniquement si \Optioncle{ArgArcMaj} vaut
% \Optionval{true}{ArgArcMaj} 
%    \begin{macrocode}
\ifTdSM@ArgArcMaj
\TdSM@ReDeclareMathOperator{\arccos}{Arccos}
\TdSM@ReDeclareMathOperator{\arcsin}{Arcsin}
\TdSM@ReDeclareMathOperator{\arctan}{Arctan}
\fi
%    \end{macrocode}
% et j'ajoute de nouvelles définitions. 
%    \begin{macrocode}
\ifTdSM@ArgArcMaj
\DeclareMathOperator{\argch}{Argch}
\DeclareMathOperator{\argsh}{Argsh}
\DeclareMathOperator{\argth}{Argth}
\else
\DeclareMathOperator{\argch}{argch}
\DeclareMathOperator{\argsh}{argsh}
\DeclareMathOperator{\argth}{argth}
\fi
%    \end{macrocode}
% 
%    \begin{macrocode}
\DeclareMathOperator{\Ker}{Ker}
\DeclareMathOperator{\Img}{Im}
%    \end{macrocode}
% 
%    \begin{macrocode}
\newcommand*{\tendversen}[1]{\xrightarrow[#1]\relax}
%    \end{macrocode}
% 
%    \begin{macrocode}
\newcommand*{\devlim}[2][0]{\ensuremath{\text{DL}_{#2}{\parent{#1}}}}
%    \end{macrocode}
% 
%    \begin{macrocode}
\newcommand*{\parties}[2][-2]{%
  \ensuremath{\manus{p}\mspace{#1mu}\parent{{#2}}}}
%    \end{macrocode}
% \begin{macro}{\drv}
% \changes{v1.3}{2008/11/26}{Réécriture avec un argument optionnel.}
%    \begin{macrocode}
\newcommand{\drv}[3][***]{\ensuremath{%
    \frac{\D\ifthenelse{\equal{#1}{***}}{}{^{#1}}#2}%
    {\D#3\ifthenelse{\equal{#1}{***}}{}{^{#1}}}}}
\newcommand{\ddrv}[3][***]{\ensuremath{\displaystyle\drv[#1]{#2}{#3}}}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newcommandx{\interent}[4][1=1,2=2,4=2]{%
  \EncloreExtensible[#1]{\llbracket}{\rrbracket}%
                        {\TdSM@dedans{#2}{#3}{#4}}}
\newcommandx{\interzn}[3][1=1,2=2,3=2]{\interent{0 n}\xspace}
%    \end{macrocode}
%
% \subsection{Dérivées partielles}
% \label{SSECderpart}
% 
% \begin{macro}{\TdSMDerPartSepar}
% Cette macro contient ce qui sépare, \PX, un \(\partial x^{2}\) du
% \(\partial y\) qui le suit. Par défaut, elle est définie comme étant
% égale à |\,| ce qui, à mon sens, améliore le rendu. Mais on peut la
% redéfinir avec un coup de \cs{renewcommand}. 
%    \begin{macrocode}
\newcommand\TdSMDerPartSepar{\,}
%    \end{macrocode}
% \end{macro}
% 
% 
% % \begin{macro}{\derpart}
% Je vais maintenant tenter d'expliquer clairement la construction de
% la macro \cs{derpart}. 
% 
% \textsf{Attention}: je n'ai aucune prétention à fournir ici un code
% optimisé. Je l'ai testé, il fait ce que je veux qu'il fasse et \og
% sam suffi\fg.
% 
% \textsf{Remarque}: ce code est basé une fois encore sur celui
% fourni par Manuel \textsc{Pégourié-Gonnard} pour traiter les noms de
% fichiers.  
% 
% Pour commencer, on notera que la définition de \cs{derpart} est
% entourée d'une double paire de parenthèses |{{...}}|. Cela assure
% que les macros définies à l'intérieur resteront inconnues au niveau
% du document et que les compteurs utilisés retrouveront leur état
% antérieur au sortir de la macro. Bref on utilise la capacité de
% \TeX\ à \og localiser\fg définitions et modifications de compteurs
% et macros. 
% 
% J'utilise \cs{count@} et \cs{count0} parce qu'ils existent déjà et
% que ça m'évite d'en créer deux exprès. On pourra se reporter à la
% documentation sur le noyau de \LaTeXe, \texttt{source2e.pdf}
% disponible avec toutes les bonnes distributions de \TeX. 
% 
% \cs{count0} contient le nombre de lettres identiques successives
% trouvées à l'itération considérée. \cs{count@} vaut à la fin le
% nombre total de caractères contenus dans la chaine constituant le
% 2\ieme argument de la macro \cs{derpart}. 
% 
% La macro \cs{TdSM@sentinelle} a la valeur |@@| et la garde tout le
% temps. La macro \cs{TdSM@precedent} commence l'aventure avec la même
% valeur. Cela permet de tester le début de la lecture du 2\ieme
% argument que j'appelerai désormais \emph{la chaine}. 
% 
% Au début du jeu, les macros \cs{TdSM@DenomAux} et \cs{TdSM@Denom}
% sont vides. À la fin \cs{TdSM@Denom} contient le dénominateur de la
% dérivée partielle, passé en 2\ieme argument de \cs{frac}. La macro
% \cs{TdSM@DenomAux}, quant à elle, permet de construire
% \cs{TdSM@Denom} en me facilitant la tâche à la fin de la chaine. 
%    \begin{macrocode}
\newcommand\derpart[2]{{%
    \count@=1
    \def\TdSM@sentinelle{@@}%
    \def\TdSM@precedent{@@}%
    \def\TdSM@DenomAux{}%
    \def\TdSM@Denom{}%
%    \end{macrocode}
% 
% \cs{TdSM@Puissance} place un exposant \TO il viendra derrière le
% caractère\TF si cet exposant est supérieur à~\(1\). 
%    \begin{macrocode}
    \def\TdSM@Puissance{%
      \ifnum\count0>1 ^{\the\count0}\fi}%
%    \end{macrocode}
% 
% \cs{TdSM@FaireDenom} sert à créer le dénominateur. Comme sa
% définition est donnée à l'intérieur d'une définition \TO celle de
% \cs{derpart}\TF il faut doubler les \emph{dièses} |#| dénotant les 
% arguments. J'utilise \cs{edef} pour forcer le développement immédiat
% de \cs{TdSM@Denom} dans la définition même de
% \cs{TdSM@Denom}. Supposons, pour faire simple, que \cs{TdSM@Denom}
% contienne \texttt{tralala} au moment où \TeX\ arrive sur 
% \cs{TdSM@FaireDenom}\BOP|{truc}|. Après l'exécution de cette
% commande, \cs{TdSM@Denom} se développe en
% |tralala |\BOP|\mathchar"140 |\BOP|truc|. 
% 
% En utilisant un simple \cs{def} à la place du \cs{edef}, on partait
% dans une de ces boucles infinies dont \TeX\ se sort en invoquant la
% finitude de sa mémoire. 
%    \begin{macrocode}
    \def\TdSM@FaireDenom##1{%
      \edef\TdSM@Denom{\TdSM@Denom \partial ##1}}
%    \end{macrocode}
% 
% Voici maintenant la macro \cs{TdSM@derpartaux} qui fait la plus
% grosse partie du boulot. 
%    \begin{macrocode}
    \def\TdSM@derpartaux##1##2{%
      \ifx\@nil##2%
%    \end{macrocode}
% Voici ce qui arrive lorsque le 2\ieme argument vaut \cs{@nil} \CAD
% lorsque l'on arrive à la fin de la chaine: on place la valeur du
% 1\ier argument |##1| dans \cs{TdSM@actuel}.
%    \begin{macrocode}
      \def\TdSM@actuel{##1}%
%    \end{macrocode}
% On regarde s'il a la même valeur que le précédent, placé dans
% \cs{TdSM@precedent}.   
%    \begin{macrocode}
        \ifx\TdSM@actuel\TdSM@precedent
%    \end{macrocode}
% Si oui, on incrémente le compteur \(0\) et on doit tenir compte de
% la puissance
%    \begin{macrocode}
          \advance\count0 by 1
          \TdSM@FaireDenom{\TdSM@precedent\TdSM@Puissance}%
        \else
%    \end{macrocode}
% sinon on regarde si la valeur précédente est égale à la sentinelle
%    \begin{macrocode}
          \ifx\TdSM@precedent\TdSM@sentinelle
%    \end{macrocode}
% auquel cas \cs{TdSM@actuel} contient l'unique lettre de la chaine et
% on peut écrire le dénominateur.
%    \begin{macrocode}
            \TdSM@FaireDenom{\TdSM@actuel}%
          \else
%    \end{macrocode}
% Si ce n'est pas le cas il faut placer la lettre précédente avec la
% bonne puissance puis placer l'actuelle: 
%    \begin{macrocode}
            \TdSM@FaireDenom{%
              \TdSM@precedent\TdSM@Puissance
              \TdSMDerPartSepar\partial\TdSM@actuel}%
          \fi
        \fi
%    \end{macrocode}
% Dans le cas où le 2\ieme argument ne vaut pas \cs{@nil} c'est que
% l'on n'est pas encore au bout.  
%    \begin{macrocode}
      \else
      \def\TdSM@actuel{##1}%
%    \end{macrocode}
% On tient compte du cas où le \cs{TdSM@precedent} est égal à la
% sentinelle, auquel cas on met le compteur à \(0\).
%    \begin{macrocode}
      \ifx\TdSM@precedent\TdSM@sentinelle
        \count0=1      
      \else
%    \end{macrocode}
% Sinon, soit la lettre actuelle est égale à la précédente et on
% incrémente le compteur~\(0\)
%    \begin{macrocode}
        \ifx\TdSM@actuel\TdSM@precedent
           \advance\count0 by 1
        \else
%    \end{macrocode}
% soit elle ne l'est pas et on place dans le dénominateur la lettre
% précédente à la bonne puissance et on remet le compteur~\(0\) à
% zéro.  
%    \begin{macrocode}
          \TdSM@FaireDenom{%
            \TdSM@precedent\TdSM@Puissance\TdSMDerPartSepar}%
          \count0=1
        \fi
      \fi
%    \end{macrocode}
% Enfin, on incrémente le compteur |@| général, on place la lettre
% actuelle dans \cs{TdSM@precedent} et on appelle la macro
% \cs{TdSM@derpart@continue} sur le 2\ieme argument. L'astuce ici est
% que le \cs{fi} ferme le premier \cs{if} et que, dans le même temps,
% il délimite l'argument de la macro \cs{TdSM@derpart@continue}
%    \begin{macrocode}
      \advance\count@ by 1
      \let\TdSM@precedent\TdSM@actuel%
      \TdSM@derpart@continue##2%
    \fi}%
%    \end{macrocode}
% comme on le voit dans sa définition qui consiste à replacer un
% \cs{fi} et rappeler \cs{TdSM@derpartaux} sur ce qui suit: 
%    \begin{macrocode}
\def\TdSM@derpart@continue##1\fi{\fi\TdSM@derpartaux##1}%
%    \end{macrocode}
% Maintenant que \cs{TdSM@derpartaux} est définie, on s'en sert sur le
% 2\ieme argument de \cs{derpart} en plaçant le \cs{@nil} qui signale
% la fin de la chaine puis on compose la fraction en assurant le mode
% mathématique.
%    \begin{macrocode}
\TdSM@derpartaux#2\@nil%
\ensuremath{\frac%
              {\partial\ifnum\count@>1^{\the\count@}\fi #1}%
              {\TdSM@Denom}}%
}}
%    \end{macrocode}
% \end{macro}
% \iffalse
%</taupe>
% \fi
% \iffalse
%<*suite>
% \fi
%    \begin{macrocode}
\ProvidesFile{suite.sto}%
[\filedate\space\fileversion\space Pour tdsfrmath -- option suite]
%    \end{macrocode}
% \begin{macro}{\suite}
% \changes{v1.3}{2009/01/07}{Ajout de \cs{xspace} dans le code de
% \cs{suite} et \cs{suite*} pour éviter que la macro mange l'espace
% derrière} 
%    \begin{macrocode}
\ifTdSM@suitedeco
\newcommandx\suite[2][1=\N,2=u]{\ensuremath{\parent{{#2}_{n}}_{#1}}\xspace}
\newcommandx\suitar[6][1=\N,2=u,4=0,6={}]{%
  \suite[#1][#2]#6 la suite arithm\'etique de raison %
  $r = #3$ et de premier terme $#2_{#4}=#5$}
\newcommandx\suitgeo[6][1=\N,2=u,4=0,6={}]{%
  \suite*[#1][#2]#6 la suite g\'eom\'etrique de raison %
  $q = #3$ et de premier terme $#2_{#4}=#5$}
\WithSuffix\newcommand\suite*[1][u]{\parent{{#1}_{n}}\xspace}
\WithSuffix\newcommandx\suitar*[5][1=u,3=0,5={}]{%
  \suite*[#1]#5 la suite arithm\'etique de raison %
  $r = #2$ et de premier terme $#1_{#3}=#4$}
\WithSuffix\newcommandx\suitgeo*[5][1=u,3=0,5={}]{%
  \suite*[#1]#5 la suite g\'eom\'etrique de raison %
  $q = #2$ et de premier terme $#1_{#3}=#4$}
\else
\newcommand\suite[1][u]{\parent{{#1}_{n}}\xspace}
\newcommandx\suitar[5][1=u,3=0,5={}]{%
  \suite[#1]#5 la suite arithm\'etique de raison %
  $r = #2$ et de premier terme $#1_{#3}=#4$}
\newcommandx\suitgeo[5][1=u,3=0,5={}]{%
  \suite[#1]#5 la suite g\'eom\'etrique de raison %
  $q = #2$ et de premier terme $#1_{#3}=#4$}
\WithSuffix\newcommandx\suite*[2][1=\N,2=u]{%
  \ensuremath{\suite[#2]_{#1}}\xspace}
\WithSuffix\newcommandx\suitar*[6][1=\N,2=u,4=0,6={}]{%
  \suite*[#1][#2]#6 la suite arithm\'etique de raison %
  $r = #3$ et de premier terme $#2_{#4}=#5$}
\WithSuffix\newcommandx\suitgeo*[6][1=\N,2=u,4=0,6={}]{%
  \suite*[#1][#2]#6 la suite g\'eom\'etrique de raison %
  $q = #3$ et de premier terme $#2_{#4}=#5$}
\fi
%    \end{macrocode}
% \end{macro}
% 
% Et ici se termine l'extension \texttt{tdsfrmath}. 
% 
% Scripsit TdS.
% \iffalse
%</suite>
% \fi
% \vspace{2\baselineskip}
% \begin{center}
%   \large Remerciements
% \end{center}
% Je tiens à remercier Maxime \textsc{Chupin} pour l'aide qu'il m'a
% apportée pour améliorer \Pkg{tdsfrmath}. 
% 
% Je remercie également Manuel \textsc{Pégourié-Gonnard} pour les
% diverses réponses intelligentes et utiles à mes questions qui ne le
% furent pas toujours et Christian \textsc{Tellechea} dont j'utilise
% le \Pkg{xstring} et dont je n'oublie pas qu'il m'a envoyé du code
% qui fera son apparition dans la prochaine version.
%  
% \vspace{2\baselineskip}
% 
% \Finale \PrintChanges\PrintIndex
\endinput
%%% Local Variables: 
%%% mode: doctex
%%% coding: iso-8859-15
%%% fill-column: 70
%%% End: 
