From 0f5d5ac126d81175f5569b7ff505a79e6d810226 Mon Sep 17 00:00:00 2001 From: jfbu Date: Sat, 30 Jun 2018 19:51:37 +0200 Subject: [PATCH] Add ``latex_use_xindy`` new config variable for UTF-8 enabled indices Fix: #5132 --- sphinx/builders/latex/__init__.py | 35 +++++++++++++++++++++++++++++- sphinx/templates/latex/latex.tex_t | 2 +- sphinx/texinputs/Makefile_t | 6 +++++ sphinx/texinputs/latexmkrc_t | 4 ++++ sphinx/texinputs/python.xdy | 16 ++++++++++++++ sphinx/texinputs/sphinx.sty | 4 +++- sphinx/writers/latex.py | 7 ++++-- 7 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 sphinx/texinputs/python.xdy diff --git a/sphinx/builders/latex/__init__.py b/sphinx/builders/latex/__init__.py index 382914731..806b67723 100644 --- a/sphinx/builders/latex/__init__.py +++ b/sphinx/builders/latex/__init__.py @@ -44,6 +44,31 @@ if False: from sphinx.config import Config # NOQA +XINDY_LANGUAGES = { +# currently only Latin scripts here, for use with -L option of texindy +# code, name + 'hr': 'croatian', + 'cs': 'czech', + 'da': 'danish', + 'en': 'english', + 'et': 'estonian', + 'fi': 'finnish', + 'fr': 'french', + 'de': 'german-din', # there is also german-duden + 'hu': 'hungarian', + 'it': 'italian', + 'lv': 'latvian', + 'lt': 'lithuanian', + 'nb': 'norwegian', + 'pl': 'polish', + 'pt': 'portuguese', + 'sk': 'slovak-small', # xindy recognizes slovak-small and slovak-large + 'sl': 'slovenian', + 'es': 'spanish-modern', + 'sv': 'swedish', + 'tr': 'turkish' +} + logger = logging.getLogger(__name__) @@ -232,7 +257,14 @@ class LaTeXBuilder(Builder): self.copy_image_files() # copy TeX support files from texinputs - context = {'latex_engine': self.config.latex_engine} + if self.config.language: + xindy_lang = \ + XINDY_LANGUAGES.get(self.config.language[:2], 'general') + else: + xindy_lang = 'english' + context = {'latex_engine': self.config.latex_engine, + 'latex_use_xindy': self.config.latex_use_xindy, + 'xindy_lang': xindy_lang} logger.info(bold(__('copying TeX support files...'))) staticdirname = path.join(package_dir, 'texinputs') for filename in os.listdir(staticdirname): @@ -334,6 +366,7 @@ def setup(app): app.add_config_value('latex_logo', None, None, string_classes) app.add_config_value('latex_appendices', [], None) app.add_config_value('latex_use_latex_multicolumn', False, None) + app.add_config_value('latex_use_xindy', False, None) app.add_config_value('latex_toplevel_sectioning', None, None, ENUM(None, 'part', 'chapter', 'section')) app.add_config_value('latex_domain_indices', True, None, [list]) diff --git a/sphinx/templates/latex/latex.tex_t b/sphinx/templates/latex/latex.tex_t index 0ea75557f..5a158444c 100644 --- a/sphinx/templates/latex/latex.tex_t +++ b/sphinx/templates/latex/latex.tex_t @@ -31,7 +31,7 @@ <%= hyperref %> <%= contentsname %> <%= numfig_format %> -<%= literalblockpto %> +<%= translatablestrings %> <%= pageautorefname %> <%= tocdepth %> <%= secnumdepth %> diff --git a/sphinx/texinputs/Makefile_t b/sphinx/texinputs/Makefile_t index 06bd6c4d7..82ea29de1 100644 --- a/sphinx/texinputs/Makefile_t +++ b/sphinx/texinputs/Makefile_t @@ -22,6 +22,12 @@ export LATEXOPTS = # or on command line for faster builds. {% endif -%} LATEXMKOPTS = +{% if latex_use_xindy -%} +export XINDYOPTS = -L {{ xindy_lang }} -C utf8 -M python.xdy +{% if latex_engine == 'xelatex' or latex_engine == 'lualatex' -%} +export XINDYOPTS += -I xelatex +{% endif -%} +{% endif -%} # format: pdf or dvi (used only by archive targets) FMT = pdf diff --git a/sphinx/texinputs/latexmkrc_t b/sphinx/texinputs/latexmkrc_t index e3cd14f48..c0965ffe3 100644 --- a/sphinx/texinputs/latexmkrc_t +++ b/sphinx/texinputs/latexmkrc_t @@ -10,7 +10,11 @@ $pdflatex = 'xelatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; {% endif -%} $lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; $xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S'; +{% if latex_use_xindy -%} +$makeindex = 'texindy ' . $ENV{'XINDYOPTS'} . ' -t %B.ilg %O -o %D %S'; +{% else -%} $makeindex = 'makeindex -s python.ist %O -o %D %S'; +{% endif -%} add_cus_dep( "glo", "gls", 0, "makeglo" ); sub makeglo { return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); diff --git a/sphinx/texinputs/python.xdy b/sphinx/texinputs/python.xdy new file mode 100644 index 000000000..1095437e6 --- /dev/null +++ b/sphinx/texinputs/python.xdy @@ -0,0 +1,16 @@ +(markup-index :open "\begin{sphinxtheindex} +\providecommand\lettergroup[1]{{\Large\sffamily#1}\nopagebreak\vspace{1mm}} +\providecommand\lettergroupDefault[1]{{\Large\sffamily\sphinxsymbolsandnumbersname}\nopagebreak\vspace{1mm}} + +" + :close " + +\end{sphinxtheindex} +" + :tree) + +;; End + +;; Local Variables: +;; mode: lisp +;; End: diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index 96be30338..42aeedc88 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -6,7 +6,7 @@ % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{sphinx}[2018/03/28 v1.8 LaTeX package (Sphinx markup)] +\ProvidesPackage{sphinx}[2018/06/30 v1.8 LaTeX package (Sphinx markup)] % provides \ltx@ifundefined % (many packages load ltxcmds: graphicx does for pdftex and lualatex but @@ -470,6 +470,8 @@ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% {}% else clause of \ltx@ifundefined +% for usage with xindy string is internationalized in document preamble +\newcommand*{\sphinxsymbolsandnumbersname}{Symbols and Numbers} %% COLOR (general) % diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 55d37da79..c335e611d 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -130,7 +130,7 @@ DEFAULT_SETTINGS = { 'tocdepth': '', 'secnumdepth': '', 'pageautorefname': '', - 'literalblockpto': '', + 'translatablestrings': '', } # type: Dict[unicode, unicode] ADDITIONAL_SETTINGS = { @@ -667,12 +667,15 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.elements['extraclassoptions']: self.elements['classoptions'] += ',' + \ self.elements['extraclassoptions'] - self.elements['literalblockpto'] = ( + self.elements['translatablestrings'] = ( self.babel_renewcommand( '\\literalblockcontinuedname', self.encode(_('continued from previous page')) ) + self.babel_renewcommand( '\\literalblockcontinuesname', self.encode(_('continues on next page')) + ) + + self.babel_renewcommand( + '\\sphinxsymbolsandnumbersname', self.encode(_('Symbols and Numbers')) ) ) self.elements['pageautorefname'] = \