From 05aff200b14741bbae3540523932a5d528816181 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 31 Mar 2020 23:22:25 +0900 Subject: [PATCH] LaTeX: Add :confval:`latex_theme_options` to override theme options --- CHANGES | 1 + doc/usage/configuration.rst | 7 +++++++ sphinx/builders/latex/__init__.py | 10 ++++++++++ sphinx/builders/latex/theming.py | 6 ++++++ tests/test_build_latex.py | 11 +++++++++++ 5 files changed, 35 insertions(+) diff --git a/CHANGES b/CHANGES index e2600b06a..88ce0ad85 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ Features added * LaTeX: Make the ``toplevel_sectioning`` setting optional in LaTeX theme * LaTeX: Allow to override papersize and pointsize from LaTeX themes +* LaTeX: Add :confval:`latex_theme_options` to override theme options * #7410: Allow to suppress "circular toctree references detected" warnings using :confval:`suppress_warnings` * C, added scope control directives, :rst:dir:`c:namespace`, diff --git a/doc/usage/configuration.rst b/doc/usage/configuration.rst index 12580bd42..161be05e3 100644 --- a/doc/usage/configuration.rst +++ b/doc/usage/configuration.rst @@ -2119,6 +2119,13 @@ These options influence LaTeX output. .. versionadded:: 3.0 +.. confval:: latex_theme_options + + A dictionary of options that influence the look and feel of the selected + theme. + + .. versionadded:: 3.1 + .. confval:: latex_theme_path A list of paths that contain custom LaTeX themes as subdirectories. Relative diff --git a/sphinx/builders/latex/__init__.py b/sphinx/builders/latex/__init__.py index 04b8a3a0d..b1fe4b73e 100644 --- a/sphinx/builders/latex/__init__.py +++ b/sphinx/builders/latex/__init__.py @@ -493,6 +493,14 @@ def validate_config_values(app: Sphinx, config: Config) -> None: config.latex_elements.pop(key) +def validate_latex_theme_options(app: Sphinx, config: Config) -> None: + for key in list(config.latex_theme_options): + if key not in Theme.UPDATABLE_KEYS: + msg = __("Unknown theme option: latex_theme_options[%r], ignored.") + logger.warning(msg % (key,)) + config.latex_theme_options.pop(key) + + def default_latex_engine(config: Config) -> str: """ Better default latex_engine settings for specific languages. """ if config.language == 'ja': @@ -539,6 +547,7 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_builder(LaTeXBuilder) app.connect('config-inited', validate_config_values, priority=800) + app.connect('config-inited', validate_latex_theme_options, priority=800) app.add_config_value('latex_engine', default_latex_engine, None, ENUM('pdflatex', 'xelatex', 'lualatex', 'platex', 'uplatex')) @@ -555,6 +564,7 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value('latex_elements', {}, None) app.add_config_value('latex_additional_files', [], None) app.add_config_value('latex_theme', 'manual', None, [str]) + app.add_config_value('latex_theme_options', {}, None) app.add_config_value('latex_theme_path', [], None, [list]) app.add_config_value('latex_docclass', default_latex_docclass, None) diff --git a/sphinx/builders/latex/theming.py b/sphinx/builders/latex/theming.py index 1a4f48360..da6a7fa04 100644 --- a/sphinx/builders/latex/theming.py +++ b/sphinx/builders/latex/theming.py @@ -25,6 +25,7 @@ class Theme: """A set of LaTeX configurations.""" LATEX_ELEMENTS_KEYS = ['papersize', 'pointsize'] + UPDATABLE_KEYS = ['papersize', 'pointsize'] def __init__(self, name: str) -> None: self.name = name @@ -41,6 +42,11 @@ class Theme: value = config.latex_elements[key] setattr(self, key, value) + for key in self.UPDATABLE_KEYS: + if key in config.latex_theme_options: + value = config.latex_theme_options[key] + setattr(self, key, value) + class BuiltInTheme(Theme): """A built-in LaTeX theme.""" diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index ba70debc2..d3c491461 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -235,6 +235,17 @@ def test_latex_theme_papersize(app, status, warning): assert r'\documentclass[b5paper,9pt,english]{sphinxbook}' in result +@pytest.mark.sphinx('latex', testroot='latex-theme', + confoverrides={'latex_theme_options': {'papersize': 'b5paper', + 'pointsize': '9pt'}}) +def test_latex_theme_options(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'python.tex').read_text(encoding='utf8') + print(result) + assert r'\def\sphinxdocclass{book}' in result + assert r'\documentclass[b5paper,9pt,english]{sphinxbook}' in result + + @pytest.mark.sphinx('latex', testroot='basic', confoverrides={'language': 'zh'}) def test_latex_additional_settings_for_language_code(app, status, warning): app.builder.build_all()