Créez votre propre package
Formation
En Semi-présenciel Paris
Description
-
Typologie
Formation
-
Méthodologie
En semi-présentiel
-
Lieu
Paris
Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.
Les sites et dates disponibles
Lieu
Date de début
Date de début
Les Avis
Le programme
Bonjour chers amis ZérOs !
Utilisateurs du système de composition typographique $\LaTeX{}$, vous en avez assez de saisir toujours les mêmes lignes dans le préambule de votre document ? Sachez qu'il est possible de créer votre propre package (ou dans un langage plus français : extension) dans lequel vous chargerez vos extensions, commandes et environnements favoris, afin de vous rendre la vie beaucoup plus facile !
Prêts à franchir un nouveau pas dans votre utilisation du merveilleux système qu'est $\TeX{}$ (et sa surcouche$\LaTeX{}$) ?
Suivez le guide...
Dans la suite du tutoriel, par pure fainéantise, j'écrirai TeX et LaTeX, respectivement à la place de $\TeX{}$ et $\LaTeX{}$.
Structure de baseLe code minimalTout d'abord, commençons par la structure minimale de toute extension $\LaTeX{}$$2_{\epsilon}$ (pour les novices, prononcez la tek 2 epsilon) :
\NeedsTeXFormat{LaTeX2e}[1999/01/01] \ProvidesPackage{nomPackage}[2007/11/26] %chargement des extensions requises au bon fonctionnement de l'extension et des documents %déclaration des options de l'extension \ProcessOptions %commandes et/ou environnements personnalisés \endinput Analyse du code minimalAfin de mieux comprendre, je vous propose une étude ligne par ligne du code.
Spécifications de base\NeedsTeXFormat{LaTeX2e}[1999/01/01]On spécifie tout d'abord la version de LaTeX nécessaire au fonctionnement de l'extension. Dans ce cas, on demande la version 2e soit $2_{\epsilon}$. L'argument optionnel (entre crochets) précise la date minimale de sortie du moteur TeX (ou des macros LaTeX permettant l'utilisation de l'extension créée). Ceci n'est nécessaire que si vous souhaitez utiliser des commandes seulement présentes dans des versions bien précises des moteurs TeX ou LaTeX.
Aux utilisateurs de $\LaTeX{} 2.09$ :
il est actuellement fortement déconseillé d'utiliser cette version du système de macros LaTeX, car de plus en plus d'extensions sont inaccessibles et l'utilisation est bien moins confortable pour de nombreuses actions.
Ceci est une ligne essentielle. En effet, c'est elle qui détermine le nom de l'extension que vous créez. Dans ce cas, le nom est très original : monPackage. Une fois de plus, l'argument optionnel permet de préciser la date de création de l'extension.
Ainsi, pour utiliser votre extension dans votre document, vous écrirez :
Eh ! C'est quoi cette ligne en commentaire ? Tu crois vraiment que le compilateur va la lire ?
Bien sûr que non ! Les marqueurs de commentaires ne varient pas entre les fichiers sources et les fichiers d'extensions. Je ne voulais simplement pas vous donner d'exemple et donner directement la commande sans argument n'aurait pas été très explicite.
Je vous propose maintenant la syntaxe correcte à utiliser :
Comme on peut aisément le remarquer, \RequirePackage[]{} possède la même syntaxe que \usepackage[]{} que l'on utilise dans les fichiers sources "classiques".
Veillez à bien charger toutes les extensions nécessaires au fonctionnement de votre extension. Je pense notamment aux extensions du type amsmath si vous définissez dans votre extension une commande utilisant la famille \mathbb{}.
Options%déclaration des options de l'extensionAfin de déclarer les options que vous comptez utiliser, on procède comme suit.
1. Options définies
\DeclareOption{<nom de l'option>}{<action>}Dans <nom de l'option>, on met le mot clef à indiquer dans les arguments optionnels de la commande \usepackage[]{}.
Dans <action>, on indique l'action à réaliser si l'option est demandée.
C'est bien beau tout ça, mais cela ne m'indique pas ce qu'il faut mettre dans <action>.
En fait, on met bien souvent (voire toujours) un changement de valeur de booléen. Je m'explique : imaginons que je veuille rendre l'utilisation de l'extension hyperref (pour créer des liens hypertextes et bien d'autres choses dans mon document) optionnelle. Je crée alors un booléen auquel j'affecte la valeur false :
\RequirePackage{ifthen}%pour utiliser les booléens, à mettre avec les autres RequirePackage's \newboolean{booleenH}%création du booléen \setboolean{booleenH}{false}%affectation de la valeur falseEnsuite, lorsque je déclare mon option, j'écris :
\DeclareOption{optionH}{\setboolean{booleenH}{true}}Donc, si l'option est demandée, on affecte à mon booleenH la valeur true.
Enfin, après le \ProcessOptions, je charge l'extension hyperref, uniquement si l'option optionH est demandée :
\ifthenelse{\boolean{booleenH}% }{\RequirePackage{hyperref}% }{}Remarque : une autre solution est présentée dans la suite du tutoriel.
2. Options indéfinies
Imaginons à présent que vous êtes polyglottes. Vous aurez donc besoin de charger des options de babel différentes (eh oui, même babel est chargé par votre extension personnelle ! ). Dans ce cas, on ne peut pas déclarer les options comme indiqué ci-dessus. On utilise donc un joker : l'étoile (*).
\DeclareOption*{action}Évidemment, il n'y a pas de champ <nom de l'option> à compléter !
Dans le champ <action>, on utilise bien souvent la ligne suivante :
Ce qui permet de passer l'ensemble des options non déclarées explicitement à l'extension <package> souhaitée.
L'extension voulue doit être chargée avec un (\RequirePackage[]{}) après la commande \DeclareOption*{}.
Puis vient la validation des options avec :
\ProcessOptions Commandes et environnements personnalisésLa dernière partie de votre extension est consacrée à la définition de vos propres commandes et environnements. On utilise pour ce faire les deux commandes suivantes, respectivement pour les commandes et les environnements :
\newcommand{<\nomCommande>}[<nombreArguments]{<code>}et :
\newenvironnment{<nomEnvironnement>}{<clausesDébut>}{<clausesFin>}La création de commandes et d'environnements n'étant pas le sujet de ce tutoriel, je ne m'étendrai pas d'avantage.
Et pour finir...Eh bien, on indique au compilateur que c'est fini avec :
\endinputEt voilà !
L'astuce babelComme nous l'avons vu dans la sous-partie précédente, il faut recourir au joker étoilé pour optimiser le chargement de l'extension babel. Je vous propose ici d'étudier plus en détail ce que j'ai baptisé "l'astuce babel", afin d'en maîtriser toutes les facettes.
Gestion des langues : ce qu'il faut savoirVous le savez peut-être : l'extension babel, habituellement chargée pour nous francophones, est représentée par l'un des codes suivants :
\usepackage[francais]{babel} %ou \usepackage[frenchb]{babel} %ou encore \usepackage[frenchle]{babelfr} %liste non exhaustiveElle permet d'adapter différents paramètres (traduction des titres, gestion de la typographie, etc.) à la langue choisie. Cependant, babel ne se contente pas de gérer une seule langue à la fois. En effet, il est possible d'utiliser plusieurs langues dans un même document.
Imaginons, par exemple, que je veuille écrire en français, en anglais et en allemand. Dans une source normale, j'écrirai :
Ce qui aura pour effet de charger les modules de traduction en anglais, en allemand et en français.
Mais il y a un problème. Pour les chapitres par exemple, il sera marqué ceci : Kapitel, Chapter, Chapitre 1 ?
Euh non ! Ce serait d'ailleurs bien embêtant ! En fait, c'est la dernière langue demandée (ici français) qui est appliquée par défaut. Il sera donc marqué, si je ne précise rien : Chapitre 1. Ouf !
Changement de languePour changer de langue, babel offre plusieurs possibilités :
un environnement :
\begin{otherlanguage}{<langue>} \end{otherlanguage}une commande :
\foreignlanguage{<langue>}{<texte dans la langue <langue>>}une déclaration :
\selectlanguage{<langue>}
Dans tous les cas, la langue (<langue>) indiquée en argument doit avoir été chargée par babel.
Utilisation de \DeclareOption*{}Nous allons à présent voir comment on peut utiliser intelligemment la commande \DeclareOption*{}.
Je vous propose le code suivant que je commenterai brièvement ensuite :
Comme je l'avais déjà proposé précédemment, on demande à passer l'ensemble des options non déclarées explicitement, c'est-à-dire avec une commande \DeclareOption{}{}, au package babel. Celui-ci doit donc être chargé après, comme indiqué sur le code ci-dessus et sans aucune option.
J'insiste bien sur le fait qu'il ne faut surtout pas indiquer d'options à l'extension babel dans la ligne :
\RequirePackage{babel}Sinon, vous risquez d'avoir un superbe message d'erreur :
! LaTeX Error : Option clash for package babelCe qui signifie que vous avez tenté de charger l'extension babel avec des options différentes, à deux moments différents. Et bien sûr, la compilation plante !
Remarques concernant l'utilisation de "l'astuce babel".Il existe cependant un désavantage majeur à l'utilisation de cette astuce qui est néanmoins très utile. En effet, vous êtes obligés de donner une option de langage à votre extension. De plus, n'oubliez pas que c'est la dernière langue entrée qui est utilisée par défaut dans votre document. D'autre part, il est ensuite impossible de passer d'autres options non déclarées explicitement à d'autres packages que babel.
Exemple : vous voulez utiliser les options non déclarées explicitement pour les extensions hyperref et babel. Dans la source de votre document, vous écrivez alors :
Et, lors de la compilation, vous obtenez :
! Package babel Error : Language definition file colorlinks.ldf not foundAutrement dit, si vous ne voulez pas avoir d'erreur de compilation, il ne vous reste plus qu'à inventer la langue colorlinks :lol: !
Conditions TeX, conditions LaTeXNous allons, pour finir, aborder un point un peu plus technique, mais pas de quoi s'arracher les cheveux, rassurez-vous. Il s'agit simplement d'approfondir un point essentiel de la création d'extensions, que j'ai auparavant quelque peu estompé : les conditions.
Les conditions en TeXLe système TeX de base utilise le système de conditions suivant :
\newif \if@ca \@ifcatrue % % \if@ca %commandes \fiExplications
On commence par créer une variable de type if avec la commande :
Cette variable possède pour nom :
\if@caSoit en français :
si "ça" est ...Ben oui, il faut encore assigner une valeur à notre variable :
\@ifcatrueDans notre cas, on assigne à notre variable la valeur true, soit vrai.
Les programmeurs, tous langages confondus, reconnaîtront ici un booléen. La logique booléenne est à la base de tous les langages de programmation, mais également de la logique en général. C'est cette logique que l'on utilise lorsqu'on effectue des associations de conditions avec les opérateurs logiques AND ("et"), OR ("ou"), XOR ("ou" exclusif) et NOT (négation).
Sa formalisation est appelée algèbre de Boole.
Enfin, le code devant s'exécuter lorsque la condition est vraie est dans le bloc :
\if@ca \fi Application aux extensionsIl est possible d'utiliser ce système de conditions dans les extensions, notamment dans la gestion des options.
Exemple :
On charge l'extension xcolor si l'option color est envoyée à l'extension personnelle.
Les conditions en LaTeXCréez votre propre package
