diff --git a/CHANGES b/CHANGES index d5abaa6f8..863a5ea24 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Deprecated Features added -------------- +* LaTeX: Make the ``toplevel_sectioning`` setting optional in LaTeX theme * #7410: Allow to suppress "circular toctree references detected" warnings using :confval:`suppress_warnings` diff --git a/doc/extdev/i18n.rst b/doc/extdev/i18n.rst index a3232b857..75ef36cc5 100644 --- a/doc/extdev/i18n.rst +++ b/doc/extdev/i18n.rst @@ -35,25 +35,25 @@ In practice, you have to: :func:`sphinx.locale.get_translation` function, usually renamed ``_()``, e.g.: - .. code-block:: python - :caption: src/__init__.py + .. code-block:: python + :caption: src/__init__.py - from sphinx.locale import get_translation + from sphinx.locale import get_translation - MESSAGE_CATALOG_NAME = 'myextension' - _ = get_translation(MESSAGE_CATALOG_NAME) + MESSAGE_CATALOG_NAME = 'myextension' + _ = get_translation(MESSAGE_CATALOG_NAME) - translated_text = _('Hello Sphinx!') + translated_text = _('Hello Sphinx!') #. Set up your extension to be aware of its dedicated translations: - .. code-block:: python - :caption: src/__init__.py + .. code-block:: python + :caption: src/__init__.py - def setup(app): - package_dir = path.abspath(path.dirname(__file__)) - locale_dir = os.path.join(package_dir, 'locales') - app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir) + def setup(app): + package_dir = path.abspath(path.dirname(__file__)) + locale_dir = os.path.join(package_dir, 'locales') + app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir) #. Generate message catalog template ``*.pot`` file, usually in ``locale/`` source directory, for example via `Babel`_: diff --git a/sphinx/builders/latex/theming.py b/sphinx/builders/latex/theming.py index 56f2735f0..d638639aa 100644 --- a/sphinx/builders/latex/theming.py +++ b/sphinx/builders/latex/theming.py @@ -66,19 +66,29 @@ class BuiltInTheme(Theme): class UserTheme(Theme): """A user defined LaTeX theme.""" + REQUIRED_CONFIG_KEYS = ['docclass', 'wrapperclass'] + OPTIONAL_CONFIG_KEYS = ['toplevel_sectioning'] + def __init__(self, name: str, filename: str) -> None: - self.name = name + super().__init__(name) self.config = configparser.RawConfigParser() self.config.read(path.join(filename)) - try: - self.docclass = self.config.get('theme', 'docclass') - self.wrapperclass = self.config.get('theme', 'wrapperclass') - self.toplevel_sectioning = self.config.get('theme', 'toplevel_sectioning') - except configparser.NoSectionError: - raise ThemeError(__('%r doesn\'t have "theme" setting') % filename) - except configparser.NoOptionError as exc: - raise ThemeError(__('%r doesn\'t have "%s" setting') % (filename, exc.args[0])) + for key in self.REQUIRED_CONFIG_KEYS: + try: + value = self.config.get('theme', key) + setattr(self, key, value) + except configparser.NoSectionError: + raise ThemeError(__('%r doesn\'t have "theme" setting') % filename) + except configparser.NoOptionError as exc: + raise ThemeError(__('%r doesn\'t have "%s" setting') % (filename, exc.args[0])) + + for key in self.OPTIONAL_CONFIG_KEYS: + try: + value = self.config.get('theme', key) + setattr(self, key, value) + except configparser.NoOptionError: + pass class ThemeFactory: