buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py
author wbernard
Wed, 23 Dec 2009 19:29:07 +0200
changeset 179 d8ac696cc51f
permissions -rw-r--r--
helium_7.0-r14027
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
179
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     1
# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     2
# Author: Engelbert Gruber <grubert@users.sourceforge.net>
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     3
# Copyright: This module has been placed in the public domain.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     4
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     5
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     6
LaTeX2e document tree Writer.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     7
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     8
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     9
__docformat__ = 'reStructuredText'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    10
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    11
# code contributions from several people included, thanks to all.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    12
# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    13
#
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    14
# convention deactivate code by two # e.g. ##.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    15
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    16
import sys
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    17
import time
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    18
import re
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    19
import string
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    20
from types import ListType
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    21
from docutils import frontend, nodes, languages, writers, utils
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    22
from docutils.writers.newlatex2e import unicode_map
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    23
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    24
from docutils.transforms.references import DanglingReferencesVisitor
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    25
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    26
class Writer(writers.Writer):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    27
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    28
    supported = ('latex','latex2e')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    29
    """Formats this writer supports."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    30
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    31
    settings_spec = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    32
        'LaTeX-Specific Options',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    33
        'The LaTeX "--output-encoding" default is "latin-1:strict".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    34
        (('Specify documentclass.  Default is "article".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    35
          ['--documentclass'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    36
          {'default': 'article', }),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    37
         ('Specify document options.  Multiple options can be given, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    38
          'separated by commas.  Default is "10pt,a4paper".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    39
          ['--documentoptions'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    40
          {'default': '10pt,a4paper', }),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    41
         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    42
          'Default: no, uses figures.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    43
          ['--use-latex-footnotes'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    44
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    45
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    46
         ('Format for footnote references: one of "superscript" or '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    47
          '"brackets".  Default is "superscript".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    48
          ['--footnote-references'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    49
          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    50
           'metavar': '<format>',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    51
           'overrides': 'trim_footnote_reference_space'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    52
         ('Use LaTeX citations. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    53
          'Default: no, uses figures which might get mixed with images.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    54
          ['--use-latex-citations'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    55
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    56
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    57
         ('Format for block quote attributions: one of "dash" (em-dash '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    58
          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    59
          ['--attribution'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    60
          {'choices': ['dash', 'parentheses', 'parens', 'none'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    61
           'default': 'dash', 'metavar': '<format>'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    62
         ('Specify a stylesheet file. The file will be "input" by latex in '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    63
          'the document header.  Default is no stylesheet ("").  '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    64
          'Overrides --stylesheet-path.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    65
          ['--stylesheet'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    66
          {'default': '', 'metavar': '<file>',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    67
           'overrides': 'stylesheet_path'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    68
         ('Specify a stylesheet file, relative to the current working '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    69
          'directory.  Overrides --stylesheet.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    70
          ['--stylesheet-path'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    71
          {'metavar': '<file>', 'overrides': 'stylesheet'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    72
         ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    73
          'supports only one ToC per document, but docutils does not know of '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    74
          'pagenumbers. LaTeX table of contents also means LaTeX generates '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    75
          'sectionnumbers.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    76
          ['--use-latex-toc'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    77
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    78
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    79
         ('Add parts on top of the section hierarchy.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    80
          ['--use-part-section'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    81
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    82
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    83
         ('Let LaTeX print author and date, do not show it in docutils '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    84
          'document info.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    85
          ['--use-latex-docinfo'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    86
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    87
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    88
         ('Use LaTeX abstract environment for the documents abstract.'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    89
          'Per default the abstract is an unnumbered section.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    90
          ['--use-latex-abstract'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    91
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    92
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    93
         ('Color of any hyperlinks embedded in text '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    94
          '(default: "blue", "0" to disable).',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    95
          ['--hyperlink-color'], {'default': 'blue'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    96
         ('Enable compound enumerators for nested enumerated lists '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    97
          '(e.g. "1.2.a.ii").  Default: disabled.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    98
          ['--compound-enumerators'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    99
          {'default': None, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   100
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   101
         ('Disable compound enumerators for nested enumerated lists.  This is '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   102
          'the default.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   103
          ['--no-compound-enumerators'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   104
          {'action': 'store_false', 'dest': 'compound_enumerators'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   105
         ('Enable section ("." subsection ...) prefixes for compound '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   106
          'enumerators.  This has no effect without --compound-enumerators.  '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   107
          'Default: disabled.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   108
          ['--section-prefix-for-enumerators'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   109
          {'default': None, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   110
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   111
         ('Disable section prefixes for compound enumerators.  '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   112
          'This is the default.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   113
          ['--no-section-prefix-for-enumerators'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   114
          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   115
         ('Set the separator between section number and enumerator '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   116
          'for compound enumerated lists.  Default is "-".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   117
          ['--section-enumerator-separator'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   118
          {'default': '-', 'metavar': '<char>'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   119
         ('When possibile, use verbatim for literal-blocks. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   120
          'Default is to always use the mbox environment.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   121
          ['--use-verbatim-when-possible'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   122
          {'default': 0, 'action': 'store_true',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   123
           'validator': frontend.validate_boolean}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   124
         ('Table style. "standard" with horizontal and vertical lines, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   125
          '"booktabs" (LaTeX booktabs style) only horizontal lines '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   126
          'above and below the table and below the header or "nolines".  '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   127
          'Default: "standard"',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   128
          ['--table-style'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   129
          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   130
           'metavar': '<format>'}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   131
         ('LaTeX graphicx package option. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   132
          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   133
          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   134
          'Default is no option.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   135
          ['--graphicx-option'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   136
          {'default': ''}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   137
         ('LaTeX font encoding. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   138
          'Possible values are "T1", "OT1", "" or some other fontenc option. '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   139
          'The font encoding influences available symbols, e.g. "<<" as one '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   140
          'character. Default is "" which leads to package "ae" (a T1 '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   141
          'emulation using CM fonts).',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   142
          ['--font-encoding'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   143
          {'default': ''}),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   144
         ('Per default the latex-writer puts the reference title into '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   145
          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   146
          'number or the page number.',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   147
          ['--reference-label'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   148
          {'default': None, }),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   149
         ('Specify style and database for bibtex, for example '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   150
          '"--use-bibtex=mystyle,mydb1,mydb2".',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   151
          ['--use-bibtex'],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   152
          {'default': None, }),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   153
          ),)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   154
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   155
    settings_defaults = {'output_encoding': 'latin-1'}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   156
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   157
    relative_path_settings = ('stylesheet_path',)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   158
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   159
    config_section = 'latex2e writer'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   160
    config_section_dependencies = ('writers',)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   161
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   162
    visitor_attributes = ("head_prefix", "head", 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   163
            "body_prefix", "body", "body_suffix")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   164
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   165
    output = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   166
    """Final translated form of `document`."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   167
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   168
    def __init__(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   169
        writers.Writer.__init__(self)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   170
        self.translator_class = LaTeXTranslator
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   171
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   172
    def translate(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   173
        visitor = self.translator_class(self.document)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   174
        self.document.walkabout(visitor)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   175
        self.output = visitor.astext()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   176
        # copy parts 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   177
        for attr in self.visitor_attributes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   178
            setattr(self, attr, getattr(visitor, attr))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   179
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   180
    def assemble_parts(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   181
        writers.Writer.assemble_parts(self)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   182
        for part in self.visitor_attributes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   183
            self.parts[part] = ''.join(getattr(self, part))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   184
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   185
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   186
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   187
Notes on LaTeX
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   188
--------------
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   189
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   190
* LaTeX does not support multiple tocs in one document.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   191
  (might be no limitation except for docutils documentation)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   192
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   193
  The "minitoc" latex package can produce per-chapter tocs in
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   194
  book and report document classes.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   195
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   196
* width
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   197
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   198
  * linewidth - width of a line in the local environment
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   199
  * textwidth - the width of text on the page
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   200
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   201
  Maybe always use linewidth ?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   202
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   203
  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   204
        not changed, needs fix in docutils so that tables
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   205
        are not too wide.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   206
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   207
        So we add locallinewidth set it initially and
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   208
        on entering sidebar and reset on exit.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   209
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   210
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   211
class Babel:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   212
    """Language specifics for LaTeX."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   213
    # country code by a.schlock.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   214
    # partly manually converted from iso and babel stuff, dialects and some
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   215
    _ISO639_TO_BABEL = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   216
        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   217
        'gd': 'scottish',  #XXX added by hand
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   218
        'hu': 'magyar',    #XXX added by hand
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   219
        'pt': 'portuguese',#XXX added by hand
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   220
        'sl': 'slovenian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   221
        'af': 'afrikaans',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   222
        'bg': 'bulgarian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   223
        'br': 'breton',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   224
        'ca': 'catalan',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   225
        'cs': 'czech',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   226
        'cy': 'welsh',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   227
        'da': 'danish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   228
        'fr': 'french',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   229
        # french, francais, canadien, acadian
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   230
        'de': 'ngerman',  #XXX rather than german
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   231
        # ngerman, naustrian, german, germanb, austrian
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   232
        'el': 'greek',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   233
        'en': 'english',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   234
        # english, USenglish, american, UKenglish, british, canadian
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   235
        'eo': 'esperanto',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   236
        'es': 'spanish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   237
        'et': 'estonian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   238
        'eu': 'basque',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   239
        'fi': 'finnish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   240
        'ga': 'irish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   241
        'gl': 'galician',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   242
        'he': 'hebrew',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   243
        'hr': 'croatian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   244
        'hu': 'hungarian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   245
        'is': 'icelandic',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   246
        'it': 'italian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   247
        'la': 'latin',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   248
        'nl': 'dutch',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   249
        'pl': 'polish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   250
        'pt': 'portuguese',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   251
        'ro': 'romanian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   252
        'ru': 'russian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   253
        'sk': 'slovak',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   254
        'sr': 'serbian',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   255
        'sv': 'swedish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   256
        'tr': 'turkish',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   257
        'uk': 'ukrainian'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   258
    }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   259
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   260
    def __init__(self,lang):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   261
        self.language = lang
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   262
        # pdflatex does not produce double quotes for ngerman in tt.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   263
        self.double_quote_replacment = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   264
        if re.search('^de',self.language):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   265
            #self.quotes = ("\"`", "\"'")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   266
            self.quotes = ('{\\glqq}', '{\\grqq}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   267
            self.double_quote_replacment = "{\\dq}"
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   268
        elif re.search('^it',self.language):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   269
            self.quotes = ("``", "''")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   270
            self.double_quote_replacment = r'{\char`\"}'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   271
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   272
            self.quotes = ("``", "''")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   273
        self.quote_index = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   274
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   275
    def next_quote(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   276
        q = self.quotes[self.quote_index]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   277
        self.quote_index = (self.quote_index+1)%2
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   278
        return q
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   279
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   280
    def quote_quotes(self,text):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   281
        t = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   282
        for part in text.split('"'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   283
            if t == None:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   284
                t = part
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   285
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   286
                t += self.next_quote() + part
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   287
        return t
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   288
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   289
    def double_quotes_in_tt (self,text):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   290
        if not self.double_quote_replacment:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   291
            return text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   292
        return text.replace('"', self.double_quote_replacment)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   293
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   294
    def get_language(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   295
        if self._ISO639_TO_BABEL.has_key(self.language):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   296
            return self._ISO639_TO_BABEL[self.language]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   297
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   298
            # support dialects.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   299
            l = self.language.split("_")[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   300
            if self._ISO639_TO_BABEL.has_key(l):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   301
                return self._ISO639_TO_BABEL[l]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   302
        return None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   303
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   304
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   305
latex_headings = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   306
        'optionlist_environment' : [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   307
              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   308
              '\\newenvironment{optionlist}[1]\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   309
              '{\\begin{list}{}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   310
              '  {\\setlength{\\labelwidth}{#1}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   311
              '   \\setlength{\\rightmargin}{1cm}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   312
              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   313
              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   314
              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   315
              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   316
              '}{\\end{list}}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   317
              ],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   318
        'lineblock_environment' : [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   319
            '\\newlength{\\lineblockindentation}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   320
            '\\setlength{\\lineblockindentation}{2.5em}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   321
            '\\newenvironment{lineblock}[1]\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   322
            '{\\begin{list}{}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   323
            '  {\\setlength{\\partopsep}{\\parskip}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   324
            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   325
            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   326
            '   \\leftmargin#1}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   327
            ' \\raggedright}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   328
            '{\\end{list}}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   329
            ],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   330
        'footnote_floats' : [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   331
            '% begin: floats for footnotes tweaking.\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   332
            '\\setlength{\\floatsep}{0.5em}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   333
            '\\setlength{\\textfloatsep}{\\fill}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   334
            '\\addtolength{\\textfloatsep}{3em}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   335
            '\\renewcommand{\\textfraction}{0.5}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   336
            '\\renewcommand{\\topfraction}{0.5}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   337
            '\\renewcommand{\\bottomfraction}{0.5}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   338
            '\\setcounter{totalnumber}{50}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   339
            '\\setcounter{topnumber}{50}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   340
            '\\setcounter{bottomnumber}{50}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   341
            '% end floats for footnotes\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   342
            ],
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   343
        'some_commands' : [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   344
            '% some commands, that could be overwritten in the style file.\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   345
            '\\newcommand{\\rubric}[1]'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   346
            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   347
            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   348
            '% end of "some commands"\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   349
            ]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   350
        }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   351
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   352
class DocumentClass:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   353
    """Details of a LaTeX document class."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   354
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   355
    def __init__(self, document_class, with_part=False):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   356
        self.document_class = document_class
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   357
        self._with_part = with_part
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   358
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   359
    def section(self, level):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   360
        """ Return the section name at the given level for the specific
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   361
            document class.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   362
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   363
            Level is 1,2,3..., as level 0 is the title."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   364
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   365
        sections = [ 'section', 'subsection', 'subsubsection', 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   366
                     'paragraph', 'subparagraph' ]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   367
        if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   368
            sections.insert(0, 'chapter')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   369
        if self._with_part:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   370
            sections.insert(0, 'part')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   371
        if level <= len(sections):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   372
            return sections[level-1]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   373
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   374
            return sections[-1]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   375
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   376
class Table:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   377
    """ Manage a table while traversing.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   378
        Maybe change to a mixin defining the visit/departs, but then
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   379
        class Table internal variables are in the Translator.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   380
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   381
        Table style might be 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   382
        
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   383
        * standard: horizontal and vertical lines
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   384
        * booktabs (requires booktabs latex package): only horizontal lines
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   385
        * nolines, borderless : no lines
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   386
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   387
    def __init__(self,latex_type,table_style):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   388
        self._latex_type = latex_type
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   389
        self._table_style = table_style
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   390
        self._open = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   391
        # miscellaneous attributes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   392
        self._attrs = {}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   393
        self._col_width = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   394
        self._rowspan = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   395
        self.stubs = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   396
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   397
    def open(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   398
        self._open = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   399
        self._col_specs = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   400
        self.caption = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   401
        self._attrs = {}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   402
        self._in_head = 0 # maybe context with search
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   403
    def close(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   404
        self._open = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   405
        self._col_specs = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   406
        self.caption = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   407
        self._attrs = {}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   408
        self.stubs = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   409
    def is_open(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   410
        return self._open
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   411
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   412
    def set_table_style(self, table_style):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   413
        if not table_style in ('standard','booktabs','borderless','nolines'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   414
            return
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   415
        self._table_style = table_style
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   416
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   417
    def used_packages(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   418
        if self._table_style == 'booktabs':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   419
            return '\\usepackage{booktabs}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   420
        return ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   421
    def get_latex_type(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   422
        return self._latex_type
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   423
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   424
    def set(self,attr,value):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   425
        self._attrs[attr] = value
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   426
    def get(self,attr):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   427
        if self._attrs.has_key(attr):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   428
            return self._attrs[attr]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   429
        return None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   430
    def get_vertical_bar(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   431
        if self._table_style == 'standard':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   432
            return '|'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   433
        return ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   434
    # horizontal lines are drawn below a row, because we.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   435
    def get_opening(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   436
        if self._latex_type == 'longtable':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   437
            # otherwise longtable might move before paragraph and subparagraph
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   438
            prefix = '\\leavevmode\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   439
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   440
            prefix = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   441
        return '%s\\begin{%s}[c]' % (prefix, self._latex_type)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   442
    def get_closing(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   443
        line = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   444
        if self._table_style == 'booktabs':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   445
            line = '\\bottomrule\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   446
        elif self._table_style == 'standard':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   447
            lines = '\\hline\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   448
        return '%s\\end{%s}' % (line,self._latex_type)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   449
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   450
    def visit_colspec(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   451
        self._col_specs.append(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   452
        # "stubs" list is an attribute of the tgroup element:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   453
        self.stubs.append(node.attributes.get('stub'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   454
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   455
    def get_colspecs(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   456
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   457
        Return column specification for longtable.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   458
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   459
        Assumes reST line length being 80 characters.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   460
        Table width is hairy.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   461
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   462
        === ===
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   463
        ABC DEF
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   464
        === ===
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   465
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   466
        usually gets to narrow, therefore we add 1 (fiddlefactor).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   467
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   468
        width = 80
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   469
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   470
        total_width = 0.0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   471
        # first see if we get too wide.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   472
        for node in self._col_specs:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   473
            colwidth = float(node['colwidth']+1) / width
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   474
            total_width += colwidth
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   475
        self._col_width = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   476
        self._rowspan = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   477
        # donot make it full linewidth
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   478
        factor = 0.93
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   479
        if total_width > 1.0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   480
            factor /= total_width
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   481
        bar = self.get_vertical_bar()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   482
        latex_table_spec = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   483
        for node in self._col_specs:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   484
            colwidth = factor * float(node['colwidth']+1) / width
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   485
            self._col_width.append(colwidth+0.005)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   486
            self._rowspan.append(0)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   487
            latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   488
        return latex_table_spec+bar
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   489
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   490
    def get_column_width(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   491
        """ return columnwidth for current cell (not multicell)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   492
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   493
        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   494
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   495
    def visit_thead(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   496
        self._in_thead = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   497
        if self._table_style == 'standard':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   498
            return ['\\hline\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   499
        elif self._table_style == 'booktabs':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   500
            return ['\\toprule\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   501
        return []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   502
    def depart_thead(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   503
        a = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   504
        #if self._table_style == 'standard':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   505
        #    a.append('\\hline\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   506
        if self._table_style == 'booktabs':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   507
            a.append('\\midrule\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   508
        if self._latex_type == 'longtable':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   509
            a.append('\\endhead\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   510
        # for longtable one could add firsthead, foot and lastfoot
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   511
        self._in_thead = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   512
        return a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   513
    def visit_row(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   514
        self._cell_in_row = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   515
    def depart_row(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   516
        res = [' \\\\\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   517
        self._cell_in_row = None  # remove cell counter
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   518
        for i in range(len(self._rowspan)):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   519
            if (self._rowspan[i]>0):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   520
                self._rowspan[i] -= 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   521
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   522
        if self._table_style == 'standard':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   523
            rowspans = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   524
            for i in range(len(self._rowspan)):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   525
                if (self._rowspan[i]<=0):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   526
                    rowspans.append(i+1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   527
            if len(rowspans)==len(self._rowspan):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   528
                res.append('\\hline\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   529
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   530
                cline = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   531
                rowspans.reverse()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   532
                # TODO merge clines
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   533
                while 1:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   534
                    try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   535
                        c_start = rowspans.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   536
                    except:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   537
                        break
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   538
                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   539
                res.append(cline)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   540
        return res
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   541
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   542
    def set_rowspan(self,cell,value):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   543
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   544
            self._rowspan[cell] = value
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   545
        except:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   546
            pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   547
    def get_rowspan(self,cell):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   548
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   549
            return self._rowspan[cell]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   550
        except:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   551
            return 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   552
    def get_entry_number(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   553
        return self._cell_in_row
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   554
    def visit_entry(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   555
        self._cell_in_row += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   556
    def is_stub_column(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   557
        if len(self.stubs) >= self._cell_in_row:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   558
            return self.stubs[self._cell_in_row-1]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   559
        return False
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   560
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   561
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   562
class LaTeXTranslator(nodes.NodeVisitor):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   563
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   564
    # When options are given to the documentclass, latex will pass them
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   565
    # to other packages, as done with babel.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   566
    # Dummy settings might be taken from document settings
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   567
    
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   568
    # Templates
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   569
    # ---------
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   570
    
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   571
    latex_head = '\\documentclass[%s]{%s}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   572
    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   573
    stylesheet = '\\input{%s}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   574
    # add a generated on day , machine by user using docutils version.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   575
    generator = '% generated by Docutils <http://docutils.sourceforge.net/>\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   576
    # Config setting defaults
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   577
    # -----------------------
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   578
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   579
    # use latex tableofcontents or let docutils do it.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   580
    use_latex_toc = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   581
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   582
    # TODO: use mixins for different implementations.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   583
    # list environment for docinfo. else tabularx
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   584
    use_optionlist_for_docinfo = 0 # NOT YET IN USE
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   585
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   586
    # Use compound enumerations (1.A.1.)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   587
    compound_enumerators = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   588
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   589
    # If using compound enumerations, include section information.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   590
    section_prefix_for_enumerators = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   591
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   592
    # This is the character that separates the section ("." subsection ...)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   593
    # prefix from the regular list enumerator.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   594
    section_enumerator_separator = '-'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   595
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   596
    # default link color
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   597
    hyperlink_color = "blue"
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   598
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   599
    def __init__(self, document):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   600
        nodes.NodeVisitor.__init__(self, document)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   601
        self.settings = settings = document.settings
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   602
        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   603
        self.use_latex_toc = settings.use_latex_toc
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   604
        self.use_latex_docinfo = settings.use_latex_docinfo
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   605
        self.use_latex_footnotes = settings.use_latex_footnotes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   606
        self._use_latex_citations = settings.use_latex_citations
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   607
        self._reference_label = settings.reference_label
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   608
        self.hyperlink_color = settings.hyperlink_color
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   609
        self.compound_enumerators = settings.compound_enumerators
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   610
        self.font_encoding = settings.font_encoding
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   611
        self.section_prefix_for_enumerators = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   612
            settings.section_prefix_for_enumerators)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   613
        self.section_enumerator_separator = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   614
            settings.section_enumerator_separator.replace('_', '\\_'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   615
        if self.hyperlink_color == '0':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   616
            self.hyperlink_color = 'black'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   617
            self.colorlinks = 'false'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   618
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   619
            self.colorlinks = 'true'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   620
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   621
        if self.settings.use_bibtex:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   622
            self.bibtex = self.settings.use_bibtex.split(",",1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   623
            # TODO avoid errors on not declared citations.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   624
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   625
            self.bibtex = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   626
        # language: labels, bibliographic_fields, and author_separators.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   627
        # to allow writing labes for specific languages.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   628
        self.language = languages.get_language(settings.language_code)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   629
        self.babel = Babel(settings.language_code)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   630
        self.author_separator = self.language.author_separators[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   631
        self.d_options = self.settings.documentoptions
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   632
        if self.babel.get_language():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   633
            self.d_options += ',%s' % self.babel.get_language()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   634
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   635
        self.d_class = DocumentClass(settings.documentclass, 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   636
                                     settings.use_part_section)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   637
        # object for a table while proccessing.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   638
        self.table_stack = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   639
        self.active_table = Table('longtable',settings.table_style)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   640
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   641
        # HACK.  Should have more sophisticated typearea handling.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   642
        if settings.documentclass.find('scr') == -1:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   643
            self.typearea = '\\usepackage[DIV12]{typearea}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   644
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   645
            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   646
                self.typearea = '\\typearea{12}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   647
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   648
                self.typearea = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   649
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   650
        if self.font_encoding == 'OT1':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   651
            fontenc_header = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   652
        elif self.font_encoding == '':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   653
            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   654
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   655
            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   656
        if self.latex_encoding.startswith('utf8'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   657
            input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   658
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   659
            input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   660
        if self.settings.graphicx_option == '':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   661
            self.graphicx_package = '\\usepackage{graphicx}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   662
        elif self.settings.graphicx_option.lower() == 'auto':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   663
            self.graphicx_package = '\n'.join(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   664
                ('%Check if we are compiling under latex or pdflatex',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   665
                 '\\ifx\\pdftexversion\\undefined',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   666
                 '  \\usepackage{graphicx}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   667
                 '\\else',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   668
                 '  \\usepackage[pdftex]{graphicx}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   669
                 '\\fi\n'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   670
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   671
            self.graphicx_package = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   672
                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   673
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   674
        self.head_prefix = [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   675
              self.latex_head % (self.d_options,self.settings.documentclass),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   676
              '\\usepackage{babel}\n',     # language is in documents settings.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   677
              fontenc_header,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   678
              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   679
              input_encoding,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   680
              # * tabularx: for docinfo, automatic width of columns, always on one page.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   681
              '\\usepackage{tabularx}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   682
              '\\usepackage{longtable}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   683
              self.active_table.used_packages(),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   684
              # possible other packages.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   685
              # * fancyhdr
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   686
              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   687
              #   but ??
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   688
              #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   689
              # extra space between text in tables and the line above them
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   690
              '\\setlength{\\extrarowheight}{2pt}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   691
              '\\usepackage{amsmath}\n',   # what fore amsmath.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   692
              self.graphicx_package,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   693
              '\\usepackage{color}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   694
              '\\usepackage{multirow}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   695
              '\\usepackage{ifthen}\n',   # before hyperref!
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   696
              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   697
              self.typearea,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   698
              self.generator,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   699
              # latex lengths
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   700
              '\\newlength{\\admonitionwidth}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   701
              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   702
              # width for docinfo tablewidth
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   703
              '\\newlength{\\docinfowidth}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   704
              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   705
              # linewidth of current environment, so tables are not wider
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   706
              # than the sidebar: using locallinewidth seems to defer evaluation
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   707
              # of linewidth, this is fixing it.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   708
              '\\newlength{\\locallinewidth}\n',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   709
              # will be set later.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   710
              ]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   711
        self.head_prefix.extend( latex_headings['optionlist_environment'] )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   712
        self.head_prefix.extend( latex_headings['lineblock_environment'] )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   713
        self.head_prefix.extend( latex_headings['footnote_floats'] )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   714
        self.head_prefix.extend( latex_headings['some_commands'] )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   715
        ## stylesheet is last: so it might be possible to overwrite defaults.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   716
        stylesheet = utils.get_stylesheet_reference(settings)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   717
        if stylesheet:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   718
            settings.record_dependencies.add(stylesheet)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   719
            self.head_prefix.append(self.stylesheet % (stylesheet))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   720
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   721
        if self.linking: # and maybe check for pdf
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   722
            self.pdfinfo = [ ]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   723
            self.pdfauthor = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   724
            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   725
            # pdfcreator, pdfproducer
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   726
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   727
            self.pdfinfo = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   728
        # NOTE: Latex wants a date and an author, rst puts this into
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   729
        #   docinfo, so normally we do not want latex author/date handling.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   730
        # latex article has its own handling of date and author, deactivate.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   731
        # self.astext() adds \title{...} \author{...} \date{...}, even if the
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   732
        # "..." are empty strings.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   733
        self.head = [ ]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   734
        # separate title, so we can appen subtitle.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   735
        self.title = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   736
        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   737
        self.author_stack = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   738
        self.date = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   739
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   740
        self.body_prefix = ['\\raggedbottom\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   741
        self.body = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   742
        self.body_suffix = ['\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   743
        self.section_level = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   744
        self.context = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   745
        self.topic_classes = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   746
        # column specification for tables
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   747
        self.table_caption = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   748
        
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   749
        # Flags to encode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   750
        # ---------------
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   751
        # verbatim: to tell encode not to encode.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   752
        self.verbatim = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   753
        # insert_newline: to tell encode to replace blanks by "~".
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   754
        self.insert_none_breaking_blanks = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   755
        # insert_newline: to tell encode to add latex newline.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   756
        self.insert_newline = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   757
        # mbox_newline: to tell encode to add mbox and newline.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   758
        self.mbox_newline = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   759
        # inside citation reference labels underscores dont need to be escaped.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   760
        self.inside_citation_reference_label = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   761
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   762
        # Stack of section counters so that we don't have to use_latex_toc.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   763
        # This will grow and shrink as processing occurs.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   764
        # Initialized for potential first-level sections.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   765
        self._section_number = [0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   766
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   767
        # The current stack of enumerations so that we can expand
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   768
        # them into a compound enumeration.  
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   769
        self._enumeration_counters = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   770
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   771
        # The maximum number of enumeration counters we've used.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   772
        # If we go beyond this number, we need to create a new
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   773
        # counter; otherwise, just reuse an old one.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   774
        self._max_enumeration_counters = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   775
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   776
        self._bibitems = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   777
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   778
        # docinfo.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   779
        self.docinfo = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   780
        # inside literal block: no quote mangling.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   781
        self.literal_block = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   782
        self.literal_block_stack = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   783
        self.literal = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   784
        # true when encoding in math mode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   785
        self.mathmode = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   786
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   787
    def to_latex_encoding(self,docutils_encoding):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   788
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   789
        Translate docutils encoding name into latex's.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   790
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   791
        Default fallback method is remove "-" and "_" chars from docutils_encoding.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   792
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   793
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   794
        tr = {  "iso-8859-1": "latin1",     # west european
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   795
                "iso-8859-2": "latin2",     # east european
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   796
                "iso-8859-3": "latin3",     # esperanto, maltese
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   797
                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   798
                "iso-8859-5": "iso88595",   # cyrillic (ISO)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   799
                "iso-8859-9": "latin5",     # turkish
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   800
                "iso-8859-15": "latin9",    # latin9, update to latin1.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   801
                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   802
                "windows-1251": "cp1251",   # cyrillic (on Windows)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   803
                "koi8-r": "koi8-r",         # cyrillic (Russian)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   804
                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   805
                "windows-1250": "cp1250",   #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   806
                "windows-1252": "cp1252",   #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   807
                "us-ascii": "ascii",        # ASCII (US)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   808
                # unmatched encodings
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   809
                #"": "applemac",
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   810
                #"": "ansinew",  # windows 3.1 ansi
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   811
                #"": "ascii",    # ASCII encoding for the range 32--127.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   812
                #"": "cp437",    # dos latine us
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   813
                #"": "cp850",    # dos latin 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   814
                #"": "cp852",    # dos latin 2
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   815
                #"": "decmulti",
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   816
                #"": "latin10",
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   817
                #"iso-8859-6": ""   # arabic
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   818
                #"iso-8859-7": ""   # greek
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   819
                #"iso-8859-8": ""   # hebrew
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   820
                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   821
             }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   822
        if tr.has_key(docutils_encoding.lower()):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   823
            return tr[docutils_encoding.lower()]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   824
        # convert: latin-1 and utf-8 and similar things
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   825
        return docutils_encoding.replace("_", "").replace("-", "").lower()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   826
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   827
    def language_label(self, docutil_label):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   828
        return self.language.labels[docutil_label]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   829
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   830
    latex_equivalents = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   831
        u'\u00A0' : '~',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   832
        u'\u2013' : '{--}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   833
        u'\u2014' : '{---}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   834
        u'\u2018' : '`',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   835
        u'\u2019' : '\'',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   836
        u'\u201A' : ',',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   837
        u'\u201C' : '``',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   838
        u'\u201D' : '\'\'',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   839
        u'\u201E' : ',,',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   840
        u'\u2020' : '{\\dag}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   841
        u'\u2021' : '{\\ddag}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   842
        u'\u2026' : '{\\dots}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   843
        u'\u2122' : '{\\texttrademark}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   844
        u'\u21d4' : '{$\\Leftrightarrow$}',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   845
        # greek alphabet ?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   846
    }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   847
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   848
    def unicode_to_latex(self,text):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   849
        # see LaTeX codec
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   850
        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   851
        # Only some special chracters are translated, for documents with many
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   852
        # utf-8 chars one should use the LaTeX unicode package.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   853
        for uchar in self.latex_equivalents.keys():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   854
            text = text.replace(uchar,self.latex_equivalents[uchar])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   855
        return text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   856
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   857
    def ensure_math(self, text):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   858
        if not self.__dict__.has_key('ensure_math_re'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   859
            chars = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   860
                # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   861
                'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' ,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   862
                # also latin5 and latin9
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   863
                }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   864
            self.ensure_math_re = re.compile('([%s])' % chars['latin1'])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   865
        text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   866
        return text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   867
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   868
    def encode(self, text):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   869
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   870
        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   871
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   872
        # Escaping with a backslash does not help with backslashes, ~ and ^.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   873
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   874
        #     < > are only available in math-mode or tt font. (really ?)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   875
        #     $ starts math- mode.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   876
        # AND quotes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   877
        if self.verbatim:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   878
            return text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   879
        # compile the regexps once. do it here so one can see them.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   880
        #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   881
        # first the braces.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   882
        if not self.__dict__.has_key('encode_re_braces'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   883
            self.encode_re_braces = re.compile(r'([{}])')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   884
        text = self.encode_re_braces.sub(r'{\\\1}',text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   885
        if not self.__dict__.has_key('encode_re_bslash'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   886
            # find backslash: except in the form '{\{}' or '{\}}'.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   887
            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   888
        # then the backslash: except in the form from line above:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   889
        # either '{\{}' or '{\}}'.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   890
        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   891
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   892
        # then dollar
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   893
        text = text.replace("$", '{\\$}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   894
        if not ( self.literal_block or self.literal or self.mathmode ):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   895
            # the vertical bar: in mathmode |,\vert or \mid
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   896
            #   in textmode \textbar
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   897
            text = text.replace("|", '{\\textbar}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   898
            text = text.replace("<", '{\\textless}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   899
            text = text.replace(">", '{\\textgreater}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   900
        # then
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   901
        text = text.replace("&", '{\\&}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   902
        # the ^:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   903
        # * verb|^| does not work in mbox.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   904
        # * mathmode has wedge. hat{~} would also work.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   905
        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   906
        text = text.replace("^", '{\\textasciicircum}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   907
        text = text.replace("%", '{\\%}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   908
        text = text.replace("#", '{\\#}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   909
        text = text.replace("~", '{\\textasciitilde}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   910
        # Separate compound characters, e.g. "--" to "-{}-".  (The
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   911
        # actual separation is done later; see below.)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   912
        separate_chars = '-'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   913
        if self.literal_block or self.literal:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   914
            # In monospace-font, we also separate ",,", "``" and "''"
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   915
            # and some other characters which can't occur in
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   916
            # non-literal text.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   917
            separate_chars += ',`\'"<>'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   918
            # pdflatex does not produce doublequotes for ngerman.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   919
            text = self.babel.double_quotes_in_tt(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   920
            if self.font_encoding == 'OT1':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   921
                # We're using OT1 font-encoding and have to replace
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   922
                # underscore by underlined blank, because this has
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   923
                # correct width.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   924
                text = text.replace('_', '{\\underline{ }}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   925
                # And the tt-backslash doesn't work in OT1, so we use
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   926
                # a mirrored slash.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   927
                text = text.replace('\\textbackslash', '\\reflectbox{/}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   928
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   929
                text = text.replace('_', '{\\_}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   930
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   931
            text = self.babel.quote_quotes(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   932
            if not self.inside_citation_reference_label:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   933
                text = text.replace("_", '{\\_}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   934
        for char in separate_chars * 2:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   935
            # Do it twice ("* 2") becaues otherwise we would replace
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   936
            # "---" by "-{}--".
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   937
            text = text.replace(char + char, char + '{}' + char)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   938
        if self.insert_newline or self.literal_block:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   939
            # Insert a blank before the newline, to avoid
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   940
            # ! LaTeX Error: There's no line here to end.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   941
            text = text.replace("\n", '~\\\\\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   942
        elif self.mbox_newline:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   943
            if self.literal_block:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   944
                closings = "}" * len(self.literal_block_stack)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   945
                openings = "".join(self.literal_block_stack)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   946
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   947
                closings = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   948
                openings = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   949
            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   950
        text = text.replace('[', '{[}').replace(']', '{]}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   951
        if self.insert_none_breaking_blanks:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   952
            text = text.replace(' ', '~')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   953
        if self.latex_encoding != 'utf8':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   954
            text = self.unicode_to_latex(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   955
            text = self.ensure_math(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   956
        return text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   957
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   958
    def attval(self, text,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   959
               whitespace=re.compile('[\n\r\t\v\f]')):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   960
        """Cleanse, encode, and return attribute value text."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   961
        return self.encode(whitespace.sub(' ', text))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   962
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   963
    def astext(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   964
        if self.pdfinfo is not None and self.pdfauthor:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   965
            self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   966
        if self.pdfinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   967
            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   968
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   969
            pdfinfo = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   970
        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   971
               (self.title,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   972
                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   973
                                 for author_lines in self.author_stack]),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   974
                self.date)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   975
        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   976
                        + self.body_prefix  + self.body + self.body_suffix)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   977
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   978
    def visit_Text(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   979
        self.body.append(self.encode(node.astext()))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   980
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   981
    def depart_Text(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   982
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   983
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   984
    def visit_address(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   985
        self.visit_docinfo_item(node, 'address')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   986
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   987
    def depart_address(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   988
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   989
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   990
    def visit_admonition(self, node, name=''):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   991
        self.body.append('\\begin{center}\\begin{sffamily}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   992
        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   993
        if name:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   994
            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   995
        self.body.append('\\vspace{2mm}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   996
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   997
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   998
    def depart_admonition(self, node=None):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   999
        self.body.append('}}\n') # end parbox fbox
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1000
        self.body.append('\\end{sffamily}\n\\end{center}\n');
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1001
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1002
    def visit_attention(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1003
        self.visit_admonition(node, 'attention')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1004
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1005
    def depart_attention(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1006
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1007
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1008
    def visit_author(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1009
        self.visit_docinfo_item(node, 'author')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1010
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1011
    def depart_author(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1012
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1013
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1014
    def visit_authors(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1015
        # not used: visit_author is called anyway for each author.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1016
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1017
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1018
    def depart_authors(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1019
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1020
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1021
    def visit_block_quote(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1022
        self.body.append( '\\begin{quote}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1023
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1024
    def depart_block_quote(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1025
        self.body.append( '\\end{quote}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1026
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1027
    def visit_bullet_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1028
        if 'contents' in self.topic_classes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1029
            if self.use_latex_toc:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1030
                raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1031
            self.body.append( '\\begin{list}{}{}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1032
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1033
            self.body.append( '\\begin{itemize}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1034
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1035
    def depart_bullet_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1036
        if 'contents' in self.topic_classes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1037
            self.body.append( '\\end{list}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1038
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1039
            self.body.append( '\\end{itemize}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1040
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1041
    # Imperfect superscript/subscript handling: mathmode italicizes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1042
    # all letters by default.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1043
    def visit_superscript(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1044
        self.body.append('$^{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1045
        self.mathmode = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1046
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1047
    def depart_superscript(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1048
        self.body.append('}$')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1049
        self.mathmode = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1050
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1051
    def visit_subscript(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1052
        self.body.append('$_{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1053
        self.mathmode = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1054
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1055
    def depart_subscript(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1056
        self.body.append('}$')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1057
        self.mathmode = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1058
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1059
    def visit_caption(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1060
        self.body.append( '\\caption{' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1061
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1062
    def depart_caption(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1063
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1064
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1065
    def visit_caution(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1066
        self.visit_admonition(node, 'caution')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1067
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1068
    def depart_caution(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1069
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1070
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1071
    def visit_title_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1072
        self.body.append( '\\titlereference{' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1073
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1074
    def depart_title_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1075
        self.body.append( '}' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1076
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1077
    def visit_citation(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1078
        # TODO maybe use cite bibitems
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1079
        if self._use_latex_citations:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1080
            self.context.append(len(self.body))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1081
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1082
            self.body.append('\\begin{figure}[b]')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1083
            for id in node['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1084
                self.body.append('\\hypertarget{%s}' % id)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1085
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1086
    def depart_citation(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1087
        if self._use_latex_citations:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1088
            size = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1089
            label = self.body[size]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1090
            text = ''.join(self.body[size+1:])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1091
            del self.body[size:]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1092
            self._bibitems.append([label, text])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1093
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1094
            self.body.append('\\end{figure}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1095
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1096
    def visit_citation_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1097
        if self._use_latex_citations:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1098
            self.body.append('\\cite{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1099
            self.inside_citation_reference_label = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1100
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1101
            href = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1102
            if node.has_key('refid'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1103
                href = node['refid']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1104
            elif node.has_key('refname'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1105
                href = self.document.nameids[node['refname']]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1106
            self.body.append('[\\hyperlink{%s}{' % href)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1107
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1108
    def depart_citation_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1109
        if self._use_latex_citations:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1110
            self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1111
            self.inside_citation_reference_label = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1112
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1113
            self.body.append('}]')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1114
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1115
    def visit_classifier(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1116
        self.body.append( '(\\textbf{' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1117
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1118
    def depart_classifier(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1119
        self.body.append( '})\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1120
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1121
    def visit_colspec(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1122
        self.active_table.visit_colspec(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1123
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1124
    def depart_colspec(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1125
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1126
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1127
    def visit_comment(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1128
        # Escape end of line by a new comment start in comment text.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1129
        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1130
        raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1131
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1132
    def visit_compound(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1133
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1134
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1135
    def depart_compound(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1136
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1137
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1138
    def visit_contact(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1139
        self.visit_docinfo_item(node, 'contact')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1140
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1141
    def depart_contact(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1142
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1143
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1144
    def visit_container(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1145
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1146
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1147
    def depart_container(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1148
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1149
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1150
    def visit_copyright(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1151
        self.visit_docinfo_item(node, 'copyright')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1152
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1153
    def depart_copyright(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1154
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1155
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1156
    def visit_danger(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1157
        self.visit_admonition(node, 'danger')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1158
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1159
    def depart_danger(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1160
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1161
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1162
    def visit_date(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1163
        self.visit_docinfo_item(node, 'date')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1164
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1165
    def depart_date(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1166
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1167
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1168
    def visit_decoration(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1169
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1170
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1171
    def depart_decoration(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1172
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1173
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1174
    def visit_definition(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1175
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1176
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1177
    def depart_definition(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1178
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1179
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1180
    def visit_definition_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1181
        self.body.append( '\\begin{description}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1182
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1183
    def depart_definition_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1184
        self.body.append( '\\end{description}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1185
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1186
    def visit_definition_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1187
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1188
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1189
    def depart_definition_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1190
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1191
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1192
    def visit_description(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1193
        self.body.append( ' ' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1194
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1195
    def depart_description(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1196
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1197
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1198
    def visit_docinfo(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1199
        self.docinfo = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1200
        self.docinfo.append('%' + '_'*75 + '\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1201
        self.docinfo.append('\\begin{center}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1202
        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1203
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1204
    def depart_docinfo(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1205
        self.docinfo.append('\\end{tabularx}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1206
        self.docinfo.append('\\end{center}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1207
        self.body = self.docinfo + self.body
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1208
        # clear docinfo, so field names are no longer appended.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1209
        self.docinfo = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1210
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1211
    def visit_docinfo_item(self, node, name):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1212
        if name == 'author':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1213
            if not self.pdfinfo == None:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1214
                if not self.pdfauthor:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1215
                    self.pdfauthor = self.attval(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1216
                else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1217
                    self.pdfauthor += self.author_separator + self.attval(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1218
        if self.use_latex_docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1219
            if name in ('author', 'organization', 'contact', 'address'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1220
                # We attach these to the last author.  If any of them precedes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1221
                # the first author, put them in a separate "author" group (for
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1222
                # no better semantics).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1223
                if name == 'author' or not self.author_stack:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1224
                    self.author_stack.append([])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1225
                if name == 'address':   # newlines are meaningful
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1226
                    self.insert_newline = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1227
                    text = self.encode(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1228
                    self.insert_newline = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1229
                else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1230
                    text = self.attval(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1231
                self.author_stack[-1].append(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1232
                raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1233
            elif name == 'date':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1234
                self.date = self.attval(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1235
                raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1236
        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1237
        if name == 'address':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1238
            self.insert_newline = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1239
            self.docinfo.append('{\\raggedright\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1240
            self.context.append(' } \\\\\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1241
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1242
            self.context.append(' \\\\\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1243
        self.context.append(self.docinfo)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1244
        self.context.append(len(self.body))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1245
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1246
    def depart_docinfo_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1247
        size = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1248
        dest = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1249
        tail = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1250
        tail = self.body[size:] + [tail]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1251
        del self.body[size:]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1252
        dest.extend(tail)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1253
        # for address we did set insert_newline
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1254
        self.insert_newline = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1255
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1256
    def visit_doctest_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1257
        self.body.append( '\\begin{verbatim}' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1258
        self.verbatim = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1259
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1260
    def depart_doctest_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1261
        self.body.append( '\\end{verbatim}\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1262
        self.verbatim = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1263
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1264
    def visit_document(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1265
        self.body_prefix.append('\\begin{document}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1266
        # titled document?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1267
        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1268
            self.body_prefix.append('\\maketitle\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1269
            # alternative use titlepage environment.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1270
            # \begin{titlepage}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1271
            # ...
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1272
        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1273
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1274
    def depart_document(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1275
        # TODO insertion point of bibliography should none automatic.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1276
        if self._use_latex_citations and len(self._bibitems)>0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1277
            if not self.bibtex:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1278
                widest_label = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1279
                for bi in self._bibitems:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1280
                    if len(widest_label)<len(bi[0]):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1281
                        widest_label = bi[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1282
                self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1283
                for bi in self._bibitems:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1284
                    # cite_key: underscores must not be escaped
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1285
                    cite_key = bi[0].replace(r"{\_}","_")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1286
                    self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1287
                self.body.append('\\end{thebibliography}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1288
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1289
                self.body.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1290
                self.body.append('\\bibliography{%s}\n' % self.bibtex[1])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1291
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1292
        self.body_suffix.append('\\end{document}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1293
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1294
    def visit_emphasis(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1295
        self.body.append('\\emph{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1296
        self.literal_block_stack.append('\\emph{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1297
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1298
    def depart_emphasis(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1299
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1300
        self.literal_block_stack.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1301
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1302
    def visit_entry(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1303
        self.active_table.visit_entry()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1304
        # cell separation
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1305
        if self.active_table.get_entry_number() == 1:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1306
            # if the firstrow is a multirow, this actually is the second row.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1307
            # this gets hairy if rowspans follow each other.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1308
            if self.active_table.get_rowspan(0):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1309
                count = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1310
                while self.active_table.get_rowspan(count):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1311
                    count += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1312
                    self.body.append(' & ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1313
                self.active_table.visit_entry() # increment cell count
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1314
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1315
            self.body.append(' & ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1316
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1317
        # multi{row,column}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1318
        # IN WORK BUG TODO HACK continues here
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1319
        # multirow in LaTeX simply will enlarge the cell over several rows
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1320
        # (the following n if n is positive, the former if negative).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1321
        if node.has_key('morerows') and node.has_key('morecols'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1322
            raise NotImplementedError('Cells that '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1323
            'span multiple rows *and* columns are not supported, sorry.')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1324
        if node.has_key('morerows'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1325
            count = node['morerows'] + 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1326
            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1327
            self.body.append('\\multirow{%d}{%s}{' % \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1328
                    (count,self.active_table.get_column_width()))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1329
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1330
            # BUG following rows must have empty cells.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1331
        elif node.has_key('morecols'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1332
            # the vertical bar before column is missing if it is the first column.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1333
            # the one after always.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1334
            if self.active_table.get_entry_number() == 1:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1335
                bar1 = self.active_table.get_vertical_bar()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1336
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1337
                bar1 = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1338
            count = node['morecols'] + 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1339
            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1340
                    (count, bar1, self.active_table.get_vertical_bar()))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1341
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1342
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1343
            self.context.append('')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1344
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1345
        # header / not header
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1346
        if isinstance(node.parent.parent, nodes.thead):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1347
            self.body.append('\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1348
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1349
        elif self.active_table.is_stub_column():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1350
            self.body.append('\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1351
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1352
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1353
            self.context.append('')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1354
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1355
    def depart_entry(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1356
        self.body.append(self.context.pop()) # header / not header
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1357
        self.body.append(self.context.pop()) # multirow/column
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1358
        # if following row is spanned from above.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1359
        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1360
           self.body.append(' & ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1361
           self.active_table.visit_entry() # increment cell count
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1362
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1363
    def visit_row(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1364
        self.active_table.visit_row()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1365
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1366
    def depart_row(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1367
        self.body.extend(self.active_table.depart_row())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1368
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1369
    def visit_enumerated_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1370
        # We create our own enumeration list environment.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1371
        # This allows to set the style and starting value
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1372
        # and unlimited nesting.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1373
        enum_style = {'arabic':'arabic',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1374
                'loweralpha':'alph',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1375
                'upperalpha':'Alph',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1376
                'lowerroman':'roman',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1377
                'upperroman':'Roman' }
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1378
        enum_suffix = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1379
        if node.has_key('suffix'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1380
            enum_suffix = node['suffix']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1381
        enum_prefix = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1382
        if node.has_key('prefix'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1383
            enum_prefix = node['prefix']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1384
        if self.compound_enumerators:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1385
            pref = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1386
            if self.section_prefix_for_enumerators and self.section_level:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1387
                for i in range(self.section_level):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1388
                    pref += '%d.' % self._section_number[i]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1389
                pref = pref[:-1] + self.section_enumerator_separator
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1390
                enum_prefix += pref
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1391
            for ctype, cname in self._enumeration_counters:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1392
                enum_prefix += '\\%s{%s}.' % (ctype, cname)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1393
        enum_type = "arabic"
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1394
        if node.has_key('enumtype'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1395
            enum_type = node['enumtype']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1396
        if enum_style.has_key(enum_type):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1397
            enum_type = enum_style[enum_type]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1398
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1399
        counter_name = "listcnt%d" % len(self._enumeration_counters)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1400
        self._enumeration_counters.append((enum_type, counter_name))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1401
        # If we haven't used this counter name before, then create a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1402
        # new counter; otherwise, reset & reuse the old counter.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1403
        if len(self._enumeration_counters) > self._max_enumeration_counters:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1404
            self._max_enumeration_counters = len(self._enumeration_counters)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1405
            self.body.append('\\newcounter{%s}\n' % counter_name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1406
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1407
            self.body.append('\\setcounter{%s}{0}\n' % counter_name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1408
            
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1409
        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1410
            (enum_prefix,enum_type,counter_name,enum_suffix))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1411
        self.body.append('{\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1412
        self.body.append('\\usecounter{%s}\n' % counter_name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1413
        # set start after usecounter, because it initializes to zero.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1414
        if node.has_key('start'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1415
            self.body.append('\\addtocounter{%s}{%d}\n' \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1416
                    % (counter_name,node['start']-1))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1417
        ## set rightmargin equal to leftmargin
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1418
        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1419
        self.body.append('}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1420
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1421
    def depart_enumerated_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1422
        self.body.append('\\end{list}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1423
        self._enumeration_counters.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1424
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1425
    def visit_error(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1426
        self.visit_admonition(node, 'error')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1427
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1428
    def depart_error(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1429
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1430
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1431
    def visit_field(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1432
        # real output is done in siblings: _argument, _body, _name
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1433
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1434
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1435
    def depart_field(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1436
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1437
        ##self.body.append('%[depart_field]\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1438
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1439
    def visit_field_argument(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1440
        self.body.append('%[visit_field_argument]\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1441
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1442
    def depart_field_argument(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1443
        self.body.append('%[depart_field_argument]\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1444
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1445
    def visit_field_body(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1446
        # BUG by attach as text we loose references.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1447
        if self.docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1448
            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1449
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1450
        # BUG: what happens if not docinfo
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1451
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1452
    def depart_field_body(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1453
        self.body.append( '\n' )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1454
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1455
    def visit_field_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1456
        if not self.docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1457
            self.body.append('\\begin{quote}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1458
            self.body.append('\\begin{description}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1459
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1460
    def depart_field_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1461
        if not self.docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1462
            self.body.append('\\end{description}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1463
            self.body.append('\\end{quote}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1464
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1465
    def visit_field_name(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1466
        # BUG this duplicates docinfo_item
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1467
        if self.docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1468
            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1469
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1470
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1471
            self.body.append('\\item [')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1472
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1473
    def depart_field_name(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1474
        if not self.docinfo:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1475
            self.body.append(':]')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1476
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1477
    def visit_figure(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1478
        if (not node.attributes.has_key('align') or
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1479
            node.attributes['align'] == 'center'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1480
            # centering does not add vertical space like center.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1481
            align = '\n\\centering'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1482
            align_end = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1483
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1484
            # TODO non vertical space for other alignments.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1485
            align = '\\begin{flush%s}' % node.attributes['align']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1486
            align_end = '\\end{flush%s}' % node.attributes['align']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1487
        self.body.append( '\\begin{figure}[htbp]%s\n' % align )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1488
        self.context.append( '%s\\end{figure}\n' % align_end )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1489
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1490
    def depart_figure(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1491
        self.body.append( self.context.pop() )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1492
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1493
    def visit_footer(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1494
        self.context.append(len(self.body))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1495
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1496
    def depart_footer(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1497
        start = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1498
        footer = (['\n\\begin{center}\small\n']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1499
                  + self.body[start:] + ['\n\\end{center}\n'])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1500
        self.body_suffix[:0] = footer
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1501
        del self.body[start:]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1502
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1503
    def visit_footnote(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1504
        if self.use_latex_footnotes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1505
            num,text = node.astext().split(None,1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1506
            num = self.encode(num.strip())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1507
            self.body.append('\\footnotetext['+num+']')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1508
            self.body.append('{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1509
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1510
            self.body.append('\\begin{figure}[b]')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1511
            for id in node['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1512
                self.body.append('\\hypertarget{%s}' % id)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1513
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1514
    def depart_footnote(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1515
        if self.use_latex_footnotes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1516
            self.body.append('}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1517
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1518
            self.body.append('\\end{figure}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1519
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1520
    def visit_footnote_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1521
        if self.use_latex_footnotes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1522
            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1523
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1524
        href = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1525
        if node.has_key('refid'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1526
            href = node['refid']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1527
        elif node.has_key('refname'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1528
            href = self.document.nameids[node['refname']]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1529
        format = self.settings.footnote_references
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1530
        if format == 'brackets':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1531
            suffix = '['
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1532
            self.context.append(']')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1533
        elif format == 'superscript':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1534
            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1535
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1536
        else:                           # shouldn't happen
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1537
            raise AssertionError('Illegal footnote reference format.')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1538
        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1539
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1540
    def depart_footnote_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1541
        if self.use_latex_footnotes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1542
            return
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1543
        self.body.append('}%s' % self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1544
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1545
    # footnote/citation label
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1546
    def label_delim(self, node, bracket, superscript):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1547
        if isinstance(node.parent, nodes.footnote):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1548
            if self.use_latex_footnotes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1549
                raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1550
            if self.settings.footnote_references == 'brackets':
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1551
                self.body.append(bracket)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1552
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1553
                self.body.append(superscript)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1554
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1555
            assert isinstance(node.parent, nodes.citation)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1556
            if not self._use_latex_citations:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1557
                self.body.append(bracket)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1558
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1559
    def visit_label(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1560
        self.label_delim(node, '[', '$^{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1561
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1562
    def depart_label(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1563
        self.label_delim(node, ']', '}$')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1564
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1565
    # elements generated by the framework e.g. section numbers.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1566
    def visit_generated(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1567
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1568
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1569
    def depart_generated(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1570
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1571
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1572
    def visit_header(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1573
        self.context.append(len(self.body))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1574
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1575
    def depart_header(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1576
        start = self.context.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1577
        self.body_prefix.append('\n\\verb|begin_header|\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1578
        self.body_prefix.extend(self.body[start:])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1579
        self.body_prefix.append('\n\\verb|end_header|\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1580
        del self.body[start:]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1581
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1582
    def visit_hint(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1583
        self.visit_admonition(node, 'hint')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1584
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1585
    def depart_hint(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1586
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1587
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1588
    def latex_image_length(self, width_str):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1589
        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1590
        if not match:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1591
            # fallback
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1592
            return width_str
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1593
        res = width_str
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1594
        amount, unit = match.groups()[:2]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1595
        if unit == "px":
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1596
            # LaTeX does not know pixels but points
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1597
            res = "%spt" % amount
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1598
        elif unit == "%":
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1599
            res = "%.3f\\linewidth" % (float(amount)/100.0)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1600
        return res
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1601
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1602
    def visit_image(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1603
        attrs = node.attributes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1604
        # Add image URI to dependency list, assuming that it's
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1605
        # referring to a local file.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1606
        self.settings.record_dependencies.add(attrs['uri'])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1607
        pre = []                        # in reverse order
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1608
        post = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1609
        include_graphics_options = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1610
        inline = isinstance(node.parent, nodes.TextElement)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1611
        if attrs.has_key('scale'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1612
            # Could also be done with ``scale`` option to
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1613
            # ``\includegraphics``; doing it this way for consistency.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1614
            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1615
            post.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1616
        if attrs.has_key('width'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1617
            include_graphics_options.append('width=%s' % (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1618
                            self.latex_image_length(attrs['width']), ))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1619
        if attrs.has_key('height'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1620
            include_graphics_options.append('height=%s' % (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1621
                            self.latex_image_length(attrs['height']), ))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1622
        if attrs.has_key('align'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1623
            align_prepost = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1624
                # By default latex aligns the top of an image.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1625
                (1, 'top'): ('', ''),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1626
                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1627
                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1628
                (0, 'center'): ('{\\hfill', '\\hfill}'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1629
                # These 2 don't exactly do the right thing.  The image should
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1630
                # be floated alongside the paragraph.  See
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1631
                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1632
                (0, 'left'): ('{', '\\hfill}'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1633
                (0, 'right'): ('{\\hfill', '}'),}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1634
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1635
                pre.append(align_prepost[inline, attrs['align']][0])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1636
                post.append(align_prepost[inline, attrs['align']][1])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1637
            except KeyError:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1638
                pass                    # XXX complain here?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1639
        if not inline:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1640
            pre.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1641
            post.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1642
        pre.reverse()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1643
        self.body.extend( pre )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1644
        options = ''
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1645
        if len(include_graphics_options)>0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1646
            options = '[%s]' % (','.join(include_graphics_options))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1647
        self.body.append( '\\includegraphics%s{%s}' % (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1648
                            options, attrs['uri'] ) )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1649
        self.body.extend( post )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1650
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1651
    def depart_image(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1652
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1653
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1654
    def visit_important(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1655
        self.visit_admonition(node, 'important')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1656
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1657
    def depart_important(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1658
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1659
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1660
    def visit_interpreted(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1661
        # @@@ Incomplete, pending a proper implementation on the
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1662
        # Parser/Reader end.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1663
        self.visit_literal(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1664
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1665
    def depart_interpreted(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1666
        self.depart_literal(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1667
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1668
    def visit_legend(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1669
        self.body.append('{\\small ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1670
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1671
    def depart_legend(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1672
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1673
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1674
    def visit_line(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1675
        self.body.append('\item[] ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1676
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1677
    def depart_line(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1678
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1679
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1680
    def visit_line_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1681
        if isinstance(node.parent, nodes.line_block):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1682
            self.body.append('\\item[] \n'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1683
                             '\\begin{lineblock}{\\lineblockindentation}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1684
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1685
            self.body.append('\n\\begin{lineblock}{0em}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1686
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1687
    def depart_line_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1688
        self.body.append('\\end{lineblock}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1689
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1690
    def visit_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1691
        # Append "{}" in case the next character is "[", which would break
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1692
        # LaTeX's list environment (no numbering and the "[" is not printed).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1693
        self.body.append('\\item {} ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1694
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1695
    def depart_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1696
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1697
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1698
    def visit_literal(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1699
        self.literal = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1700
        self.body.append('\\texttt{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1701
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1702
    def depart_literal(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1703
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1704
        self.literal = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1705
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1706
    def visit_literal_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1707
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1708
        Render a literal-block.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1709
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1710
        Literal blocks are used for "::"-prefixed literal-indented
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1711
        blocks of text, where the inline markup is not recognized,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1712
        but are also the product of the parsed-literal directive,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1713
        where the markup is respected.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1714
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1715
        # In both cases, we want to use a typewriter/monospaced typeface.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1716
        # For "real" literal-blocks, we can use \verbatim, while for all
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1717
        # the others we must use \mbox.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1718
        #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1719
        # We can distinguish between the two kinds by the number of
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1720
        # siblings that compose this node: if it is composed by a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1721
        # single element, it's surely either a real one or a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1722
        # parsed-literal that does not contain any markup.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1723
        #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1724
        if not self.active_table.is_open():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1725
            # no quote inside tables, to avoid vertical space between
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1726
            # table border and literal block.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1727
            # BUG: fails if normal text preceeds the literal block.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1728
            self.body.append('\\begin{quote}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1729
            self.context.append('\\end{quote}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1730
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1731
            self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1732
            self.context.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1733
        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1734
              # in case of a parsed-literal containing just a "**bold**" word:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1735
              and isinstance(node[0], nodes.Text)):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1736
            self.verbatim = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1737
            self.body.append('\\begin{verbatim}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1738
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1739
            self.literal_block = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1740
            self.insert_none_breaking_blanks = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1741
            self.body.append('{\\ttfamily \\raggedright \\noindent\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1742
            # * obey..: is from julien and never worked for me (grubert).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1743
            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1744
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1745
    def depart_literal_block(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1746
        if self.verbatim:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1747
            self.body.append('\n\\end{verbatim}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1748
            self.verbatim = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1749
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1750
            self.body.append('\n}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1751
            self.insert_none_breaking_blanks = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1752
            self.literal_block = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1753
            # obey end: self.body.append('}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1754
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1755
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1756
    def visit_meta(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1757
        self.body.append('[visit_meta]\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1758
        # BUG maybe set keywords for pdf
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1759
        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1760
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1761
    def depart_meta(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1762
        self.body.append('[depart_meta]\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1763
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1764
    def visit_note(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1765
        self.visit_admonition(node, 'note')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1766
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1767
    def depart_note(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1768
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1769
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1770
    def visit_option(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1771
        if self.context[-1]:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1772
            # this is not the first option
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1773
            self.body.append(', ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1774
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1775
    def depart_option(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1776
        # flag tha the first option is done.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1777
        self.context[-1] += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1778
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1779
    def visit_option_argument(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1780
        """The delimiter betweeen an option and its argument."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1781
        self.body.append(node.get('delimiter', ' '))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1782
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1783
    def depart_option_argument(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1784
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1785
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1786
    def visit_option_group(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1787
        self.body.append('\\item [')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1788
        # flag for first option
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1789
        self.context.append(0)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1790
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1791
    def depart_option_group(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1792
        self.context.pop() # the flag
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1793
        self.body.append('] ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1794
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1795
    def visit_option_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1796
        self.body.append('\\begin{optionlist}{3cm}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1797
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1798
    def depart_option_list(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1799
        self.body.append('\\end{optionlist}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1800
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1801
    def visit_option_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1802
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1803
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1804
    def depart_option_list_item(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1805
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1806
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1807
    def visit_option_string(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1808
        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1809
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1810
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1811
    def depart_option_string(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1812
        ##self.body.append('</span>')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1813
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1814
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1815
    def visit_organization(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1816
        self.visit_docinfo_item(node, 'organization')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1817
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1818
    def depart_organization(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1819
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1820
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1821
    def visit_paragraph(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1822
        index = node.parent.index(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1823
        if not ('contents' in self.topic_classes or
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1824
                (isinstance(node.parent, nodes.compound) and
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1825
                 index > 0 and
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1826
                 not isinstance(node.parent[index - 1], nodes.paragraph) and
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1827
                 not isinstance(node.parent[index - 1], nodes.compound))):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1828
            self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1829
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1830
    def depart_paragraph(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1831
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1832
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1833
    def visit_problematic(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1834
        self.body.append('{\\color{red}\\bfseries{}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1835
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1836
    def depart_problematic(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1837
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1838
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1839
    def visit_raw(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1840
        if 'latex' in node.get('format', '').split():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1841
            self.body.append(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1842
        raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1843
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1844
    def visit_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1845
        # BUG: hash_char "#" is trouble some in LaTeX.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1846
        # mbox and other environment do not like the '#'.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1847
        hash_char = '\\#'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1848
        if node.has_key('refuri'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1849
            href = node['refuri'].replace('#',hash_char)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1850
        elif node.has_key('refid'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1851
            href = hash_char + node['refid']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1852
        elif node.has_key('refname'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1853
            href = hash_char + self.document.nameids[node['refname']]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1854
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1855
            raise AssertionError('Unknown reference.')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1856
        self.body.append('\\href{%s}{' % href)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1857
        if self._reference_label and not node.has_key('refuri'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1858
            self.body.append('\\%s{%s}}' % (self._reference_label,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1859
                        href.replace(hash_char, '')))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1860
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1861
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1862
    def depart_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1863
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1864
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1865
    def visit_revision(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1866
        self.visit_docinfo_item(node, 'revision')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1867
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1868
    def depart_revision(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1869
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1870
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1871
    def visit_section(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1872
        self.section_level += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1873
        # Initialize counter for potential subsections:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1874
        self._section_number.append(0)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1875
        # Counter for this section's level (initialized by parent section):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1876
        self._section_number[self.section_level - 1] += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1877
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1878
    def depart_section(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1879
        # Remove counter for potential subsections:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1880
        self._section_number.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1881
        self.section_level -= 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1882
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1883
    def visit_sidebar(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1884
        # BUG:  this is just a hack to make sidebars render something
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1885
        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1886
        self.body.append('\\begin{center}\\begin{sffamily}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1887
        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1888
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1889
    def depart_sidebar(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1890
        self.body.append('}}}\n') # end parbox colorbox fbox
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1891
        self.body.append('\\end{sffamily}\n\\end{center}\n');
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1892
        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1893
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1894
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1895
    attribution_formats = {'dash': ('---', ''),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1896
                           'parentheses': ('(', ')'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1897
                           'parens': ('(', ')'),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1898
                           'none': ('', '')}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1899
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1900
    def visit_attribution(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1901
        prefix, suffix = self.attribution_formats[self.settings.attribution]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1902
        self.body.append('\n\\begin{flushright}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1903
        self.body.append(prefix)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1904
        self.context.append(suffix)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1905
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1906
    def depart_attribution(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1907
        self.body.append(self.context.pop() + '\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1908
        self.body.append('\\end{flushright}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1909
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1910
    def visit_status(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1911
        self.visit_docinfo_item(node, 'status')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1912
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1913
    def depart_status(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1914
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1915
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1916
    def visit_strong(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1917
        self.body.append('\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1918
        self.literal_block_stack.append('\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1919
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1920
    def depart_strong(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1921
        self.body.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1922
        self.literal_block_stack.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1923
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1924
    def visit_substitution_definition(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1925
        raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1926
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1927
    def visit_substitution_reference(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1928
        self.unimplemented_visit(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1929
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1930
    def visit_subtitle(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1931
        if isinstance(node.parent, nodes.sidebar):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1932
            self.body.append('~\\\\\n\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1933
            self.context.append('}\n\\smallskip\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1934
        elif isinstance(node.parent, nodes.document):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1935
            self.title = self.title + \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1936
                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1937
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1938
        elif isinstance(node.parent, nodes.section):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1939
            self.body.append('\\textbf{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1940
            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1941
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1942
    def depart_subtitle(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1943
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1944
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1945
    def visit_system_message(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1946
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1947
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1948
    def depart_system_message(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1949
        self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1950
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1951
    def visit_table(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1952
        if self.active_table.is_open():
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1953
            self.table_stack.append(self.active_table)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1954
            # nesting longtable does not work (e.g. 2007-04-18)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1955
            self.active_table = Table('tabular',self.settings.table_style)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1956
        self.active_table.open()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1957
        for cl in node['classes']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1958
            self.active_table.set_table_style(cl)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1959
        self.body.append('\n' + self.active_table.get_opening())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1960
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1961
    def depart_table(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1962
        self.body.append(self.active_table.get_closing() + '\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1963
        self.active_table.close()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1964
        if len(self.table_stack)>0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1965
            self.active_table = self.table_stack.pop()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1966
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1967
            self.active_table.set_table_style(self.settings.table_style)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1968
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1969
    def visit_target(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1970
        # BUG: why not (refuri or refid or refname) means not footnote ?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1971
        if not (node.has_key('refuri') or node.has_key('refid')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1972
                or node.has_key('refname')):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1973
            for id in node['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1974
                self.body.append('\\hypertarget{%s}{' % id)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1975
            self.context.append('}' * len(node['ids']))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1976
        elif node.get("refid"):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1977
            self.body.append('\\hypertarget{%s}{' % node.get("refid"))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1978
            self.context.append('}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1979
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1980
            self.context.append('')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1981
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1982
    def depart_target(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1983
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1984
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1985
    def visit_tbody(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1986
        # BUG write preamble if not yet done (colspecs not [])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1987
        # for tables without heads.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1988
        if not self.active_table.get('preamble written'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1989
            self.visit_thead(None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1990
            # self.depart_thead(None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1991
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1992
    def depart_tbody(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1993
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1994
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1995
    def visit_term(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1996
        self.body.append('\\item[{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1997
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1998
    def depart_term(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  1999
        # definition list term.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2000
        # \leavevmode results in a line break if the term is followed by a item list.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2001
        self.body.append('}] \leavevmode ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2002
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2003
    def visit_tgroup(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2004
        #self.body.append(self.starttag(node, 'colgroup'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2005
        #self.context.append('</colgroup>\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2006
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2007
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2008
    def depart_tgroup(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2009
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2010
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2011
    def visit_thead(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2012
        self.body.append('{%s}\n' % self.active_table.get_colspecs())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2013
        if self.active_table.caption:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2014
            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2015
        self.active_table.set('preamble written',1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2016
        # TODO longtable supports firsthead and lastfoot too.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2017
        self.body.extend(self.active_table.visit_thead())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2018
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2019
    def depart_thead(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2020
        # the table header written should be on every page
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2021
        # => \endhead
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2022
        self.body.extend(self.active_table.depart_thead())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2023
        # and the firsthead => \endfirsthead
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2024
        # BUG i want a "continued from previous page" on every not
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2025
        # firsthead, but then we need the header twice.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2026
        #
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2027
        # there is a \endfoot and \endlastfoot too.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2028
        # but we need the number of columns to
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2029
        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2030
        # self.body.append('\\hline\n\\endfoot\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2031
        # self.body.append('\\hline\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2032
        # self.body.append('\\endlastfoot\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2033
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2034
    def visit_tip(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2035
        self.visit_admonition(node, 'tip')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2036
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2037
    def depart_tip(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2038
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2039
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2040
    def bookmark(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2041
        """Append latex href and pdfbookmarks for titles.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2042
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2043
        if node.parent['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2044
            for id in node.parent['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2045
                self.body.append('\\hypertarget{%s}{}\n' % id)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2046
            if not self.use_latex_toc:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2047
                # BUG level depends on style. pdflatex allows level 0 to 3
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2048
                # ToC would be the only on level 0 so i choose to decrement the rest.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2049
                # "Table of contents" bookmark to see the ToC. To avoid this
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2050
                # we set all zeroes to one.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2051
                l = self.section_level
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2052
                if l>0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2053
                    l = l-1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2054
                # pdftex does not like "_" subscripts in titles
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2055
                text = self.encode(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2056
                for id in node.parent['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2057
                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2058
                                     (l, text, id))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2059
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2060
    def visit_title(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2061
        """Section and other titles."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2062
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2063
        if isinstance(node.parent, nodes.topic):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2064
            # the table of contents.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2065
            self.bookmark(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2066
            if ('contents' in self.topic_classes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2067
            and self.use_latex_toc):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2068
                self.body.append('\\renewcommand{\\contentsname}{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2069
                self.context.append('}\n\\tableofcontents\n\n\\bigskip\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2070
            elif ('abstract' in self.topic_classes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2071
            and self.settings.use_latex_abstract):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2072
                raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2073
            else: # or section titles before the table of contents.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2074
                # BUG: latex chokes on center environment with 
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2075
                # "perhaps a missing item", therefore we use hfill.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2076
                self.body.append('\\subsubsection*{~\\hfill ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2077
                # the closing brace for subsection.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2078
                self.context.append('\\hfill ~}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2079
        # TODO: for admonition titles before the first section
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2080
        # either specify every possible node or ... ?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2081
        elif isinstance(node.parent, nodes.sidebar) \
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2082
        or isinstance(node.parent, nodes.admonition):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2083
            self.body.append('\\textbf{\\large ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2084
            self.context.append('}\n\\smallskip\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2085
        elif isinstance(node.parent, nodes.table):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2086
            # caption must be written after column spec
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2087
            self.active_table.caption = self.encode(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2088
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2089
        elif self.section_level == 0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2090
            # document title
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2091
            self.title = self.encode(node.astext())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2092
            if not self.pdfinfo == None:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2093
                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2094
            raise nodes.SkipNode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2095
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2096
            self.body.append('\n\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2097
            self.body.append('%' + '_' * 75)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2098
            self.body.append('\n\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2099
            self.bookmark(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2100
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2101
            if self.use_latex_toc:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2102
                section_star = ""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2103
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2104
                section_star = "*"
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2105
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2106
            section_name = self.d_class.section(self.section_level)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2107
            self.body.append('\\%s%s{' % (section_name, section_star))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2108
            # MAYBE postfix paragraph and subparagraph with \leavemode to
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2109
            # ensure floatables stay in the section and text starts on a new line.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2110
            self.context.append('}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2111
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2112
    def depart_title(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2113
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2114
        for id in node.parent['ids']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2115
            self.body.append('\\label{%s}\n' % id)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2116
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2117
    def visit_topic(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2118
        self.topic_classes = node['classes']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2119
        if ('abstract' in self.topic_classes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2120
            and self.settings.use_latex_abstract):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2121
            self.body.append('\\begin{abstract}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2122
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2123
    def depart_topic(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2124
        if ('abstract' in self.topic_classes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2125
            and self.settings.use_latex_abstract):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2126
            self.body.append('\\end{abstract}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2127
        self.topic_classes = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2128
        if 'contents' in node['classes'] and self.use_latex_toc:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2129
            pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2130
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2131
            self.body.append('\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2132
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2133
    def visit_inline(self, node): # titlereference
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2134
        classes = node.get('classes', ['Unknown', ])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2135
        for cls in classes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2136
            self.body.append( '\\docutilsrole%s{' % cls)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2137
        self.context.append('}'*len(classes))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2138
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2139
    def depart_inline(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2140
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2141
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2142
    def visit_rubric(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2143
        self.body.append('\\rubric{')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2144
        self.context.append('}\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2145
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2146
    def depart_rubric(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2147
        self.body.append(self.context.pop())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2148
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2149
    def visit_transition(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2150
        self.body.append('\n\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2151
        self.body.append('%' + '_' * 75)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2152
        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2153
        self.body.append('\n\n')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2154
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2155
    def depart_transition(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2156
        pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2157
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2158
    def visit_version(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2159
        self.visit_docinfo_item(node, 'version')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2160
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2161
    def depart_version(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2162
        self.depart_docinfo_item(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2163
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2164
    def visit_warning(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2165
        self.visit_admonition(node, 'warning')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2166
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2167
    def depart_warning(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2168
        self.depart_admonition()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2169
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2170
    def unimplemented_visit(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2171
        raise NotImplementedError('visiting unimplemented node type: %s'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2172
                                  % node.__class__.__name__)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2173
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2174
#    def unknown_visit(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2175
#    def default_visit(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2176
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
  2177
# vim: set ts=4 et ai :