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.