Compilation partielle et multiple

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

[Résolu] Compilation partielle et multiple

Message par ThomP »

Bonjour;
Encore un petit problème je ne trouve pas de documentation sur le net.

Je rédige un document de cours dont la structure est la suivante

Code : Tout sélectionner

Fichier latex maitre 
--- input chapitre 1
------------- section 1
------------- section 2
------------- section Exercices
------------------ corrigé des exercices
--- input chapitre 2
------------- section 1
------------- section 2
------------- section Exercices
------------------ corrigé des exercices
Je rédige donc les chapter dans des fichires tex différents pour permettre des compilations rapides en cours de rédaction. Avant le input je commente le begindocument, et j'obtiens mon doc complet.

J'ai un problème que j'aimerai résoudre : j'aimerai compiler uniquement une partie du chapitre (sans les exo, sans la correction).

Grosso modo dans le ECM suivant :

Code : Tout sélectionner

\begin{document}

\chapter{Mon chapitre}

\section{Partie1}
\lipsum[3]

\newpage
\section{partie2}
\lipsum[3]

\newpage
\section{exercices}
\lipsum[3]
\newpage

\section{corrigé des exercices}
\lipsum[3]

\end{document}
Je voudrais pouvoir compiler uniquement la dernière section, ou uniquement les 3 premières.
C'est possible facilement ?

J'ai pensé à trois solutions dont une que j'utilisais :

1. Compiler en entier et découper le PDF en ligne ou via un logiciel (j'ai pas trop envie de mettre mon fichier sur un site lambda ou de chercher un logiciel).
2. Compiler en entier et après avec l'imprimante PDF imprimer uniquement les pages concernées (j'ai des soucis de flou sur les polices + les liens hypertextes ne marchent plus).
3. Mettre chaque section dans un .tex a part et l'appeler via input ou include mais j'ai l'impression que ça serait fastidieux ?

Peut être qu'il y a bien plus simple ?
Dernière modification par ThomP le jeudi 04 juin 2020, 16:16, modifié 2 fois.

MB
Administrateur
Administrateur
Messages : 7137
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Compilation partielle ?

Message par MB »

Une solution avec des if ?

Code : Tout sélectionner

\documentclass{article}
\usepackage{lipsum}

\newif\ifsectiona
\newif\ifsectionb
\newif\ifsectionc
\newif\ifsectiond
\sectionatrue% ou \sectionafalse pour ignorer la section 1
\sectionbtrue% ou \sectionbfalse pour ignorer la section 2
\sectionctrue% ou \sectioncfalse pour ignorer la section 3
\sectiondtrue% ou \sectiondfalse pour ignorer la section 4

\begin{document}
\ifsectiona
\section{Partie1}
\lipsum[3]
\fi

\ifsectionb
\newpage
\section{partie2}
\lipsum[3]
\fi

\ifsectionc
\newpage
\section{exercices}
\lipsum[3]
\fi

\ifsectiond
\newpage
\section{corrigé des exercices}
\lipsum[3]
\fi
\end{document}
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle ?

Message par ThomP »

Ah, génial. Merci. :oops:

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle ?

Message par ThomP »

Je pousse le truc plus loin maintenant que cela fonctionne (merci encore)!
Est-il possible de dire à LaTeX de boucler en compilation ?

Je commence par compiler tout le document (version prof complète).
Je continue en compilant tout le document sauf la correction des exercices (version élève).
Je termine en compilant uniquement la correction des exercices.

Ce qui fait qu'à chaque compilation on obtient 3 PDF ? (plutôt que d'éditer les 3 fichiers pour une modif mineure)

MB
Administrateur
Administrateur
Messages : 7137
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Compilation partielle

Message par MB »

Je ne sais pas si ce mode de fonctionnement est très judicieux, mais en s'inspirant de cette proposition, on peut réaliser le fichier suivant.

Code : Tout sélectionner

\documentclass{article}
\usepackage{shellesc}
\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1%
\section{partie1}
\newpage
\section{partie2}
\newpage
\section{partie3}
\newpage
\section{partie4}
\fi

\ifnum\conditionmacro=2%
\section{partie1}
\newpage
\section{partie2}
\newpage
\section{partie3}
\fi

\ifnum\conditionmacro=3%
\section{partie4}
\fi
\end{document}
En compilant avec l'option --shell-escape on va bien obtenir les trois fichiers pdf demandés.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: Compilation partielle

Message par marco56 »

Il y a le package versions qui est fait pour cela : http://ctan.math.utah.edu/ctan/tex-arch ... ns-doc.pdf
Je l'utilise pour tous mes documents de cours.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

MB a écrit :
jeudi 04 juin 2020, 18:21
Je ne sais pas si ce mode de fonctionnement est très judicieux, mais en s'inspirant de cette proposition, on peut réaliser le fichier suivant.
Je vais regarder. Pourquoi pas judicieux par curiosité ?
Edit: marche bien ... Intéressant! Mais nécessite de dupliquer dans le fichier les parties à re compiler.
marco56 a écrit :
jeudi 04 juin 2020, 19:43
Il y a le package versions qui est fait pour cela : http://ctan.math.utah.edu/ctan/tex-arch ... ns-doc.pdf
Je l'utilise pour tous mes documents de cours.
Je regarde merci.

Edit: pas réussi à obtenir d'un coup plusieurs PDF avec cette technique.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: Compilation partielle

Message par marco56 »

En fait il faut mettre une compil avec include versions eleve et une autre en include versions prof, donc 2 fichiers, une pour le prof et une pour l'élève.
Si tu le souhaites, je peux essayer de te faire un ecm.
Cela doit être trouvable sur le net.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

marco56 a écrit :
jeudi 04 juin 2020, 21:19
en fait il faut mettre une compil avec include versions eleve et une autre en include versions prof, donc 2 fichiers, une pour le prof et une pour l'élève.
Si tu le souhaites, je peux essayer de te faire un ecm.
Cela doit être trouvable sur le net.
Je crois que je suis presque à quelque chose qui m'éviterait ça à partir du code précédent de @MB :

Code : Tout sélectionner

\documentclass{article}
\usepackage{lipsum}
\usepackage{shellesc}

\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi

\begin{document}
\ifnum\conditionmacro=1%
\section{partie1}
\newpage
\section{partie2}
\newpage
\fi
\ifnum\conditionmacro=2%

\section{exos}
\fi
\newpage
\ifnum\conditionmacro=3%

\section{corr}
\fi

\end{document}
Si j'ai bien compris pour réussir à faire ce que je veux (c'est à dire qu'il me sorte 1 PDF complet, 1 PDF avec uniquement les exo et 1PDF avec uniquement les corrigés des exos) il suffirait (je déteste ce mot vu mon niveau de connaissances) que j'arrive dans cette partie du code :

Code : Tout sélectionner

\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi
A transformer le jobname1 pour qu'il mette le fichier complet (car jobname2 et 3 font déjà le taf demandé, à savoir extraire ma partie exo et ma partie corrigé).

Je n'arrive pas à faire ça :(

MB
Administrateur
Administrateur
Messages : 7137
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Compilation partielle

Message par MB »

ThomP a écrit :
jeudi 04 juin 2020, 20:14
Pourquoi pas judicieux par curiosité ?
Edit: marche bien ... Intéressant! Mais nécessite de dupliquer dans le fichier les parties à re compiler.
Je pense qu'il serait préférable de gérer chaque partie dans des fichiers séparés et de faire en sorte que le fichier principal s'occupe des \input.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

MB a écrit :
jeudi 04 juin 2020, 22:07
ThomP a écrit :
jeudi 04 juin 2020, 20:14
Pourquoi pas judicieux par curiosité ?
Edit: marche bien ... Intéressant! Mais nécessite de dupliquer dans le fichier les parties à re compiler.
Je pense qu'il serait préférable de gérer chaque partie dans des fichiers séparés et de faire en sorte que le fichier principal s'occupe des \input.
J'ai cependant un problème du coup, depuis le début (j'ai retapé environ 50% de mes cours de cette année ce qui représente un paquet d'heures de latex) j'utilise pour mes exos une structure du type.

Code : Tout sélectionner

\exo{} blablabla
\begin{correction}
blabla
\end{correction}
\finexo
Qui m'envoie le corrigé sur une page annexe.

Du coup avec cette structure je pense que c'est compliqué de faire en deux fichiers .tex et de sortir un fichier avec cours+exo (énoncé)+corrigé (pour le prof) et un fichier avec cours+exo (sans corrigé) pour l'élève avec un fichier de corrigé à côté pour mise en ligne distribution plus tard.

C'est possible de modifier ça :

Code : Tout sélectionner

\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi

\begin{document}
\ifnum\conditionmacro=1%
\section{P1}
\newpage
\section{P2}
\newpage
\fi
\ifnum\conditionmacro=2%
\section{P3}
\fi
\newpage
\ifnum\conditionmacro=3%
\section{corr}
\fi
\end{document}
Pour que le premier Shellescape compile tout le document ?
J'ai testé de modifier cette partie :

Code : Tout sélectionner

  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
En ajoutant 2 et 3 mais ne comprenant pas bien la structure, je n'ai pas réussi. J'ai ajouté avec une virgule "\gdef\string\conditionmacro{2}\string\input\space\jobname" et "\gdef\string\conditionmacro{3}\string\input\space\jobname" par exemple mais pas très efficace .. !

MB
Administrateur
Administrateur
Messages : 7137
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Compilation partielle

Message par MB »

Dans la première version, la condition 1 ne compilait pas tout le document ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

Dans celle ci ?

Code : Tout sélectionner

\documentclass{article}
\usepackage{shellesc}
\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1%
\section{partie1}
\newpage
\section{partie2}
\newpage
\section{partie3}
\newpage
\section{partie4}
\fi

\ifnum\conditionmacro=2%
\section{partie1}
\newpage
\section{partie2}
\newpage
\section{partie3}
\fi

\ifnum\conditionmacro=3%
\section{partie4}
\fi
\end{document}

Oui, cela fonctionnait, à condition de dupliquer les sections et leur contenu ?
Mais peut etre est-ce la seule option ?

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: Compilation partielle

Message par marco56 »

Pour ma part, j'évite toujours le shell-escape : trop compliqué à gérer en cas d'erreur.
J'essaie de faire un ecm pour ce soir.

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

marco56 a écrit :
vendredi 05 juin 2020, 10:18
Pour ma part, j'évite toujours le shell-escape : trop compliqué à gérer en cas d'erreur.
J'essaie de faire un ecm pour ce soir.
Merci

Pour info voila un exemple de mes exos

Code : Tout sélectionner

\section{exercices}
\Opensolutionfile{mycor}[ficcorex]

\exo{}
On coupe un fil de \SI{45}{\meter} en deux parties de manière à ce que la première ait $9$m de plus que la seconde.\\
Donner la longueur de chaque partie.
\begin{correction}
Soit $x$ la longueur de la seconde partie. La première partie est donc de $x+9$m et au total $x+x+9=45$.
$$2x +9 = 45$$
$$ 2x = 36 $$
$$x = 18 $$
La seconde partie mesure donc $18$m et la première $18+9=\SI{27}{\meter}$. Vérification : $27+18=45$. 
\end{correction}
\finexo

\newpage
\setcounter{page}{1}
\Closesolutionfile{mycor}
\Readsolutionfile{mycor}
Avec ça (et une définition dans le préambule à laquelle je ne comprend rien) j'ai la correction sur une page à part ...
Mais dans le texte je tape tout en même temps au même endroit !

Code : Tout sélectionner

\newtheorem{Exc}{EXERCICE}[chapter] %création d'exo avec corrigés
\Newassociation{correction}{Soln}{mycor}
\renewcommand{\Solnlabel}[1]{\textbf{CORRIGE  #1}}
\def\exo#1{%
\futurelet\testchar\MaybeOptArgmyexoo}
\def\MaybeOptArgmyexoo{
\ifx[\testchar  \let\next\OptArgmyexoo
\else  \let\next\NoOptArgmyexoo  \fi  \next}
\def\OptArgmyexoo[#1]{%
\begin{Exc}[#1]\normalfont}
\def\NoOptArgmyexoo{%
\begin{Exc}\normalfont}
\newcommand{\finexo}{\end{Exc}}
\newcommand{\flag}[1]{}
\newcommand{\entete}[1]

MB
Administrateur
Administrateur
Messages : 7137
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Compilation partielle

Message par MB »

En mixant un peu les solutions précédentes, on pourrait faire quelque chose comme ça.

Code : Tout sélectionner

\documentclass{article}
\usepackage{shellesc}
\newif\ifsectiona
\newif\ifsectionb
\newif\ifsectionc
\newif\ifsectiond
\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi
\begin{document}
\ifnum\conditionmacro=1
\sectionatrue
\sectionbtrue
\sectionctrue
\sectiondtrue
\fi

\ifnum\conditionmacro=2
\sectionatrue
\sectionbtrue
\sectionctrue
\sectiondfalse
\fi

\ifnum\conditionmacro=3
\sectionafalse
\sectionbfalse
\sectioncfalse
\sectiondtrue
\fi

\ifsectiona
\section{partie1}
\fi

\ifsectionb
\newpage
\section{partie2}
\fi

\ifsectionc
\newpage
\section{partie3}
\fi

\ifsectiond
\newpage
\section{partie4}
\fi
\end{document}
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: Compilation partielle

Message par marco56 »

Il y a plusieurs possibilités mais un exemple ci-dessous :
pour avoir la version eleve ou prof, il faut commenter 2 lignes :
\excludeversion{Eleve} % version élève
\includeversion{Prof} % version prof
ou les deux autres.
L'idéal est donc de sauver sous 2 noms de fichier, un en version prof, l'autre en version eleve.
On peut aussi inclure le tout dans un document.
Enfin, cela fonctionne aussi avec des \input{fich1}...

Code : Tout sélectionner

\documentclass{article}
\usepackage{amsmath}
\usepackage{versions}

\newenvironment{Eleve}{ \par% 
	\medskip% 
	\par% 
}{
}

\newenvironment{Prof}{ \par% 
	\medskip% 
	\par% 
}{
}


\begin{document}


% version Eleve
%\includeversion{Eleve} % version élève
%\excludeversion{Prof} % version prof


% version Prof
\excludeversion{Eleve} % version élève
\includeversion{Prof} % version prof


\begin{Eleve}
\begin{center}
\begin{tabular}{|c|c|c|c|}
\hline
système & liquide & liquide $\rightarrow$ vapeur & liquide  \\
\hline
\hline
$W$ &  & & \\
\hline
\end{tabular}
\end{center}
\end{Eleve}

\begin{Prof}
\begin{center}

\begin{tabular}{| c  | c | c | c |}
\hline
système & liquide & liquide $\rightarrow$ vapeur & vapeur \\
\hline
\hline
$W$ & $- \int p_{\text{ext}} \, dV \simeq 0$ & $- p_{\text{sat}} \, \left(V_{\text{vap}} - V_{\text{liq}} \right) \simeq - p_{\text{sat}} \, V_{\text{vap}}$ & $- \int p_{\text{ext}} \, dV$ \\
\hline
\end{tabular}

\end{center}
\end{Prof}

\end{document}

ThomP
Utilisateur confirmé
Utilisateur confirmé
Messages : 16
Inscription : mardi 19 mai 2020, 14:51
Statut actuel : Enseignant
Localisation : Rhône Alpes

Re: Compilation partielle

Message par ThomP »

Génial !
Merci pour votre aide précieuse !

Merci @marco56 pour l'alternative, je vais voir laquelle est la plus simple pour adapter à mes doc.