Aller au contenu

Zettlr : astuces (Bonus)

Simple PDF et CSS

Dans le guide, j'ai expliqué comment appliquer une feuille de style destinée à la conversion en Simple PDF depuis Zettlr. Pour rappel, ce système se sert de la conversion vers HTML. Le résultat est vraiment assez basique. Or, pour qui ne maîtrise pas les CSS, il peut être difficile d'améliorer cela.

Rien ne remplace LaTeX

Au risque de me répéter lourdement, si vous voulez un rendu sérieux, c'est vers la solution LaTeX qu'il faut vous tourner pour une transformation directe en PDF depuis Zettlr. Sinon, convertir en .odt, LaTeX ou Typst pour retravailler une bonne mise en page par la suite.

La feuille de style présentée ici est le fruit de mes propres tâtonnements. Il y a sans doute beaucoup mieux à faire (merci à celleux qui auraient des idées). Sachez, par exemple que j'ai longuement tâtonné pour gérer les césures de mots qui fonctionnent en HTML et pas dans le PDF. À ce jour j'ignore pourquoi.

  • Ce modèle est destiné à la rédaction d'articles ou de simples notes utilisant, pour la sortie bibliographique, les styles CSL ISO 690 Français,
  • Voici un exemple du rendu PDF.

Pour utiliser cette feuille de style, votre en-tête YAML doit ressembler à ceci :

title: "Lorem ipsum dolor sit amet"
subtitle: "Distinctio tenetur et distinctio adipisci"
date: 25/12/2025
author: "Jean Bonnot"
lang: fr-FR
bibliography: "unebiblio.bib"
csl: "iso690-author-date-fr-no-abstract.csl"
abstract: |
    Lorem ipsum ldolor sit amet, consectetur adipiscing 
    elit. Etiam tincidunt ligula sed consequat sollicitudin. 
    Quisque vel lobortis lacus. Etiam lacinia mattis nisl,
    sit amet imperdiet justo dapibus et. Mauris lobortis 
    nisi tellus, sed maximus diam luctus vel. Curabitur 
    quis ultrices erat. Curabitur dapibus ipsum non urna
    sagittis, non eleifend velit molestie. Fusce
    fringilla enim at massa euismod fermentum. Aliquam
    erat volutpat. Pellentesque lorem felis, lacinia sit
    amet eleifend sit amet, aliquet eu neque. Fusce tortor
    nisi, viverra eu eros vitae, mattis dapibus ligula.
header-includes:
  - |
    <style>
    @page {
      @top-center {
        content: "Lorem ipsum dolor sit amet";
      }
    }
    </style>

Notez les éléments suivants :

  • la langue doit être correctement renseignée
  • votre fichier bibliographique doit être, lui aussi, renseigné ainsi que le fichier de styles CSL.
  • la fonction header-include sert à inclure des éléments dans l'en-tête du fichier de sortie de conversion. Il s'agit d'un extrait de la CSS qui indique en haut de chaque page le titre du document. Il pourrait être renseigné uniquement dans la CSS, mais dans la mesure où il s'agit de pouvoir écrire des documents différents avec la même feuille de style CSS, il faut le sortir pour pouvoir l'écrire dans l'en-tête Yaml de chaque fichier.

Voici ci-dessous la feuille CSS qui contient des commentaires, et en dessous encore d'autres commentaires. Il vous faut recopier ce code, l'enregistrer dans un fichier .css et indiquer ce fichier dans les assets selon la méthode décrite dans le chapitre La production de PDF.

/* --- Impression --- */
@page {
    size: A4 portrait;
    margin: 2.5cm 2cm; /* Marges confortables pour la reliure */

    @top-center { /* voir autres éléments dans l'entête Yaml du document */
        font-size: 9pt;
        color: #666;
        border-bottom: 0.5pt solid #2B7FFF;
        margin-bottom: 5px;
        width: 100%;
    }

    @bottom-center { /* On indique le compteur de pages en bas, centré */
        content: "Page " counter(page) " de " counter(pages);
        font-size: 10pt;
        color: #2B7FFF;
    }
}


/* On n'oublie pas les compteurs sur 4 niveaux à      */
/* commencer  par H2 (car H1 sert au titre principal) */

body {
    counter-reset: h2counter h3counter h4counter; 
    text-align: justify;
    text-justify: inter-word; /* Optimise l'espace entre les mots */
    -webkit-hyphens: auto;
    -ms-hyphens: auto;
    hyphens: auto;
    font-family: "Times New Roman", "Times", "Liberation Serif", FreeSerif, serif;
    line-height: 1.5;
    color: #000;
    font-size: 11pt;
}

/* --- Les styles Pandoc par défaut qu'on modifie --- */
h1 {
    text-align: center;
    font-size: 2.5em;
    font-weight: 300;
    margin-top: 1cm;
    margin-bottom: 1cm;
    color: #000;
}

.subtitle {
    text-align: center;
    font-size: 1.2em;
    color: #2B7FFF;
    font-weight: bold;
    margin-top: -0.5cm;
    margin-bottom: 1cm;
}

.author, .date {
    text-align: center;
    margin: 0.2em 0;
    font-weight: 300;
}

.date { color: #2B7FFF; }

.abstract {
    border-top: 2px solid #2B7FFF;
    border-bottom: 2px solid #2B7FFF;
    margin: 1cm 5%;
    padding: 1em;
    font-size: 0.95em;
    font-style: italic;
}

.abstract-title {
    font-weight: bold;
    text-align: center;
    display: block;
    padding-bottom: 0.5em;
    font-style: normal;
}

/* --- Corps de texte --- */
p {
    orphans: 3;
    widows: 3;
    margin-bottom: 1em;
}

blockquote {
    margin: 1.5em 2em;
    padding-left: 1em;
    border-left: 3px solid #2B7FFF;
    font-style: italic;
    color: #444;
}

a { 
    text-decoration: none; 
    color: magenta; /* Ou noir #000 pour l'impression */
}

/* --- Listes --- */
ul, ol { margin-bottom: 1em; }

ul { list-style-type: none; }

ul li {
    position: relative;
    margin-left: 1.5em;
}

ul li::before {
    content: "\2014"; /* Tiret cadratin */
    position: absolute;
    left: -1.5em;
}

/* --- Bibliographie --- */
.csl-entry {
    text-indent: -1cm;
    margin-bottom: 0.5em;
    line-height: 1.3;
    orphans: 3;
    widows: 3;
}

a, .csl-entry, .footnotes {
    /* Permet de casser l'URL n'importe où pour éviter le débordement */
    overflow-wrap: break-word; 
    word-wrap: break-word;
  word-break: break-all;  /*Coupe les caractères si nécessaire pour les URL trop longues */
  /* hyphens: none !important; Optionnel : améliore le rendu sur certains navigateurs */
}

/* --- 5. TITRES ET NUMÉROTATION --- */

/* Sécuriser le saut de page : pas de titre seul en bas de page */
h2, h3, h4 {
    color: #2B7FFF;
    break-after: avoid;
    page-break-after: avoid;
    margin-top: 1.5em;
}

/* H2 : Niveau 1 de numérotation */
h2:not(.unnumbered) {
    display: flex;
    align-items: flex-start;
    counter-increment: h2counter;
    counter-reset: h3counter; /* Reset les enfants */
}

h2:not(.unnumbered)::before {
    content: counter(h2counter) ". ";
    flex-basis: 2em;
    flex-shrink: 0;
    font-weight: bold;
}

/* H3 : Niveau 2 de numérotation */
h3:not(.unnumbered) {
    display: flex;
    align-items: flex-start;
    counter-increment: h3counter;
    counter-reset: h4counter; /* Reset les enfants */
}

h3:not(.unnumbered)::before {
    content: counter(h2counter) "." counter(h3counter) " ";
    flex-basis: 2.8em;
    flex-shrink: 0;
    font-weight: bold;
}

/* H4 : Niveau 3 de numérotation */
h4:not(.unnumbered) {
    display: flex;
    align-items: flex-start;
    counter-increment: h4counter;
}

h4:not(.unnumbered)::before {
    content: counter(h2counter) "." counter(h3counter) "." counter(h4counter) " ";
    flex-basis: 3.5em;
    flex-shrink: 0;
    font-weight: bold;
}

/* --- 6. NETTOYAGE IMPRESSION --- */
@media print {
    nav, .ads, .social-share, button, .no-print {
        display: none !important;
    }

}

Cette feuille de style numérote les titres à commencer par les titres de niveau 2. Le titre de niveau 1 est en fait le titre du document. Faites attention à cela si vous voulez convertir vers d'autres formats.

Par ailleurs, vous remarquerez que les notes de bas de page figurent… à la fin du document. La raison est que, comme expliqué dans le guide, il s'agit ici de passer par la version HTML, c'est-à-dire que les notes apparaissent en bas de la page web, pas en bas de chaque page A4.

unnumbered

Si vous indiquez un titre pour votre bibliographie à la fin du document, par exemple ## Bibliographie, alors faites suivre ce titre par l'instruction qui empêche la numérotation de cette section particulière, entre accolades : ## Bibliographie {.unnumbered}. Pandoc interprétera cette instruction et arrêtera le compteur.

Correction auto : grammaire et orthographe

Zettlr dispose d'un correcteur orthographique de base que vous pouvez configurer dans Préférences > Correcteur orthographique. Ce correcteur étant assez incomplet, pour y remédier, Zettlr permet de se connecter à votre compte sur les services de LanguageTool.org. Or, cela suppose deux choses : d'une part que vous ayez effectivement un compte sur ce service en ligne et d'autre part que vous soyez prêt·e à faire circuler votre texte via l'API du service.

Il faut savoir que LanguageTool est au départ un logiciel libre. Il est donc conseillé de l'installer localement et de faire travailler Zettlr avec cette version locale. La documentation de Zettlr propose un guide détaillé à ce propos. Je résume ici la solution la plus simple et rapide de configurer cela (le même principe prévaut sur Obsidian, par exemple) :

  • votre distribution Linux Mint propose des paquets Flatpak dans la Logithèque. Le logiciel Eloquent en fait partie. Installez-le. C'est un logiciel qui installe le serveur LanguageTool et propose une interface où vous pouvez entrer du texte pour le corriger. L'adresse du serveur local est alors : http://localhost:8081/ (pour vérifier si le serveur fonctionne, visitez la page http://localhost:8081/v2/languages).
  • dans Zettlr, dans Préférences > Correcteur orthographique activez la fonction LanguageTool. Puis entrez l'adresse ci-dessus dans le champ Adresse du serveur personnalisée.
  • c'est tout.

Avec Libre Office

Notez que l'adresse du serveur à utiliser avec Libre Office est http://localhost:8081/v2. Pour configurer LanguageTool avec Libre Office, c'est par ici.