<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LaTeXmakefile.mk</title>
<meta name="Generator" content="Vim/8.2">
<meta name="plugin-version" content="vim8.1_v2">
<meta name="syntax" content="make">
<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=,use_input_for_pc=fallback">
<meta name="colorscheme" content="default">
<style>
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #ffffff; background-color: #000000; }
body { font-family: monospace; color: #ffffff; background-color: #000000; }
* { font-size: 1em; }
.PreProc { color: #ff40ff; }
.Comment { color: #8080ff; }
.Constant { color: #ff6060; }
.Special { color: #ff40ff; }
.Identifier { color: #00ffff; }
.Statement { color: #ffff00; }
-->
</style>
</head>
<body>
<pre id='vimCodeElement'>
<span class="Comment"># ---------------------------------------------------------------------------- #</span>
<span class="Comment">## \file LaTeXmakefile.mk</span>
<span class="Comment">## \author Sebastien Beaugrand</span>
<span class="Comment">## \sa <a href="http://beaugrand.chez.com/">http://beaugrand.chez.com/</a></span>
<span class="Comment">## \copyright CeCILL 2.1 Free Software license</span>
<span class="Comment"># ---------------------------------------------------------------------------- #</span>
<span class="Comment">#</span>
<span class="Comment"># Utilisation :</span>
<span class="Comment">#</span>
<span class="Comment"># - mettre dans un Makefile, par exemple :</span>
<span class="Comment">#</span>
<span class="Comment"># PROJET=p1</span>
<span class="Comment"># include ../LaTeXmakefile.mk</span>
<span class="Comment">#</span>
<span class="Comment"># - generer les dependances avec &quot;make dep&quot;</span>
<span class="Comment">#</span>
<span class="Comment"># - compiler le projet avec &quot;make p1&quot;</span>
<span class="Comment">#</span>
<span class="Comment"># - compiler les sections modifiees avec &quot;make&quot;</span>
<span class="Comment">#</span>
<span class="Comment"># Les sections sont donc dans des fichiers separes (par exemple src/s1.tex)</span>
<span class="Comment"># et leurs compilations separees se font avec d'autres fichiers dont le nom</span>
<span class="Comment"># commence par sec/section-.</span>
<span class="Comment"># Par exemple sec/section-s1.tex pourrait ressembler a :</span>
<span class="Comment">#</span>
<span class="Comment"># \documentclass{section}</span>
<span class="Comment"># \begin{document}</span>
<span class="Comment"># \input s1</span>
<span class="Comment"># \end{document}</span>
<span class="Comment">#</span>
<span class="Comment"># Et le fichier du projet pourrait ressembler a :</span>
<span class="Comment">#</span>
<span class="Comment"># \documentclass{livret}</span>
<span class="Comment"># \begin{document}</span>
<span class="Comment"># \input s1</span>
<span class="Comment"># \newpage</span>
<span class="Comment"># \input s2</span>
<span class="Comment"># \newpage</span>
<span class="Comment"># \input s3</span>
<span class="Comment"># \end{document}</span>
<span class="Comment">#</span>
<span class="Comment"># Remarque : ces exemples sont adaptes a la production de livrets A5 sans</span>
<span class="Comment"># changement d'echelle. (Utilisation du fichier livret.cls et &quot;pdfbook&quot;.)</span>
<span class="Comment">#</span>
<span class="Comment"># Si une dependance est modifiee (ajout ou suppression d'un \input,</span>
<span class="Comment"># \includegraphics de pdf, ou \verbatiminput), les regenerer avec &quot;make dep&quot;.</span>
<span class="Comment"># Ne regenerer qu'un seul fichier de dependance :</span>
<span class="Comment"># make dep DEP=dep/src/s1.dep</span>
<span class="Comment"># make dep DEP=dep/sec/section-s1.tex</span>
<span class="Comment">#</span>
<span class="Comment"># - verifier l'orthographe avec &quot;make spell&quot;</span>
<span class="Comment">#</span>
<span class="Comment"># Ceci fonctionne pour tous les fichiers ayant un fichier .dic correspondant</span>
<span class="Comment"># dans le repertoire dic. Pour ajouter une verification sur un nouveau fichier,</span>
<span class="Comment"># faire par exemple &quot;touch dic/s1.dic &amp;&amp; touch src/s1.tex&quot;. Normalement les</span>
<span class="Comment"># fichiers sec/section-*.tex n'ont pas besoin de fichiers .dic associes.</span>
<span class="Comment">#</span>
<span class="Comment"># - produire un extrait  : make pdf/extrait-&lt;pdf&gt; P=2,3,4,1</span>
<span class="Comment">#</span>
<span class="Comment"># - produire un livret   : make pdf/livret-&lt;pdf&gt;</span>
<span class="Comment">#</span>
<span class="Comment"># - produire un portrait : make pdf/portrait-&lt;pdf&gt;</span>
<span class="Comment">#</span>
<span class="Comment"># ---------------------------------------------------------------------------- #</span>
<span class="Identifier">PDFDIR  </span>= pdf
<span class="Identifier">SRCDIR  </span>= src/
<span class="Identifier">SECDIR  </span>= sec/
<span class="Identifier">MAKEDOC </span>= @pdflatex --halt-on-error -output-directory <span class="Identifier">$(PDFDIR)</span> <span class="Identifier">$&lt;</span>
<span class="Identifier">PURGE   </span>= @<span class="Identifier">$(RM)</span> -f <span class="Identifier">$(PDFDIR)</span>/*.aux <span class="Identifier">$(PDFDIR)</span>/*.log <span class="Identifier">$(SRCDIR)</span>*~ <span class="Identifier">$(SECDIR)</span>*~
<span class="Identifier">DEP </span>= <span class="Identifier">$(</span><span class="Statement">patsubst</span><span class="Identifier"> %.tex,dep/%.dep,$(</span><span class="Statement">wildcard</span><span class="Identifier"> */*.tex))</span>
<span class="Identifier">OBJ </span>= <span class="Identifier">$(</span><span class="Statement">patsubst</span><span class="Identifier"> $(SECDIR)%.tex,$(PDFDIR)/%.pdf,\</span>
<span class="Identifier">      $(</span><span class="Statement">wildcard</span><span class="Identifier"> $(SECDIR)section-*.tex))</span>
<span class="Identifier">DIC </span>= <span class="Identifier">$(</span><span class="Statement">wildcard</span><span class="Identifier"> dic/*.dic)</span>

<span class="Statement">.SUFFIXES:</span>

<span class="Statement">.PHONY:</span> all
<span class="Identifier">all:</span> <span class="Identifier">$(PDFDIR)</span> <span class="Identifier">$(OBJ)</span>
<span class="Constant">    </span><span class="Identifier">$(PURGE)</span>

<span class="Identifier">$(PDFDIR)</span><span class="Identifier"> dep/</span><span class="Identifier">$(SRCDIR)</span><span class="Identifier"> dep/</span><span class="Identifier">$(SECDIR)</span><span class="Identifier"> dic:</span>
<span class="Special">    @</span><span class="Constant">mkdir -p </span><span class="Identifier">$@</span>

<span class="Identifier">$(OBJ):</span> <span class="Identifier">$(PDFDIR)</span>/section-<span class="Identifier">%</span>.pdf: <span class="Identifier">$(SECDIR)</span>section-<span class="Identifier">%</span>.tex
<span class="Constant">    </span><span class="Identifier">$(MAKEDOC)</span>

<span class="Statement">.PHONY:</span> <span class="Identifier">$(PROJET)</span>
<span class="Identifier">$(PROJET):</span> <span class="Identifier">$(PDFDIR)</span> <span class="Identifier">$(PDFDIR)</span>/<span class="Identifier">$(PROJET)</span>.pdf

<span class="Identifier">$(PDFDIR)/$(PROJET).pdf:</span> <span class="Identifier">$(SRCDIR)$(PROJET)</span>.tex
<span class="Constant">    </span><span class="Identifier">$(MAKEDOC)</span>
<span class="Constant">    </span><span class="Identifier">$(PURGE)</span>

<span class="Statement">.PHONY:</span> spell
<span class="Identifier">spell:</span> dic <span class="Identifier">$(DIC)</span>
<span class="Constant">    </span><span class="Identifier">$(PURGE)</span>

<span class="Identifier">$(DIC):</span> dic/<span class="Identifier">%</span>.dic: <span class="Identifier">$(SRCDIR)%</span>.tex
<span class="Constant">    aspell -d francais -p ./</span><span class="Identifier">$@</span><span class="Constant"> -t -c </span><span class="Identifier">$&lt;</span>
<span class="Special">    @</span><span class="Constant">touch </span><span class="Identifier">$@</span>

<span class="Identifier">$(PDFDIR)/livret-%.pdf:</span> <span class="Identifier">$(PDFDIR)</span>/<span class="Identifier">%</span>.pdf
<span class="Constant">    pdfxup -b -kbb -ow -o </span><span class="Identifier">$@</span><span class="Constant"> </span><span class="Identifier">$&lt;</span><span class="Constant"> &gt;/dev/null</span>
<span class="Identifier">$(PDFDIR)/portrait-%.pdf:</span> <span class="Identifier">$(PDFDIR)</span>/livret-<span class="Identifier">%</span>.pdf
<span class="Constant">    pdfjam --angle 90 -q -o </span><span class="Identifier">$@</span><span class="Constant"> </span><span class="Identifier">$&lt;</span>
<span class="Identifier">$(PDFDIR)/extrait-%.pdf:</span> <span class="Identifier">$(PDFDIR)</span>/<span class="Identifier">%</span>.pdf
<span class="Constant">    pdfjam -q -o </span><span class="Identifier">$@</span><span class="Constant"> </span><span class="Identifier">$&lt;</span><span class="Constant"> </span><span class="Identifier">$(P)</span>

<span class="PreProc">define dependances-courantes</span>
<span class="PreProc">    deps=`sed \</span>
<span class="PreProc">    -e 's/^.*: //' \</span>
<span class="PreProc">    -e '/^[^ ]* </span><span class="Identifier">$$</span><span class="PreProc">/d' \</span>
<span class="PreProc">    -e '/^section-.*/d' </span><span class="Identifier">$1</span><span class="PreProc">`</span>
<span class="PreProc">endef</span>
<span class="PreProc">define dependances-uniques</span>
<span class="PreProc">    sed 's/ /\n/g' </span><span class="Identifier">$1</span><span class="PreProc"> | sed -n '1p' &gt;</span><span class="Identifier">$1</span><span class="PreProc">.tmp; \</span>
<span class="PreProc">    sed 's/ /\n/g' </span><span class="Identifier">$1</span><span class="PreProc"> | sed -e '1d' -e '/^</span><span class="Identifier">$$</span><span class="PreProc">/d' | \</span>
<span class="PreProc">    sort | uniq &gt;&gt;</span><span class="Identifier">$1</span><span class="PreProc">.tmp; \</span>
<span class="PreProc">    cat </span><span class="Identifier">$1</span><span class="PreProc">.tmp | tr '\n' ' ' &gt;</span><span class="Identifier">$1</span><span class="PreProc">; \</span>
<span class="PreProc">    echo &gt;&gt;</span><span class="Identifier">$1</span><span class="PreProc">; \</span>
<span class="PreProc">    </span><span class="Identifier">$(RM)</span><span class="PreProc"> </span><span class="Identifier">$1</span><span class="PreProc">.tmp</span>
<span class="PreProc">endef</span>
<span class="PreProc">define dependances-vers-les-autres</span>
<span class="PreProc">    </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-courantes,$1)</span><span class="PreProc">; \</span>
<span class="PreProc">    if [ -n &quot;</span><span class="Identifier">$$</span><span class="PreProc">deps&quot; ]; then \</span>
<span class="PreProc">        cible=`echo </span><span class="Identifier">$1</span><span class="PreProc"> | sed \</span>
<span class="PreProc">        -e 's@dep/\(.*\)\.dep@\1.tex@'`; \</span>
<span class="PreProc">        for f in `ls dep/*/*.dep`; do \</span>
<span class="PreProc">            if [ </span><span class="Identifier">$$</span><span class="PreProc">f != </span><span class="Identifier">$1</span><span class="PreProc"> ]; then \</span>
<span class="PreProc">                sed -i &quot;s@ </span><span class="Identifier">$$</span><span class="PreProc">cible @ </span><span class="Identifier">$$</span><span class="PreProc">deps@&quot; </span><span class="Identifier">$$</span><span class="PreProc">f; \</span>
<span class="PreProc">                </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-uniques,$$f)</span><span class="PreProc">; \</span>
<span class="PreProc">            fi; \</span>
<span class="PreProc">        done; \</span>
<span class="PreProc">    fi</span>
<span class="PreProc">endef</span>
<span class="PreProc">define dependances-depuis-les-autres</span>
<span class="PreProc">    for f in `ls dep/*/*.dep`; do \</span>
<span class="PreProc">        if [ </span><span class="Identifier">$$</span><span class="PreProc">f != </span><span class="Identifier">$1</span><span class="PreProc"> ]; then \</span>
<span class="PreProc">            </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-courantes,$$f)</span><span class="PreProc">; \</span>
<span class="PreProc">            if [ -n &quot;</span><span class="Identifier">$$</span><span class="PreProc">deps&quot; ]; then \</span>
<span class="PreProc">                cible=`echo </span><span class="Identifier">$$</span><span class="PreProc">f | sed \</span>
<span class="PreProc">                -e 's@dep/\(.*\)\.dep@\1.tex@'`; \</span>
<span class="PreProc">                sed -i &quot;s@ </span><span class="Identifier">$$</span><span class="PreProc">cible @ </span><span class="Identifier">$$</span><span class="PreProc">deps@&quot; </span><span class="Identifier">$1</span><span class="PreProc">; \</span>
<span class="PreProc">            fi; \</span>
<span class="PreProc">        fi; \</span>
<span class="PreProc">    done; \</span>
<span class="PreProc">    </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-uniques,$1)</span>
<span class="PreProc">endef</span>
<span class="PreProc">define dependances</span>
<span class="PreProc">    name=`echo </span><span class="Identifier">$1</span><span class="PreProc"> | sed 's@dep/\(.*\)\.dep@\1@'`; \</span>
<span class="PreProc">    echo -n  &quot;</span><span class="Identifier">$(PDFDIR)</span><span class="PreProc">/`basename </span><span class="Identifier">$1</span><span class="PreProc"> .dep`.pdf: </span><span class="Identifier">$$</span><span class="PreProc">name.tex &quot; \</span>
<span class="PreProc">    &gt;dep/</span><span class="Identifier">$$</span><span class="PreProc">name.dep; \</span>
<span class="PreProc">    sed \</span>
<span class="PreProc">    -e 's/\\</span><span class="Identifier">%</span><span class="PreProc">/PourCent/g' \</span>
<span class="PreProc">    -e 's/</span><span class="Identifier">%</span><span class="PreProc">.*//' \</span>
<span class="PreProc">    -e 's/PourCent/\\</span><span class="Identifier">%</span><span class="PreProc">/g' </span><span class="Identifier">$$</span><span class="PreProc">name.tex | \</span>
<span class="PreProc">    grep -e '\\input' -e '\\includegraphics' -e '\\verbatiminput' | \</span>
<span class="PreProc">    tr '\n' ' ' | \</span>
<span class="PreProc">    sed 's/\\input[{ ]*\([^} ]*\)/\n\1.tex\n/g' | \</span>
<span class="PreProc">    sed 's/\\includegraphics[{ ]*\([^} ]*\)/\n\1.pdf\n/g' | \</span>
<span class="PreProc">    sed 's/\\verbatiminput[{ ]*\([^} ]*\)/\n\1.sh\n/g' | \</span>
<span class="PreProc">    grep -e '.tex' -e '.pdf' -e '.sh' | \</span>
<span class="PreProc">    sed \</span>
<span class="PreProc">    -e 's/\.tex\.tex/.tex/g' \</span>
<span class="PreProc">    -e 's/\.pdf\.pdf/.pdf/g' \</span>
<span class="PreProc">    -e 's/\.sh\.sh/.sh/g' | \</span>
<span class="PreProc">    tr '\n' ' ' &gt;&gt;dep/</span><span class="Identifier">$$</span><span class="PreProc">name.dep; \</span>
<span class="PreProc">    echo &gt;&gt;dep/</span><span class="Identifier">$$</span><span class="PreProc">name.dep; \</span>
<span class="PreProc">    </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-vers-les-autres,dep/$$name.dep)</span><span class="PreProc">; \</span>
<span class="PreProc">    </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances-depuis-les-autres,dep/$$name.dep)</span>
<span class="PreProc">endef</span>

<span class="Statement">.PHONY:</span> dep
<span class="Identifier">dep:</span>
<span class="Special">    @</span><span class="Constant">for file in </span><span class="Identifier">$(DEP)</span><span class="Constant">; do </span><span class="Special">\</span>
<span class="Constant">        if [ -f </span><span class="Identifier">$$</span><span class="Constant">file ]; then </span><span class="Special">\</span>
<span class="Constant">            mv </span><span class="Identifier">$$</span><span class="Constant">file </span><span class="Identifier">$$</span><span class="Constant">file.bak; </span><span class="Special">\</span>
<span class="Constant">        fi; </span><span class="Special">\</span>
<span class="Constant">    done</span>
<span class="Special">    @</span><span class="Constant">for file in </span><span class="Identifier">$(DEP)</span><span class="Constant">; do </span><span class="Special">\</span>
<span class="Constant">        </span><span class="Identifier">$(</span><span class="Statement">call</span><span class="Identifier"> dependances,$$file)</span><span class="Constant">; </span><span class="Special">\</span>
<span class="Constant">        echo -n </span><span class="Constant">&quot;Dependances de &quot;</span><span class="Constant">; cat </span><span class="Identifier">$$</span><span class="Constant">file; </span><span class="Special">\</span>
<span class="Constant">    done</span>
<span class="Special">    @</span><span class="Constant">for file in `find . -name </span><span class="Constant">&quot;*.dep&quot;</span><span class="Constant"> -print`; do </span><span class="Special">\</span>
<span class="Constant">        if diff </span><span class="Identifier">$$</span><span class="Constant">file.bak </span><span class="Identifier">$$</span><span class="Constant">file &gt;/dev/null 2&gt;&amp;1; then </span><span class="Special">\</span>
<span class="Constant">            mv </span><span class="Identifier">$$</span><span class="Constant">file.bak </span><span class="Identifier">$$</span><span class="Constant">file; </span><span class="Special">\</span>
<span class="Constant">        fi; </span><span class="Special">\</span>
<span class="Constant">    done</span>
<span class="PreProc">-include $(wildcard dep/*/*.dep)</span>

<span class="Identifier">dep:</span> dep/<span class="Identifier">$(SRCDIR)</span> dep/<span class="Identifier">$(SECDIR)</span>

<span class="Identifier">$(OBJ) $(PDFDIR)/$(PROJET).pdf:</span> <span class="Identifier">$(MAKEFILE_LIST)</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->