Faire des macros élémentaires

Les macros, des abréviations

Il est très facile de définir de nouvelles commandes qui seront autant d'abréviations. Par exemple :

\newcommand\cad{c'est-à-dire}

Cette ligne crée une nouvelle commande, \cad, qui sera automatiquement remplacée lors de la compilation par le texte « c'est-à-dire ». Remarquez que LaTeX proteste si la commande que vous définissez existe déjà. Vous pouvez ainsi remplacer les choses un peu longues à taper par des commandes abrégées. Pour une thèse sur le chevalier Paul-Louis de la Grange-Noble, vous aurez tout intérêt à définir dès le début :

\newcommand\PL{Paul-Louis de la Grange-Noble}

Il arrive fréquemment d'avoir besoin de redéfinir une commande qui existe déjà. Dans ce cas-là, on utilise simplement:

\renewcommand\nom{contenu}

à la place de newcommand .

Espaces après les macros

Après toute commande dont le nom est composé de lettres (comme \LaTeX, par exemple et à l'inverse de \$), les espaces sont ignorées. Par conséquent, si vous voulez que votre macro soit suivie d'une espace dans le résultat final, utilisez l'une des méthodes suivantes :

Le Maître du Monde, \cad{} moi, ...
Le Maître du Monde, \cad\ moi, ...
Le Maître du Monde, {\cad} moi, ...

Ce serait une très mauvaise idée de mettre une espace dans la définition de la macro, car vous auriez toujours une espace, y compris avant une ponctuation.

Vous pouvez utiliser le package xspace pour remédier à cette nécessité. Dans le préambule, ajoutez : \usepackage{xspace} Ensuite, écrivez vos macros de la façon suivante :

\newcommand\cad{c'est-à-dire\xspace}

La commande \xspace teste ce qui suit la commande : si c'est une ponctuation ou { ou }, elle ne fera rien; dans les autres cas, elle ajoute une espace. Une conséquence de ce fonctionnement est qu'une \footnote suivant \cad va produire une espace inopportune. Elle peut être évitée en tapant 

(...) \cad{}\footnote{Ma note de pied de page} (...)

Commandes à arguments

Les commandes utilisées comme raccourcis atteignent vite leurs limites. D'ailleurs les raccourcis peuvent être également du ressort des éditeurs (cf. le chapitre « Abréviations » de la page Emacs avancé). Les commandes peuvent avoir des rôles bien plus importants :

Un élément sémantique, une commande

La séparation fond-forme peut être atteinte en assignant à chaque élément sémantique une commande (on appelle cela aussi le balisage générique). Par exemple \auteur pour citer des auteurs, ou \source pour indiquer la source d'une citation. Supposons que nous souhaitions afficher les auteurs avec leur nom en petites capitales grâce à la commande utilisée ainsi

\auteur{prénom}{nom}

on dit alors que la commande \auteur « prend deux arguments », tous deux délimités par des paires d'accolades. Du coup, la définition de la commande devient

\newcommand\auteur[2]{...}

Le 2 voulant dire que la commande \auteur a besoin de deux arguments pour fonctionner. On voudrait que la commande \auteur accomplisse l'équivalent de

prénom~\textsc{nom}

~ est l'espace insécable, et le nom est mis en petites capitales. Pour TeX, prénom étant le premier argument on va l'appeler #1 et nom fort logiquement #2. Nous n'avons plus qu'à compléter la définition

\newcommand\auteur[2]{#1~\textsc{#2}}

L'avantage de procéder ainsi est que, plus tard, si les petites capitales ne vous conviennent plus vous pourrez changer de manière cohérente tout votre document (qu'il fasse deux ou plus de 1000 pages) en changeant une ligne. La même modification serait au contraire extrêmement fastidieuse si vous aviez tapé systématiquement prénom~\textsc{nom} car il faudrait relire l'ensemble du document et procéder aux modifications en prenant garde de ne pas modifier un \textsc qui ne serait pas celui d'un auteur. Vous pouvez vous créer un fichier de style avec vos définitions les plus courantes : cf. Écrire son propre package qui pourra inclure (ce ne sont que des exemples, ce sont les besoins spécifiques d'un document particulier qui décident quelles commandes il est souhaitable de définir)

\newcommand\titre[1]{\emph{#1}}
\newcommand\auteur[2]{#1~\textsc{#2}}
\newcommand\source[1]{\footnote{#1}}

Tâches complexes

En plus de vous permettre de contrôler le rendu de votre document, l'utilisation de commandes spécifiques à chaque besoin permet d'accomplir des tâches complexes adaptées à chaque élément de votre document. Supposons que votre commande \auteur vous satisfasse dans un premier temps, mais que plus tard vous arriviez à vous dire qu'un index des auteurs (avec les pages où ils sont mentionnés) serait du meilleur effet. Puisque vous avez une commande spécifique, il vous suffit de la « surcharger », c'est-à-dire de lui ajouter toute la machinerie nécessaire à la réalisation de la toute nouvelle tâche complexe (et cela sans toucher au reste du texte). Vous pourriez essayer de remplacer votre définition initiale par (cf. Faire un index avec MakeIndex)

\newcommand\auteur[2]{#1~\textsc{#2}\index{#2, #1}}

qui produit « prénom nom » et indexe l'auteur sous la forme « nom, prénom » (pour faciliter la recherche).

En fait, la définition précédente est très largement perfectible, notamment parce que MakeIndex ne comprend pas très bien les accents (on peut pour cette raison, lui préférer Xindy). Ce qu'il faut retenir de tout cela, c'est qu'une fois que la macro spécifique est mise en place (ici \auteur), peaufiner la présentation du document se bornera à effectuer de petites modifications sur quelques commandes. Le seul prérequis est que vous définissiez assez tôt la commande et cela même si vous pensez ne pas être compétent pour écrire le code nécessaire : écrivez dans ce cas une commande qui ne fasse rien comme

\newcommand\auteur{}

car vous pourrez toujours modifier la macro à mesure que vous progressez en LaTeX ou alors quelqu'un de plus savant pourra vous venir en aide, il sera toujours plus facile pour lui de ne travailler que sur une macro isolée plutôt que sur tout un document.

Enfin sachez qu'il est possible de définir des commandes prenant des arguments optionnels à l'instar de, par exemple, \usepackage. C'est-à-dire qu'il est possible de définir une commande \auteur telle que \auteur{prénom}{nom} fasse ce qui a été dit jusqu'alors et que \auteur[textit]{prénom}{nom} mette en italique le numéro de page dans l'index (pour distinguer divers types de mention de l'auteur). Il est même possible d'avoir trois commandes en une :

\auteur*{prénom}{nom} % Imprime seulement
\auteur {prénom}{nom} % Imprime et indexe
\auteur[textit]%
        {prénom}{nom} % Imprime, indexe
                      % et met la page en italique

Par souci d'exhaustivité, je place le code correspondant. Il est certes un peu complexe, mais on ne peut pas attendre d'une macro qu'elle abatte des montagnes sans l'éduquer un tant soit peu.

% Tester si une chaîne est vide
\usepackage{ifmtarg}

% À partir de maintenant, pour TeX, « @ » est une lettre et peut donc
% participer à l'élaboration de noms de commande complexes comme
% \@ifmtarg défini par le package homonyme ou \@ifstar défini par LaTeX
\makeatletter

% Si \auteur est suivi d'une étoile appeler \sauteur, sinon \oauteur
\newcommand*{\auteur}{\@ifstar\sauteur\oauteur}

% \sauteur{prénom}{nom} imprime seulement
\newcommand*{\sauteur}[2]{#1~\textsc{#2}}

% \oauteur[comment]{prénom}{nom} imprime et indexe
\newcommand*{\oauteur}[3][]{% Par défaut <comment> est vide
        \sauteur{#2}{#3}%
        \@ifmtarg{#1}{% #1 est-il vide ?
                \index{#3, #2}%    Oui (mise en page par défaut)
        }{%
                \index{#3, #2|#1}% Non (mise en page particulière)
        }%
}

% À partir de maintenant, pour TeX, « @ » n'est plus une lettre
\makeatother

Environnements

Les environnements \begin{env}...\end{env} sont une structure classique de LaTeX que vous pouvez aussi adapter à vos besoins. Pour cela on utilise la commande \newenvironment :

\newenvironment{env}{%
  begin
}{%
  end
}

à ce moment-là, lorsque vous utiliserez

\begin{env}
  .
  .
  .
\end{env}

TeX substituera essentiellement (remarquez les accolades qui forment un « groupe »)

{begin
  .
  .
  .
end}

Prenons un exemple — peu intéressant, mais commençons doucement — pour être clair. On définit l'environnement itenv ainsi

\newenvironment{itenv}{%
  \itshape
}{%
  % Rien
}

Maintenant, quand vous tapez

\begin{itenv}Texte\end{itenv}

vous obtiendrez le même résultat que

{\itshape Texte}

qui met « Texte » en italique. Développons un exemple plus intéressant. Supposons que vous vouliez avoir plus de souplesse avec les citations de votre document (pour l'interlignage, la police, etc.). Pour cela vous pourriez définir un environnement myquote ainsi

\newenvironment{myquote}{%
  \begin{quote}% Environnement quote
    \itshape   % ... en italique
    \small     % ... en plus petit
}{%
  \end{quote}%
}

Remarques : 1. de manière analogue aux commandes, on ne peut pas définir un environnement qui existe déjà ; 2. il n'est pas possible de définir un environnement portant le même nom qu'une commande existant déjà (par exemple, il n'est pas possible de définir un environnement usepackage) et réciproquement (il n'est pas possible de définir une commande \center).

Éléments de programmation

Pour réaliser des macros complexes, on pourra se référer à la FAQ anglaise qui contient de nombreux trucs de programmation dans la section « Macro programming » comme

Les packages suivants sont d'un grand intérêt pour des applications complexes :

ifthen
pour des tests conditionnels « if-then-else », des boucles « while-do », etc. ;
calc
pour de l'arithmétique des compteurs et des longueurs plus aisée ;
ifmtarg
pour tester si quelque chose est vide.
Auteurs : Émilia Robin (1999), François-Xavier Coudert, Josselin Noirel (2005). Dernière modification : 2008-03-24 par Éric Levieil.