summaryrefslogtreecommitdiff
path: root/info/formation-latex-ul/source/commandes.tex
blob: d8b8a9549cf9b0de707f6b3ceb0ad38f772881a8 (plain)
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) 2020 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, il est assez naturel de
permettre à l'usager de définir à son tour ses propres 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}
  Nous avons créé ou modifié des commandes pour chacune des raisons
  ci-dessus dans la préparation du présent document.
  \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 nous souhaitons en changer, il suffit 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}
  Nous reviendrons 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 les appels à ces commandes 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. Ce nom doit être différent de celui
de toute commande active\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.} %
dans le document dans le cas de \cmdprint{\newcommand}. À l'inverse,
une commande active doit nécessairement porter le même nom lorsque
l'on fait appel à \cmdprint{\renewcommand}.

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}
  Ainsi, si l'on souhaite pour une raison quelconque modifier la
  représentation de l'ensemble des nombres réels, il 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}, nous avons
  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, on trouve dans le préambule du document 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'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~\raisebox{-0.2ex}{\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{fontawesome} \citep{fontawesome}; elles
  insèrent dans le texte des icônes de la police libre %
  \link{https://fortawesome.com/}{Font~Awesome}. %

  Avec la définition ci-dessus, la déclaration
\begin{lstlisting}
\doc{documentation}{hyperref}{%
  http://texdoc.net/pkg/hyperref}
\end{lstlisting}
  produit: \doc{hyperref}{http://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{...}}.

On crée ou modifie des environnements avec les commandes
\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}
  On souhaite 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 \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}
  Nous n'avons 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}{http://texdoc.net/pkg/hyperref}
\end{lstlisting}
    produit toujours \doc{hyperref}{http://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}
\newcommand{citation}
  {\begin{quote}
     \begin{tabularx}{\linewidth}{X}
       \toprule\small\sffamily}%
  {\\ \bottomrule
     \end{tabularx}
   \end{quote}}
\end{lstlisting}
    On remarquera dans le troisième argument la présence de la
    commande de fin de ligne {\bs\bs} qui doit absolument 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: