diff --git a/logiciels/latex/macros.tml b/logiciels/latex/macros.tml index 167f3b1..054ce61 100644 --- a/logiciels/latex/macros.tml +++ b/logiciels/latex/macros.tml @@ -12,19 +12,24 @@

Les macros, des abréviations

-

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

+

+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 +

+Cette ligne crée une nouvelle commande, \cad, qui sera automatiquement remplacée lors de la compilation par le texte -« c'est-à-dire ». Vous pouvez ainsi remplacer les choses un peu -longues à taper par des commande abrégées. Pour une thèse sur le +« 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 :

+définir dès le début : +

 \newcommand\PL{Paul-Louis de la Grange-Noble}
@@ -32,42 +37,380 @@ d
 
 

Espaces après les macros

-

Après toute commande dont le nom est composé de lettres (comme +

+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'un espace dans le résultat -final, utilisez l'une des méthodes suivantes :

+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, ...
 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.

+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 :

+suivante : +

-
\newcommand\cad{c'est-à-dire\xspace}
+
+\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 produite une espace inopportune. Elle peut être évitée en -tapant 

+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. Dernière modification le 2003-05-20, par -Josselin Noirel
+François-Xavier Coudert, Josselin Noirel (2005). Dernière modification le .