Forum général.général Latex : la place du nom des chapitres

Posté par  .
Étiquettes : aucune
0
15
juin
2005
Bonjour tout le monde...

Je suis en train de finir mon projet de fin d'études que j'ai rédigé en utilisant latex... J'ai un petit problème qui est que j'aime pas le fait que les noms des chapitres s'écrivent si bas sur la page... je veux que ca s'écrive à 3-4 cm maximum du haut de la page mais la c'est à 7-8 cm...

Est-ce que quelqu'un pourra m'aider ? (je dois rendre mon projet demain :( )

Merci d'avance

Bonne soirée a tous et a toutes

(j'ai écrit en "book")
  • # IRC

    Posté par  (site web personnel) . Évalué à 0.

    irc.freenode.net
    #latex

    dans le topic, y a des tas d URLs.
  • # Hum, très facile

    Posté par  . Évalué à 5.

    Dans book.cls, on trouve que \chapter fait appel à \@chapter ou à \@schapter qui font appel à \@makechapterhead et cette macro est définie comme suit :

    \def\@makechapterhead#1{%
    \vspace*{50\p@}%
    {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
    \if@mainmatter
    \huge\bfseries \@chapapp\space \thechapter
    \par\nobreak
    \vskip 20\p@
    \fi
    \fi
    \interlinepenalty\@M
    \Huge \bfseries #1\par\nobreak
    \vskip 40\p@
    }}

    et donc, l'espace au début est dû au \vspace*{50\p@} (un espace vertical de 50 pt).
    Il «suffit» donc de modifier cette définition (ben oui, l'espace est codé en dur, ils auraient pu utiliser une longueur (variable modifiable par \setlength)). Pour la redéfinition, il faut ajouter cela avant le \begin{document} :

    \makeatletter
    \def\@makechapterhead#1{%
    \vspace*{10\p@}% <<-------------------- modifier la taille (marche aussi en cm...)
    {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
    \if@mainmatter
    \huge\bfseries \@chapapp\space \thechapter
    \par\nobreak
    \vskip 20\p@
    \fi
    \fi
    \interlinepenalty\@M
    \Huge \bfseries #1\par\nobreak
    \vskip 40\p@
    }}
    \makeatother

    Les \makeatletter et \makeatother permettent d'utiliser des @ dans les noms de macro (ce qui est interdit dans un document mais pas dans un .sty ou un .cls).

    Voilà, ça a pas l'air très propre mais c'est parce que ce n'est pas prévu : book.cls est un *exemple*, on _devrait_ refaire son style soi-même, mais faut pas pousser, on va pas s'embêter pour si peu.

    Bien sûr, si on fait plein de modifications, le plus simple est de copier book.cls dans monbook.cls et d'y faire les modifs directement. Ça permet d'apprendre à faire ses propres classes.
    • [^] # Re: Hum, très facile

      Posté par  . Évalué à 4.

      Petite rectification, \@schapter appelle \@makeschapterhead (s pour _star_, donc \chapter*).
      Il faudra donc aussi modifier \@majeshapterhead :

      \def\@makeschapterhead#1{%
      \vspace*{50\p@}% <<----------------------- là
      {\parindent \z@ \raggedright
      \normalfont
      \interlinepenalty\@M
      \Huge \bfseries #1\par\nobreak
      \vskip 40\p@
      }}

      (aussi emballé par \makeat{letter,other})
      • [^] # Re: Hum, très facile

        Posté par  . Évalué à 2.

        Vu que les \@makechapterhead et \@makeschapterhead sont déjà définis dans le book.cls, est-ce qu'il ne vaudrait pas mieux les redéfinir avec un \renewcommand{\@makechapterhead} que directement avec \def ?
        • [^] # Re: Hum, très facile

          Posté par  . Évalué à 3.

          Si tu veux, ça n'a pas de conséquence réelle ici.

          Mais, étant donné que c'est du pur TeX, réutiliser \def me semble plus cohérent : je réserve \renewcommand aux macros définies par \newcommand.

          Un problème pourrait se poser avec d'autres macros, par exemple celles dont la signature n'est pas simplement \toto[arg1]{arg2}{...}, comme \put(arg1,arg2){arg3} (les parenthèses ne sont pas gérables avec newcommand).

          Je préfère n'utiliser que les commandes LaTeX (donc, entre autres, ne pas utiliser \def) dans les .cls et les .sty (destinés uniquement à LaTeX) ; quand cela est possible évidemment : certaines commandes équivalentes LaTeX ne sont pas toujours aussi simples, souples ou robustes (p.ex. \if vs \ifthenelse).

          Mais la cohérence n'est pas le fort de LaTeX et des paquets associés : preuve en est l'utilisation très fréquente de commandes TeX (comme \def) dans les classes et dans certains paquets qui sont exclusivement LaTeX (car incompatibles avec plain-TeX ou simplement à cause d'un joli \NeedsTeXFormat{LaTeX2e} au début). Ces commandes étant par ailleurs désavouées par LaTeX, puisque :
          1) des macros remplissant ces fonctions y sont définies (\newcommand) ;
          2) les documentations officielles les déconseillent.

          On pourrait aussi parler de l'habitude d'écrire \z@ pour "0pt", \p@ pour "pt" ou \@ne pour "1pt" et autres écritures très faciles à lire parce que :
          1. Knuth le fait ;
          2. Knuth dit que ça va plus vite pour TeX (il décompose mieux les terminaux de sa grammaire de cette façon) ;
          alors que
          1. c'est souvent illisible ;
          2. on est plus en 1986, ce n'est sûrement pas la différence entre le découpage de "\@ne " et celui de "1pt " qui fait que (La)TeX est lent.
          • [^] # Re: Hum, très facile

            Posté par  . Évalué à 2.

            OK, merci pour ton explication. Je ne connais (et n'ai jamais utilisé) que LaTeX... sauf bidouilles plus ou moins crades (et en général purement empirique :^°) dans quelques commandes telles que décrites ici. Donc je ne fait pas trop la différence entre ce qui est du pur LaTeX, et ce qui est du pur TeX.

            En fait, si j'ai posé cette question, c'est que je pensais qu'il vallait mieux utiliser un renewcommand dans le cas où une commande existait déjà, juste pour éviter toute confusion. Par contre, si je comprends bien, le renewcommand aurait été bienvenu si le book.cls avait défini ses makechapterhead à grand coup de newcommand. J'ai bon ?
            • [^] # Re: Hum, très facile

              Posté par  . Évalué à 2.

              Oui.
              Parce que \newcommand vérifie si la macro existe et ne permet pas de l'écraser. D'où la nécessité de \renewcommand.
              De son côté, \def ne vérifie rien et écrase allégrement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.