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
On peut aussi utiliser la commande \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'appeler
  • nb_arg: le nombre d'arguments
  • commandes: 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
. Par exemple
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 1: 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 



Table des matières


Haut de la page


LongPage: h2: 2 - h3: 3