Intro très rapide à LaTeX

Il y a un peu plus d’un an j’ai promis une intro très rapide à LaTeX pour les non-informaticiens. Je m’y mets maintenant. En bas de ce billet vous trouverez des références pour aller plus loin.

Comment faire un document LaTeX

LaTeX est un langage où on compile le document. Contrairement à des logiciels comme Libreoffice Writer ou Word, qui sont des éditeurs WYSIWYG, dans le document que l’on édite, on saisit le document et sa structure (paragraphes, sections, etc). Le compilateur LaTeX se charge de la mise en forme, selon la feuille de style utilisée, et produit le document lui-même.

Sommaire

Les outils

Pas de panique, il existe plein d’outils pour faire tout ça automatiquement pour vous… que je n’utilise pas personnellement, mais je connais des gens dont c’est le cas.

C’est dispo sur plein de plate-formes (Windows Mac Linux), il vous propose une colonne pour gérer vos fichiers, la moitié de l’écran pour écrire votre document, l’autre moitié compile à la volée et vous donne un aperçu du document, et vous pouvez avoir une colonne pour gérer et accéder à vos fichiers. Dernièrement, tous les collègues que j’ai vu utiliser un éditeur de ce genre  utilisaient soit Texmaker, soit TeXstudio. Une capture d’écran proposée par le site [ici].

C’est le même principe, la différence se fait dans les fonctionnalités « fines » d’aide à la rédaction comme l’auto-complétion ou des fonctionnalités de l’éditeur de textes (curseurs multiples par exemple). Une capture d’écran [ici].

Pendant ma thèse, c’est ce que je voyais mes copains non-informaticiens utiliser. Même principe, sauf qu’il faut appuyer sur un bouton pour générer le PDF (ou un autre format). Une capture d’écran [ici].

C’est en ligne, rien besoin d’installer… bref, c’est très intéressant. Je vois beaucoup de gens l’utiliser. Il suffit de se créer un compte pour l’utiliser.
(merci @eisaru pour la suggestion, j’avais oublié !)

C’est aussi un outil en ligne, que je vois beaucoup de gens utiliser. Il permet notamment le travail collaboratif, ce qui est encore plus pratique !

Créer un document

Maintenant que vous êtes équipé, vous n’avez plus qu’à créer votre premier document !

Gardez un principe en tête : vous donnez la structure du document et LaTeX s’occupe de la mise en forme.

Pour cela, il faut qu’il sache de quel type de document il va s’agir : c’est-à-dire, de quelle classe. Vous commencez donc votre document par :

\documentclass{article}

Ici, nous allons créer un document en utilisant la classe article. Les classes par défaut de LaTeX sont book, report, article (par ordre décroissant de longueur) et des classes spécifiques comme letter, beamer… En passant le nom d’une feuille de style (un fichier .cls), vous pourrez utiliser une autre classe. Par exemple, pour utiliser la classe IEEE, on met le fichier IEEEtran.cls dans le même répertoire et on commence par :

\documentclass{IEEEtran}

On peut aussi passer des options, qui dépendent du style. Par exemple, un style a une taille de police de base. On peut la préciser en la passant en option de cette commande. On peut aussi spécifier le format de papier à utiliser. Par exemple, pour faire un livre sur du papier A4 avec une taille de police de base égale à 11 :

\documentclass[a4paper,11pt]{book}

Vous pouvez d’ores et déjà remarquer trois choses sur cette commande LaTeX :

  • elle commence par un antislash : \
  • l’information passée en argument est passé entre accolades : {}
  • les options sont passées avant les arguments, elles entre crochets : []

Il y a ensuite quelques options à fournir. C’est ici que vous allez déclarer les packages à utiliser, par exemple. Pour écrire du français, il faut préciser :

\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

Si bien sûr vos fichiers sont encodés en UTF8. Dans le cas contraire, précisez l’encodage (probablement iso8859-15).

La structure du document

Le document lui-même doit être entre

\begin{document}

et

\end{document}

Tout ce qui se situe avant le \begin{document} est le préambule : il contient toutes les déclarations, les ouvertures de packages… Il n’y a rien après le \end{document}. Le texte du document lui-même se situe donc entre ces deux commandes.

Le titre

Le titre est mis en forme pour vous. Dans le préambule, vous pouvez déclarer :

\author{Votre nom}
\title{Titre du document}
\date{21 Octobre 2015}

Si vous ne mettez pas de date, LaTeX insérera la date du jour de la compilation. Vous pouvez mettre à la place \date{~} pour la laisser vide.

Dans le texte, vous pouvez générer le titre avec la commande

\maketitle

capture-du-2017-02-06-211703

Sections et paragraphes

Le corps du texte lui-même est structuré en sections et en paragraphes. Suivant le type de document (report, book), vous disposez d’autres éléments : des chapitres et des parties.

Indiquez le début d’une section avec

\section{Titre de la section}

C’est tout ! De même, vous disposez de sous-sections :

\subsection{Titre de la sous-section}
\subsubsection{Encore un niveau d'imbrication}

Les sections et les sous-sections sont numérotées. Les paragraphes, eux, ne le sont pas. On peut les définir avec :

\paragraph{Titre du paragraphe}
\subparagraph{Titre du sous-paragraphe}

Les paragraphes, au sens de blocs de texte, sont simplement séparés par des sauts de ligne.

Enfin, la commande

\tableofcontents

génère la table des matières automatiquement. Attention, il faut compiler deux fois pour avoir une table des matières : la première fois le compilateur note où sont les sections et les sous-sections, la deuxième fois il génère la table des matières à partir de ces notes.

Les listes et énumérations

Les listes et les énumérations… C’est très simple. On dit où ça commence et où ça se termine, avec une commande \begin et une commande \end, et on démarre chaque élément par \item. En fonction du type de liste que l’on souhaite, LaTeX génère la liste elle-même : numérotée avec enumerate et non-numérotée avec itemize.

Par exemple, pour une liste non-numérotée :

\begin{itemize} 
\item premier élément
\item deuxième élément
\end{itemize}

Et pour une liste numérotée :

\begin{enumerate}
\item premier élément
\item deuxième élément
\end{enumerate}

Vous constatez que la seule différence est entre itemize et enumerate : on parle d’environnement, et pour changer entre l’un et l’autre, il suffit de modifier le type d’environnement.

Insérer une image

TODO

Les références

Les références, c’est un truc absolument génial avec LaTeX. Quand on s’est tapé une gestion de références croisées et une bibliographie avec un éditeur WYSIWYG, on aime d’amour LaTeX.

Les références croisées

Première chose : les références croisées. C’est extrêmement simple : on met un label à l’endroit vers lequel on veut faire des références, et partout ailleurs on s’y réfère avec une référence. Ce qui donne la commande :

\label{nomdulabel}

Et pour les références, on utilise le nom de ce label (attention à ne pas définir deux labels avec le même nom) :

\ref{nomdulabel}

Voilà, c’est tout. LaTeX a ici encore besoin de deux compilations : à la première il note les labels, à la deuxième il insère les références. Par conséquent, à la première compilation, vous aurez des ?? à la place des références.

Cela fonctionne avec les sections, les tableaux, les figures… Par exemple, pour mettre un label sur une figure, mettez-le dans la légende :

\caption{Légende de la figure.\label{mafigure}}

Dans le texte, vous obtiendrez une référence au numéro de la figure.

Une bibliographie

La bibliographie fonctionne un peu selon le même principe. On insère une référence dans le texte, et la référence est générée automatiquement à la compilation. Il existe deux façons de faire une bibliographie : en utilisant BibTeX, ou non.

Sans BibTeX, on ajoute les références bibliographiques à la fin, dans un environnement thebibliography :

\begin{thebibliography}{50}
\bibitem{KR78} Kernighan, Brian W., and Dennis M. Ritchie. The C 
programming language. 1978.
\bibitem{L86} Lamport, Leslie. LaTEX: User's Guide \& Reference 
Manual. 1986.
\end{thebibliography}

Quelques remarques sur cette biblio. Tout d’abord, on a passé l’option 50 entre accolades : il s’agit de la longueur maximale des étiquettes qui seront utilisées. Ensuite, à chaque élément de la bibliographie (les \bibitem), on a mis un petit code entre accolads : c’est ce code qui sera utilisé dans le texte pour citer l’élément. Un dernier petit élément : on a mis un antislash avant le &. En effet, le caractère « & » est un caractère spécial de LaTeX, il faut donc l’échapper en le faisant précéder d’un \.

La deuxième façon de faire consiste à mettre la bibliographie dans un fichier séparé .bib sous un format donné, et d’utiliser l’outil BibTeX. Beaucoup d’outils comme Google Scholar fournissent les citations au format BibTeX, par exemple :

@book{KR77,
title={The M4 macro processor},
author={Kernighan, Brian W and Ritchie, Dennis M},
year={1977},
publisher={Bell Laboratories Murray Hill, NJ}
}

Le format BibTeX est tout un sujet en lui-même, que je pourrai traiter plus tard, à l’occasion d’un autre tuto. Ce qu’il y a à retenir ici, c’est qu’on a ici encore une clé, sur la première ligne : ici, c’est KR77.

Cette clé est primordiale : c’est elle que l’on utilise dans le texte pour citer la référence bibliographique. Cette fois, avec \cite :

\cite{KR77}

Suivant la feuille de style, on peut citer plusieurs références : \cite{KR78, L86}. Avec d’autres, on ne peut pas.

Si on a utilisé la première solution (thebibliography), toutes les références seront ajoutées à la fin du document. Si on a utilisé un fichier bibtex, seules les références citées dans le texte seront ajoutées. On peut en ajouter qui ne sont pas citées dans le texte avec la commande \nocite{...}.

Les outils tout intégrés compilent la bibliographie automatiquement. Si vous compilez à la main, la première passe de compilation va vous générer un fichier aux : vous devez le donner à manger à bibtex, qui va générer des fichiers qui seront ensuite utilisés par pdflatex pour insérer les citations (deux compilations après le passage de bibtex).

Vous pouvez avoir plus de détails avec l’article « Un Makefile basique avec LaTeX« .

Références cliquables dans le PDF

Il existe un package qui fait tout un tas de choses, mais en particulier une sympa : les références sont cliquables dans le PDF. Cela permet, d’un clic, d’aller sur l’élément référencé. C’est pratique avec un lecteur comme Skim (sous Mac), en permettant d’ouvrir une référence dans une fenêtre à côté, tout en poursuivant sa lecture.

\usepackage{hyperref}

Sur le PDF, les liens apparaissent en couleur : pas de panique, le cadre de couleur ne figurera pas sur le document imprimé.

capture-du-2017-02-06-224539capture-du-2017-02-06-224526

Exemple complet

Références pour aller plus loin

Deux petits liens qui sont en fait ceux avec lesquels j’ai appris LaTeX :

  • une intro à LaTeX sur Comment Ça Marche : [lien]

Vous y verrez comment créer vos premiers documents et y insérer des tableaux, images, etc.

  • Une (Courte) Introduction à LaTeX2e, par Tobias Oetiker Hubert Partl, Irene Hyna et Elisabeth Schlegl : [lien]

Il s’agit d’un livre de pas loin de 200 pages, traduit dans plein de langues, qui explique comment faire des choses assez avancées en LaTeX et l’esprit qu’il y a derrière. Plus qu’un livre à lire de façon séquentielle, c’est plutôt une référence sur laquelle on vient quand on a besoin de quelque chose (le sommaire et l’index sont très bien faits).

Intro très rapide à LaTeX

Un diagramme de Gantt en TikZ

Il existe des paquets pour faire des diagrammes de Gantt en TikZ, mais ils font des trucs beaucoup trop compliqués pour ce que j’ai besoin de faire. Donc j’ai fait le mien avec de bêtes rectangles.

J’ai besoin de :

  • plusieurs work packages
  • délimiter les années
  • avoir plusieurs personnes en parallèles dans un même work package
  • pouvoir mettre des personnes à cheval sur plusieurs work packages

Voici le résultat :

Capture d’écran 2016-08-08 à 15.46.22

Les dimensions

Première chose à faire : régler les tailles. Ici on a :

  • la hauteur de chaque WP (on peut en définir plusieurs pour avoir des hauteurs différentes)
  • la hauteur des barres qui vont être utilisées pour les personnes
  • la largeur utilisée pour une année
  • l’écart entre deux personnes

\def\hauteur{2.6} %% hauteur d'un WP
\def\annee{3} %% largeur d'une annee
\def\taskH{.8} %% hauteur d'une personne
\def\ecart{.2} %% ecart entre deux personnes

On peut, à partir de là, demander à TikZ de calculer l’endroit où va se trouver le bord supérieur de chaque WP, mais pour aller vite j’ai défini des variables pour ça aussi. Dans cet exemple, je définis trois work packages.

\def\hauteurWPun{\hauteur*3} % hauteur du bord sup des WP
\def\hauteurWPdeux{\hauteur*2}
\def\hauteurWPtrois{\hauteur*1}

Le cadre autour

C’est très simple : il s’agit d’un rectangle avec des marques pour les années. J’aime bien avoir aussi une marque verticale pour les années.

%% Cadre
\foreach \y in {0, 1, 2, 3 } {
\draw (0, \y*\hauteur ) -- ( 6*\annee, \y*\hauteur );
}
\foreach \y in {1, 2, 3} {
\node at ( -.7, 3*\hauteur - \y*\hauteur+\hauteur/2 ) { $WP_\y$};
}
\foreach \x in {0, 6 } {
\draw (\x*\annee, 0 ) -- ( \x*\annee, 3*\hauteur );
\node at (\x*\annee, 3*\hauteur+.4 ) {
\pgfmathparse{\x*10}
\pgfmathprintnumber{\pgfmathresult}};
}
\foreach \x in {1.2, 2.4, 3.6, 4.8 } {
\draw [dashed] (\x*\annee, 0 ) -- ( \x*\annee, 3*\hauteur );
\node at (\x*\annee, 3*\hauteur+.4 ) {
\pgfmathparse{\x*10}
\pgfmathprintnumber{\pgfmathresult}};
}

Pour faire des WP de hauteurs différentes, on peut définir la position de chaque WP en fonction de celle qui le précède :

\def\hauteurWPquatre{\hauteur}
\def\hauteurWPtrois{\hauteur + \hauteurWPquatre}
\def\hauteurWPdeux{\hauteur + \taskH + \hauteurWPtrois}
\def\hauteurWPun{\hauteur + \hauteurWPdeux}
\def\hauteurWPzero{\hauteur + \hauteurWPun}

Les lignes horizontales sont donc tracées en fonction de ces hauteurs ainsi que les noms des WP :

\def\tableofhauteurs{0, \hauteurWPzero, \hauteurWPun, \hauteurWPdeux, \hauteurWPtrois, \hauteurWPquatre }
\foreach \y in \tableofhauteurs {
\draw (0, \y) -- ( 4*\annee, \y);
}
\foreach[count=\cnt from 0] \y in \tableofhauteurs {
\ifnum\cnt <5
\node at ( -.7, \y - \hauteur/2 ) { $WP_\cnt$};
\fi

Les gens dans les WP

Une personne est simplement représentée par un rectangle. On utilise les variables définies plus haut pour calculer les coordonnées du rectangle :

  • Pour les moments dans le temps, on multiplie la largeur d’une année \annee par le nombre de mois divisé par 10. Par exemple, une abscisse à la troisième année vaudra  3*1.2*\annee
  • Pour la hauteur, il faut calculer par rapport au bord supérieur du WP (rappelez-vous les variables \hauteurWPun, \hauteurWPdeux et \hauteurWPtrois), les personnes déjà placées dans ce WP (variable \taskH) et l’écart entre les personnes (variable \ecart)

Par exemple, pour une personne commençant année 0, terminant en fin d’année 2 (3*12 mois plus tard), tout en haut du WP1 :

\draw [fill=blue!30]( 0, \hauteurWPun - \ecart ) rectangle ( 3*1.2*\annee, \hauteurWPun - \ecart - \taskH) node[pos=.5] {PhD student 1};

Juste en-dessous de lui, commençant année 0 et terminant en fin d’année 0 (12 mois plus tard), et donc décalé de \écart + \taskH + \ecart par rapport au haut du WP1:

\draw [fill=blue!30]( 0, \hauteurWPun - \taskH - 2*\ecart ) rectangle (
1*1.2*\annee, \hauteurWPun - 2*\ecart - 2*\taskH) node[pos=.5] {post doc 1};

Le mec hachuré

Pour des raisons de présentation, j’ai utilisé une couleur par work package. Or, j’ai besoin de mettre un personne à cheval sur deux work packages. Je vous passe le calcul des coordonnées (il suffit d’utiliser \taskH/2), mais surtout, j’avais envie de le hachurer en utilisant les couleurs des deux work packages sur lesquels il est à cheval. Pour avoir les hachures kivonbien (largeur et écartement qui se voient bien), il faut définir un pattern :

\tikzset{
hatch distance/.store in=\hatchdistance,
hatch distance=10pt,
hatch thickness/.store in=\hatchthickness,
hatch thickness=4pt
}
\makeatletter
\pgfdeclarepatternformonly[\hatchdistance,\hatchthickness]{flexible hatch}
{\pgfqpoint{0pt}{0pt}}
{\pgfqpoint{\hatchdistance}{\hatchdistance}}
{\pgfpoint{\hatchdistance-1pt}{\hatchdistance-1pt}}%
{
\pgfsetcolor{\tikz@pattern@color}
\pgfsetlinewidth{\hatchthickness}
\pgfpathmoveto{\pgfqpoint{0pt}{0pt}}
\pgfpathlineto{\pgfqpoint{\hatchdistance}{\hatchdistance}}
\pgfusepath{stroke}
}
\makeatother

Encore une petite saleté pour hachurer : j’ai superposé deux rectangles, un bleu (celui avec \fill [color=blue!30]) et un hachuré vert (avec \draw [pattern=flexible hatch, pattern color=green!30 ]).

\fill [color=blue!30]( 3*1.2*\annee, \hauteurWPun - 3*\ecart-2*\taskH ) rectangle ( 5*1.2*\annee, \hauteurWPun - 2.2 - \taskH);
\draw [pattern=flexible hatch, pattern color=green!30 ]( 3*1.2*\annee, \hauteurWPun - 3*\ecart-2*\taskH ) rectangle ( 5*1.2*\annee, \hauteurWPun - 3*\ecart-2*\taskH - \taskH) node[pos=.5] {engineer};

Et voilà !

Un diagramme de Gantt en TikZ

Modularité et réutilisabilité en LaTeX

J’aime bien faire des documents modulaires en LaTeX : écrire dans des fichiers différents et inclure ces fichiers dans différents documents. Cela me permet de ne pas à avoir à faire de copies, à corriger à un seul endroit quand je tombe sur une typo…

Le problème est que j’ai parfois des petites différences entre ces documents. Par exemple, pour un article, je vais avoir :

  • une version sur arXiv, courte, qui ne contiendra que les idées principales
  • l’article complet
  • la présentation, en Beamer

La version arXiv contient généralement simplement les idées. Pas d’évaluation de performances ni de conclusion. Ainsi, quand j’annonce le plan à la fin de l’introduction, ces sections ne doivent pas être mentionnées.

Par ailleurs, j’aime bien réutiliser les images de l’article (en TikZ) dans la présentation, mais j’ajoute souvent des \pause dedans pour les afficher petit à petit. Or, les \pause ne passent pas la compilation avec les styles autres que Beamer…

La commande \mode

Une solution est d’utiliser le \mode. C’est ce qui est suggéré ici. On définit alors une commande qui sera différente suivant le mode dans lequel on est (IEEEtran, article, beamer…).
\mode<IEEEtran|article>{\newcommand\mypause{{}}}
\mode<IEEEtran|article>{\newcommand\mypause{{\pause}}}

Mais, me direz-vous, si c’est fourni par Beamer, comment l’utiliser dans un document qui n’est pas une présentation Beamer ? Grâce au paquet beamerarticle, à utiliser dans votre document.

Malheureusement, vous vous en doutez bien, cela ne marche pas tout le temps : notamment parce que le paquet beamerarticle apporte son lot de conflits avec le style llncs.

Récupérer le nom de la classe

On peut récupérer le nom de la classe dans la variable @documentclass ou les options qui lui sont passées dans la variable @classoptionslist. On peut alors se créer une option arxiv, par exemple.

On fait la comparaison de nom avec \IfSubStr, qui est fourni par le paquet xstring. Cette solution est évoquée ici.

\usepackage{xstring}
\makeatletter
\IfSubStr{\@classoptionslist}{arxiv}
{\newcommand{\fullpaper}[1]{{}}}
{\newcommand{\fullpaper}[1]{#1}}

Ici, on définit une commande \fullpaper dont ce qui est passé en argument n’apparaîtra que dans la version qui n’est pas pour arXiv. On peut également définir de cette façon des environnements, des commandes (comme la redéfinition de \pause suggérée ci-dessus), et ainsi de suite.

Modularité et réutilisabilité en LaTeX

[LaTeX] Un Makefile basique avec LaTeX

Compiler un article LaTeX nécessite parfois l’enchaînement de plusieurs commandes, pour construire la bibliographie, pour créer les références croisées… Mon Makefile n’est pas parfait mais il fait le boulot et je l’utilise depuis maintenant 10 ans.

La compilation

C’est du grand classique :

pdflatex $(filename).tex || true
bibtex $(filename) || true
pdflatex $(filename).tex || true
pdflatex $(filename).tex

Les dépendances

Bon alors, de quoi avons-nous besoin pour compiler tout ça ?

  • des fichiers .tex
  • des figures, généralement des pdf, png ou pgf, dans le répertoire fig
  • de la bibliographie au format .bib

Pour inclure tout ça, on utilise une wildcard dans les dépendance de la cible :

$(wildcard *.tex *.bib fig/*.pgf fig/*.png)

Le ménage

Cette série de commandes va créer :

  • un fichier « auxiliaire » avec toutes les infos pour construire les références croisées lors de passes ultérieures : main.aux
  • des fichiers pour la bibliographie : main.bbl main.blg
  • un fichier de log : main.log
  • le PDF que l’on souhaite produire : main.pdf

On peut donc mettre tout ça explicitement dans la cible clean, ou être plus général avec des étoiles.

Le fichier tout entier

Voici un fichier assez basique :
filename = main
$all: $(filename).pdf

$(filename).pdf: $(wildcard *.tex *.bib fig/*.pgf fig/*.png fig/*.tex)
pdflatex $(filename).tex || true
bibtex $(filename) || true
pdflatex $(filename).tex || true
pdflatex $(filename).tex

clean:
rm -f *.log *.aux *.bbl *.blg *~ $(filename).pdf

Si vous souhaitez utiliser une petite compilation conditionnelle pour, par exemple, générer un rapport différent (cf cet article précédent), vous pouvez ajouter une cible :

$all: main.pdf
arxiv: arxiv.pdf

main.pdf: $(wildcard *.tex *.bib fig/*.pgf fig/*.png fig/*.tex)
pdflatex main.tex || true
bibtex main || true
pdflatex main.tex || true
pdflatex main.tex

arxiv.pdf: $(wildcard *.tex *.bib fig/*.pgf fig/*.png fig/*.tex)
pdflatex --jobname=arxiv main.tex || true
bibtex arxiv || true
pdflatex --jobname=arxiv main.tex || true
pdflatex --jobname=arxiv main.tex

clean:
rm -f *.log *.aux *.bbl *.blg *~ main.pdf arxiv.pdf

Une autre façon de faire, un poil plus compliquée, consiste à utiliser un fichier caché pour forcer la recompilation :

$all: main.pdf

main.pdf: main.ps
ps2pdf main.ps

main.ps: .main.dvi.ok
dvips -o main.ps main.dvi

.main.dvi.ok: $(wildcard *.tex *.bib fig/*.pgf fig/*.png fig/*.tex)
latex -interaction batchmode main.tex || true
bibtex main || true
latex -interaction batchmode main.tex || true
latex main.tex
touch .main.dvi.ok

clean:
rm -f *.dvi *.log *.aux *.bbl *.blg *~ main.ps main.pdf .main.dvi.ok

Voilà, c’est tout ce que j’ai en stock !

[LaTeX] Un Makefile basique avec LaTeX

[LaTeX] Compilation conditionnelle

Il peut arriver que l’on ait besoin de produire plusieurs versions compilées d’un même document LaTeX : par exemple, un rapport et un article de conférence, ou un sujet de TD avec ou sans les corrigés…

Le jobname

Pour cela, la compilation conditionnelle vient à notre secours. On peut notamment passer un paramètre au compilateur LaTeX (latex ou pdflatex) avec l’option –jobname.

La commande utile est :

\equal{\detokenize{arxiv}}{\jobname}}

Ici, pour accepter l’option « arxiv ». Évidemment, on peut faire la même chose avec « correction » par exemple…

Ensuite, on va regarder la valeur de cette option jobname pour fixer une variable, et c’est cette variable qui va être regardée dans le reste du document. Pour cela, on a besoin du package ifthen :

\usepackage{ifthen}
\newif\ifARXIV
\ifthenelse{\equal{\detokenize{arxiv}}{\jobname}}{
\ARXIVtrue
}{
\ARXIVfalse
}

Ici, on a créé un test \ifARXIV, qu’on met a vrai (\ARXIVtrue) quand le jobname est « arxiv » et à faux (\ARXIVfalse) sinon.

Utilisation

Ensuite, ça s’utilise dans le document avec \ifARXIV, \else (l’alternative est optionnelle) et \fi. Par exemple :

\ifARXIV
\input{proof}
\else
In order to keep this paper compact, the proof can befound in \cite{arxiv}.
\fi

Compilation

Pour compiler, on utilise donc l’option --jobname=.... Par exemple, si mon fichier principal s’appelle main.tex et mon jobname « arxiv » :

pdflatex --jobname=arxiv main.tex

Vous noterez que les fichiers produits ont un nom qui commence par « arxiv » :

$ ls main.* arxiv.*
arxiv.aux arxiv.log arxiv.pdf main.tex

Et avec une bibliographie ?

Avec une bibliographie, c’est exactement la même chose. On utilise bibtex sur le fichier .aux produit :

bibtex arxiv.aux

Ici encore, les fichiers produits ont un nom qui commence par « arxiv » :

$ ls main.* arxiv.*
arxiv.aux arxiv.bbl arxiv.blg arxiv.log arxiv.pdf main.tex

On repasse deux petits coups de pdflatex et c’est gagné

pdflatex --jobname=arxiv main.tex
pdflatex --jobname=arxiv main.tex

Et si je veux utiliser un Makefile ?

Ça sera le sujet d’un billet ultérieur 😉

[LaTeX] Compilation conditionnelle

[LaTeX] Définir une fonction avec algorithm2e 4.01

Pour définir une fonction avec le package algorithm2e 5.0, il suffit d’utiliser de mot-clé \setKwProc :

\SetKwProg{Fn}{Function}{}{end}
\Fn{foo}{bar}{
/ * .. */
}

Ce qui donne :

Code pour algorithm2e 5.00

Et on se retrouve avec la définition d’une fonction foo qui prend comme argument bar.

resultat avec algorithm2e 5.00

Sauf que arXiv utilise la version 4.01 de ce package, et le magnifique mot-clé \setKwProc n’y est pas encore défini.

Ma petite astuce moche consiste à définir une fonction comme un type particulier de bloc :

\SetKwBlock{Function}{Function foo( bar ):}{end}
\Function{ /* ... */
}

Ce qui donne :

Code pour algorithm2e 4.01

Le résultat n’est pas exactement identique, mais il fait le boulot.

resultat avec algorithm2e 4.01

[LaTeX] Définir une fonction avec algorithm2e 4.01