diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-04-22 17:10:49 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-22 17:10:49 +0900 |
commit | a2542cad0f96b76405663ef1a4117ca6eca989b7 (patch) | |
tree | 3ee67b479eab641970ed821e240b529e4f5ea3f0 | |
parent | 0541c14766dee0fcf62ba819db2d7b18cd682238 (diff) | |
parent | 61bf7c44df5fc12f5ad6cdd1257238c78b2e02f2 (diff) | |
download | sphinx-git-a2542cad0f96b76405663ef1a4117ca6eca989b7.tar.gz |
Merge pull request #4876 from tk0miya/4717_use_correct_mainlanguage_for_polyglossia
Fix #4717: latex: Compilation for German docs failed with LuaLaTeX and XeLaTeX
-rw-r--r-- | CHANGES | 1 | ||||
-rw-r--r-- | sphinx/writers/latex.py | 38 | ||||
-rw-r--r-- | tests/test_build_latex.py | 44 |
3 files changed, 77 insertions, 6 deletions
@@ -31,6 +31,7 @@ Bugs fixed * #4838: htmlhelp: The entries in .hhp file is not ordered * toctree directive tries to glob for URL having query_string * #4871: html search: Upper characters problem in German +* #4717: latex: Compilation for German docs failed with LuaLaTeX and XeLaTeX Testing -------- diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 8dbe58963..f5209eb38 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -186,10 +186,11 @@ class LaTeXWriter(writers.Writer): # Helper classes class ExtBabel(Babel): - def __init__(self, language_code): - # type: (unicode) -> None + def __init__(self, language_code, use_polyglossia=False): + # type: (unicode, bool) -> None super(ExtBabel, self).__init__(language_code or '') self.language_code = language_code + self.use_polyglossia = use_polyglossia def get_shorthandoff(self): # type: () -> unicode @@ -217,11 +218,28 @@ class ExtBabel(Babel): def get_language(self): # type: () -> unicode language = super(ExtBabel, self).get_language() - if not language: + if language == 'ngerman' and self.use_polyglossia: + # polyglossia calls new orthography (Neue Rechtschreibung) as + # german (with new spelling option). + return 'german' + elif not language: return 'english' # fallback to english else: return language + def get_mainlanguage_options(self): + # type: () -> unicode + """Return options for polyglossia's ``\setmainlanguage``.""" + language = super(ExtBabel, self).get_language() + if self.use_polyglossia is False: + return None + elif language == 'ngerman': + return 'spelling=new' + elif language == 'german': + return 'spelling=old' + else: + return None + class Table(object): """A table data""" @@ -513,7 +531,8 @@ class LaTeXTranslator(nodes.NodeVisitor): '\\sffamily}\n\\ChTitleVar{\\Large' '\\normalfont\\sffamily}') - self.babel = ExtBabel(builder.config.language) + self.babel = ExtBabel(builder.config.language, + not self.elements['babel']) if builder.config.language and not self.babel.is_supported_language(): # emit warning if specified language is invalid # (only emitting, nothing changed to processing) @@ -547,8 +566,15 @@ class LaTeXTranslator(nodes.NodeVisitor): # disable fncychap in Japanese documents self.elements['fncychap'] = '' elif self.elements['polyglossia']: - self.elements['multilingual'] = '%s\n\\setmainlanguage{%s}' % \ - (self.elements['polyglossia'], 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) if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index be9d800b3..c6aed1e3e 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -534,6 +534,50 @@ def test_babel_with_unknown_language(app, status, warning): assert "WARNING: no Babel option known for language 'unknown'" in warning.getvalue() +@pytest.mark.sphinx( + 'latex', testroot='latex-babel', + confoverrides={'language': 'de', 'latex_engine': 'lualatex'}) +def test_polyglossia_with_language_de(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\documentclass[letterpaper,10pt,german]{sphinxmanual}' in result + assert '\\usepackage{polyglossia}' in result + assert '\\setmainlanguage[spelling=new]{german}' in result + assert '\\usepackage{times}' not in result + assert '\\usepackage[Sonny]{fncychap}' in result + assert ('\\addto\\captionsgerman{\\renewcommand{\\contentsname}{Table of content}}\n' + in result) + assert '\\addto\\captionsgerman{\\renewcommand{\\figurename}{Fig.}}\n' in result + assert '\\addto\\captionsgerman{\\renewcommand{\\tablename}{Table.}}\n' in result + assert '\\def\\pageautorefname{Seite}\n' in result + assert '\\shorthandoff' not in result + + +@pytest.mark.sphinx( + 'latex', testroot='latex-babel', + confoverrides={'language': 'de-1901', 'latex_engine': 'lualatex'}) +def test_polyglossia_with_language_de_1901(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\documentclass[letterpaper,10pt,german]{sphinxmanual}' in result + assert '\\usepackage{polyglossia}' in result + assert '\\setmainlanguage[spelling=old]{german}' in result + assert '\\usepackage{times}' not in result + assert '\\usepackage[Sonny]{fncychap}' in result + assert ('\\addto\\captionsgerman{\\renewcommand{\\contentsname}{Table of content}}\n' + in result) + assert '\\addto\\captionsgerman{\\renewcommand{\\figurename}{Fig.}}\n' in result + assert '\\addto\\captionsgerman{\\renewcommand{\\tablename}{Table.}}\n' in result + assert '\\def\\pageautorefname{page}\n' in result + assert '\\shorthandoff' not in result + + @pytest.mark.sphinx('latex') def test_footnote(app, status, warning): app.builder.build_all() |