Skip to content

Commit

Permalink
Close sphinx-doc#8081: latex: Allow to add LaTeX package until writin…
Browse files Browse the repository at this point in the history
…g tex file

This postpones the evaluation of LaTeX packages via
``app.add_latex_package()`` to just before writing .tex file.  That
allows extensions to add LaTeX packages during reading and resolving
phase.
  • Loading branch information
tk0miya committed Aug 9, 2020
1 parent f916e1d commit fb6fa3e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 7 deletions.
6 changes: 6 additions & 0 deletions CHANGES
Expand Up @@ -10,9 +10,15 @@ Incompatible changes
Deprecated
----------

* ``sphinx.builders.latex.LaTeXBuilder.usepackages``
* ``sphinx.builders.latex.LaTeXBuilder.usepackages_afger_hyperref``

Features added
--------------

* #8081: latex: Allow to add LaTeX package via ``app.add_latex_package()`` until
just before writing .tex file

Bugs fixed
----------

Expand Down
10 changes: 10 additions & 0 deletions doc/extdev/deprecated.rst
Expand Up @@ -26,6 +26,16 @@ The following is a list of deprecated interfaces.
- (will be) Removed
- Alternatives

* - ``sphinx.builders.latex.LaTeXBuilder.usepackages``
- 3.3
- 5.0
- N/A

* - ``sphinx.builders.latex.LaTeXBuilder.usepackages_afger_hyperref``
- 3.3
- 5.0
- N/A

* - ``sphinx.ext.autodoc.members_set_option()``
- 3.2
- 5.0
Expand Down
28 changes: 21 additions & 7 deletions sphinx/builders/latex/__init__.py
Expand Up @@ -24,7 +24,7 @@
from sphinx.builders.latex.theming import Theme, ThemeFactory
from sphinx.builders.latex.util import ExtBabel
from sphinx.config import Config, ENUM
from sphinx.deprecation import RemovedInSphinx40Warning
from sphinx.deprecation import RemovedInSphinx40Warning, RemovedInSphinx50Warning
from sphinx.environment.adapters.asset import ImageAdapter
from sphinx.errors import NoUri, SphinxError
from sphinx.locale import _, __
Expand Down Expand Up @@ -128,8 +128,6 @@ def init(self) -> None:
self.docnames = [] # type: Iterable[str]
self.document_data = [] # type: List[Tuple[str, str, str, str, str, bool]]
self.themes = ThemeFactory(self.app)
self.usepackages = self.app.registry.latex_packages
self.usepackages_after_hyperref = self.app.registry.latex_packages_after_hyperref
texescape.init()

self.init_context()
Expand Down Expand Up @@ -179,10 +177,6 @@ def init_context(self) -> None:
key = (self.config.latex_engine, self.config.language[:2])
self.context.update(ADDITIONAL_SETTINGS.get(key, {}))

# Apply extension settings to context
self.context['packages'] = self.usepackages
self.context['packages_after_hyperref'] = self.usepackages_after_hyperref

# Apply user settings to context
self.context.update(self.config.latex_elements)
self.context['release'] = self.config.release
Expand All @@ -203,6 +197,13 @@ def init_context(self) -> None:
# Show the release label only if release value exists
self.context.setdefault('releasename', _('Release'))

def update_context(self) -> None:
"""Update template variables for .tex file just before writing."""
# Apply extension settings to context
registry = self.app.registry
self.context['packages'] = registry.latex_packages
self.context['packages_after_hyperref'] = registry.latex_packages_after_hyperref

def init_babel(self) -> None:
self.babel = ExtBabel(self.config.language, not self.context['babel'])
if self.config.language and not self.babel.is_supported_language():
Expand Down Expand Up @@ -290,6 +291,7 @@ def write(self, *ignored: Any) -> None:
doctree['tocdepth'] = tocdepth
self.post_process_images(doctree)
self.update_doc_context(title, author, theme)
self.update_context()

with progress_message(__("writing")):
docsettings._author = author
Expand Down Expand Up @@ -448,6 +450,18 @@ def write_message_catalog(self) -> None:
filename = path.join(package_dir, 'templates', 'latex', 'sphinxmessages.sty_t')
copy_asset_file(filename, self.outdir, context=context, renderer=LaTeXRenderer())

@property
def usepackages(self) -> List[Tuple[str, str]]:
warnings.warn('LaTeXBuilder.usepackages is deprecated.',
RemovedInSphinx50Warning, stacklevel=2)
return self.app.registry.latex_packages

@property
def usepackages_after_hyperref(self) -> List[Tuple[str, str]]:
warnings.warn('LaTeXBuilder.usepackages_after_hyperref is deprecated.',
RemovedInSphinx50Warning, stacklevel=2)
return self.app.registry.latex_packages


def patch_settings(settings: Any) -> Any:
"""Make settings object to show deprecation messages."""
Expand Down

0 comments on commit fb6fa3e

Please sign in to comment.