From 1ced210d74ee8e2e4b533a2bee26de5f1d4e78b1 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Wed, 19 Oct 2016 12:21:32 +0900 Subject: [PATCH 1/6] latex: Introduce ADDITIONAL_SETTINGS to support default settings for each LaTeX engine --- sphinx/writers/latex.py | 121 +++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 58 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index b667c0c9a..d01d9bcab 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -45,6 +45,67 @@ DEFAULT_TEMPLATE = 'latex/content.tex_t' URI_SCHEMES = ('mailto:', 'http:', 'https:', 'ftp:') SECNUMDEPTH = 3 +DEFAULT_SETTINGS = { + 'papersize': 'letterpaper', + 'pointsize': '10pt', + 'pxunit': '49336sp', + 'classoptions': '', + 'extraclassoptions': '', + 'passoptionstopackages': '', + 'geometry': '\\usepackage[margin=1in,marginparwidth=0.5in]' + '{geometry}', + 'inputenc': '', + 'utf8extra': ('\\ifdefined\\DeclareUnicodeCharacter\n' + ' \\DeclareUnicodeCharacter{00A0}{\\nobreakspace}\n' + '\\fi'), + 'cmappkg': '\\usepackage{cmap}', + 'fontenc': '\\usepackage[T1]{fontenc}', + 'amsmath': '\\usepackage{amsmath,amssymb,amstext}', + 'babel': '\\usepackage{babel}', + 'fontpkg': '\\usepackage{times}', + 'fncychap': '\\usepackage[Bjarne]{fncychap}', + 'longtable': '\\usepackage{longtable}', + 'hyperref': ('% Include hyperref last.\n' + '\\usepackage[colorlinks,breaklinks,%\n' + ' ' + 'linkcolor=InnerLinkColor,filecolor=OuterLinkColor,%\n' + ' ' + 'menucolor=OuterLinkColor,urlcolor=OuterLinkColor,%\n' + ' ' + 'citecolor=InnerLinkColor]{hyperref}\n' + '% Fix anchor placement for figures with captions.\n' + '\\usepackage{hypcap}% it must be loaded after hyperref.\n' + '% Set up styles of URL: it should be placed after hyperref.\n' + '\\urlstyle{same}'), + 'usepackages': '', + 'numfig_format': '', + 'contentsname': '', + 'preamble': '', + 'title': '', + 'date': '', + 'release': '', + 'author': '', + 'logo': '', + 'releasename': 'Release', + 'makeindex': '\\makeindex', + 'shorthandoff': '', + 'maketitle': '\\maketitle', + 'tableofcontents': '\\sphinxtableofcontents', + 'postamble': '', + 'printindex': '\\printindex', + 'transition': '\n\n\\bigskip\\hrule{}\\bigskip\n\n', + 'figure_align': 'htbp', + 'tocdepth': '', + 'secnumdepth': '', + 'pageautorefname': '', +} + +ADDITIONAL_SETTINGS = { + 'pdflatex': { + 'inputenc': '\\usepackage[utf8]{inputenc}', + }, +} + class collected_footnote(nodes.footnote): """Footnotes that are collected are assigned this class.""" @@ -258,61 +319,6 @@ class LaTeXTranslator(nodes.NodeVisitor): ignore_missing_images = False - default_elements = { - 'papersize': 'letterpaper', - 'pointsize': '10pt', - 'pxunit': '49336sp', - 'classoptions': '', - 'extraclassoptions': '', - 'passoptionstopackages': '', - 'geometry': '\\usepackage[margin=1in,marginparwidth=0.5in]' - '{geometry}', - 'inputenc': '', - 'utf8extra': ('\\ifdefined\\DeclareUnicodeCharacter\n' - ' \\DeclareUnicodeCharacter{00A0}{\\nobreakspace}\n' - '\\fi'), - 'cmappkg': '\\usepackage{cmap}', - 'fontenc': '\\usepackage[T1]{fontenc}', - 'amsmath': '\\usepackage{amsmath,amssymb,amstext}', - 'babel': '\\usepackage{babel}', - 'fontpkg': '\\usepackage{times}', - 'fncychap': '\\usepackage[Bjarne]{fncychap}', - 'longtable': '\\usepackage{longtable}', - 'hyperref': ('% Include hyperref last.\n' - '\\usepackage[colorlinks,breaklinks,%\n' - ' ' - 'linkcolor=InnerLinkColor,filecolor=OuterLinkColor,%\n' - ' ' - 'menucolor=OuterLinkColor,urlcolor=OuterLinkColor,%\n' - ' ' - 'citecolor=InnerLinkColor]{hyperref}\n' - '% Fix anchor placement for figures with captions.\n' - '\\usepackage{hypcap}% it must be loaded after hyperref.\n' - '% Set up styles of URL: it should be placed after hyperref.\n' - '\\urlstyle{same}'), - 'usepackages': '', - 'numfig_format': '', - 'contentsname': '', - 'preamble': '', - 'title': '', - 'date': '', - 'release': '', - 'author': '', - 'logo': '', - 'releasename': 'Release', - 'makeindex': '\\makeindex', - 'shorthandoff': '', - 'maketitle': '\\maketitle', - 'tableofcontents': '\\sphinxtableofcontents', - 'postamble': '', - 'printindex': '\\printindex', - 'transition': '\n\n\\bigskip\\hrule{}\\bigskip\n\n', - 'figure_align': 'htbp', - 'tocdepth': '', - 'secnumdepth': '', - 'pageautorefname': '', - } - # sphinx specific document classes docclasses = ('howto', 'manual') @@ -350,7 +356,8 @@ class LaTeXTranslator(nodes.NodeVisitor): self.top_sectionlevel = 1 # sort out some elements - self.elements = self.default_elements.copy() + self.elements = DEFAULT_SETTINGS.copy() + self.elements.update(ADDITIONAL_SETTINGS.get(builder.config.latex_engine, {})) self.elements.update({ 'wrapperclass': self.format_docclass(document.settings.docclass), # if empty, the title is set to the first section title @@ -371,8 +378,6 @@ class LaTeXTranslator(nodes.NodeVisitor): else: docclass = builder.config.latex_docclass.get('manual', 'report') self.elements['docclass'] = docclass - if builder.config.latex_engine == 'pdflatex': - self.elements['inputenc'] = '\\usepackage[utf8]{inputenc}' if builder.config.today: self.elements['date'] = builder.config.today else: From d322e443a84fa2c1a720002d70c7ab65a3b3a008 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Wed, 19 Oct 2016 21:28:02 +0900 Subject: [PATCH 2/6] Travis CI: Install lmodern to build xetex documents --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9623c65f1..5f035b73b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,7 @@ addons: - texlive-fonts-recommended - texlive-fonts-extra - texlive-xetex + - lmodern install: - pip install -U pip setuptools - pip install docutils==$DOCUTILS From a79ea0fa95a731a856eb463b6d0e2321923a5099 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Wed, 19 Oct 2016 20:16:47 +0900 Subject: [PATCH 3/6] A better default settings for XeLaTeX --- sphinx/writers/latex.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index d01d9bcab..4693a71e4 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -102,7 +102,13 @@ DEFAULT_SETTINGS = { ADDITIONAL_SETTINGS = { 'pdflatex': { - 'inputenc': '\\usepackage[utf8]{inputenc}', + 'inputenc': '\\usepackage[utf8]{inputenc}', + }, + 'xelatex': { + 'babel': '', # disable babel + 'inputenc': '\\usepackage{polyglossia}', + 'fontenc': '\\usepackage{fontspec}', + 'fontpkg': '', }, } From 68de92042f44df5b455cf4759272d2aae8b6ecc5 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Wed, 19 Oct 2016 23:36:47 +0900 Subject: [PATCH 4/6] latex: Use \refname if \bibname not defined in sphinxhowto.cls --- sphinx/texinputs/sphinxhowto.cls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/texinputs/sphinxhowto.cls b/sphinx/texinputs/sphinxhowto.cls index 6980f10a1..42c44d29e 100644 --- a/sphinx/texinputs/sphinxhowto.cls +++ b/sphinx/texinputs/sphinxhowto.cls @@ -92,7 +92,7 @@ % so no page break before it. \newenvironment{sphinxthebibliography}[1]{% \begin{thebibliography}{1}% - \addcontentsline{toc}{section}{\bibname}}{\end{thebibliography}} + \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}} % Same for the indices. From 5af1713d604f54b1aaf9e35f9c0fb4433b0f6e7a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 20 Oct 2016 00:35:20 +0900 Subject: [PATCH 5/6] latex: Disable babel if polyglossia loaded --- sphinx/templates/latex/content.tex_t | 2 +- sphinx/writers/latex.py | 49 ++++++++++++++++------------ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/sphinx/templates/latex/content.tex_t b/sphinx/templates/latex/content.tex_t index 1e0028503..97b71a704 100644 --- a/sphinx/templates/latex/content.tex_t +++ b/sphinx/templates/latex/content.tex_t @@ -12,7 +12,7 @@ <%= cmappkg %> <%= fontenc %> <%= amsmath %> -<%= babel %> +<%= multilingual %> <%= fontpkg %> <%= fncychap %> <%= longtable %> diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 4693a71e4..4ec08cea6 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -61,7 +61,9 @@ DEFAULT_SETTINGS = { 'cmappkg': '\\usepackage{cmap}', 'fontenc': '\\usepackage[T1]{fontenc}', 'amsmath': '\\usepackage{amsmath,amssymb,amstext}', + 'multilingual': '', 'babel': '\\usepackage{babel}', + 'polyglossia': '', 'fontpkg': '\\usepackage{times}', 'fncychap': '\\usepackage[Bjarne]{fncychap}', 'longtable': '\\usepackage{longtable}', @@ -105,8 +107,7 @@ ADDITIONAL_SETTINGS = { 'inputenc': '\\usepackage[utf8]{inputenc}', }, 'xelatex': { - 'babel': '', # disable babel - 'inputenc': '\\usepackage{polyglossia}', + 'polyglossia': '\\usepackage{polyglossia}', 'fontenc': '\\usepackage{fontspec}', 'fontpkg': '', }, @@ -393,28 +394,34 @@ class LaTeXTranslator(nodes.NodeVisitor): # no need for \\noindent here, used in flushright self.elements['logo'] = '\\sphinxincludegraphics{%s}\\par' % \ path.basename(builder.config.latex_logo) - # setup babel + # setup multilingual package self.babel = ExtBabel(builder.config.language) - self.elements['classoptions'] += ',' + self.babel.get_language() - if builder.config.language: - if not self.babel.is_supported_language(): - self.builder.warn('no Babel option known for language %r' % - builder.config.language) - self.elements['shorthandoff'] = self.babel.get_shorthandoff() - self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' + if self.elements['polyglossia']: + self.elements['babel'] = '' # disable babel forcely + self.elements['multilingual'] = self.elements['polyglossia'] + elif self.elements['babel']: + self.elements['multilingual'] = self.elements['babel'] + self.elements['classoptions'] += ',' + self.babel.get_language() + if builder.config.language: + if not self.babel.is_supported_language(): + self.builder.warn('no Babel option known for language %r' % + builder.config.language) + self.elements['shorthandoff'] = self.babel.get_shorthandoff() + self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' - # Times fonts don't work with Cyrillic languages - if self.babel.uses_cyrillic(): - self.elements['fontpkg'] = '' + # Times fonts don't work with Cyrillic languages + if self.babel.uses_cyrillic(): + self.elements['fontpkg'] = '' - # pTeX (Japanese TeX) for support - if builder.config.language == 'ja': - # use dvipdfmx as default class option in Japanese - self.elements['classoptions'] = ',dvipdfmx' - # disable babel which has not publishing quality in Japanese - self.elements['babel'] = '' - # disable fncychap in Japanese documents - self.elements['fncychap'] = '' + # pTeX (Japanese TeX) for support + if builder.config.language == 'ja': + # use dvipdfmx as default class option in Japanese + self.elements['classoptions'] = ',dvipdfmx' + # disable babel which has not publishing quality in Japanese + self.elements['babel'] = '' + self.elements['multilingual'] = '' + # disable fncychap in Japanese documents + self.elements['fncychap'] = '' if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): if options: From 8122f0641548ee476420d53c136d2d267567361d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 20 Oct 2016 02:24:58 +0900 Subject: [PATCH 6/6] Update CHANGES --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index d599988cf..66d346d6f 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,8 @@ Incompatible changes Features added -------------- +* #2513: A better default settings for XeLaTeX + Bugs fixed ----------