Source code for pyexlatex.models.title.page

from typing import List, Optional, Sequence
from pyexlatex.models.template import Template
from pyexlatex.models.title.title import Title
from pyexlatex.models.credits.author import Author
from pyexlatex.models.date import Date
from pyexlatex.models.section.abstract import Abstract
from pyexlatex.texgen import _maketitle_str
from pyexlatex.logic.format.and_join import join_with_commas_and_and
from pyexlatex.models.sizes.baselineskip import BaselineSkip
from pyexlatex.models.control.group import Group
from pyexlatex.models.control.setlength import SetLength
from pyexlatex.models.control.setcounter import SetCounter
from pyexlatex.models.format.text.bold import Bold
from pyexlatex.models.sizes.textsizes import TextSize
from pyexlatex.models.format.centering import Center
from pyexlatex.models.control.newpage import PageBreak
from pyexlatex.models.page.style import ThisPageStyle
from pyexlatex.models.format.vspace import VSpace
from pyexlatex.models.format.hspace import HSpace
from pyexlatex.models.format.breaks import LineBreak


[docs]class TitlePage(Template):
[docs] def __init__(self, title: str = None, authors: List[str] = None, date: Optional[str] = None, abstract: Optional[str] = None, separate_abstract_page: bool = False, extra_lines: Optional[Sequence] = None, empty_page_style: bool = False): self.empty_page_style = empty_page_style self.title = title author: Optional[str] if authors is not None: author = join_with_commas_and_and(authors) else: author = None contents = [ self._title_obj, Author(author, short_author=None) if author is not None else None, Date(date) if date is not None else Date(), _maketitle_str() if title is not None else None, ThisPageStyle('empty') if empty_page_style else None, Abstract(abstract) if abstract is not None and not separate_abstract_page else None, ] if extra_lines is not None and not separate_abstract_page: contents.extend(extra_lines) if separate_abstract_page and abstract: contents.append( CustomTitlePage(title, abstract, extra_lines=extra_lines, next_page_number=1) ) self.contents = [content for content in contents if content is not None] super().__init__()
@property def _title_obj(self) -> Optional[Title]: if self.title is None: return None title = self.title if self.empty_page_style: # Empty page style strips away bold title, bring it back manually title = Bold(title) return Title(title)
[docs]class CustomTitlePage(Template): r""" Title page which is not created using \maketitle, instead it is created manually and so may be included at any point in a document, and there may be multiple. """
[docs] def __init__(self, title: Optional[str], abstract: Optional[str] = None, title_relative_size: int = 3, gap_after_title_pt: int = 35, extra_lines: Optional[Sequence] = None, next_page_number: Optional[int] = None): self.title = title self.abstract = abstract self.title_relative_size = title_relative_size self.gap_after_title = gap_after_title_pt self.extra_lines = extra_lines self.next_page_number = next_page_number self.contents = self._get_contents() super().__init__()
def _get_contents(self): contents = [ PageBreak(), ThisPageStyle('empty'), self._title_block, VSpace(self.gap_after_title, units='pt'), ] if self.abstract is not None: contents.extend(self._abstract_block) if self.extra_lines is not None: contents.extend(self._extra_lines_block) contents.append(PageBreak()) if self.next_page_number is not None: contents.append(SetCounter('page', 1)) return contents @property def _title_block(self) -> Group: main_contents = [ SetLength(BaselineSkip(), '40pt'), TextSize(self.title_relative_size), Bold(self.title) ] return Group(Center(main_contents)) @property def _abstract_block(self): if self.abstract is None: return None abstract_title = Center(Bold('Abstract')) return [ abstract_title, VSpace(-10, 'pt'), HSpace(1.5, 'em'), self.abstract ] @property def _extra_lines_block(self): if self.extra_lines is None: return None contents = [VSpace(20, 'pt')] for line in self.extra_lines: contents.extend([ line, LineBreak(), ]) return contents