> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/fr/fichiers-de-classe/04-writing-your-own-class.md).

# Écrire votre propre classe

Parfois, la meilleure option pour personnaliser un document est d’écrire une nouvelle classe à partir de zéro. Cet article explique la structure principale et les commandes nécessaires dans une nouvelle classe.

## Introduction

La première chose à faire avant de coder une nouvelle classe est de déterminer si vous avez vraiment besoin ou non d’une nouvelle classe. Il est recommandé de [faire une recherche sur CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) et de voir si quelqu’un a déjà créé quelque chose de similaire à la classe de document dont vous avez besoin.

Une autre chose importante à garder à l’esprit est [la différence entre les packages et les classes](/latex/fr/fichiers-de-classe/01-understanding-packages-and-class-files.md). Faire le mauvais choix peut affecter la flexibilité du produit final.

## Structure générale

La structure de tous les fichiers de classe peut être décrite approximativement en quatre parties :

* ***Identification***. Le fichier se déclare comme une classe écrite avec la syntaxe LaTeX2ε.
* ***Déclarations préliminaires***. Ici, les paquets et classes externes nécessaires sont importés. De plus, dans cette partie du fichier, les commandes et définitions nécessaires aux options déclarées sont codées.
* ***Options***. La classe déclare et traite les options.
* ***Autres déclarations***. Le corps principal de la classe. Presque tout ce qu’une classe fait est défini ici.

Dans les sous-sections suivantes, une description plus détaillée de la structure et un exemple fonctionnel, *exampleclass.cls*, seront présentés.

### Identification

Il y a deux commandes simples que toutes les classes doivent avoir :

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Exemple de classe LaTeX]
```

La commande `\NeedsTeXFormat{LaTeX2e}` définit la version de LaTeX pour que la classe fonctionne. De plus, une date peut être ajoutée entre crochets pour préciser la date minimale de publication requise.

La commande `ProvidesClass{exampleclass}[...]` identifie cette classe comme *exampleclass* et, à l’intérieur des crochets, la date de publication et quelques informations supplémentaires sont incluses. La date doit être au format AAAA/MM/JJ

[Ouvrez un exemple montrant comment écrire une classe dans Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Déclarations préliminaires

La plupart des classes étendent et personnalisent des classes existantes, et ont aussi besoin de certains paquets externes pour fonctionner. Ci-dessous, du code supplémentaire est ajouté à la classe d’exemple `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Exemple de classe LaTeX]

\newcommand{\headlinecolor}{\normalcolor}
\LoadClass[twocolumn]{article}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}
```

Les commandes dans cette partie initialisent soit certains paramètres qui seront ensuite utilisés pour gérer les options, soit importent des fichiers externes.

La commande `\LoadClass[twocolumn]{article}` charge la classe `article` avec le paramètre supplémentaire `twocolumn`. Par conséquent, toutes les commandes de la `article` classe standard seront automatiquement disponibles dans la **example** classe, sauf que le document sera imprimé dans un format à deux colonnes.

`\RequirePackage` est très similaire au bien connu `\usepackage`, l’ajout de paramètres optionnels entre crochets fonctionne aussi. La seule différence est que la `\usepackage` ne peut pas être utilisé avant `\documentclass` la commande. Il est fortement recommandé d’utiliser `\RequirePackage` lors de l’écriture de nouvelles classes ou de nouveaux paquets.

[Ouvrez un exemple montrant comment écrire une classe dans Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Options

Pour permettre une certaine flexibilité dans les classes, quelques options supplémentaires sont très utiles. La partie suivante du fichier `exampleclass.cls` gère les paramètres passés à la commande documentclass. Nous avons également déplacé `\LoadClass` à *après* le traitement des options, afin que les options définies dans le fichier .tex puissent être transmises à la classe de base.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Exemple de classe LaTeX]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}
```

Il y a ici quatre commandes principales qui gèrent les options passées à la classe.

La commande `\DeclareOption{}{}` gère une option donnée. Elle prend deux paramètres, le premier est le nom de l’option et le second est le code à exécuter si l’option est passée.

La commande `\OptionNotUsed` affichera un message dans le compilateur et dans les journaux, l’option ne sera pas utilisée. Dans ce cas, le document est défini en deux colonnes et si l’utilisateur essaie de le passer en une colonne, cela ne fonctionnera pas, l’option sera ignorée.

La commande `\Declareoption*{}` gère toute option non définie explicitement. Il ne prend qu’un seul paramètre, le code à exécuter lorsqu’une option inconnue est passée. Dans ce cas, il exécutera la commande suivante :

`\PassOptionsToClass{}{}`. Transmet l’option contenue dans la première paire d’accolades à la classe de document indiquée dans la deuxième paire d’accolades. Dans l’exemple, toutes les options inconnues seront transmises à la **article** classe de document.

`\CurrentOption` stocke le nom de l’option de classe en cours de traitement à un moment donné.

La commande `\ProcessOptions\relax` exécute le code pour chaque option et doit être inséré après la saisie de toutes les commandes de gestion des options. Il existe une version étoilée de cette commande qui exécutera les options dans l’ordre exact spécifié par les commandes appelantes.

Dans l’exemple, si les options `red` ou `vert` sont transmises au document, la police utilisée pour le titre et les sections sera définie dans la couleur correspondante. La couleur appelée `slcolor` a été définie dans le [déclarations préliminaires](#preliminary-declaration) après l’importation de la `xcolor` package.

[Ouvrez un exemple montrant comment écrire une classe dans Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Autres déclarations

Dans cette partie apparaîtront la plupart des commandes. Dans « exampleclass.cls », les dimensions de la page, la taille de police pour le titre, le corps du texte et les sections sont définies. Ci-dessous, vous pouvez voir le fichier de classe complet.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Exemple de classe LaTeX]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}

\renewcommand{\maketitle}{%
    \twocolumn[%
        \fontsize{50}{60}\fontfamily{phv}\fontseries{b}%
        \fontshape{sl}\selectfont\headlinecolor
        \@title
        \medskip
        ]%
}

\renewcommand{\section}{%
    \@startsection
    {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
    {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
}

\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{22cm}
\setcounter{secnumdepth}{0}
```

Pour comprendre le reste des commandes, voir le [guide de référence](#reference-guide) et les liens dans la [section de lecture complémentaire](#further-reading).

Les quatre dernières commandes de l’exemple montrent les quatre éléments que toutes les classes doivent contenir :

* La définition de `normalsize`. Définit la taille de police par défaut [taille de police](/latex/fr/polices/01-font-sizes-families-and-styles.md).
* Une valeur par défaut pour [`textwidth`](/latex/fr/mise-en-forme/07-page-size-and-margins.md)
* Une valeur par défaut pour [`textheight`](/latex/fr/mise-en-forme/07-page-size-and-margins.md)
* Les spécifications pour la [numérotation des pages](/latex/fr/mise-en-forme/03-page-numbering.md).

Ci-dessous, un document qui utilise la classe *exampleclass.cls*.

```latex
\documentclass[red]{exampleclass}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{blindtext}

\title{Exemple pour montrer comment fonctionnent les classes}
\author{Team Learn ShareLaTeX}
\date{août 2014}

\begin{document}

\maketitle

\noindent
Commençons ici par un exemple simple et fonctionnel.

\blindtext

\section{Introduction}

Le problème de Monty Hall...

\section{La même chose}

Le Monty...
```

![WrittingClassesEx1.png](/files/8288c3054d21b82c210cd6e718f249478c178283)

Remarquez que la première commande ici est

```latex
\documentclass[red]{exampleclass}
```

[Ouvrez un exemple montrant comment écrire une classe dans Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Gestion des erreurs

Lorsqu’il s’agit de développer de nouvelles classes, il est important de gérer les erreurs possibles afin d’informer l’utilisateur qu’une erreur s’est produite. Il existe quatre commandes principales pour signaler les erreurs dans le compilateur.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Prend trois paramètres, chacun entre accolades : le nom de la classe, le texte de l’erreur qui va être affiché (le processus de compilation sera suspendu), et le texte d’aide qui sera imprimé si l’utilisateur appuie sur « h » lorsque la compilation s’arrête à cause de l’erreur.
* `\ClassWarning{*class-name*}{*warning-text*}`. Dans ce cas, le texte est affiché mais le processus de compilation ne s’arrêtera pas. Le numéro de ligne où l’avertissement s’est produit sera affiché.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Fonctionne comme la commande précédente, mais n’affichera pas la ligne où l’avertissement s’est produit.
* `\ClassInfo{*class name*}{*info-text*}`. Dans ce cas, l’information contenue dans le second paramètre ne sera imprimée que dans le fichier de transcription, y compris le numéro de ligne.

[Ouvrez un exemple montrant comment écrire une classe dans Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Guide de référence

**Liste des commandes couramment utilisées dans les classes et les paquets**

* `\newcommand{*name*}{*definition*}`. Définit une [nouvelle commande](/latex/fr/commandes/01-commands.md#defining-a-new-command), le premier paramètre est le nom de la nouvelle commande, le second paramètre est ce que la commande fera.
* `\renewcommand{}{}`. Comme `\newcommand` mais écrasera une commande existante.
* `\providecommand{}{}`. Fonctionne exactement comme `\newcommand` mais si la commande est déjà définie, celle-ci sera ignorée silencieusement.
* `\CheckCommand{}{}`. La syntaxe est la même que `\newcommand`, mais il vérifiera plutôt si la commande existe et possède la définition attendue ; LaTeX affichera un avertissement si la commande n’est pas ce que `\CheckCommand` attendu.
* `\setlength{}{}`. Définit la longueur de l’élément passé en premier paramètre à la valeur écrite en second paramètre.
* `\mbox{}`. Crée une boîte qui contient les éléments écrits à l’intérieur des accolades.
* `\fbox{}`. Comme `\mbox`, mais une boîte est réellement imprimée autour du contenu.

## Lectures complémentaires

Pour plus d'informations, voir

* [Comprendre les paquets et les fichiers de classe](/latex/fr/fichiers-de-classe/01-understanding-packages-and-class-files.md)
* [Écrire votre propre package](/latex/fr/fichiers-de-classe/03-writing-your-own-package.md)
* [Commandes](/latex/fr/commandes/01-commands.md) et [Environnements](/latex/fr/commandes/02-environments.md)
* [Longueurs en LaTeX](/latex/fr/mise-en-forme/01-lengths-in-latex.md)
* [Utiliser les couleurs dans LaTeX](/latex/fr/mise-en-forme/13-using-colors-in-latex.md)
* [Gestion dans un grand projet](/latex/fr/structure-du-document/07-management-in-a-large-project.md)
* [LaTeX2ε pour les auteurs de classes et de paquets](http://www.latex-project.org/guides/clsguide.pdf)
* [Notes sur la programmation en TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minutes en moins d’heures : utilisation des ressources LaTeX](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Deuxième édition](http://ptgmedia.pearsoncmg.com/images/9780201362992/samplepages/0201362996.pdf)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/fr/fichiers-de-classe/04-writing-your-own-class.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
