Notes sur la conversion RST vers LaTeX/PDF

Éric Bellot

<ebellot@laposte.net>

Vers. 0.2 -- Formats : [PDF | RST | HTML | TEX]

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

1. Présentation
2. Installation du script Latex2e.py
3. Conversion
3.1. Conversion RST en LaTeX
3.2. Conversion LaTeX en PDF
4. Personnalisation du fichier LaTeX
4.1. Afficher la table des matières
4.2. Personnalisation avec une feuille de styles
4.3. Modifier les paramètres de préambule
4.4. Support du français avec Frenchb de Babel
4.5. Support du français avec Frenchle
4.5.1. Installation
4.5.2. Utilisation de Frenchle
4.6. Améliorer l'impression avec les fontes Almost European
4.7. Alléger le fichier PDF avec Times
4.8. Utiliser le symbole Euro
5. Problèmes non résolus
5.1. Liens vers des ancres
5.2. Tirets doublés
5.3. Options de Latex-Writer

1. Présentation

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 :

Python

Version 2.2.

Docutils

Scripts Python pour gérer le ReStructuredText. Version 0.2.8 de développement ("snapshot").

Script Latex2e.py

Extension pour les Docutils. Revision 1.61 du 17-02-2003 (téléchargement sur le site de Docutils).

Pdflatex

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.

2. Installation du script Latex2e.py

  1. Téléchargez le script sur le site Docutils. Il faut aller dans la section "Sandbox" et suivre le lien "Latex Writer".

  2. 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/
  3. 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)
  4. 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.

3. Conversion

3.1. Conversion RST en LaTeX

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

3.2. Conversion LaTeX en PDF

Commande sous Linux :

pdflatex rst_doc.tex

ou :

pdftex rst_doc.tex

Dans les deux cas, vous obtenez un fichier rst_doc.pdf.

4. Personnalisation du fichier LaTeX

... et par voie de conséquence du fichier PDF.

4.1. Afficher la table des matières

Latex2e.py propose deux options :

TdM basé sur celle du document RST

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.

TdM générée par LaTeX

On opère la conversion en utilisant l'option --use-latex-toc.

  1. 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.

  2. 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.

4.2. Personnalisation avec une feuille de styles

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é]

4.3. Modifier les paramètres de préambule

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À

4.4. Support du français avec Frenchb de Babel

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

4.5. Support du français avec Frenchle

4.5.1. Installation

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.

  1. Téléchargez l'archive frenchle.tar.gz sur http://frenchle.free.fr.

  2. Décompressez-la

  3. 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.cnf

    On 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
  4. Lancez la commande texhash pour que les fichiers soient reconnus par TeTeX.

    Par exemple, en mode "utilisateur" :

    texhash ~/texmf/tex/generic/babel

4.5.2. Utilisation de Frenchle

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

4.6. Améliorer l'impression avec les fontes Almost European

Attention

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.

Note

J'ai trouvé cette astuce sur la FAQ LaTeX. Consultez la section "Documents en français" pour plus de détails.

4.7. Alléger le fichier PDF avec Times

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...

4.8. Utiliser le symbole Euro

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.

  1. 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

  2. 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.

Note

Le paquetage Marvosym propose d'autres formats pour le symbole Euro que je n'est pas approfondis (voir la doc de Marvosym).

5. Problèmes non résolus

L'évolution du projet Latex2e.py est notée dans la page le latex2e BUGS TODOS and other animals.

5.1. Liens vers des ancres

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']]

5.2. Tirets doublés

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).

5.3. Options de Latex-Writer

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.



[1] C'est tout de même plus lourd que d'utiliser les fontes standards d'Adobe.

[2] Le but visé est la compatibilité avec la version 1.3 du PDF pour être sûr que le document passe à peu prêt partout.


http://www.chez.com/ebellot
Miroir : http://membres.lycos.fr/ebellot