<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.causeries-numeriques.fr/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Causeries numériques - make</title>
  <link>http://www.causeries-numeriques.fr/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 07 Feb 2012 14:32:21 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Compilation automatisée de fichier Latex</title>
    <link>http://www.causeries-numeriques.fr/post/2007/08/14/Compilation-automatisee-de-fichier-Latex</link>
    <guid isPermaLink="false">urn:md5:20c67c76dcb316877b76370e0e75c7db</guid>
    <pubDate>Tue, 14 Aug 2007 14:17:00 +0200</pubDate>
    <dc:creator>jb</dc:creator>
        <category>Des pingouins et des hommes</category>
        <category>latex</category><category>make</category><category>rake</category>    
    <description>&lt;p&gt;La compilation de document écrit avec Latex devient vite compliquée si différents types de fichiers entrent en jeu. Un script ou un &lt;code&gt;Makefile&lt;/code&gt; permet de simplifier cette tâche.&lt;/p&gt;    &lt;h3&gt;Besoin&lt;/h3&gt;


&lt;p&gt;Mes documents (écrit ou présentation réalisées avec &lt;a href=&quot;http://latex-beamer.sourceforge.net/&quot;&gt;beamer&lt;/a&gt;) sont produits par Latex. Pour chaque document, j'ai un répertoire qui contient le ou les fichiers Latex et des sous-répertoires.&lt;/p&gt;


&lt;h4&gt;Les différents sous-répertoires&lt;/h4&gt;


&lt;p&gt;Un répertoire &lt;code&gt;fig/&lt;/code&gt; contient des fichiers &lt;code&gt;png&lt;/code&gt; qui sont convertit en fichiers &lt;code&gt;eps&lt;/code&gt; à l'aide de l'utilitaire &lt;code&gt;convert&lt;/code&gt; présent dans le paquet &lt;code&gt;imagemagick&lt;/code&gt;.
Un répertoire &lt;code&gt;src/&lt;/code&gt; qui peut contenir toutes sortes de fichiers (C, SQL, Java, ...) qui sont inclus dans le document Latex à l'aide du &lt;em&gt;package&lt;/em&gt; &lt;code&gt;listings&lt;/code&gt;&lt;/p&gt;


&lt;h4&gt;Outil actuel&lt;/h4&gt;


&lt;p&gt;Un &lt;code&gt;Makefile&lt;/code&gt; présent dans le répertoire de travail assurait la compilation Latex alors qu'un autre &lt;code&gt;Makefile&lt;/code&gt; placé dans le répertoire &lt;code&gt;fig&lt;/code&gt; prenait en charge la conversion des images&amp;nbsp;; &lt;code&gt;make&lt;/code&gt; ne permet pas de travailler dans un autre répertoire.
A chaque nouveau document, je créais mes répertoire et copiais les deux &lt;code&gt;Makefile&lt;/code&gt;. Une simple commande &lt;code&gt;make&lt;/code&gt; me permettait de lancer la compilation (si nécessaire) ainsi que la conversion des images.&lt;/p&gt;


&lt;h3&gt;Développement d'un nouvel outil&lt;/h3&gt;


&lt;p&gt;Ce système de copie de fichier finissait par être assez pénible à l'usage. J'ai profité d'un peu de temps libre pour développer un outil pour automatiser toutes ces tâches (création des répertoires et compilation du fichier Latex) et rajouter des fonctionnalités.&lt;/p&gt;


&lt;h4&gt;Choix du système&lt;/h4&gt;

&lt;p&gt;Ces derniers temps je bidouille avec Ruby, j'ai donc choisi &lt;code&gt;rake&lt;/code&gt; pour gérer ce projet.  &lt;code&gt;rake&lt;/code&gt; utilise par défaut un fichier nommé &lt;code&gt;Rakefile&lt;/code&gt; lors de son appel.&lt;/p&gt;


&lt;h4&gt;Le fichier obtenu&lt;/h4&gt;

&lt;code class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;require&lt;/span&gt; 'rake/clean'&lt;br /&gt;
&lt;br /&gt;
CLEAN.&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;include&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'*.&lt;span style=&quot;color:#9900CC;&quot;&gt;ps&lt;/span&gt;','*.&lt;span style=&quot;color:#9900CC;&quot;&gt;dvi&lt;/span&gt;','*.&lt;span style=&quot;color:#9900CC;&quot;&gt;log&lt;/span&gt;','*.&lt;span style=&quot;color:#9900CC;&quot;&gt;out&lt;/span&gt;','*.&lt;span style=&quot;color:#9900CC;&quot;&gt;aux&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Main file&lt;/span&gt;&lt;br /&gt;
MAIN = &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;truc.pdf&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
PNG = FileList&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;fig/*.png&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;br /&gt;
EPS = PNG.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;eps&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
TEX = FileList&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;*.tex&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;br /&gt;
SRC = FileList&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;src/*.*&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;br /&gt;
DVI = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;dvi&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
desc &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;The default task : preview version&amp;quot;&lt;/span&gt;&lt;br /&gt;
task :default =&amp;gt; MAIN&lt;br /&gt;
file MAIN =&amp;gt; DVI&lt;br /&gt;
file DVI =&amp;gt; SRC&lt;br /&gt;
file DVI =&amp;gt; EPS&lt;br /&gt;
file DVI =&amp;gt; TEX&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Convert image files&lt;/span&gt;&lt;br /&gt;
rule '.&lt;span style=&quot;color:#9900CC;&quot;&gt;eps&lt;/span&gt;' =&amp;gt; '.&lt;span style=&quot;color:#9900CC;&quot;&gt;png&lt;/span&gt;' &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |t|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;convert #{t.source} #{t.name}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;rm&amp;nbsp; #{t.source}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
file DVI &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; main_tex = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;tex&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;latex #{main_tex}&amp;quot;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;latex #{main_tex}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
desc &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Screen resolution compilation&amp;quot;&lt;/span&gt;&lt;br /&gt;
file MAIN =&amp;gt; DVI &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#puts &amp;quot;Main task... : \n #{t.investigation}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; main_dvi = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;dvi&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; main_ps = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;ps&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;dvips #{main_dvi}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;ps2pdf #{main_ps}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
desc &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;High resolution conversion&amp;quot;&lt;/span&gt;&lt;br /&gt;
task :final =&amp;gt; DVI &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; main_dvi = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;dvi&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; main_ps = MAIN.&lt;span style=&quot;color:#9900CC;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;'.&lt;span style=&quot;color:#9900CC;&quot;&gt;ps&lt;/span&gt;'&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;dvips -D600 -Z #{main_dvi}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;ps2pdf -dPDFSETTINGS=/prepress #{main_ps}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sh &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;acroread #{MAIN} &amp;amp;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
desc &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Create directories&amp;quot;&lt;/span&gt;&lt;br /&gt;
task :init &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dir.&lt;span style=&quot;color:#9900CC;&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;fig&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dir.&lt;span style=&quot;color:#9900CC;&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;


&lt;h4&gt;Quelques explications&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;La variable &lt;code&gt;MAIN&lt;/code&gt; définie le nom du fichier de sortie.&lt;/li&gt;
&lt;li&gt;La liste de fichiers &lt;code&gt;PNG&lt;/code&gt; permet de constuire la liste des futurs fichiers &lt;code&gt;EPS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les listes &lt;code&gt;TEX&lt;/code&gt; et &lt;code&gt;SRC&lt;/code&gt; contiennent les fichiers &lt;code&gt;*.tex*&lt;/code&gt; et ceux contenus dans le répertoire &lt;code&gt;src&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Une règle (&lt;code&gt;rule&lt;/code&gt;) permet de définir la conversion &lt;code&gt;png&lt;/code&gt; vers &lt;code&gt;eps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La règle associée au fichier &lt;code&gt;DVI&lt;/code&gt; dépend des listes de fichiers &lt;code&gt;TEX&lt;/code&gt;, &lt;code&gt;SRC&lt;/code&gt; et &lt;code&gt;EPS&lt;/code&gt;. Elle lance la compilation du fichier Latex si un des fichiers présent dans ces trois liste est plus récent que la cible (ici le fichier &lt;code&gt;dvi&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;La règle &lt;code&gt;MAIN&lt;/code&gt; (qui est la règle par défaut) dépend du fichier &lt;code&gt;dvi&lt;/code&gt; et assure la conversion en &lt;code&gt;pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La tâche &lt;code&gt;final&lt;/code&gt; assure une conversion en haute qualité du fichier &lt;code&gt;dvi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La tâche &lt;code&gt;init&lt;/code&gt; crée les deux répertoire &lt;code&gt;src&lt;/code&gt; et &lt;code&gt;fig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La règle &lt;code&gt;clean&lt;/code&gt; est crée par défaut, on ajout seulement la liste de fichier à supprimer&amp;nbsp;: &lt;code&gt;*.ps','*.dvi','*.log','*.out','*.aux'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Utilisation&lt;/h4&gt;

&lt;p&gt;Selon les arguments passés à la commande &lt;code&gt;rake&lt;/code&gt;, différentes tâches sont réalisée&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rake init&lt;/code&gt; va créer les répertoires &lt;code&gt;fig&lt;/code&gt; et &lt;code&gt;src&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rake&lt;/code&gt; va lancer la compilation du fichier Latex (si nécessaire) et créer le fichier &lt;code&gt;pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rake final&lt;/code&gt; va lancer la compilation du fichier Latex avec un conversion en &lt;code&gt;pdf&lt;/code&gt; en haute résolution&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rake clean&lt;/code&gt; effacera tous les fichiers temporaires&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Outils utilisés pour déboguer le script&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;La commande &lt;code&gt;touch&lt;/code&gt; permet de modifier la date d'un fichier, très utile pour vérifier les règles de dépendances&lt;/li&gt;
&lt;li&gt;Dans le &lt;code&gt;Rakefile&lt;/code&gt; on peut ajouter les lignes ci-dessous pour déboguer les règles qui ne sont pas définies&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;code class=&quot;ruby&quot;&gt;rule '' &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |t|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;puts&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Undefined task... : &lt;span style=&quot;color:#000099;&quot;&gt;\n&lt;/span&gt; #{t.investigation}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;</description>
    
    
    
          <comments>http://www.causeries-numeriques.fr/post/2007/08/14/Compilation-automatisee-de-fichier-Latex#comment-form</comments>
      <wfw:comment>http://www.causeries-numeriques.fr/post/2007/08/14/Compilation-automatisee-de-fichier-Latex#comment-form</wfw:comment>
      <wfw:commentRss>http://www.causeries-numeriques.fr/feed/rss2/comments/2</wfw:commentRss>
      </item>
    
</channel>
</rss>
