Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le mai 8, 2016 Temps de lecture: 16 min

Me suivre sur Mastodon

Un beau document en LaTeX

Faire un joli document avec une couverture “design”, des pages de chapitre originales, le tout en LaTeX, c’est ce que nous allons voir aujourd’hui. Quand on se penche sur la puissance de certains packages LaTeX on se rend compte que “tout est possible”. C’est là la grande force de ce “langage” créé en 1983!

Cet article va vous permettre de créer ce thème LaTeX:

Vous pouvez récupérer le PDF final ici: https://examples.metal3d.org/example-theme.pdf

LaTeX ?

Pour commencer, résumons ce qu’est LaTeX. C’est un language de “balise” qui permet de générer des documents de différents type tels que des rapports, des articles, des livres, des présentations (slide type beamer), etc. Il a surtout été apprécié par les doctorants scientifiques par la qualité de présentation des équations.

TeX est né en 1977 et LaTeX, la suite de macros pour faciliter son écriture, date lui de 1983. Il y a eu très peu d’évolution majeure ce qui le rend très stable, presque dépourvu de bug, et cela assure aussi une pérennité de package rarement égalée.

Dans ces packages, on trouve des styles, des macros qui permettent de colorer du code tel que l’excellent “minted”, mais aussi un package que j’adore: “TikZ”.

TikZ est un package de création de “dessin”. Cela va de simples formes (rectangle, cercles…) à des diagrammes, des graphiques, et du placement de noeuds (pour faire des mind-map par exemple). Plus on se penche sur les possibilités du package, plus on s’étonne de la puissance de l’outil.

Bref, je viens d’être amené à refaire du LaTeX. J’ai retrouvé ce plaisir de taper du texte sans me poser la question de “comment ça va rendre au final”, sachant que je pouvais me poser sur le “design” après coup. Autant vous dire, je ne vais pas vous mentir, quand vous décidez de passer à la phase “design” vous allez y passer un moment. Car, bien que je sois un fervent défenseur de LaTeX et de sa productivité, je ne suis pas de ceux qui estiment que c’est magique. Non, il faut se pencher sur de la documentation, il faut tester, se former, se planter 20 fois, recommencer… Mais ce qui est intéressant c’est que je ne crains jamais de tuer mon projet. Au pire, je supprime les packages qui m’embêtent, au mieux je vire mes adaptations.

Pour bien faire les choses

Pour commencer, il faut toujours penser à séparer la description du document, le document, et le style. Personnellement je fais ainsi, un fichier “main.tex”:

\documentclass[12pt]{book}
\usepackage[frenchb]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

% là je mets tout ce qui est voué
% à styliser mon document
\input{_monstyle}

\begin{document}

\maketitle
\tableofcontents

%% ici j'inclu mon contenu
\input{_structure}

\end{document}

N’oubliesz pas: on inclue les fichiers sans donner l’extension, donc j’ai bien deux fichiers “_monsytle.tex” et “_structure.tex”.

L’intérêt de cette manière d’écrire un document est simplement que si jamais mon style est inutilisable, je peux commenter l’inclusion. Si mon fichier principal ne me plait plus, je peux refaire un “main.tex” simple et inclure ma structure. C’est donc bien “_structure.tex” qui est mon élément central, c’est-à-dire le contenu.

Le fichier de structure est simplement une liste d’inclusion d’autre partie du document:

% j'inclue ici mes docments, ou
\input{partie1}
\input{les_caramels_mous}

% une autre manière que j'utilise:
\chapter{Introduction}
    \section{Qui je suis}
    \input{moi}

    \section{Ce document}
    \input{apropos}

\chapter{Les caramels mous}
    \section{C'est bon ou pas ?}
    \input{gouts_et_couleurs}

    \section{etc...}

A vous de choisir votre méthode de construction. Il y en a qui tape tout le document dans “_structure”, d’autres incluent les fichiers les uns après les autres ou représentent la table des matières comme je le fais souvent. Là c’est une question de méthode et de gout.

Juste un petit point à préciser, j’utilise la classe de document “book”, mais si les alternances de marge de page “doite-gauche” ne vous intéresse pas, passez la classe de document à “report”. Cette classe permet de faire une page de couverture et des chapitres à l’inverse de “article” par exemple. Mais encore une fois, c’est à vous de voir.

Bon, on va passer au design.

Packages utiles au design

LaTeX génère par défaut un document très sobre. Personnellement je trouve la forme de base austère. Pas moche mais pas sexy. À coté d’un document généré avec Word LibreOffice, qui a des entêtes avec des images, des logos… on ne peut pas dire le contraire. Mais je vous le répète, LaTeX permet de faire énormément de choses.

Pour nous amuser un peu, on va changer la police de caractères, et intégrer quelques packages:

  • “fancyhdr” pour changer les entêtes et pieds de page avec aisance
  • “TikZ” qui va nous permettre de dessiner sur nos pages
  • “titlesec” pour changer la forme des titres plus facilement
  • “color” pour créer des couleurs

Ouvrons notre fameux fichier “_monstyle.tex”, et commençons:

% change la fonte
\usepackage[default]{sourcesanspro}

% on insert TikZ et des sous-packages
% très utiles
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tikzpagenodes}

% modification des titres
\usepackage{titlesec}

% création de couleurs
\usepackage{color}

% entêtes et pieds de page
\usepackage{fancyhdr}

Ces packages donnent accès à des nouvelles directives (ou commandes) que nous allons pouvoir utiliser. Sachez que pour 90% de mes documents j’inclue ces packages.

Quelques couleurs

On va définir une ou deux couleurs pour notre document, je vais définir un blanc pur et un bleu agréable à mes yeux. Dans “_monstyle”, toujours, on insert:

\definecolor{white}{rgb}{1,1,1}
\definecolor{myblue}{RGB}{126,136,150}

Un petit mot sur TikZ

À l’origine, TikZ sert surtout à dessiner des diagrammes, des graphiques, etc… en tant que figure dans le document. Mais son uilisation ne se limite pas à cela. TikZ est un “environnement”, c’est-à-dire qu’il définie sont propre espace de travail. LaTeX propose d’autres environnements tels que les entêtes, les pieds de pages, les marges, la page de titre, etc. Il suffit donc de placer l’environnement TikZ dans un environnement choisi pour dessiner où l’on veut.

C’est ce que nous allons faire.

Chapitres

Les pages de chapitres sont franchement les plus difficiles à modifier. Mais avec un peu de bon sens et des tests, on y arrive. De base, LaTeX propose une page de chapitre très simple mais j’avais envie de bien les “extraire” pour que le lecteur ne s’ennuie pas.

Le package “titlesec” fourni (entre autre) une commande un peu violente à lire, mais qui s’avère finalement plus simple qu’on le pense:

\titleformat{command}[shape]{format}{label}{sep}{before}[after]

La documentation est très complète, je vous conseille d’aller la lire.

Pour faire court, “command” est la commande titre à changer, on va utiliser “\chapter”, shape est optionnel, vient alors le “format” qui défini comment afficher le titre (couleur, taille, etc.)

Ensuite, le “label” pour définir le titre, “sep” défini la séparation vertical entre le document et le titre, et “before” va nous permettre de définir ce qu’on place “avant” le chapitre. C’est ce dernier bloc qui va être le sujet de toute notre attention.

Comme “shape” est optionnel, tout comme “after”, on va juste faire ceci:

\titleformat{command}
    {format}
    {label}
    {sep}
    {before}
\titleformat{\chapter}
    {\Huge\color{white}}
    {\thechapter}
    {0}
    {Et là notre dessin... on y vient}

Le dessin avec TikZ va être un peu déroutant au premier abord de la lecture, mais surtout ne paniquez pas.

Le dessin avec TikZ

Dessiner avec TikZ n’est pas “intuitif”, bien que je ne vois pas comment on pourrait faire plus simple en LaTeX. L’idée est que vous allez définir un canva de travail et dessiner dedans. Vous pouvez y injecter des textes, des images, dessiner des traits, remplir des formes, relier des noeuds, etc.

Bref, nous allons nous amuser à dessiner un quadrilatère qui va partir du coin haut-gauche, aller au coin haut-droit, descendre de quelques lignes, et aller rejoindre le bord gauche en oblique.

Si je pars du principe que la page est en “position absolue” pour ne pas perdre les fans de CSS, on va rejoindre 4 points:

  • 0,0
  • largeur de page, 0
  • largeur de page, 8
  • 0, 10

Sauf que…

Si je pars de 0,0, TikZ va partir de la position “0,0” du texte… Heureusement, TikZ propose des positions cardinales qui vont nous aider. Par exemple “current page.north west” correspond au coin haut-gauche de la page (nord ouest).

Voilà le code de dessin, qu’on va injecter:

\begin{tikzpicture}[remember picture,overlay]
  \draw[fill=myblue] (current page.north west)
    -- (current page.north east)
    -- ++ (0, -8)
    -- ++ (-\paperwidth, -2)
    -- cycle;
\end{tikzpicture}

Ok, je vous vois somber. C’est pourtant super simple, j’ai ajouté un “environnement” tikzpicture et je lui dis de:

  • se souvenir des positions des éléments et de leurs noms (on ne va pas trop en parler dans cet article)
  • de ne pas se baser sur les positions du “document” mais de passer en mode “overlay”, c’est-à-dire “sur la page”

J’utilise ensuite la commande “\draw” en lui disant que le dessin dois se remplir de la couleur “myblue” qu’on a défini plus tôt. Et je lui donne les positions. Je joins les points par des “–”, ce qui signifie “trace le trait”.

L’option “++” veut simplement dire: au lieu d’aller au point en position absolue, vas-y en position relative à la position en cours.

Ainsi, quand j’ai inséré “-- ++ (0, -8)” je demande à TikZ de ne pas bouger en “x” mais de descendre de “8” vers le bas. Alors que “ -- (current page.north east)” a demandé à TikZ de déplacer le crayon à ce point sans prendre en considération d’où je viens.

Enfin, la commande “cycle” demande simplement de fermer la forme. En gros, rejoindre le dernier point au premier point déclaré.

Ça ressemble à un peu à du “tortue logo” cette affaire :)

Bon, et bien on a plus qu’à poser ce super dessin dans notre bloc de chapitre:

![Le chapitre](/static/upload/paste-1f0b4fc1-8a66-47db-b852-7e0f800b5318.png)
\titleformat{\chapter} % type
    {\Huge\color{white}} % style
    {\thechapter} % quoi afficher
    {0} % espacement
    {\begin{tikzpicture}[remember picture,overlay]
      \draw[fill=myblue] (current page.north west)
        -- (current page.north east)
        -- ++ (0, -8)
        -- ++ (-\paperwidth, -2)
        -- cycle;
    \end{tikzpicture}
    } % "before"

% on déplace un peu le titre vers le haut
\titlespacing*{\chapter}{-18pt}{0pt}{50pt}

Oui, comme ça de visu ça peut faire peur, mais prennez le temps de repérer les blocs, de comprendre, vous allez voir que c’est finalement pas si compliqué.

J’ai déplacé le titre vers le haut de -18pt tout simplement parce que notre dessin se pose “avant” le titre, et par consquent le texte apparait après. C’est en quelques sortes un “margin-top” en CSS. Et le “0pt” c’est l’écart à gauche, le “padding-left” en CSS. Le “50pt” est l’écart que je force “après” le titre, là on parle de “padding-bottom” en CSS.

Et voilà ! On a dessiné notre page de chapitre. Passons aux autres pages.

Entêtes et Pieds de pages

La partie la plus compliquée est passée, on passe maintenant aux pages. J’ai envie de dessiner une image dans l’entête qui fasse la taille de la page, bord à bord.

Entêtes

J’ai donc créé une image à la va-vite dans Gimp, assez grande pour éviter de pixeliser. On va l’injecter encore une fois grâce à TikZ. Le paquet “fancyhrd” va nous permettre de modifier l’entête.

Petite astuce, pour initialiser les entête et pieds de page à vide, on utilise “\fancyhf{}” ce qui veut dire, mot pour mot, “défini header et footer à vide”. Autre chose, la barre qui sépare l’entête et le pied de page du texte nous gêne, donc on va la mettre à 0pt.

% à placer après l'insertion de
% package "fancyhdr"
\pagestyle{fancyplain} % ou "fancy", testez
\fancyhf{} % vire le contenu de header et footer
\renewcommand{\headrulewidth}{0pt} % vire la barre de séparation

Maintenant, on définie l’entête. Fancyhdr permet de placer des trucs à droite, à gauche et au centre. On va utiliser le bloc central, mais c’est absolument arbitraire. On déclare notre entête avec “\chead{...}” qui est un alias de “\fancyhead[C]”:

\chead{%
    \begin{tikzpicture}[remember picture, overlay]
    \node [yshift=-100, inner sep=0, outer sep=0]
        at (current page.north){\includegraphics[width=\paperwidth]{head.png}};
    \end{tikzpicture}
}

Bon je vous avoue que j’ai “tatoné” un peu pour trouver le “yshift”. Sans cela, l’image se place bien au “nord” de la page, mais c’est le centre de l’image qui est placé à cet endroit, donc je demande à TikZ de “descendre” l’image un peu (un genre de margin-top), ce qui fait que l’image est légèrement plus basse. Mon image est relativement large et haute, donc “-100” est une très grosse valeur. Mais je voulais que l’image déborde sur le texte, l’effet est voulu.

En ce qui concerne les “inner et outer sep”, c’est en gros les marge et “paddings” que je le mets à 0. Enore une fois je ne peux que vous conseiller de modifier les valeurs pour comprendre le comportement.

Pour que l’image prenne toute la largeur de la page, je lui donne une largeur qui vaut “\paperwidth”. De cette manière si vous avez une partie de l’image qui doit bien atteindre le bord droit de la page, elle sera bien collée à droite.

C’est pas mal. Mais c’est vide.

On va ajouter le titre du chapitre sur l’image avec un peu de couleur. À savoir que fancyhdr propose des commandes:

Bref, voilà un exemple:

![](/static/upload/paste-5cdb96ec-54ae-464a-8652-864555a1f79d.png)
\chead{%
    \begin{tikzpicture}[remember picture, overlay]
    \node [yshift=-100, inner sep=0, outer sep=0]
        at (current page.north){\includegraphics[width=\paperwidth]{head.png}};
    \node[yshift=-40,rotate=5, text width=0.5\paperwidth]
        at (current page.north) {%
            \Huge
            \textbf{``} % un guillemet à l'envers
            \textcolor{myblue}{\leftmark} % le titre
            \textbf{''} % un guillemet à l'endroit
        };
    \end{tikzpicture}
}

Et oui, si vous avez bien lu l’exemple, je fais tourner le texte de 5 degrés, j’aime bien :)

Vous commencez à comprendre à quel point on peut aller loin ? Là j’ai mis une image, mais rien ne vous empêche de dessiner avec TikZ dans l’entête.

On passe au pied de page.

Pieds de pages

On va faire un truc un peu comme pour les pages de titre de chapitre, on va dessiner une forme, et y coller du contenu.

Alors, un petit rappel à ceux qui utilisent Word ou LibreOffice (je n’ai rien contre), n’oubliez pas que LaTeX est vraiment un outil d’édition. De ce fait, on pense aux pages de droite et gauche, et notamment on les désigne comme étant les pages “paires” et “impaires”. Rappelez-vous que impair en anglais ce dit “Odd”, et pair “Even”. C’est important pour la suite.

Je pars du principe que nous allons utiliser la classe de document “book”, qui change les marges des pages paires et impaires. Donc, je vais moi aussi gérer les pieds de pages correctement en orientant la forme dessinées un coup dans un sens, un coup dans l’autre, et placer mon numéro de page un coup au bord gauche (pages paires) et un coup au bord droit (pages impaires)

Je ne vais pas tout détailler, référez-vous à notre exemple sur les entêtes, je ne fais rien de différent à part modifier les coordonnées:

\fancyfoot[CE]{%
\begin{tikzpicture}[remember picture, overlay]
    \draw [fill=myblue]
        (current page.south east)
        -- (current page.south west)
        -- ++ (0, 4)
        -- cycle;
    \node [yshift=28pt,xshift=50pt]
        at (current page.south west)
        {\color{white}\rightmark};
    \node [yshift=28pt]
        at (current page.south)
        {\color{white}\thepage};
\end{tikzpicture}
}


\fancyfoot[CO]{%
\begin{tikzpicture}[remember picture, overlay]
    \draw [fill=myblue]
        (current page.south west)
        -- (current page.south east)
        -- ++ (0, 2)
        -- cycle;
    \node [yshift=28pt, xshift=-50pt]
        at (current page.south east)
        {\color{white}\thepage};
\end{tikzpicture}
}

Que signifient les lettres “CE” et “CO” ?

Et bien c’est simple. “C” veut dire que je définis le centre de mon “footer”, encore une fois c’est arbitraire puisque nous avons réinitialisé les contenus avec “\fancyhf” et que par conséquent les blocs de droite et gauche sont vides.

Par contre “O” signifie que je travaille sur le pied de page des pages “paires” (Odd), et “E” sur les pieds de pages “impaires” (Even). J’inverse donc la forme et le placement de “\thepage” qui donne le numéro de page actuel.

Voilà ce que me donne ces blocs:

Pages impaires

Pages paires

Oui, j’ai fait exprès de ne pas avoir la même forme à droite et à gauche.

Nous y voilà, les pages sont terminées, on peut passer à la page de titre.

La page de titre

LaTeX est un langage de “balise”, et chaque balise est en fait une macro “TeX”. Par conséquent, la balise “\maketitle” qui génère la page de titre est une macro.

Et en LaTeX, on peut redéfinir des macros. C’est ce que nous allons faire pour la page de titre.

De manière général, voilà comment vous allez vous y prendre:

\renewcommand{\maketitle}{%
    \begin{titlepage}
    % ici le contenu de la page titre
    \end{titlepage}
}

Et encore une fois, TikZ va nous servir.

Mon image d’entête est assez grande, vous n’avez vu qu’une petite partie de celle-ci. Je vais m’en servir dans ma page, placer le titre, l’auteur, etc. Rien de bien compliqué (mais non).

![La page titre](/static/upload/paste-accb6d6c-b6f7-4b49-8a4e-c7484354a11c.png)
% pour récupérer le titre...
\usepackage{titling}

% je définis le titre
\title{Mon example de thème}
% l'auteur (moi)
\author{%
    Patrice FERLET\\
    metal3d@gmail.com
}

% et la page de titre
\renewcommand{\maketitle}{%
    \begin{titlepage}
    \begin{tikzpicture}[remember picture, overlay]

    \node [yshift=-230, inner sep=0, outer sep=0]
        at (current page.north)
        {\includegraphics[width=\paperwidth]{head.png}};

    \node [shape=rectangle,
            fill=myblue,
            anchor=west,
            minimum width=1.4\paperwidth,
            xshift=-0.7\paperwidth,
            inner sep=2cm,
            rotate=10]
        at (current page.center)
        {\Huge\textcolor{white}{\textbf{\thetitle}}};

    \node [yshift=120, text width=\paperwidth, align=center]
        at (current page.south)
        {\Huge\color{myblue}\theauthor};
    \end{tikzpicture}
    \end{titlepage}
}

C’est du vite-fait pour l’article, je vous laisse une fois de plus imaginer ce que vous pouvez faire avec un peu de travail.

On peaufine

Reste une ou deux choses à adapter, personnellement j’ajoute déjà des règles de séparation de paragraphe ainsi que l’indentation de paragraphe:

\setlength{\parindent}{12pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em}

Et en ce qui concerne l’entête, j’ajoute le “titre” du chapitre seulement à partir des pages > 2. Sinon on se retrouve avec des guillemets qui ne contiennent rien à la page 2 (page de garde).

Donc revenez sur le code “\chead” et ajouter un test:

\chead{%
\begin{tikzpicture}[remember picture, overlay]
    \node [yshift=-100, inner sep=0, outer sep=0] at (current page.north) {\includegraphics[width=\paperwidth]{head.png}};
    \node[yshift=-40,rotate=5, text width=0.5\paperwidth] at (current page.north) {%
    \ifnum\value{page}>2
        \Huge
        \textbf{``}
        \textcolor{myblue}{\leftmark}
        \textbf{''}
    \fi
    };
\end{tikzpicture}
}

Et voilà, on a fini.

Conclusion

Vous pouvez récupérer le PDF final ici: https://examples.metal3d.org/example-theme.pdf

Ce n’est pas du grand art, je ne suis pas un fin designer, mais ça vous donne une idée de la possibilité qu’offre LaTeX et TikZ.

Je suis conscient que LaTeX n’est pas “aisé” quand on entre dans ce genre de détail. Mais rapellez-vous que vous allez certainement créer un thème (template) une fois et le garder pour le reste de vos travaux. Je peux aussi utiliser différents thèmes pour le même article, livre, rapport…

Apprendre LaTeX est souvent considéré comme désuet face à markdown ou RST, mais si je prends l’exemple de PanDoc (que j’adore) il passe bien par LaTeX pour gérèrer le document. Et par conséquent, créer un template pour pandoc revient à faire ce que j’ai fait dans cet article. Alors un bon conseil, penchez-vous dessus.

Un dernier point, si vous maitrisez LaTeX, vous allez pouvoir générer des rapports en PDF en utilisant des templates à vous. Comparer l’utilisation d’un fichier .doc, ou .odt et la génération de document en PDF avec LibreOffice (sans le critiquer, je le trouve très bien), et LaTeX, vous vous rendrez compte que c’est peut-être bien plus évident de se taper un thème et des macros que de se battre avec les thèmes et règles d’un outil “de traitement de texte”.

Personnellement, j’utilise LaTeX pour pas mal de travaux et je vous invite à passer un peu de temps à vous former dessus pour gagner beaucoup de temps à l’avenir.

comments powered by Disqus