From 4c38038f647b48466a3a12216c57b9dfb81dece6 Mon Sep 17 00:00:00 2001 From: jfbu Date: Sat, 5 Nov 2016 18:43:03 +0100 Subject: [PATCH 1/5] latex multilingual and contentsname setup to after getting user setup --- sphinx/writers/latex.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 84697a4f9..3b2a43fd5 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -437,6 +437,9 @@ class LaTeXTranslator(nodes.NodeVisitor): # disable fncychap in Japanese documents self.elements['fncychap'] = '' + # set 'babel' to improbable value to detect if user has used it + self.elements['babel'] = '3.1415' + if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): if options: @@ -462,12 +465,17 @@ class LaTeXTranslator(nodes.NodeVisitor): if tocdepth >= SECNUMDEPTH: # Increase secnumdepth if tocdepth is depther than default SECNUMDEPTH self.elements['secnumdepth'] = '\\setcounter{secnumdepth}{%d}' % tocdepth - if getattr(document.settings, 'contentsname', None): - self.elements['contentsname'] = \ - self.babel_renewcommand('\\contentsname', document.settings.contentsname) # allow the user to override them all self.check_latex_elements() self.elements.update(builder.config.latex_elements) + + if self.elements['babel'] != '3.1415': + self.elements['multilingual'] = self.elements['babel'] + + if getattr(document.settings, 'contentsname', None): + self.elements['contentsname'] = \ + self.babel_renewcommand('\\contentsname', document.settings.contentsname) + if self.elements['maxlistdepth']: self.elements['sphinxpkgoptions'] += (',maxlistdepth=%s' % self.elements['maxlistdepth']) From b35539bd2e83c61436ca201e79af48fe037669e1 Mon Sep 17 00:00:00 2001 From: jfbu Date: Sat, 5 Nov 2016 19:25:20 +0100 Subject: [PATCH 2/5] reset ``'babel'`` to empty if it was for ``babel_renewcommand`` ok --- sphinx/writers/latex.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 3b2a43fd5..d224ae323 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -438,7 +438,10 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['fncychap'] = '' # set 'babel' to improbable value to detect if user has used it - self.elements['babel'] = '3.1415' + if self.elements['babel']: + self.elements['babel'] = '3.1415' + else: + self.elements['babel'] = '2.7182' if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): @@ -470,7 +473,10 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements.update(builder.config.latex_elements) if self.elements['babel'] != '3.1415': - self.elements['multilingual'] = self.elements['babel'] + if self.elements['babel'] != '2.7182': + self.elements['multilingual'] = self.elements['babel'] + else: + self.elements['babel'] = '' if getattr(document.settings, 'contentsname', None): self.elements['contentsname'] = \ From 5663f750fe9e1f2cd8e766d3df3766462633f285 Mon Sep 17 00:00:00 2001 From: jfbu Date: Thu, 17 Nov 2016 10:00:01 +0100 Subject: [PATCH 3/5] refactor multilingual (load user settings on top) --- sphinx/writers/latex.py | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index d224ae323..214f14fe9 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -109,6 +109,7 @@ ADDITIONAL_SETTINGS = { 'xelatex': { 'latex_engine': 'xelatex', 'polyglossia': '\\usepackage{polyglossia}', + 'babel': '', 'fontenc': '\\usepackage{fontspec}', 'fontpkg': '', 'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0' @@ -372,6 +373,11 @@ class LaTeXTranslator(nodes.NodeVisitor): # sort out some elements self.elements = DEFAULT_SETTINGS.copy() self.elements.update(ADDITIONAL_SETTINGS.get(builder.config.latex_engine, {})) + # allow the user to override them all + self.check_latex_elements() + self.elements.update(builder.config.latex_elements) + + # but some have other interface in config file self.elements.update({ 'wrapperclass': self.format_docclass(document.settings.docclass), # if empty, the title is set to the first section title @@ -398,7 +404,8 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['logo'] = '\\sphinxincludegraphics{%s}\\par' % \ path.basename(builder.config.latex_logo) - if builder.config.language: + if builder.config.language \ + and 'fncychap' not in builder.config.latex_elements: # use Sonny style if any language specified self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' @@ -414,17 +421,16 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['classoptions'] += ',' + self.babel.get_language() # set up multilingual module... - if self.elements['polyglossia']: - self.elements['babel'] = '' # disable babel - self.elements['multilingual'] = '%s\n\\setmainlanguage{%s}' % \ - (self.elements['polyglossia'], self.babel.get_language()) - elif self.elements['babel']: + # 'babel' key is public and user setting must be obeyed + if self.elements['babel']: + # this branch is not taken for xelatex with writer default settings self.elements['multilingual'] = self.elements['babel'] if builder.config.language: self.elements['shorthandoff'] = self.babel.get_shorthandoff() # Times fonts don't work with Cyrillic languages - if self.babel.uses_cyrillic(): + if self.babel.uses_cyrillic() \ + and 'fontpkg' not in builder.config.latex_elements: self.elements['fontpkg'] = '' # pTeX (Japanese TeX) for support @@ -436,12 +442,9 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['multilingual'] = '' # disable fncychap in Japanese documents self.elements['fncychap'] = '' - - # set 'babel' to improbable value to detect if user has used it - if self.elements['babel']: - self.elements['babel'] = '3.1415' - else: - self.elements['babel'] = '2.7182' + elif self.elements['polyglossia']: + self.elements['multilingual'] = '%s\n\\setmainlanguage{%s}' % \ + (self.elements['polyglossia'], self.babel.get_language()) if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): @@ -468,15 +471,6 @@ class LaTeXTranslator(nodes.NodeVisitor): if tocdepth >= SECNUMDEPTH: # Increase secnumdepth if tocdepth is depther than default SECNUMDEPTH self.elements['secnumdepth'] = '\\setcounter{secnumdepth}{%d}' % tocdepth - # allow the user to override them all - self.check_latex_elements() - self.elements.update(builder.config.latex_elements) - - if self.elements['babel'] != '3.1415': - if self.elements['babel'] != '2.7182': - self.elements['multilingual'] = self.elements['babel'] - else: - self.elements['babel'] = '' if getattr(document.settings, 'contentsname', None): self.elements['contentsname'] = \ From 8e1db118c0da8a7d6872baf933a2439353b80044 Mon Sep 17 00:00:00 2001 From: jfbu Date: Thu, 17 Nov 2016 10:01:46 +0100 Subject: [PATCH 4/5] polyglossia honors ``\addto\captions`` like babel --- sphinx/writers/latex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 214f14fe9..8d3eef097 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -590,7 +590,7 @@ class LaTeXTranslator(nodes.NodeVisitor): return self.idescape(ref).replace('-', '\\string-') def babel_renewcommand(self, command, definition): - if self.elements['babel']: + if self.elements['multilingual']: prefix = '\\addto\\captions%s{' % self.babel.get_language() suffix = '}' else: # babel is disabled (mainly for Japanese environment) From 308d3aee89046d1dc893a04d3cd6f97d4a1454f9 Mon Sep 17 00:00:00 2001 From: jfbu Date: Thu, 17 Nov 2016 10:12:53 +0100 Subject: [PATCH 5/5] make shorthandoff extra safe also for turkish (perhaps xelatex+babel+turkish may not use active ``=`` either now or in future) --- sphinx/writers/latex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 8d3eef097..454c30e9c 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -175,7 +175,7 @@ class ExtBabel(Babel): 'italian'): return '\\if\\catcode`\\"\\active\\shorthandoff{"}\\fi' elif shortlang in ('tr', 'turkish'): - return '\\shorthandoff{=}' + return '\\if\\catcode`\\=\\active\\shorthandoff{=}\\fi' return '' def uses_cyrillic(self):