Vers. 0.2 -- Formats : [PDF | RST | HTML | TEX]
Copyright © 2003 Eric Bellot
2003-03-10
Résumé
Notes sur la conversion de documents RST (ReStructuredText) aux formats LaTeX et PDF avec les Docutils de David Goodger et le script Latex-Writer de Engelbert Gruber.
Table des matières
Ce document explique comment utiliser Latex-Writer pour convertir un document ReStructuredText aux formats LaTeX et PDF.
Le script Latex2e.py est très efficace, il génère un fichier LaTeX configuré pour la production d'un fichier PDF. Il intègre la gestion des liens, des bookmarks, des images et des tableaux.
Les différents logiciels cités dans ce document ont été utilisés dans les versions suivantes :
Version 2.2.
Scripts Python pour gérer le ReStructuredText. Version 0.2.8 de développement ("snapshot").
Extension pour les Docutils. Revision 1.61 du 17-02-2003 (téléchargement sur le site de Docutils).
Pdflatex est un composant standard de la distribution TeTeX pour Linux. Il permet de convertir un fichier LaTeX au format PDF. Version 3.14 du 11-02-2002.
Ces logiciels évoluent constamment. Il est possible que ce document devienne rapidement obsolète.
Téléchargez le script sur le site Docutils. Il faut aller dans la section "Sandbox" et suivre le lien "Latex Writer".
Copiez le script latex2e.py dans le répertoire writers de votre installation Docutils. Sur ma Linux-Mandrake, il s'agit du répertoire :
/usr/lib/python2.2/site-packages/docutils/writers/ |
Créez un script, par exemple, rst2latex.py permettant de réaliser la conversion :
#!/usr/bin/env python import locale try: locale.setlocale(locale.LC_ALL, '') except: pass from docutils.core import publish_cmdline, default_description description = (default_description) publish_cmdline(writer_name='latex2e', description=description) |
Sous Linux, vous pouvez rendre le script exécutable grâce à la commande suivante :
chmod a+x rst2latex.py |
Enfin placez-le dans un répertoire de binaires. Par exemple, /usr/bin ou ~/bin.
Dans ce document, le script permettant de lancer la conversion est baptisé rst2latex.py (voir ci-dessus).
Commande sous Linux :
rst2latex.py rst_doc.txt rst_doc.tex |
... et par voie de conséquence du fichier PDF.
Latex2e.py propose deux options :
Si on ajoute une table des matières dans le document RST, Latex2e.py produira une TdM sans référence de page dans le fichier PDF final.
Pas très intéressant.
On opère la conversion en utilisant l'option --use-latex-toc.
On convertit le document RST au format LaTeX :
rst2latex.py --use-latex-toc=1 rst-doc.txt rst-doc.tex |
Le script insère une balise \tableofcontents dans le document LaTeX.
On convertit le document LaTeX en PDF en 2 passes :
pdflatex rst-doc.tex pdflatex rst-doc.tex |
La 1ère passe indexe les sections, la 2e construit la TdM.
Note
Lorsqu'on construit une TdM, les sections sont automatiquement numérotées. C'est une règle de LaTeX. Il construit la TdM à partir des sections numérotées.
Par défaut, Latex-Writer produit un fichier LaTeX permettant l'incorporation d'une feuille de styles style.tex. Cette feuille doit se trouver dans le même répertoire que le document source.
On peut y ajouter toute une série de macro et autres personnalisations.
Le contenu de style.tex sera inséré par la balise \input{style.tex} lors de la conversion du document LaTeX vers d'autres format.
Voici le préambule du document LaTeX :
\documentclass[10pt]{article} \usepackage{babel} \usepackage{shortvrb} \usepackage[latin1]{inputenc} \usepackage{tabularx} \usepackage{longtable} \setlength{\extrarowheight}{2pt} \usepackage{amsmath} \usepackage{graphicx} \usepackage{color} \usepackage{multirow} \usepackage[colorlinks,linkcolor=blue]{hyperref} \usepackage[a4paper,margin=2cm,nohead]{geometry} %% generator Docutils: http://docutils.sourceforge.net/ \newlength{\admwidth} \addtolength{\admwidth}{0.9\textwidth} \newcommand{\optionlistlabel}[1]{\bf #1 \hfill} \newenvironment{optionlist}[1] {\begin{list}{} {\setlength{\labelwidth}{#1} \setlength{\rightmargin}{1cm} \setlength{\leftmargin}{\rightmargin} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \renewcommand{\makelabel}{\optionlistlabel}} }{\end{list}} % begin: floats for footnotes tweaking. \setlength{\floatsep}{0.5em} \setlength{\textfloatsep}{\fill} \addtolength{\textfloatsep}{3em} \renewcommand{\textfraction}{0.5} \renewcommand{\topfraction}{0.5} \renewcommand{\bottomfraction}{0.5} \setcounter{totalnumber}{50} \setcounter{topnumber}{50} \setcounter{bottomnumber}{50} % end floats for footnotes \input{style.tex} <================== STYLE.TEX \title{Conversion reStructuredText vers Docbook} \author{} \date{} \hypersetup{ pdftitle={Conversion reStructuredText vers Docbook}, pdfauthor={Éric Bellot} } \raggedbottom \begin{document} ......[coupé] |
On peut modifier certains paramètres grâce à la feuille style.tex. Toutefois, certains d'entre eux ne peuvent être modifiés qu'en intervenant directement dans le script Latex2e.py... ce qui n'est pas élégant.
On trouve, par exemple, dans la classe LaTeXTranslator du script un certain nombre de paramètres :
d_class = 'article' # document.settings.stylesheet d_options = '10pt' # papersize, fontsize d_paper = 'a4paper' d_margins = '2cm' d_stylesheet_path = '~/texmf/style.tex' # for pdflatex some other package. pslatex |
On peut les modifier pour obtenir un document LaTeX à son goût.
Voici mes personalisations :
d_class = 'article' d_options = '11pt' <=================================== ICI d_paper = 'a4paper' d_margins = '2.5cm' <================================== ICI d_stylesheet_path = '/home/ebellot/texmf/style.tex' <=== ET LÀ |
Ce module est fournit en standard avec les distributions. Toutefois, il ne fournit pas autant de fonctionnalités que le module Frenchle (voir plus bas)
Modifiez le script Latex2e.py pour ajouter le nom du paquetage de francisation de LaTeX (french).
Dans le début du script ajoutez la ligne suivante à la variable _ISO639_TO_BABEL :
'fr': 'french', |
Vous devez obtenir quelque chose comme :
_ISO639_TO_BABEL = { 'fr': 'french', 'no': 'norsk', 'gd': 'scottish', ..... |
Cela permettra de modifier la balise \documentclass du fichier LaTeX :
\documentclass[10pt,french]{article} _____^ |
On peut, plus simplement ajouter la ligne suivante dans la feuille de styles :
\usepackage{french} |
Il suffit alors de réaliser la conversion en ajoutant l'otion -l fr dans la ligne de commande :
rst2latex.py -l fr rst_doc.txt rst_doc.tex |
Ce module est réalisé par Bernard Gaulle. Il est livré dans une version libre (?), Frenchle, et une version shareware, FrenchPro, plus étendue. Ce module n'est pas fournit en standard dans TeTeX.
Je n'aborde ici que l'utilisation de Frenchle.
Téléchargez l'archive frenchle.tar.gz sur http://frenchle.free.fr.
Décompressez-la
Pour une installation "utilisateur", copiez les fichiers french.ldf, frenchle.sty et frenchle.ldf dans le répertoire :
~/texmf/tex/generic/babel |
Créez-les au besoin.
La distribution TeTeX ne reconnaît pas, par défaut, le répertoire personnel ~/texmf. Il faut l'activer en mode super-utilisateur en modifiant le fichier :
/usr/share/texmf/web2c/texmf.cnfOn décommente la ligne suivante :
User texmf trees can be catered for like this... HOMETEXMF = $HOME/texmf
Pour une installation "administrateur", copiez ces fichiers dans le répertoire :
/usr/share/texmf/tex/generic/babel |
Lancez la commande texhash pour que les fichiers soient reconnus par TeTeX.
Par exemple, en mode "utilisateur" :
texhash ~/texmf/tex/generic/babel |
Il suffit d'ajouter le code suivant dans le fichier de style :
\usepackage{frenchle} |
Il est recommandé de le placer en dernière position du préambule, c'est à dire en dernière ligne du fichier style.tex.
Il est bon d'utiliser l'encodage T1, sans cela Frenchle n'est pas capable de gérer la césure des mots accentués.
J'utilise la commande \untypedspaces. Cette commande corrige les espaces autour des caractères ": ! ? ;". Les corrections sont nombreuses car Latex-Writer utilise abondamment le double-point.
Cette commande doit être passée dans le corps du document. Pas dans le préambule. J'ai donc modifié le script latex2e.py afin de pouvoir passer des commandes à cet endroit. J'ai utilisé le même principe que le fichier style.tex standard :
def visit_document(self, node): self.body_prefix.append('\\begin{document}\n') # La ligne ci-dessous a été ajoutée self.body_prefix.append('\\input{/home/ebellot/texmf/topdoc.tex}\n') self.body_prefix.append('\\maketitle\n\n') |
Il suffit alors de créer un fichier topdoc.tex et y insérer toutes les commandes voulues :
\untypedspaces \parindent 0pt |
J'ai rencontré des problèmes pour l'affichage des guillemets français avec le paquetage Almost European. Même en utilisant le paquetage Aeguill Ils apparaissent sous la forme de carrés noirs dans Xpdf et Kghostview. Le paquetage Times ne pose pas ce problème (voir plus bas).
Par défaut, les fontes sont embarquées au format Bitmap dans le PDF. L'impression est déplorable et lente. On peut utiliser les fontes Almost European et l'extension Aeguill ("guillemets pour AE"), les fontes sont vectorielles donc beaucoup plus légères [1]. Pour cela, on ajoute la ligne suivante dans le fichier style.tex :
\usepackage[ae]{aeguill} |
Possible title underline, too short for the title. Treating it as ordinary text because it's so short.
On peut aussi utiliser les fontes AE sans le paquetage des guillemets :
\usepackage{ae} |
L'impression devient rapide et la sortie est superbe.
J'ai trouvé cette astuce sur la FAQ LaTeX. Consultez la section "Documents en français" pour plus de détails.
Au lieu d'embarquer les fontes dans le documents -- c'est lourd --, on peut utiliser les fontes Postscript d'Adobe (Times, etc.). Tous les lecteurs PDF les supportent par défaut.
Possible title underline, too short for the title. Treating it as ordinary text because it's so short.
Il suffit de saisir la balise suivante dans le fichier style.tex :
\usepackage{times} |
On aura soin de retirer la ligne concernant les fontes AE, par exemple en la commentant :
%\usepackage{ae} |
Résultat : un fichier PDF de 77 Ko avec les fontes AE ne fait plus que 24 Ko avec le paquetage Times.
L'économie à un prix. Le fichier obtenu est typographiquement beaucoup moins élégant...
J'ai testé pas mal de paquetages Eurosym, Eurosans, etc. Toutefois, c'est avec le paquetage standard Marvosym que j'ai obtenu les meilleurs résultats.
En effets, les autres posent des problèmes lors de la conversion au format PDF avec PDFLatex. Soit la conversion plante pour des raisons ésotériques et fastidieuses à résoudre (fontes manquantes, encodage incorrect, etc.), soit c'est le fichier produit qui fonctionne mal avec les lecteurs PDF courants : XPDF, KGhostView et Acrobat Reader 4.05 [2].
Avec le paquetage Marvosym, pas de problème. Mieux, il est présent en standard dans les distributions.
On ajoute la déclaration du paquetage dans style.tex:
\usepackage{marvosym} |
Le symbole Euro est représenté dans le fichier LaTeX par le code \EUR
Il faut aussi modifier le fichier latex2e.py pour qu'il produise le code \EUR à la place du symbole "€". Il faut rechercher la fonction def encode(self, text): puis y ajouter la ligne :
text = text.replace(u"\u20ac", '\\EUR') |
u"\u20ac" est la représentation Python pour le code Unicode su symbole Euro.
Le paquetage Marvosym propose d'autres formats pour le symbole Euro que je n'est pas approfondis (voir la doc de Marvosym).
L'évolution du projet Latex2e.py est notée dans la page le latex2e BUGS TODOS and other animals.
Un lien du type http://www.domain.org/index.htm#ancre produira une erreur lors de la conversion LaTeX => PDF. C'est le "#" qui ne passe pas.
Problème résolu. Il faut modifier le script Latex2e.py dans la fonction visit_reference en rajoutant un slash devant le "#" :
href = '#' + node['refid'] elif node.has_key('refname'): href = '#' + self.document.nameids[node['refname']]
Lorsqu'on place deux tirets successifs dans un literal inline, les tirets sont convertis en un tiret long dans la sortie. Par exemple, le double-tiret disparaît du code --use-latex-toc=1 alors qu'il est correctement conservé dans un bloc litéral :
--use-latex-toc=1 |
Ce comportement est souhaitable dans le texte courant mais regrettable dans du code.
Latex-Writer convertit les literaux inline avec la balise testtt{...} alors que l'utilisation du mode verbatim serait peut-être préférable \verb|...|.
Ce problème ne se pose qu'avec l'encodage T1 (et AE qui l'utilise).
Seules les options --use-latex-toc et --footnote-references sont pour l'instant fonctionnelles. Consulter le latex2e BUGS TODOS and other animals pour plus de détail sur l'avancement du projet.