diff --git a/sphinx/builders/latex/__init__.py b/sphinx/builders/latex/__init__.py index 354b20284..4a7ec5e31 100644 --- a/sphinx/builders/latex/__init__.py +++ b/sphinx/builders/latex/__init__.py @@ -20,7 +20,7 @@ import sphinx.builders.latex.nodes # NOQA # Workaround: import this before wri from sphinx import package_dir, addnodes, highlighting from sphinx.application import Sphinx from sphinx.builders import Builder -from sphinx.builders.latex.constants import ADDITIONAL_SETTINGS, DEFAULT_SETTINGS +from sphinx.builders.latex.constants import ADDITIONAL_SETTINGS, DEFAULT_SETTINGS, SHORTHANDOFF from sphinx.builders.latex.theming import Theme, ThemeFactory from sphinx.builders.latex.util import ExtBabel from sphinx.config import Config, ENUM @@ -133,6 +133,7 @@ class LaTeXBuilder(Builder): self.init_context() self.init_babel() + self.init_multilingual() def get_outdated_docs(self) -> Union[str, List[str]]: return 'all documents' # for now @@ -208,6 +209,41 @@ class LaTeXBuilder(Builder): logger.warning(__('no Babel option known for language %r'), self.config.language) + def init_multilingual(self) -> None: + if self.context['latex_engine'] == 'pdflatex': + if not self.babel.uses_cyrillic(): + if 'X2' in self.context['fontenc']: + self.context['substitutefont'] = '\\usepackage{substitutefont}' + self.context['textcyrillic'] = '\\usepackage[Xtwo]{sphinxcyrillic}' + elif 'T2A' in self.context['fontenc']: + self.context['substitutefont'] = '\\usepackage{substitutefont}' + self.context['textcyrillic'] = '\\usepackage[TtwoA]{sphinxcyrillic}' + if 'LGR' in self.context['fontenc']: + self.context['substitutefont'] = '\\usepackage{substitutefont}' + else: + self.context['textgreek'] = '' + + # 'babel' key is public and user setting must be obeyed + if self.context['babel']: + self.context['classoptions'] += ',' + self.babel.get_language() + # this branch is not taken for xelatex/lualatex if default settings + self.context['multilingual'] = self.context['babel'] + if self.config.language: + self.context['shorthandoff'] = SHORTHANDOFF + + # Times fonts don't work with Cyrillic languages + if self.babel.uses_cyrillic() and 'fontpkg' not in self.config.latex_elements: + self.context['fontpkg'] = '' + elif self.context['polyglossia']: + self.context['classoptions'] += ',' + self.babel.get_language() + options = self.babel.get_mainlanguage_options() + if options: + language = r'\setmainlanguage[%s]{%s}' % (options, self.babel.get_language()) + else: + language = r'\setmainlanguage{%s}' % self.babel.get_language() + + self.context['multilingual'] = '%s\n%s' % (self.context['polyglossia'], language) + def write_stylesheet(self) -> None: highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style) stylesheet = path.join(self.outdir, 'sphinxhighlight.sty') diff --git a/sphinx/builders/latex/constants.py b/sphinx/builders/latex/constants.py index 70fd0b1d1..9a89036bf 100644 --- a/sphinx/builders/latex/constants.py +++ b/sphinx/builders/latex/constants.py @@ -192,3 +192,11 @@ ADDITIONAL_SETTINGS = { 'fontpkg': XELATEX_GREEK_DEFAULT_FONTPKG, }, } # type: Dict[Any, Dict[str, Any]] + + +SHORTHANDOFF = r''' +\ifdefined\shorthandoff + \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi + \ifnum\catcode`\"=\active\shorthandoff{"}\fi +\fi +''' diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index cfce52f7f..9390ba5de 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -50,13 +50,6 @@ if False: logger = logging.getLogger(__name__) -SHORTHANDOFF = r''' -\ifdefined\shorthandoff - \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi - \ifnum\catcode`\"=\active\shorthandoff{"}\fi -\fi -''' - MAX_CITATION_LABEL_LENGTH = 8 LATEXSECTIONNAMES = ["part", "chapter", "section", "subsection", "subsubsection", "paragraph", "subparagraph"] @@ -395,44 +388,6 @@ class LaTeXTranslator(SphinxTranslator): logger.warning(__('no Babel option known for language %r'), self.config.language) - # set up multilingual module... - if self.elements['latex_engine'] == 'pdflatex': - if not self.babel.uses_cyrillic(): - if 'X2' in self.elements['fontenc']: - self.elements['substitutefont'] = '\\usepackage{substitutefont}' - self.elements['textcyrillic'] = ('\\usepackage[Xtwo]' - '{sphinxcyrillic}') - elif 'T2A' in self.elements['fontenc']: - self.elements['substitutefont'] = '\\usepackage{substitutefont}' - self.elements['textcyrillic'] = ('\\usepackage[TtwoA]' - '{sphinxcyrillic}') - if 'LGR' in self.elements['fontenc']: - self.elements['substitutefont'] = '\\usepackage{substitutefont}' - else: - self.elements['textgreek'] = '' - # 'babel' key is public and user setting must be obeyed - if self.elements['babel']: - self.elements['classoptions'] += ',' + self.babel.get_language() - # this branch is not taken for xelatex/lualatex if default settings - self.elements['multilingual'] = self.elements['babel'] - if self.config.language: - self.elements['shorthandoff'] = SHORTHANDOFF - - # Times fonts don't work with Cyrillic languages - if self.babel.uses_cyrillic() and 'fontpkg' not in self.config.latex_elements: - self.elements['fontpkg'] = '' - elif self.elements['polyglossia']: - self.elements['classoptions'] += ',' + self.babel.get_language() - options = self.babel.get_mainlanguage_options() - if options: - mainlanguage = r'\setmainlanguage[%s]{%s}' % (options, - self.babel.get_language()) - else: - mainlanguage = r'\setmainlanguage{%s}' % self.babel.get_language() - - self.elements['multilingual'] = '%s\n%s' % (self.elements['polyglossia'], - mainlanguage) - minsecnumdepth = self.secnumdepth # 2 from legacy sphinx manual/howto if self.document.get('tocdepth'): # reduce tocdepth if `part` or `chapter` is used for top_sectionlevel @@ -2177,6 +2132,7 @@ deprecated_alias('sphinx.writers.latex', 'DEFAULT_SETTINGS': constants.DEFAULT_SETTINGS, 'LUALATEX_DEFAULT_FONTPKG': constants.LUALATEX_DEFAULT_FONTPKG, 'PDFLATEX_DEFAULT_FONTPKG': constants.PDFLATEX_DEFAULT_FONTPKG, + 'SHORTHANDOFF': constants.SHORTHANDOFF, 'XELATEX_DEFAULT_FONTPKG': constants.XELATEX_DEFAULT_FONTPKG, 'XELATEX_GREEK_DEFAULT_FONTPKG': constants.XELATEX_GREEK_DEFAULT_FONTPKG, 'ExtBabel': ExtBabel, diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index d55a3b895..61020b861 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -99,7 +99,7 @@ def skip_if_stylefiles_notfound(testfunc): def test_build_latex_doc(app, status, warning, engine, docclass): app.config.latex_engine = engine app.config.latex_documents = [app.config.latex_documents[0][:4] + (docclass,)] - app.builder.init_context() + app.builder.init() LaTeXTranslator.ignore_missing_images = True app.builder.build_all()