Latex
Nouvelles commandes
Définition d'une nouvelle commande simple
On peut personnaliser Latex, créer par exemple un raccourci pour un élément plus ou moins long utiliser couramment, la commande\newcommand
est faite pour ça:
- Code:
\newcommand{\mycmd}{Du texte répétitif, à recopier très (trop) souvent, par exemple une formule en fin de document, en bas de page\dots }
% Utilisation:
\mycmd\mycmd\\ \mycmd
% affiche 2 fois le texte précédent consécutivement et une fois supplémentaire après être allé à la ligne
\def
pour cette définition:
- Code:
\def\mycmd{Du texte répétitif, à recopier très (trop) souvent, par exemple une formule en fin de document, en bas de page\dots }
% Utilisation:
\mycmd\mycmd\\ \mycmd
% fournit un résultat similaire à celui avec newcommand précédent
\def
est une commande "primitive" de Tex, tandis que \newcommand
est une commande Latex, donc construite au-dessus (et avec) de \def
.
En pratique,
\newcommand
vérifie tout d'abord si la commande que l'on souhaite créer existe déjà, tandis qu'avec\def
on peut sans faire attention (ou en faisant exprès) écraser une commande déjà existante\newcommand
accepte l'utilisation d'un argument optionnel, voir ci-dessous
Définition d'une nouvelle commande avec un ou plusieurs arguments
On peut bien sûr passer des paramètres, ou arguments, à une commande. C'est un des intérêts fondamentaux des fonctions.La syntaxe est:
\newcommand{\cmd_name}[nb_arg]{commandes}
,
où
\cmd_name
: est le nom de la commande, utilisé ensuite pour l'appelernb_arg
: le nombre d'argumentscommandes
: l'ensemble des commandes, instructions que l'on souhaite, dans lesquelles peuvent être utilisés#1
,#2
, …#nb_arg
désignant l'argument correspondant passé à la fonction
- Code:
\newcommand{\mycmd}[2]{Le 1er argument est: #1\\ Le 2ème est: #2}
% Utilisation:
\mycmd{arg1}{arg2}
Commande avec un argument optionnel
Avoir un argument optionnel dans une commande peut-être intéressant, pour au moins deux raisons:
- on prévoit qu'un des arguments de notre commande va être, sauf cas (très) rare, toujours le même; on n'a donc pas spécialement envie de le repréciser à chaque appel de la commande, et on souhaiterait que lorsqu'il n'est pas précisé une valeur par défaut lui soit directement attribuée;
- on a créé une commande qui fonctionne comme souhaité, et que l'on utilise déjà un certain nombre de fois dans notre document (ou même dans un certain nomrbe de documents qui utilisent tous le même fichier de commande et donc cette commande là).
Néanmoins, avec le temps et la pratique, on s'aperçoit que l'on aimerait bien que cette commande puisse accepter un autre argument, mais sans pour autant avoir à modifier tous les appels à cette fonction, c'est-à-dire, en faisant en sorte que tous le texte déjà tapé et utilisant déjà cette commande continue à fonctionner correctement bien que la définition de la commande soit modifié
Méthode 1: argument optionnel entre crochets
Pour créer une commande avec un argument optionnel, qui sera alors utilisé entre crochet:cmd[option]{arg_1}{arg_2}...{arg_n}
, on peut procéder comme suit, en testant si le caractère qui suit l'appel de la commande
est un crochet ou non.
On définit alors deux versions de la commande, une sans option et une avec option:
- Code:
\makeatletter
\def\mycmd{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]#2{#1 est optionnel, mais pas #2?}
\def\@without#1{Avec l'unique argument #1, mycmd fonctionne aussi !!}
\makeatother
% Utilisation, avec un ou deux arguments
\mycmd["Arg. en plus"]{"l'arg. original"}
\mycmd{"arg. originel"}
Méthode 2: commande avec une version étoilée
Une autre méthode permettant de définir une commande avec un argument optionnel, et d'en définir deux versions, le choix étant orienté par l'appel de la fonction avec une étoile ou non.De nombreuses commandes Latex utilisent en fait déjà cela, par exemple la commande
\vspace
qui insère un espace vertical arpès un texte sauf si cette commande se retrouve tout en haut d'une page, tandis que \vspace*
fournit le même résultat
même quelque soit l'emplacement où se trouve appelée la commande.
On peut programmer ses propres commandes ainsi:
- Code:
% On définit donc 2 versions: % la commande mycmd* appelle en fait mycmds % tandis que mycmd (sans étoile) appelle mycomdns \makeatletter \newcommand*{\mycmd}{\@ifstar\mycmds\mycmdns} \makeatother % Définition des deux commandes référentes: \newcommand{\mycmds}[2]{Deux arguments: #1 et #2} \newcommand{\mycmdns}[3]{% Par défaut
est vide Trois arguments: #1 et #2, et #3 } % Utilisation: \mycmd*{a}{b} % qui retourne: % Deux arguments: a et b \mycmd{a}{b}{c} % qui retourne: % Trois arguments: a et b, et c