Créer ses propres commandes

Nous avons vu quelques outils. Mais c’est un peu fatigant de réécrire à chaque fois la même chose. Et puis, on peut ne pas écrire la même chose, et ça pour la normalisation, on en reparlera. Donc pour se simplifier la vie, nous allons créer de jolies commandes.

Ensembles et intervalles

N\mathbb{N}, Z\mathbb{Z}, Q\mathbb{Q}, R\mathbb{R} ou C\mathbb{C}

Nous allons commencer par des commandes pour les ensembles et les intervalles. La commande \mathbb permet d’avoir les notations pour les ensembles de nombres N\mathbb{N}, Z\mathbb{Z}, Q\mathbb{Q}, R\mathbb{R} ou C\mathbb{C}. Ce serait bien d’avoir des commandes pour eux. Bien sûr, il est logique de penser à écrire une commande de ce genre pour chaque ensemble : \newcommand*\N[1]{\mathbb{#1}}.

Ce n’est pas ce que nous allons faire. Imaginons que plus tard, nous décidons d’utiliser par exemple cette notation N\mathbf{N} disponible avec \mathbf{N}. Il nous faudrait réécrire toutes les commandes. C’est pourquoi nous allons d’abord définir une commande \ensembleNombre qui se chargera d’appliquer à nos lettres le formatage désiré.

\let\ensembleNombre\mathbb
\newcommand*\N{\ensembleNombre{N}}
\newcommand*\Z{\ensembleNombre{Z}}
\newcommand*\Q{\ensembleNombre{Q}}
\newcommand*\R{\ensembleNombre{R}}
\newcommand*\C{\ensembleNombre{C}}

Pour encore plus de facilité dans la saisie des macros que nous venons de définir, on pourrait souhaiter qu’elles puissent être appelées aussi bien en mode mathématique qu’en mode texte. Nous aurions pu utiliser la macro \ensuremath{…} pour définir la macro \N de cette manière.

\newcommand*\N{\ensuremath{\ensembleNombre{N}}}

Nous n’avons désormais plus à nous soucier de savoir si \N est appelée en mode mathématique ou pas, et elle affichera N\mathbb{N} dans tous les cas.

Nous avons défini des commandes permettant d’écrire très facilement ces ensembles.

Les intervalles

Nous pouvons écrire plusieurs sortes d’intervalles. Donc nous allons également faire d’abord une commande générale, qui se chargera du formatage, puis utiliser cette commande pour définir cinq autres commandes pour les quatre types d’intervalles et les intervalles d’entiers.

\newcommand*\intervalle[4]{\left#1 #2 \, ; #3 \right#4}
\newcommand*\intervalleOO[2]{\intervalle{]}{#1}{#2}{[}}
\newcommand*\intervalleFF[2]{\intervalle{[}{#1}{#2}{]}}
\newcommand*\intervalleOF[2]{\intervalle{]}{#1}{#2}{]}}
\newcommand*\intervalleFO[2]{\intervalle{[}{#1}{#2}{[}}

\intervalleOO permet d’obtenir un intervalle ouvert des deux côtés, \intervalleOF un intervalle ouvert à gauche et fermé à droite…

En fait, on peut même créer une commande pour écrire ces intervalles de manière naturelle.

Le code qui suit est difficile à comprendre pour un débutant et nous n’allons pas le commenter. Nous pouvons parfaitement nous contenter de l’utiliser.

\newcommand\actimath[1]{\mathcode`#1"8000 \begingroup \lccode`~`#1 \lowercase{\endgroup\def~}}
\newcommand\interv{%
    \begingroup
    \actimath\;{\mathpunct{}\mathpunct{\mathchar`\;}}%
    \actimath\[{\right\delimiter\delcode`\[ \endgroup}%
    \actimath\]{\right\delimiter\delcode`\] \endgroup}%
    \left\delimiter\delcode`}

Elle s’utilise en écrivant $\interv[1;10]$ et $\interv]\frac{1}{2};25]$ pour obtenir [1;10][1; 10] et ]12;25]\left]\frac{1}{2}; 25\right].

Pour définir \intervalleEntier, nous allons utiliser les commandes \llbracket et \rrbracket du package stmaryrd pour obtenir les doubles crochets.

\newcommand*\intervalleEntier[2]{\intervalle{\llbracket}{#1}{#2}{\rrbracket}}

Nous aurions aussi pu utiliser [\![ et ]\!], mais ces crochets ne sont pas exactement les bons.

On obtient ainsi très facilement [ ⁣[1,10] ⁣][\![1, 10]\!] avec \intervalleEntier{1}{10}.

Les ensembles du type « tel que »

Il nous reste à définir une commande pour les ensembles définis en compréhension, c’est-à-dire avec « tel que ». Nous voulons donc faire une commande qui nous permette d’obtenir {xR,  x0}\left\{x \in \mathbb{R},\; x \neq 0\right\}. Cette commande est assez simple à faire. La seule question à se poser est qu’utiliser pour représenter « tel que » ; la virgule, le slash, la barre verticale ou même « tq » sont des choix possibles. Prenons, par exemple, la virgule. Nous allons ici appeler notre fonction enstq pour ensemble tel que.

\newcommand*\enstq[2]{\left\{#1,\; #2\right\}}

Symboles en furie

Il y a une autre chose pour laquelle il peut être judicieux de créer ses commandes. C’est pour tout ce qui nécessite l’usage de symboles, surtout si ceux-ci ont une taille variable.

Valeur absolue

Un exemple flagrant est celui de la valeur absolue. Avoir écrit \left\lvert x \right\rvert dans un code ne laisse pas du tout penser qu’il s’agit d’un code pour afficher x\left\lvert x \right\rvert. Pour rendre ceci plus lisible, mettons-le dans une commande, et profitons-en pour faire la même chose pour la partie entière et pour la norme.

\newcommand*\ent[1]{\left\lfloor #1\right\rfloor}
\newcommand*\norme[1]{\left\lVert #1\right\rVert}
\newcommand*\abs[1]{\left\lvert #1\right\rvert}

Nous aurions également pu nous intéresser aux commandes \DeclarePairedDelimiter ou \DeclarePairedDelimiterx du package mathtools pour faire ce travail.

Vecteurs

La commande \vec{arg} permet d’afficher un vecteur à l’aide d’une flèche, et d’obtenir x\vec{x}. Cependant, pour écrire un vecteur avec deux lettres par exemple, elle n’est pas adaptée. Essayons : AB\vec{AB}. Nous préférerions avoir ceci : AB\overrightarrow{AB}. Il nous suffit de créer une commande qui place une flèche au-dessus de son argument.

\let\vecteur\overrightarrow

Et elle permet également d’obtenir x\overrightarrow{x} ou ABC\overrightarrow{ABC}. On a donc bien une commande adaptée à tous les cas.

Une petite question : pourquoi ne pas avoir redéfini la commande \vec plutôt que d’en définir une nouvelle ?

On aurait pu en effet redéfinir la commande \vec, mais il vaut mieux choisir de créer de nouvelles commandes. Cela peut prévenir des erreurs, et on ne sait jamais si on aura besoin de la commande originelle. En fait, les commandes à redéfinir sont celles qui, par exemple, obéissent aux notations anglaises, alors qu’on sait que, dans notre document, on n’utilisera que les notations françaises…

En fait, là encore un package, le package esvect nous permet d’obtenir une flèche de la bonne taille sur nos vecteurs grâce à sa commande \vv. En fait, il fait même encore mieux, puisqu’il nous permet d’obtenir une flèche plus esthétique, et offre quasiment une dizaine de types de flèches. Il ne faut pas hésiter à l’utiliser.

Cependant, il ne règle pas un problème : certains préfèrent avoir toutes les flèches des vecteurs à la même hauteur ; ils veulent avoir (AB\overrightarrow{\vphantom{(} AB} et (x\overrightarrow{\vphantom{(} x} plutôt que AB\overrightarrow{AB} et x\overrightarrow{x}. Créons donc une commande qui place la flèche de cette manière. Pour cela, nous allons placer une espace verticale invisible de taille supérieure à celle des caractères. Ainsi, la flèche sera toujours au-dessus de cette espace, donc à la même hauteur.

La commande \mathstrut permet de placer l’espace voulue. Elle est strictement équivalente à \vphantom{(}, c’est-à-dire qu’elle produit une espace verticale de la taille d’une parenthèse. Ce qui nous permet d’écrire notre commande.

\newcommand*\vecteur[1]{\vv{\mathstrut #1}}

Dans certains documents, nous pourrons préférer écrire les vecteurs en gras par souci de simplicité (en physique notamment). La question qui se pose est quelle commande utiliser pour mettre en gras votre vecteur. Nous allons utiliser \mathbf pour obtenir AB\mathbf{AB}. Nous pouvons aussi utiliser la commande \boldsymbol qui, elle, donne AB\boldsymbol{AB}. Notre commande \vecteur devient donc ceci.

\let\vecteur\boldsymbol

Les fonctions

Dans le mode mathématique, les fonctions les plus courantes disposent d’une commande qui les affiche en romain. Ainsi, $\sin x$ permet d’obtenir sinx\sin x. Mais comment faire pour écrire les noms d’autres fonctions ou opérateurs en romain ? Prenons l’exemple d’une fonction « card ».

Nous aurions pu utiliser la commande \text, mais comme nous l’avons dit, elle est là pour écrire du texte, et ce n’est pas du texte que nous voulons écrire. De même, la commande \mathrm ne permet tout simplement pas d’obtenir le comportement d’une fonction, puisque $x\mathrm{cos} x$ donne xcosxx\mathrm{cos} x au lieu de xcosxx\cos x.

Le package amsmath dispose d’une commande \operatorname qui nous permet d’obtenir le résultat désiré. Ainsi, \operatorname{card} x donne cardx\operatorname{card} x.

En fait, on a encore mieux avec la commande \DeclareMathOperator (toujours du package amsmath), qui permet de définir une commande pour un nouvel opérateur. Elle prend comme premier paramètre la commande à définir, et comme deuxième paramètre ce qui doit être affiché.

\DeclareMathOperator{\card}{card} % On déclare l’opérateur \card qui correspond à « card ».

Ainsi, \card E donnera cardE\operatorname{card} E.

Notons que la variante étoilée de la commande \DeclareMathOperator permet d’obtenir un opérateur mathématique dont les exposants et les indices seront placés comme pour \sum, c’est-à-dire au-dessus et au-dessous de l’opérateur.

Environnements particuliers

Les systèmes d’équations

Nous avons vu dans la partie précédente comment écrire des systèmes d’équations en utilisant l’environnement aligned. Il paraît judicieux de créer une commande qui mette en place l’environnement. Cette commande n’est pas compliquée à faire, elle ne prend qu’un argument, et ne fait que le placer dans un environnement aligned.

\newcommand*\Sys[1]{\left\{ \begin{aligned} #1 \end{aligned} \right. \kern-\nulldelimiterspace}

Notons également l’existence du package systeme, qui permet également d’obtenir des systèmes d’équations.

Définir une fonction

Nous allons juste placer un environnement alignedat dans une commande fonction.

\newcommand*\fonction[5]{
#1 \colon \left\{\begin{alignedat}{2}  &#2 &\: &\to      #3\\
                                &#4 &   &\mapsto  #5
\end{alignedat} \right. \kern-\nulldelimiterspace}

On peut alors obtenir f ⁣:{EFxf(x)f \colon \left\{ \begin{alignedat}{2} &E &\:&\to F\\ &x & &\mapsto f(x) \end{alignedat} \right. avec \fonction{f}{E}{F}{x}{f(x)}.

Nous aurions aussi pu utiliser l’environnement aligned.

Les coordonnées d’un point

On peut écrire les coordonnées d’un point de l’espace de plusieurs manières en mathématique. On peut vouloir les noter entre parenthèses séparées d’une virgule, ou encore l’une au-dessus de l’autre dans le cas des coordonnées d’un vecteur. Dans le premier cas, il n’est pas nécessaire de créer de commandes, puisque $A(8, 9)$ permet déjà d’obtenir facilement A(8,9)A(8, 9), mais dans les deux autres cas, il est bon de faire une commande pour s’affranchir une bonne fois pour toutes de ce travail. Voici ce que nous aimerions obtenir :

AB(106) ou AB106\overrightarrow{AB} \, \begin{pmatrix} 10\\ 6\end{pmatrix} \text{ ou } \overrightarrow{AB} \,\left\lvert\begin{matrix} 10\\ 6\end{matrix}\right.

Pour ce faire, nous allons tout simplement utiliser les environnements de matrices.

\newcommand*\coord[2]
{
   \vecteur{#1} \,
   \begin{pmatrix}
      #2
   \end{pmatrix}
}

Avec cette commande il faut écrire \[\coord{AB}{12\\21} \coord{BC}{21\\12\\32}\] pour obtenir :

AB(1221)BC(211232) \overrightarrow{AB} \, \begin{pmatrix} 12\\21 \end{pmatrix} \overrightarrow{BC} \, \begin{pmatrix} 21\\12\\32 \end{pmatrix}

Pour obtenir l’écriture avec la barre, il nous suffit d’utiliser matrix à la place de pmatrix, et de placer les délimiteurs adaptés, à savoir \left| et \right..

N’oublions pas, si nous voulons insérer des fractions dans un environnement de type matrice et garder un bon espacement, nous utilisons la commande \mathstrut.


Voilà, nous avons vu la création de quelques commandes. Nous pouvons faire des commandes pour d’autres choses. Mais attention, ne tombons pas dans l’excès en faisant une commande pour tout et n’importe quoi !

Nous avons également vu que certains packages pouvaient déjà faire ce que nous voulions. Si un package existe déjà pour faire ce que nous voulons, il vaut mieux l’utiliser que de chercher à tout prix à faire notre propre commande. Bien sûr, dans certains cas, ce package ne fait pas exactement ce que nous voulons, ou n’existe tout simplement pas. Dans ce cas, nous pouvons faire une commande, et même en faire profiter les autres en créant un package !

Lorsque nous décidons d’utiliser un package, il faut vérifier qu’il n’est pas obsolète, et s’il n’existe pas de package le remplaçant. Par exemple, le package theorem est obsolète et il est conseillé d’utiliser à la place le package ntheorem ou le package amsthm (à noter qu’un tutoriel sur le package ntheorem est disponible ici).