1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
%%% Copyright (C) 2015-2024 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
%%% https://gitlab.com/vigou3/formation-latex-ul
%%%
%%% Cette création est mise à disposition sous licence
%%% Attribution-Partage dans les mêmes conditions 4.0
%%% International de Creative Commons.
%%% https://creativecommons.org/licenses/by-sa/4.0/
\chapter{Commandes et environnements définis par l'usager}
\label{chap:commandes}
{\LaTeX} est un ensemble de macro-commandes conçu pour faciliter
l'utilisation du système {\TeX}. Dès lors, les utilisateurs peuvent à
leur tour définir des commandes. Il suffit généralement d'avoir rédigé
quelques documents --- ou quelques chapitres d'un long document ---
avec {\LaTeX} pour réaliser combien cette possibilité est de nature à
faciliter le travail.
La définition de nouvelles commandes et de nouveaux environnements
peut servir à créer des extensions à {\LaTeX} --- c'est d'ailleurs ce
que font plusieurs paquetages. Cependant, en usage courant, on fera
principalement appel à ces fonctionnalités pour l'une ou l'autre des
trois raisons suivantes:
\begin{enumerate}
\item créer des raccourcis pour de longues commandes utilisées
fréquemment;
\item créer des commandes sémantiques afin d'uniformiser la
présentation du texte;
\item modifier le comportement de commandes existantes --- car il est
également possible de redéfinir une commande existante.
\end{enumerate}
\begin{exemple}
\label{ex:commandes:intro}
J'ai créé ou modifié des commandes pour chacune des raisons
ci-dessus dans la préparation du présent ouvrage.
\begin{enumerate}
\item Une nouvelle commande \cmdprint{\doc} facilite et systématise
l'insertion de liens vers la documentation. D'un seul appel, elle
crée un hyperlien dans le texte suivi de l'icône {\faExternalLink*}
et elle ajoute le nom du fichier de documentation dans la marge
précédé de l'icône {\faBookmark}.
\item Une nouvelle commande sémantique \cmdprint{\pkg} sert pour la
mise en forme des noms de paquetages. Ainsi, leur présentation est
toujours la même et, si je devais souhaiter en changer, il me
suffirait de modifier la définition de la commande.
\item La redéfinition de la commande \cmd{\chaptitlefont} de la
classe \class{memoir} permet de modifier la police et la mise en
forme des titres de chapitres.
\end{enumerate}
Je reviendrai sur les détails de ces exemples dans la suite du
chapitre. %
\qed
\end{exemple}
\section{Nouvelles commandes}
\label{sec:commandes:commandes}
Les commandes \cmd{\newcommand} et \cmd{\renewcommand} permettent
respectivement de définir une nouvelle commande et de redéfinir une
commande existante --- c'est-à-dire d'en modifier la définition. On
place généralement ces définitions dans le préambule du document.
\subsection{Commandes sans arguments}
\label{sec:commandes:commandes:sans_arg}
Certaines commandes ne requièrent pas d'argument; pensons à
\cmdprint{\LaTeX} ou \cmdprint{\bfseries}. Ce sont les commandes les
plus simples à créer. La syntaxe des commandes \cmd{\newcommand} et
\cmd{\renewcommand} pour de tels cas est la suivante:
\begin{lstlisting}
\newcommand{`\bs\meta{nom\_commande}'}`\marg{définition}'
\renewcommand{`\bs\meta{nom\_commande}'}`\marg{définition}'
\end{lstlisting}
Le premier argument, \bs\meta{nom\_commande}, est le nom de la
commande, avec le symbole «\bs». Pour \cmdprint{\newcommand}, ce nom
doit être différent de celui de toute commande active dans le
document\footnote{%
Les commandes actives dans un document sont les commandes de base de
{\TeX} et {\LaTeX} ainsi que les commandes de tous les paquetages
chargés dans le préambule.}. %
À l'inverse, avec \cmdprint{\renewcommand}, le nom doit déjà être pris
par une commande active.
Le second argument, \meta{définition}, contient la définition de la
commande. Il peut s'agir de caractères à insérer dans le texte, de
commandes à exécuter ou d'une combinaison de tout cela.
\begin{exemple}
La commande \cmd{\mathbb}, présentée à la
\autoref{sec:math:symboles:mathcal}, permet de créer une lettre
majuscule ajourée pour représenter un ensemble de nombres en
mathématiques. Plutôt que de l'utiliser à divers endroits dans un
document, il est préférable de définir une commande sémantique comme
\cmdprint{\R} pour représenter l'ensemble des nombres réels:
\begin{lstlisting}
\newcommand{\R}{\mathbb{R}}
\end{lstlisting}
Comme cela, si vous souhaitez pour une raison quelconque modifier la
représentation de l'ensemble des nombres réels, il vous suffit de
modifier la définition de la commande \cmdprint{\R} pour que le
changement prenne effet dans tout le document. %
\qed
\end{exemple}
\begin{exemple}
Tel que mentionné à l'\autoref{ex:commandes:intro}, j'ai modifié la
police des titres de chapitres dans le présent document en
redéfinissant la commande \cmdprint{\chaptitlefont} de la classe
\class{memoir}. Pour obtenir des titres de chapitres sans
empattements, en caractères gras, de dimension \cmdprint{\Huge} et
alignés à gauche, le préambule du document contient la
déclaration
\begin{lstlisting}
\renewcommand{\chaptitlefont}{\normalfont%
\sffamily\bfseries\Huge\raggedright}
\end{lstlisting}
\qed
\end{exemple}
\subsection{Commandes avec arguments}
\label{sec:commandes:commandes:avec_arg}
Les commandes \cmdprint{\newcommand} et \cmdprint{\renewcommand} ont
d'autres tours dans leur sac. Leur syntaxe étendue permet également de
définir ou de redéfinir des commandes acceptant un ou plusieurs
arguments:
\begin{lstlisting}
\newcommand{`\bs\meta{nom\_commande}'}`\oarg{narg}\marg{définition}'
\renewcommand{`\bs\meta{nom\_commande}'}`\oarg{narg}\marg{définition}'
\end{lstlisting}
Le nouvel argument \meta{narg} est un nombre entre 1 et 9
spécifiant le nombre d'arguments de la commande. La \meta{définition}
de la commande doit alors contenir des jetons \code{\#1}, \code{\#2},
\dots\ pour identifier les endroits où les arguments 1, 2, \dots\
doivent apparaitre.
\begin{exemple}
La nouvelle commande \cmdprint{\pkg} mentionnée à
l'\autoref{ex:commandes:intro} affiche les noms de paquetages en
caractères gras. La commande prend en argument le nom du paquetage.
Sa définition est donc
\begin{lstlisting}
\newcommand{\pkg}[1]{\textbf{#1}}
\end{lstlisting}
Il s'agit encore d'une commande sémantique permettant de changer
aisément la mise en forme en modifiant une seule définition dans le
préambule du document. %
\qed
\end{exemple}
\begin{exemple}
\label{ex:commandes:doc}
La commande \cmdprint{\doc} mentionnée à
l'\autoref{ex:commandes:intro} requiert trois arguments:
\begin{enumerate}
\item le texte de l'hyperlien qui sera placé au fil du texte;
\item le nom du fichier de documentation à placer dans la marge dans
une police non proportionnelle;
\item l'adresse URL vers le fichier de documentation en ligne.
\end{enumerate}
Voici une version simplifiée de la définition de la commande:
\begin{lstlisting}
\newcommand{\doc}[3]{%
\href{#3}{#1~\faExternalLink*}%
\marginpar{\faBookmark~\texttt{#2}}}
\end{lstlisting}
La commande \cmd{\href} qui permet d'insérer un hyperlien dans le
texte provient du paquetage \pkg{hyperref} \citep{hyperref}. Les
commandes \cmdprint{\faEx\-ter\-nal\-Link*} et \cmdprint{\faBookmark}
proviennent du paquetage \pkg{fontawesome5} \citep{fontawesome5};
elles insèrent dans le texte des icônes de la police libre %
\link{https://fontawesome.com}{Font~Awesome}. %
Avec la définition ci-dessus, la déclaration
\begin{lstlisting}
\doc{documentation}{hyperref}{%
https://texdoc.net/pkg/hyperref}
\end{lstlisting}
produit: \doc{hyperref}{https://texdoc.net/pkg/hyperref}. %
\qed
\end{exemple}
\section{Nouveaux environnements}
\label{sec:commandes:environnements}
Tel que mentionné en introduction du chapitre, {\LaTeX} permet
également à l'utilisateur de définir ou de modifier des
environnements. La mécanique est similaire à celle de la définition de
commandes, sauf qu'un environnement compte trois parties: le début,
marqué par la déclaration \cmdprint{\begin\marg{...}} et, parfois, des
commandes de configuration de l'environnement; le contenu en tant
que tel; la fin, marquée par la déclaration
\cmdprint{\end\marg{...}}.
Les commandes suivantes servent à créer ou à modifier des
environnements:
\begin{lstlisting}
\newenvironment`\marg{nom\_env}\oarg{narg}\marg{début\_déf}\marg{fin\_déf}'
\renewenvironment`\marg{nom\_env}\oarg{narg}\marg{début\_déf}\marg{fin\_déf}'
\end{lstlisting}
Les nombreux arguments sont les suivants:
\begin{list}{}{%
\setlength{\labelsep}{1.5ex}
\settowidth{\labelwidth}{\meta{début\_déf}}
\setlength{\leftmargin}{\labelwidth}
\addtolength{\leftmargin}{\labelsep}
\setlength{\parsep}{0.5ex plus0.2ex minus0.2ex}
\setlength{\itemsep}{0.3ex}
\renewcommand{\makelabel}[1]{\meta{#1}\hfill}}
%
\item[nom\_env] nom de l'environnement à créer ou à modifier.
Il est fortement recommandé de ne pas modifier les environnements de
base de {\LaTeX};
\item[narg] un nombre entre 1 et 9 représentant le nombre
d'arguments de l'environnement, lorsqu'il y en a. Les arguments sont
utilisés de la même manière que dans les définitions de commandes;
\item[début\_déf] commandes et texte à insérer au début de
l'environnement, lors de l'appel \cmdprint{\begin\marg{nom\_env}}.
C'est dans ce bloc que doivent se trouver les jetons \code{\#1},
\dots, \code{\#}\meta{narg} lorsque l'environnement a des
arguments.
\item[fin\_déf] commandes et texte à insérer à la fin de
l'environnement, lors de l'appel \cmdprint{\end\marg{nom\_env}}.
\end{list}
\begin{exemple}
\label{ex:commandes:citation}
Créons un environnement pour composer les citations hors paragraphe
de la manière suivante:
\begin{quote}
\small\itshape%
Texte en italique, dans une police de taille inférieure au texte
normal et en retrait des marges gauche et droite.
\end{quote}
Ceci est simple à réaliser en se basant sur l'environnement standard
\Ie{quote} et en modifiant les attributs de police:
\begin{lstlisting}
\begin{quote}
\small\itshape%
Texte en italique...
\end{quote}
\end{lstlisting}
Pour automatiquement composer toutes les citations de la même
manière, il suffit de créer un nouvel environnement, disons
\Ie{citation}:
\begin{lstlisting}
\newenvironment{citation}%
{\begin{quote}\small\itshape}%
{\end{quote}}
\end{lstlisting}
Le bloc de code ci-dessus peut ensuite être remplacé par
\begin{lstlisting}
\begin{citation}
Texte en italique...
\end{citation}
\end{lstlisting}
\qed
\end{exemple}
\tipbox{N'hésitez pas à créer des nouvelles commandes et des nouveaux
environnements dès lors qu'une mise en forme particulière revient
plus d'une ou deux fois dans un document.}
%%%
%%% Exercices
%%%
\section{Exercices}
\label{sec:commandes:exercices}
\Opensolutionfile{solutions}[solutions-commandes]
\begin{Filesave}{solutions}
\section*{Chapitre \ref*{chap:commandes}}
\addcontentsline{toc}{section}{Chapitre \protect\ref*{chap:commandes}}
\end{Filesave}
\begin{exercice}
Certains auteurs composent les sigles et les acronymes\footnote{%
Un sigle est une abréviation formée par une suite de lettres qui
sont les initiales d'un groupe de mots. Un acronyme est un sigle
qui se prononce comme un mot ordinaire.} %
en petites capitales, avec ou sans les points: \textsc{c.q.f.d.},
\textsc{nasa}.
\begin{enumerate}
\item Créer une commande \cmdprint{\NASA} qui insère l'acronyme
\textsc{nasa} dans le texte. Rappelons que l'on compose du texte en petites
capitales avec la commande \cmd{\textsc}.
\item Créer une commande plus générale \cmdprint{\sigle} qui affiche
son argument en petites capitales. La commande devra convertir
l'argument en minuscules avec \cmd{\MakeLowercase} afin que le
résultat soit toujours le même peu importe la casse utilisée dans
le code. Ainsi, \lstinline=\sigle{nasa}=, \lstinline=\sigle{Nasa}= et
\lstinline=\sigle{NASA}= donneront toujours
\textsc{nasa}.
\item Après avoir utilisé la commande \cmdprint{\sigle} à quelques
reprises dans un document, modifier sa définition pour plutôt
composer les sigles en majuscules.
\end{enumerate}
Utiliser le gabarit de document \fichier{exercice-gabarit.tex} pour
créer et tester les commandes ci-dessus.
\begin{sol}
\begin{enumerate}
\item \lstinline=\newcommand{\NASA}{\textsc{nasa}}=
\item \lstinline=\newcommand{\sigle}[1]{\textsc{\MakeLowercase{#1}}}=
\item \lstinline=\newcommand{\sigle}[1]{\MakeUppercase{#1}}=
\end{enumerate}
\end{sol}
\end{exercice}
\begin{exercice}
Je n'ai pas abordé dans le chapitre une fonctionnalité plus avancée
de \cmd{\newcommand} et \cmd{\renewcommand}, soit celle de pouvoir
définir des commandes dont un argument est optionnel ou, plus
précisément, de donner une valeur par défaut à un argument.
La syntaxe réellement complète de \cmd{\newcommand} et
\cmd{\renewcommand} est la suivante:
\begin{lstlisting}
\newcommand{`\bs\meta{nom\_commande}'}`\oarg{narg}\oarg{option}\marg{déf}'
\renewcommand{`\bs\meta{nom\_commande}'}`\oarg{narg}\oarg{option}\marg{déf}'
\end{lstlisting}
L'argument additionnel \meta{option} contient la valeur par défaut
du \emph{premier} argument de \bs\meta{nom\_commande}. Dès lors, la
commande ne compte plus \meta{narg} arguments obligatoires, mais
bien $\text{\meta{narg}} - 1$ arguments obligatoires et un optionnel.
Modifier la définition de la commande \cmdprint{\doc} de
l'\autoref{ex:commandes:doc} pour que «documentation» soit le texte
par défaut de l'hyperlien qui est placé au fil du texte.
\begin{sol}
Avec la définition
\begin{lstlisting}
\newcommand{\doc}[3][documentation]{%
\href{#3}{#1~\raisebox{-0.2ex}{\faExternalLink}}%
\marginpar{\faBookmark~\texttt{#2}}}
\end{lstlisting}
la déclaration à deux arguments
\begin{lstlisting}
\doc{hyperref}{https://texdoc.net/pkg/hyperref}
\end{lstlisting}
produit toujours \doc{hyperref}{https://texdoc.net/pkg/hyperref}.
\end{sol}
\end{exercice}
\begin{exercice}
Modifier l'environnement \Ie{citation} de
l'\autoref{ex:commandes:citation} afin de composer les citations
hors paragraphe comme suit:
\begin{quote}
\begin{tabularx}{\linewidth}{X}
\toprule
\small\sffamily%
La citation est toujours en retrait des marges gauche et droite,
mais également surmontée et suivie de filets horizontaux. Le
texte est en police de taille \cmdprint{\small}, droite et sans
empattements. \\
\bottomrule
\end{tabularx}
\end{quote}
\emph{Astuce}: utiliser un tableau pleine largeur à l'intérieur de
l'environnement \Pe{quote} pour disposer le texte et créer les
filets horizontaux.
\begin{sol}
La définition suivante donne les résultats demandés:
\begin{lstlisting}
\newenvironment{citation}
{\begin{quote}
\begin{tabularx}{\linewidth}{X}
\toprule\small\sffamily}%
{\\ \bottomrule
\end{tabularx}
\end{quote}}
\end{lstlisting}
Dans le troisième argument, la présence de la commande de fin de
ligne {\pixbsbs} doit précéder \cmdprint{\bottomrule}.
\end{sol}
\end{exercice}
\Closesolutionfile{solutions}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "formation-latex-ul"
%%% TeX-engine: xetex
%%% coding: utf-8
%%% End:
|