Un fichier par chapitre — Les-mathematiques.net The most powerful custom community solution in the world

Un fichier par chapitre

Bonjour,

Je souhaite écrire un document décomposé en chapitres.

J'ai disons quatre fichiers main.tex, chap1.tex, chap2.tex et chap3.tex.

La compilation des fichiers chap1.tex, chap2.tex et chap3.tex donnent respectivement le contenu des chapitres 1, 2 et 3. La compilation du fichier main.tex donne les trois chapitres écrits les uns à la suite des autres.

Il y a une solution assez simple que je connais (avec des \include), mais qui ne permet que de compiler main.tex et pas de compiler les fichiers chap1, chap2 et chap3. Or j'aimerais bien inspecter le contenu de par exemple chap2.tex sans avoir à compiler main.tex.

Auriez-vous une solution ?

Merci d'avance

Réponses

  • Bonjour,

    Tu peux mettre \includeonly{chap2} dans le préambule de main.tex et compiler main.tex (voir ici par exemple).
  • Merci mais ça ne marche pas chez moi.

    Le compilateur n'aime pas le préambule de chap2, car il y en a déjà un dans main. Pourtant le préambule est indipensable dans chap2 car je veux aussi pouvoir compiler chap2 et voir son rendu sans avoir à compiler main.
  • Avec la méthode que j'ai indiquée, il n'y a qu'un préambule : dans main.tex. Cela évite la redondance, donc des problèmes. Si tu veux vraiment avoir des préambules partout, il faut te donner les moyens de les ignorer.

    Dans main.tex :
    \newif\ifMachinChapII
    \MachinChapIIfalse % inutile mais explicite
    
    Dans chap2.tex :
    \unless\ifdefined\ifMachinChapII
      \newif\ifMachinChapII
      \MachinChapIItrue
    \fi
    
    \ifMachinChapII
    \documentclass{...}
    ...
    \begin{document}
    \fi
    
    ...
    
    \ifMachinChapII
    \end{document}
    \fi
    
  • Voici une solution plus simple.

    main.tex :
    \documentclass{book}
    \usepackage{standalone}
    
    \begin{document}
    
    \include{chap1}
    \include{chap2}
    \include{chap3}
    
    \end{document}
    
    chap1.tex :
    \documentclass{book}
    
    \begin{document}
    \chapter{Premier chapitre}
    \end{document}
    
    chap2.tex :
    \documentclass{book}
    
    \begin{document}
    \chapter{Deuxième chapitre}
    \end{document}
    
    chap3.tex :
    \documentclass{book}
    
    \begin{document}
    \chapter{Troisième chapitre}
    \end{document}
    
  • Merci beaucoup pour ces réponses.

    J'avais déjà vu ce package standalone que je n'arrive pas à faire fonctionner. Il semblerait qu'il se dispute avec d'autres packages mais je ne suis pas sûr.

    Je préfère de loin la première solution, avec les conditions, pour plusieurs raisons :
    1) je préfère avoir recours au moins de packages possible (pour éviter les collisions entre packages notamment)
    2) ça me permettra de faire des choses un peu plus précises, par exemple changer le titre selon que chap2 est compilé par chap2.tex ou main.tex.

    En revanche, j'ai un souci avec la première solution. Le code suivant ne fonctionne pas :
    \newif\ifMachinChapII
    \MachinChapIIfalse
    
    \unless\ifdefined\ifMachinChapII
    	\newif\ifMachinChapII
    	\MachinChapIItrue
    \fi
    
    \ifMachinChapII
    \documentclass{article}
    
    \begin{document}
    \fi
    	
    Bonjour
    	
    \ifMachinChapII
    \end{document}
    \fi
    

    L'erreur suivante est indiquée :
    Incomplete \unless\ifdefined; all text was ignored after line 4.
    
  • En effet, je me suis fait avoir par le truc habituel. Quand \ifMachinChapII est \let-égal à \iftrue ou \iffalse et que TeX ignore du texte conditionnel, chaque \ifMachinChapII trouvé dans le texte ignoré fait incrémenter le compteur d'imbrication et nécessite donc un \fi correspondant. Ici, lorsque \ifMachinChapII a été défini par main.tex, après avoir lu \unless\ifdefined, TeX va ignorer du texte jusqu'à trouver \else ou \fi, en tenant compte du compteur d'imbrication. Comme \ifMachinChapII est alors \let-égal à \iftrue ou \iffalse, le deuxième token de \newif\ifMachinChapII commence un nouveau bloc \if... \fi pour TeX (i.e., il fait incrémenter le compteur d'imbrication). Ce bloc se termine avec le \fi qui aurait dû matcher le \unless\ifdefined, donc TeX continue à ignorer du texte en tenant compte du niveau d'imbrication, et au final il arrive à la fin du document sans avoir trouvé de \fi correspondant au \unless\ifdefined.

    Il faut donc cacher \ifMachinChapII si on le définit à l'intérieur d'un bloc conditionnel. Le code suivant fonctionne.

    main.tex :
    \documentclass{book}
    
    \newif\ifMachinChapII
    
    \begin{document}
    
    \tableofcontents
    \include{chap2}
    
    \end{document}
    

    chap2.tex :
    \unless\ifdefined\ifMachinChapII
      \expandafter\newif\csname ifMachinChapII\endcsname
      \MachinChapIItrue
    \fi
    
    \ifMachinChapII
    \documentclass{book}
    \begin{document}
    \fi
    
    \chapter{Deuxième chapitre}
    
    \ifMachinChapII
    \end{document}
    \fi
    
  • Ça fonctionne parfaitement !

    Merci beaucoup pour le temps consacré à la résolution de mon problème.
  • Ce fut un plaisir, cher (chère ?) WM007. ;-)
  • cher :-D
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!