Modifier le mot chapitre

Bonjour,

Je suis en train de saisir un cours et je désire personnaliser les chapitres comme suit ( Cf. la photo ). J'éprouve de difficultés à monter un code tex exécutant ce travail.
Quelqu'un a quelques pistes ?

Merci85082

Réponses

  • Bonjour,

    Je propose quelque chose comme ça :
    \documentclass[a4paper,11pt,french]{book}
    \usepackage{lmodern}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{babel}
    \usepackage{textcomp}
    \usepackage{etoolbox}
    \usepackage{titlesec}
    
    \usepackage{tikz}
    \usetikzlibrary{babel}
    
    % Placement des lignes verticales par rapport au nœud 'orig' de la tikzpicture
    % insérée par \chapDecoShape (voir ci-dessous).
    \newcommand*{\chapDecoXstart}{-1.5}
    \newcommand*{\chapDecoXstep}{0.1}
    \newcommand*{\chapDecoYmin}{-1.5}
    \newcommand*{\chapDecoYmax}{1.5}
    
    % Indique si on travaille sur un \chapter ou un \chapter*
    \newtoggle{chapDecoIsNumberedChap}
    
    % Commande « de haut niveau » pour la déco du numéro de chapitre : deux
    % déclinaisons (version étoilée, version non étoilée).
    \makeatletter
    \newcommand*{\chapDeco}{%
      \@ifstar{%
        \togglefalse{chapDecoIsNumberedChap}%
        \chapDecoShape\@nil         % pas de numéro de chapitre en argument
      }{%
        \toggletrue{chapDecoIsNumberedChap}%
        \chapDecoShape
      }%
    }
    \makeatother
    
    % #1 : truc à encadrer (numéro de chapitre) si chapDecoIsNumberedChap est
    % vrai ; sinon, #1 n'est pas utilisé.
    \newcommand*{\chapDecoShape}[1]{%
      \begin{tikzpicture}[baseline=(orig), overlay]
        \foreach \i in {0,...,7} {
          % Lignes verticales
          \draw[line width=1.0pt, line cap=round]
            (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmin) --
            (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmax);
        }
    
        \iftoggle{chapDecoIsNumberedChap}{
          % Cas de \chapter -> numéro de chapitre encadré
          \node[inner sep=0.2cm, outer sep=0, anchor=base west, white, fill=black]
            (n) at (\chapDecoXstart + 0.1, 0) {#1};
        }{
          % Cas de \chapter* -> rien
        }
        % Pour visualiser l'origine, mettre un point entre les accolades, plus
        % éventuellement 'circle, red' entre les crochets.
        \node[inner sep=0, outer sep=0] (orig) at (0,0) {};
      \end{tikzpicture}%
    }
    
    % ****************************************************************************
    % *                       Configuration de 'titlesec'                        *
    % ****************************************************************************
    
    % Pour \chapter
    \titleformat{\chapter}[block]
      {\normalfont\Huge\bfseries}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco{\thechapter}}%
      }
    
    % Pour \chapter*
    \titleformat{name = \chapter, numberless}[block]
      {\normalfont\Huge\bfseries}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco*}%
      }
    
    
    \begin{document}
      \chapter{Chapitre un}
    
      Pouet pouet.
    
      \chapter{Chapitre deux}
    
      Bla bla.
    
      \chapter*{Chapitre sans numéro}
    
      Terminé.
    \end{document}
    

    On pourrait faire plus court, mais cette manière de procéder expose les paramètres qui me semblent intéressants et est très extensible (grâce à TikZ). Une attention particulière a été apportée aux points suivants :
    • lignes de base alignées entre le titre de chapitre et son numéro ;
    • position (horizontale et verticale) des traits fixe par rapport au début du titre, indépendamment de la largeur du numéro de chapitre et de l'utilisation de \chapter ou de \chapter* (cette position est donc fixe par rapport à la page, avec les paramètres par défaut pour un début de chapitre) ; s'il y a des numéros de chapitres à deux chiffres, il faudra sans doute décaler à gauche la déco en modifiant \chapDecoXstart pour un résultat plus esthétique (ou bien abandonner l'idée de garder le groupe de lignes verticales fixe par rapport à la page) ;
    • l'origine du repère de la tikzpicture est juste à gauche du titre au niveau de la ligne de base, le titre commence à la marge gauche et la déco se passe dans la marge (du fait du point précédent, elle peut évidemment mordre sur le titre de chapitre si on a un numéro de chapitre à 10 chiffres, j'estime que c'est exclu).
    La première capture d'écran[1] montre le point de référence utilisé (le nœud 'orig') et le résultat avec les paramètres suivants (la ligne verticale la plus à gauche passe par le point de référence et ces lignes descendent beaucoup, sans pour autant décaler le paragraphe qui suit) :
    \newcommand*{\chapDecoXstart}{0.0}
    \newcommand*{\chapDecoXstep}{0.1}
    \newcommand*{\chapDecoYmin}{-3.5}
    \newcommand*{\chapDecoYmax}{1.5}
    
    La deuxième capture montre la même chose mais en commençant les lignes verticales à 1,5 cm à gauche du point de référence :
    \newcommand*{\chapDecoXstart}{-1.5}
    \newcommand*{\chapDecoXstep}{0.1}
    \newcommand*{\chapDecoYmin}{-3.5}
    \newcommand*{\chapDecoYmax}{1.5}
    
    Les trois dernières captures d'écran montrent ce que l'on peut obtenir avec les valeurs de l'exemple complet donné plus haut.

    [1] En espérant que les anciennes, sur fond gris, ont bien été retirées par mon “edit”, ce qui ne se voit pas sur l'aperçu !85126
    85128
    85130
    85138
    85136
  • Je n'avais pas porté mon attention sur ce point dans le message précédent, mais pour ce genre de chose, je préfère les polices sans empattement. Voici donc la même chose, avec juste une petite amélioration au niveau de la sélection de la police :
    \documentclass[a4paper,11pt,french]{book}
    \usepackage{lmodern}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{babel}
    \usepackage{textcomp}
    \usepackage{etoolbox}
    \usepackage{titlesec}
    
    \usepackage{tikz}
    \usetikzlibrary{babel}
    
    % Placement des lignes verticales par rapport au nœud 'orig' de la tikzpicture
    % insérée par \chapDecoShape (voir ci-dessous).
    \newcommand*{\chapDecoXstart}{-1.5}
    \newcommand*{\chapDecoXstep}{0.1}
    \newcommand*{\chapDecoYmin}{-1.5}
    \newcommand*{\chapDecoYmax}{1.5}
    
    % Indique si on travaille sur un \chapter ou un \chapter*
    \newtoggle{chapDecoIsNumberedChap}
    
    % Commande « de haut niveau » pour la déco du numéro de chapitre : deux
    % déclinaisons (version étoilée, version non étoilée).
    \makeatletter
    \newcommand*{\chapDeco}{%
      \@ifstar{%
        \togglefalse{chapDecoIsNumberedChap}%
        \chapDecoShape\@nil         % pas de numéro de chapitre en argument
      }{%
        \toggletrue{chapDecoIsNumberedChap}%
        \chapDecoShape
      }%
    }
    \makeatother
    
    % #1 : truc à encadrer (numéro de chapitre) si chapDecoIsNumberedChap est
    % vrai ; sinon, #1 n'est pas utilisé.
    \newcommand*{\chapDecoShape}[1]{%
      \begin{tikzpicture}[baseline=(orig), overlay]
        \foreach \i in {0,...,7} {
          % Lignes verticales
          \draw[line width=1.0pt, line cap=round]
            (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmin) --
            (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmax);
        }
    
        \iftoggle{chapDecoIsNumberedChap}{
          % Cas de \chapter -> numéro de chapitre encadré
          \node[inner sep=0.2cm, outer sep=0, anchor=base west, white, fill=black]
            (n) at (\chapDecoXstart + 0.1, 0) {#1};
        }{%
          % Cas de \chapter* -> rien
        }
        % Pour visualiser l'origine, mettre un point entre les accolades, plus
        % éventuellement 'circle, red' entre les crochets.
        \node[inner sep=0, outer sep=0] (orig) at (0,0) {};
      \end{tikzpicture}%
    }
    
    % ****************************************************************************
    % *                       Configuration de 'titlesec'                        *
    % ****************************************************************************
    
    \newcommand*{\chapDecoFont}{%
      \fontsize{24.88}{29.856}\usefont{T1}{lmss}{bx}{n}%
    }
    
    % Pour \chapter
    \titleformat{\chapter}[block]
      {\chapDecoFont}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco{\thechapter}}%
      }
    
    % Pour \chapter*
    \titleformat{name = \chapter, numberless}[block]
      {\chapDecoFont}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco*}%
      }
    
    
    \begin{document}
      \chapter{Chapitre un}
    
      Pouet pouet.
    
      \chapter{Chapitre deux}
    
      Bla bla.
    
      \chapter*{Chapitre sans numéro}
    
      Terminé.
    \end{document}
    
    C'est quand même plus joli (à mon avis).85142
  • @ brian,

    avec quel compilateur as-tu compilé ta proposition de code ?
    Je fais du copier-coller de ton code proposé et lorsque je compile avec "PDFLaTeX" il m'affiche ce message d'erreur (cf. la photo) :85144
    cha.png 58.2K
  • Je compile aussi avec pdflatex. Le fichier manquant chez toi (tikzlibrarybabel.code.tex) appartient à TikZ. Ton MikTeX est donc sans doute trop vieux, vu que c'est certainement lui qui t'a amené TikZ.

    Ce n'est pas très grave ici. Je te propose de commenter la ligne
    \usetikzlibrary{babel}
    
    en mettant un % devant, et d'ajouter ça en-dessous :
    \tikzset{
      handle active characters in code,
      handle active characters in nodes,
    }
    
    Après, tu recompiles. Si tu obtiens cette erreur :
    ./doc.tex:16: Package pgfkeys Error: I do not know the key '/tikz/handle active characters in code' and I am going to ignore it. Perhaps you misspelled it.
    
    1) supprime ces lignes que tu viens juste d'ajouter ;
    2) au-dessus de la ligne
    %\usetikzlibrary{babel}
    
    met un commentaire indiquant qu'il vaudra mieux la décommenter quand ton TikZ sera à jour.

    Avec la figure que je t'ai faite, cela ne devrait rien changer d'avoir commenté cette ligne. Mais si l'on ajoute du code dans la figure TikZ contenant des caractères rendus actifs par babel, tels que ':' ou '!', cela pourrait éventuellement poser des problèmes. Il y a diverses manières de contourner ces éventuels problèmes ; de nos jours, je crois que la méthode recommandée est de mettre ce '\usetikzlibrary{babel}'. Tu le mettras quand ton TikZ sera à jour. Voilà.
  • @brian,

    Super ! instructions bien respectées et ça marche cette fois-ci. J'arrive à compiler ton code avec PDFLaTeX.

    Merci
  • Parfait. Voici une petite variante :
    • les coins du rectangle sont arrondis (option “rounded corners”, facile) ;
    • l'alignement des lignes de base est toujours respecté, mais cette fois-ci, le paquet de traits verticaux est centré verticalement au même niveau que le rectangle. Pour les chapitres sans numéro (\chapter*), le positionnement est le même que s'il y avait un numéro de chapitre 1 invisible.
    \documentclass[a4paper,11pt,french]{book}
    \usepackage{lmodern}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{babel}
    \usepackage{textcomp}
    \usepackage{etoolbox}
    \usepackage{titlesec}
    
    \usepackage{tikz}
    \usetikzlibrary{babel}
    
    % Placement des lignes verticales par rapport au nœud 'orig' de la tikzpicture
    % insérée par \chapDecoShape (voir ci-dessous).
    \newcommand*{\chapDecoXstart}{-1.5}
    \newcommand*{\chapDecoXstep}{0.1}
    \newcommand*{\chapDecoYmin}{-1.5}
    \newcommand*{\chapDecoYmax}{1.5}
    
    % Indique si on travaille sur un \chapter ou un \chapter*
    \newtoggle{chapDecoIsNumberedChap}
    
    % Commande « de haut niveau » pour la déco du numéro de chapitre : deux
    % déclinaisons (version étoilée, version non étoilée).
    \makeatletter
    \newcommand*{\chapDeco}{%
      \@ifstar{%
        \togglefalse{chapDecoIsNumberedChap}%
        \chapDecoShape\@nil         % pas de numéro de chapitre en argument
      }{%
        \toggletrue{chapDecoIsNumberedChap}%
        \chapDecoShape
      }%
    }
    \makeatother
    
    % #1 : truc à encadrer (numéro de chapitre) si chapDecoIsNumberedChap est
    % vrai ; sinon, #1 n'est pas utilisé.
    \newcommand*{\chapDecoShape}[1]{%
      % Contournement de <https://sourceforge.net/p/pgf/bugs/345/>. Sans ce
      % \raisebox, la combinaison de 'baseline' et 'overlay' pourrait augmenter la
      % hauteur de la boîte contenant la tikzpicture (vérifié avec avec PGF/TikZ
      % 2019/02/02 v3.1.1).
      \raisebox{0pt}[0pt][0pt]{%
        \begin{tikzpicture}[
            baseline=(n.base), overlay,
            numero/.pic = {
              \node[inner sep=0.2cm, outer sep=0, anchor=west, pic actions,
                    rounded corners]
                (n) at (\chapDecoXstart + 0.1, 0) {##1};
            }]
          \foreach \i in {0,...,7} {
            % Lignes verticales
            \draw[line width=1.0pt, line cap=round]
              (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmin) --
              (\chapDecoXstart+\chapDecoXstep*\i, \chapDecoYmax);
          }
    
          \iftoggle{chapDecoIsNumberedChap}{
            % Cas de \chapter -> numéro de chapitre encadré
            \pic[ color=white, fill=black] {numero={#1}};
          }{%
            % Cas de \chapter* -> on utilise un nœud invisible pour positionner les
            % lignes verticales comme il serait fait pour le chapitre numéroté 1.
            \pic[draw=none, fill=none] {numero={\phantom{1}}};
          }
          % Décommenter ceci pour visualiser l'origine :
          % \node[circle, red, inner sep=0, outer sep=0] (orig) at (0,0) {.};
        \end{tikzpicture}%
      }%
    }
    
    % ****************************************************************************
    % *                       Configuration de 'titlesec'                        *
    % ****************************************************************************
    
    \newcommand*{\chapDecoFont}{%
      \fontsize{24.88}{29.856}\usefont{T1}{lmss}{bx}{n}%
    }
    
    % Pour \chapter
    \titleformat{\chapter}[block]
      {\chapDecoFont}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco{\thechapter}}%
      }
    
    % Pour \chapter*
    \titleformat{name = \chapter, numberless}[block]
      {\chapDecoFont}{}{0pt}{%
        % On travaille dans la marge gauche
        \makebox[0pt][r]{\chapDeco*}%
      }
    
    
    \begin{document}
      \chapter{Chapitre un}
    
      Pouet pouet.
    
      \chapter{Chapitre deux}
    
      Bla bla.
    
      \chapter*{Chapitre sans numéro}
    
      Terminé.
    \end{document}
    
    Edit : ajout d'un espace avant 'color=white' pour soulager le logiciel du forum (on peut aussi enlever 'color='... si le forum supporte 'white' précédé d'un crochet, ce qui reste à vérifier).

    Edit 2019-03-18 : ajout d'un \raisebox{0pt}[0pt][0pt]{...} dans la définition de \chapDecoShape autour de la tikzpicture afin de contourner un bug de PGF/TikZ. Pour voir un effet concret du bug dans ce cas d'utilisation (avec la version antérieure de mon code), il faudrait que la distance séparant la ligne de base du numéro encadré de la “droite horizontale” coupant le cadre en deux excède la hauteur de la \hbox qui contient la première ligne du titre de chapitre. Autrement dit, à moins d'ajouter artificiellement de la hauteur au numéro encadré, cela avait fort peu de chances de se produire (et plus aucune maintenant, a priori).85160
    85162
  • Super travail, Brian ! J'adore !
  • Merci, c'est gentil. :)
  • J'ai fait une petite modif au code contenu dans ce message dont voici l'objet :

    Ajout d'un \raisebox{0pt}[0pt][0pt]{...} dans la définition de \chapDecoShape autour de la tikzpicture afin de contourner un bug de PGF/TikZ. Pour voir un effet concret du bug dans ce cas d'utilisation (avec la version antérieure de mon code), il faudrait que la distance séparant la ligne de base du numéro encadré de la “droite horizontale” coupant le cadre en deux excède la hauteur de la \hbox qui contient la première ligne du titre de chapitre. Autrement dit, à moins d'ajouter artificiellement de la hauteur au numéro encadré, cela avait fort peu de chances de se produire (et plus aucune maintenant, a priori).

    (Le code donné dans les messages antérieurs pourrait recevoir la même modification, mais il n'est a priori pas affecté par le bug, car la ligne de base du numéro de chapitre a pour équation $y =0$ dans les deux premiers bouts de code que j'ai postés dans ce fil — autrement dit, l'option 'baseline' ne faisait a priori rien de visible dans ces bouts de code, en raison du positionnement du numéro de chapitre par rapport à l'origine (0, 0) de la tikzpicture.)
Connectez-vous ou Inscrivez-vous pour répondre.