Document Templates

When it is not possible to achieve a particular document style using one of the existing templates and a custom template configuration, you can create a new template. A new template is programmed in Python and therefor it is required that you are familiar with Python, or at least with general object-oriented programming.

Subclassing a Template

If you need to customize a template beyond what is possible by configuration, you can subclass a template class and override document part and page templates with custom templates. The following example subclasses Article.

from rinoh.attribute import OverrideDefault
from rinoh.template import DocumentPartTemplate, BodyPageTemplate
from rinoh.templates import Article


class BibliographyPartTemplate(DocumentPartTemplate):
    ...


class MyArticle(Article):
    parts = OverrideDefault(['contents', 'bibliography'])

    # default document part templates
    bibliography = BibliographyPartTemplate()

    # default page templates
    bibliography_page = BodyPageTemplate(base='page')

MyArticle extends the Article template, adding the extra bibliography document part, along with the page template bibliography_page. The new document part is included in parts.

Creating a Custom Template

A new template can be created from scratch by subclassing DocumentTemplate, defining all document parts, their templates and page templates.

The Article and Book templates are examples of templates that inherit directly from DocumentTemplate. We will briefly discuss the article template, the simpler of the two. The Article template overrides the default style sheet and lists a single document part named contents in the parts attribute and provided a template for it are provided along with page templates:

class Article(DocumentTemplate):
    stylesheet = OverrideDefault(sphinx_article)
    abstract_location = Option(AbstractLocation, 'title',
                               'Where to place the abstract')

    parts = OverrideDefault(['contents'])

    # default document part templates
    contents = ArticleContentsPartTemplate(page_number_format='number')

    # default page templates
    page = ArticleBodyPageTemplate(page_size=Var('paper_size'),
                                   left_margin=1.2*CM,
                                   right_margin=1.2*CM,
                                   top_margin=1.8*CM,
                                   bottom_margin=1.6*CM,
                                   header_footer_distance=2*PT)
    contents_page = ArticleBodyPageTemplate(base='page')

Have a look at the Book template source code for an example of a slightly more complex template that defines separate templates for left and right pages.