From: Alan G. I. <ala...@gm...> - 2023-01-14 22:55:20
|
In the latex writer, in LaTeXTranslator.depart_document might it be considered to move the docinfo section to a separate method? Say `depart_document_docinfo` or something like that? Motivation: it is the only part of the method that rst2beamer changes, but there has been churn in the other parts of `depart_document`. (So there was really no need for the rst2beamer method to get out of sync as it has.) Thanks for considering, Alan Isaac |
From: Guenter M. <mi...@us...> - 2023-01-18 10:06:15
|
Dear Alan, On 2023-01-14, Alan G. Isaac wrote: > In the latex writer, in > LaTeXTranslator.depart_document > might it be considered to move the docinfo section > to a separate method? Say `depart_document_docinfo` > or something like that? > Motivation: it is the only part of the method that > rst2beamer changes, but there has been churn in > the other parts of `depart_document`. (So there > was really no need for the rst2beamer method to > get out of sync as it has.) Something like the patch below? Günter -- From: milde <mi...@us...> Date: Wed, 18 Jan 2023 10:57:51 +0100 Subject: [PATCH] LaTeX writer: outsourcing of some code from `depart_document()`. Move parts of the spaghetti code in `LaTeXTranslator.depart_document() to new auxiliary methods `LaTeXTranslator.append_title()` and `LaTeXTranslator.append_bibliography()`. --- docutils/docutils/writers/latex2e/__init__.py | 72 ++++++++++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/docutils/docutils/writers/latex2e/__init__.py b/docutils/docutils/writers/latex2e/__init__.py index d46272a..4386620 100644 --- a/docutils/docutils/writers/latex2e/__init__.py +++ b/docutils/docutils/writers/latex2e/__init__.py @@ -1995,5 +1995,5 @@ class LaTeXTranslator(nodes.NodeVisitor): def depart_document(self, node): - # Complete header with information gained from walkabout + # Complete "parts" with information gained from walkabout # * language setup if (self.babel.otherlanguages @@ -2011,30 +2011,49 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.pdfinfo: self.pdfsetup += [r'\hypersetup{'] + self.pdfinfo + ['}'] - # Complete body - # * document title (with "use_latex_docinfo" also - # 'author', 'organization', 'contact', 'address' and 'date') - if self.title or ( - self.use_latex_docinfo and (self.author_stack or self.date)): - # \title (empty \title prevents error with \maketitle) - title = [''.join(self.title)] - if self.title: - title += self.title_labels - if self.subtitle: - title += [r'\\', + # * title (including author(s) and date if using "latex_docinfo") + self.append_title() # see below + # * bibliography + self.append_bibliogaphy() # see below + # * make sure to generate a toc file if needed for local contents: + if 'minitoc' in self.requirements and not self.has_latex_toc: + self.out.append('\n\\faketableofcontents % for local ToCs\n') + + def append_title(self): + # Append ``\title``, ``\author``, and ``\date`` to "titledata" + # and ``\maketitle`` to "body_pre_docinfo" parts. + # + # Auxiliary function called by `self.depart_document()`. + if not (self.title + or (self.use_latex_docinfo + and (self.author_stack or self.date))): + return # do nothing, there is no title data + # We need all three of ``\title``, ``\author``, and ``\date`` + # (even if empty) to prevent errors and/or automatic display + # of the current date by \maketitle. + # \title + title_arg = [''.join(self.title)] # ensure len == 1 + if self.title: + title_arg += self.title_labels + if self.subtitle: + title_arg += [r'\\', r'\DUdocumentsubtitle{%s}' % ''.join(self.subtitle), ] + self.subtitle_labels - self.titledata.append(r'\title{%s}' % '%\n '.join(title)) - # \author (empty \author prevents warning with \maketitle) - authors = ['\\\\\n'.join(author_entry) - for author_entry in self.author_stack] - self.titledata.append(r'\author{%s}' % - ' \\and\n'.join(authors)) - # \date (empty \date prevents defaulting to \today) - self.titledata.append(r'\date{%s}' % ', '.join(self.date)) - # \maketitle in the body formats title with LaTeX - self.body_pre_docinfo.append('\\maketitle\n') - - # * bibliography - # TODO insertion point of bibliography should be configurable. + self.titledata.append(r'\title{%s}' % '%\n '.join(title_arg)) + # \author + author_arg = ['\\\\\n'.join(author_entry) + for author_entry in self.author_stack] + self.titledata.append(r'\author{%s}' % + ' \\and\n'.join(author_arg)) + # \date + self.titledata.append(r'\date{%s}' % ', '.join(self.date)) + # \maketitle + # Must be in the document body. We add it to `body_pre_docinfo` + # to allow templates to put `titledata` into the document preamble. + self.body_pre_docinfo.append('\\maketitle\n') + + def append_bibliogaphy(self): + # Add bibliography at end of document. + # TODO insertion point should be configurable. + # Auxiliary function called by `depart_document`. if self.bibtex and self._bibitems: self.out.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0]) @@ -2054,7 +2073,4 @@ class LaTeXTranslator(nodes.NodeVisitor): (bibitem[0], cite_key, bibitem[1])) self.out.append('\\end{thebibliography}\n') - # * make sure to generate a toc file if needed for local contents: - if 'minitoc' in self.requirements and not self.has_latex_toc: - self.out.append('\n\\faketableofcontents % for local ToCs\n') def visit_emphasis(self, node): -- libgit2 1.1.0 |
From: Alan G. I. <ala...@gm...> - 2023-01-19 13:56:53
|
On 1/18/2023 5:05 AM, Guenter Milde via Docutils-users wrote: > Dear Alan, > > On 2023-01-14, Alan G. Isaac wrote: >> In the latex writer, in >> LaTeXTranslator.depart_document >> might it be considered to move the docinfo section >> to a separate method? Say `depart_document_docinfo` >> or something like that? > >> Motivation: it is the only part of the method that >> rst2beamer changes, but there has been churn in >> the other parts of `depart_document`. (So there >> was really no need for the rst2beamer method to >> get out of sync as it has.) > > Something like the patch below? > > Günter > -- > > From: milde <mi...@us...> > Date: Wed, 18 Jan 2023 10:57:51 +0100 > Subject: [PATCH] LaTeX writer: outsourcing of some code from `depart_document()`. > > Move parts of the spaghetti code in `LaTeXTranslator.depart_document() > to new auxiliary methods `LaTeXTranslator.append_title()` and > `LaTeXTranslator.append_bibliography()`. > --- > docutils/docutils/writers/latex2e/__init__.py | 72 ++++++++++++++++++++++++++++++++++++++++++++---------------------------- > 1 file changed, 44 insertions(+), 28 deletions(-) > > diff --git a/docutils/docutils/writers/latex2e/__init__.py b/docutils/docutils/writers/latex2e/__init__.py > index d46272a..4386620 100644 > --- a/docutils/docutils/writers/latex2e/__init__.py > +++ b/docutils/docutils/writers/latex2e/__init__.py > @@ -1995,5 +1995,5 @@ class LaTeXTranslator(nodes.NodeVisitor): > > def depart_document(self, node): > - # Complete header with information gained from walkabout > + # Complete "parts" with information gained from walkabout > # * language setup > if (self.babel.otherlanguages > @@ -2011,30 +2011,49 @@ class LaTeXTranslator(nodes.NodeVisitor): > if self.pdfinfo: > self.pdfsetup += [r'\hypersetup{'] + self.pdfinfo + ['}'] > - # Complete body > - # * document title (with "use_latex_docinfo" also > - # 'author', 'organization', 'contact', 'address' and 'date') > - if self.title or ( > - self.use_latex_docinfo and (self.author_stack or self.date)): > - # \title (empty \title prevents error with \maketitle) > - title = [''.join(self.title)] > - if self.title: > - title += self.title_labels > - if self.subtitle: > - title += [r'\\', > + # * title (including author(s) and date if using "latex_docinfo") > + self.append_title() # see below > + # * bibliography > + self.append_bibliogaphy() # see below > + # * make sure to generate a toc file if needed for local contents: > + if 'minitoc' in self.requirements and not self.has_latex_toc: > + self.out.append('\n\\faketableofcontents % for local ToCs\n') > + > + def append_title(self): > + # Append ``\title``, ``\author``, and ``\date`` to "titledata" > + # and ``\maketitle`` to "body_pre_docinfo" parts. > + # > + # Auxiliary function called by `self.depart_document()`. > + if not (self.title > + or (self.use_latex_docinfo > + and (self.author_stack or self.date))): > + return # do nothing, there is no title data > + # We need all three of ``\title``, ``\author``, and ``\date`` > + # (even if empty) to prevent errors and/or automatic display > + # of the current date by \maketitle. > + # \title > + title_arg = [''.join(self.title)] # ensure len == 1 > + if self.title: > + title_arg += self.title_labels > + if self.subtitle: > + title_arg += [r'\\', > r'\DUdocumentsubtitle{%s}' % ''.join(self.subtitle), > ] + self.subtitle_labels > - self.titledata.append(r'\title{%s}' % '%\n '.join(title)) > - # \author (empty \author prevents warning with \maketitle) > - authors = ['\\\\\n'.join(author_entry) > - for author_entry in self.author_stack] > - self.titledata.append(r'\author{%s}' % > - ' \\and\n'.join(authors)) > - # \date (empty \date prevents defaulting to \today) > - self.titledata.append(r'\date{%s}' % ', '.join(self.date)) > - # \maketitle in the body formats title with LaTeX > - self.body_pre_docinfo.append('\\maketitle\n') > - > - # * bibliography > - # TODO insertion point of bibliography should be configurable. > + self.titledata.append(r'\title{%s}' % '%\n '.join(title_arg)) > + # \author > + author_arg = ['\\\\\n'.join(author_entry) > + for author_entry in self.author_stack] > + self.titledata.append(r'\author{%s}' % > + ' \\and\n'.join(author_arg)) > + # \date > + self.titledata.append(r'\date{%s}' % ', '.join(self.date)) > + # \maketitle > + # Must be in the document body. We add it to `body_pre_docinfo` > + # to allow templates to put `titledata` into the document preamble. > + self.body_pre_docinfo.append('\\maketitle\n') > + > + def append_bibliogaphy(self): > + # Add bibliography at end of document. > + # TODO insertion point should be configurable. > + # Auxiliary function called by `depart_document`. > if self.bibtex and self._bibitems: > self.out.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0]) > @@ -2054,7 +2073,4 @@ class LaTeXTranslator(nodes.NodeVisitor): > (bibitem[0], cite_key, bibitem[1])) > self.out.append('\\end{thebibliography}\n') > - # * make sure to generate a toc file if needed for local contents: > - if 'minitoc' in self.requirements and not self.has_latex_toc: > - self.out.append('\n\\faketableofcontents % for local ToCs\n') > > def visit_emphasis(self, node): > -- > libgit2 1.1.0 > Yes, that seems much better to me. Please announce when/if you apply it. Thanks! Alan |
From: Guenter M. <mi...@us...> - 2023-01-30 09:03:05
|
On 2023-01-19, Alan G. Isaac wrote: > On 1/18/2023 5:05 AM, Guenter Milde via Docutils-users wrote: >> Dear Alan, >> On 2023-01-14, Alan G. Isaac wrote: >>> In the latex writer, in >>> LaTeXTranslator.depart_document >>> might it be considered to move the docinfo section >>> to a separate method? This is now done at [r9324]. Please keep in mind: * The new functions are not part of the public API. Like all undocumented objects (i.e. elements without a docstring), they are only provisional, without the promise of backwards compatibility. * As a general rule, if subclassing a Translator class: Safe subclassing: when overriding methods, treat ``visit_*`` and ``depart_*`` methods as a unit to prevent breaks due to internal changes. Günter |