Discussion:
Deux PDFs via un lancement de compilation
(trop ancien pour répondre)
projetmbc
2022-10-07 12:46:57 UTC
Permalink
Bonjour.

Comment produire deux PDFs dont les rendus dépendent de la valeur d'un booléen, et ceci en lançant juste une compilation ?

C'est un collègue qui m'a posé la question. Pour ma part, je passerais via un bête script bash, ou pourquoi pas un makefile.

~~~~~~~~~~~~~~~~~~~~~~~~

\documentclass[12pt]{article}

\usepackage{etoolbox}
\newbool{test}
\setbool{test}{false}

\begin{document}

\section{Double compilation ?}

\ifbool{test}{
Booléen vrai.
}{
Booléen faux.
}

\end{document}
Denis Bitouzé
2022-10-07 13:08:10 UTC
Permalink
Post by projetmbc
Bonjour.
Comment produire deux PDFs dont les rendus dépendent de la valeur d'un booléen,
et ceci en lançant juste une compilation ?
C'est un collègue qui m'a posé la question. Pour ma part, je passerais via un
bête script bash, ou pourquoi pas un makefile.
Voici une solution, pas loin du script ou du makefile. Si `test.tex`
contient :

--8<---------------cut here---------------start------------->8---
\documentclass[12pt]{article}

\begin{document}

\section{Double compilation ?}

\ifbool{test}{
Booléen vrai.
}{
Booléen faux.
}

\end{document}
--8<---------------cut here---------------end--------------->8---

lancer l'une ou l'autre des compilations :

--8<---------------cut here---------------start------------->8---
pdflatex -jobname test "\RequirePackage{etoolbox}\newbool{test}\setbool{test}{true}\input{test}"
pdflatex -jobname test "\RequirePackage{etoolbox}\newbool{test}\setbool{test}{false}\input{test}"
--8<---------------cut here---------------end--------------->8---
--
Denis
projetmbc
2022-10-07 16:04:10 UTC
Permalink
Merci.
projetmbc
2022-10-09 14:20:26 UTC
Permalink
Post by Denis Bitouzé
Post by projetmbc
Bonjour.
Comment produire deux PDFs dont les rendus dépendent de la valeur d'un booléen,
et ceci en lançant juste une compilation ?
C'est un collègue qui m'a posé la question. Pour ma part, je passerais via un
bête script bash, ou pourquoi pas un makefile.
Voici une solution, pas loin du script ou du makefile. Si `test.tex`
--8<---------------cut here---------------start------------->8---
\documentclass[12pt]{article}
\begin{document}
\section{Double compilation ?}
\ifbool{test}{
Booléen vrai.
}{
Booléen faux.
}
\end{document}
--8<---------------cut here---------------end--------------->8---
--8<---------------cut here---------------start------------->8---
pdflatex -jobname test "\RequirePackage{etoolbox}\newbool{test}\setbool{test}{true}\input{test}"
pdflatex -jobname test "\RequirePackage{etoolbox}\newbool{test}\setbool{test}{false}\input{test}"
--8<---------------cut here---------------end--------------->8---
--
Denis
Du coup, ceci demande tout de même deux compilations.

Pourrait-on imaginer lancer ce processus depuis un fichier TeX ?
Denis Bitouzé
2022-10-09 17:24:47 UTC
Permalink
Post by projetmbc
Du coup, ceci demande tout de même deux compilations.
Pour obtenir deux PDF distincts, ça me paraît inévitable.
Post by projetmbc
Pourrait-on imaginer lancer ce processus depuis un fichier TeX ?
Euh... comment ça ?
--
Denis
projetmbc
2022-10-10 06:44:44 UTC
Permalink
Post by Denis Bitouzé
Post by projetmbc
Du coup, ceci demande tout de même deux compilations.
Pour obtenir deux PDF distincts, ça me paraît inévitable.
Post by projetmbc
Pourrait-on imaginer lancer ce processus depuis un fichier TeX ?
Euh... comment ça ?
--
Denis
Mon idée était de lancer une compilation en mode normal, et en fin de compilation lancer la compilation depuis le TeX compilé via une macro en "fin de code".
Vincent Belaïche
2022-10-26 18:03:55 UTC
Permalink
Post by projetmbc
Bonjour.
Comment produire deux PDFs dont les rendus dépendent de la valeur d'un booléen,
et ceci en lançant juste une compilation ?
C'est un collègue qui m'a posé la question. Pour ma part, je passerais via un
bête script bash, ou pourquoi pas un makefile.
Cette page vous sera peut-être utile :

https://latexref.xyz/fr/Command-line-input.html#Command-line-input

V.
projetmbc
2022-10-27 14:30:50 UTC
Permalink
En fait, il y a un petit hack qui peut être utile.

Il faut deux fichiers comme ci-dessous, et on lance juste la compilation sur other.tex (en shell escape).


% Fichier: other-student.tex

\input{other.tex}



% Fichier: other.tex

\documentclass{article}

\usepackage{xcolor}

\usepackage{iexec}
\usepackage{jobname-suffix}


\newcommand{\solution}[1]{{\color{red}#1}}
\newcommand{\launchstudent}{
\iexec[quiet]{pdflatex \jobname-student.tex}
}


\IfSuffixT[student]{
\renewcommand{\solution}[1]{}
\renewcommand{\launchstudent}{}
}

\begin{document} \begin{enumerate}

\item First question \solution{First answer}

\item Second question

\solution{Second answer} \end{enumerate}

\launchstudent{}

\end{document}
projetmbc
2022-10-27 15:32:41 UTC
Permalink
Un peu mieux et je m'arrêterais là sur ce sujet. :-)


% Fichier unique à compiler en "shell escape"

\documentclass{article}

\usepackage{xcolor}

\usepackage{iexec}
\usepackage{jobname-suffix}


\newcommand{\solution}[1]{{\color{red}#1}}

\IfSuffixT[]{
\iexec[quiet]{touch \jobname-student.tex}
\iexec[quiet]{echo '\\input{\jobname.tex}' > \jobname-student.tex}
\iexec[quiet]{pdflatex \jobname-student.tex}

}

\IfSuffixT[student]{
\renewcommand{\solution}[1]{}
}

\begin{document}

\begin{enumerate}

\item First question

\solution{First answer}

\item Second question

\solution{Second answer}

\item Third question

\solution{Third answer}
\end{enumerate}

\end{document}
projetmbc
2022-10-27 17:17:50 UTC
Permalink
J'ai pris le temps de regarder le lien proposé par Vincent Belaïche. Il y a une dépendance de moins avec un code plus court.

Il reste à virer iexec... ;-)

% professor.tex

\documentclass{article}

\usepackage{xcolor}

\usepackage{iexec}

% Source (given in fr.comp.text.tex).
% * https://latexref.xyz/fr/Command-line-input.html#Command-line-input
\newcommand{\solution}[1]{{\color{red}#1}}

\ifdefined\forstudents
\renewcommand{\solution}[1]{}
\else
\iexec[quiet]{pdflatex -jobname=students '\\def\\forstudents{}\\input{main}'}
\fi



\begin{document}

\begin{enumerate}

\item First question

\solution{First answer}

\item Second question

\solution{Second answer}

\item Third question

\solution{Third answer}
\end{enumerate}

\end{document}
projetmbc
2022-10-27 17:19:10 UTC
Permalink
Post by projetmbc
\iexec[quiet]{pdflatex -jobname=students '\\def\\forstudents{}\\input{main}'}
input{professor.tex} bien entendu !
projetmbc
2022-10-29 17:12:07 UTC
Permalink
Finalement, aucune dépendance n'est utile... Mais cela, vous le saviez sûrement déjà. :-)

% ------------- Code ------------- %

\documentclass{article}

\usepackage{xcolor}

% Source (given in fr.comp.text.tex).
% * https://latexref.xyz/fr/Command-line-input.html#Command-line-input
\newcommand{\solution}[1]{{\color{red}#1}}

\ifdefined\forstudents
\renewcommand{\solution}[1]{}
\else
% We need `...` to launch a subprocess!
\input{\detokenize{|`"pdflatex -jobname=students '\\def\\forstudents{}\\input{professor}'"`}}
\fi


\begin{document}

\begin{enumerate}

\item First question

\solution{First answer}

\item Second question

\solution{Second answer}

\item Third question

\solution{Third answer}
\end{enumerate}

\end{document}

Loading...