mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
LaTeX: add hyperref support to general index as handled by xindy
- achieve hyperlinked page numbers in general index, despite xindy's incompatibility with hyperref, - obtain compatibility of pdflatex with xindy for documents with Cyrillic scripts, - use xindy by default with xelatex/lualatex because any non-ascii character as first letter of an indexed term breaks PDF build if using makeindex with lualatex, and produces incoherent index with xelatex. This commit also switches off xindy logs (which were activated in parent commits) as they are voluminous and not of immediate use to Sphinx user.
This commit is contained in:
parent
a68d06a1da
commit
60b160431a
14
CHANGES
14
CHANGES
@ -4,6 +4,11 @@ Release 1.8.0 (in development)
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
* LaTeX: :confval:`latex_use_xindy`, if ``True`` (default for
|
||||
``xelatex/lualatex``), instructs ``make latexpdf`` to use :program:`xindy`
|
||||
for general index. Make sure your LaTeX distribution includes it.
|
||||
(refs: #5134)
|
||||
|
||||
Incompatible changes
|
||||
--------------------
|
||||
|
||||
@ -39,6 +44,10 @@ Incompatible changes
|
||||
Please use ``app.add_js_file()`` instead.
|
||||
* #5072: Save environment object also with only new documents
|
||||
* #5035: qthelp builder allows dashes in :confval:`qthelp_namespace`
|
||||
* LaTeX: with lualatex or xelatex use by default :program:`xindy` as
|
||||
UTF-8 able replacement of :program:`makeindex` (refs: #5134). After
|
||||
upgrading Sphinx, please clean latex build repertory of existing project
|
||||
before new build.
|
||||
|
||||
Deprecated
|
||||
----------
|
||||
@ -143,7 +152,8 @@ Features added
|
||||
for mathjax
|
||||
* #4362: latex: Don't overwrite .tex file if document not changed
|
||||
* #1431: latex: Add alphanumeric enumerated list support
|
||||
* Add :confval:`latex_use_xindy` for UTF-8 savvy indexing
|
||||
* Add :confval:`latex_use_xindy` for UTF-8 savvy indexing, defaults to ``True``
|
||||
if :confval:`latex_engine` is ``'xelatex'`` or ``'lualatex'``.
|
||||
|
||||
Bugs fixed
|
||||
----------
|
||||
@ -153,7 +163,7 @@ Bugs fixed
|
||||
* #4945: i18n: fix lang_COUNTRY not fallback correctly for IndexBuilder. Thanks
|
||||
to Shengjing Zhu.
|
||||
* #4983: productionlist directive generates invalid IDs for the tokens
|
||||
* #5132: (lualatex) PDF build fails if indexed word starts with Unicode characters
|
||||
* #5132: (lualatex) PDF build fails if indexed word starts with Unicode character
|
||||
|
||||
Testing
|
||||
--------
|
||||
|
@ -1874,28 +1874,35 @@ information.
|
||||
|
||||
.. confval:: latex_use_xindy
|
||||
|
||||
If ``True`` (default ``False``), the PDF build from the LaTeX files
|
||||
created by Sphinx will use :program:`xindy` (doc__) rather than
|
||||
:program:`makeindex`. This means that utf-8 initials in indexed
|
||||
words will be handled correctly, and entries will be ordered
|
||||
according to the rules appropriate to the :confval:`language`.
|
||||
Currently, this uses :program:`texindy` and only (most) European
|
||||
languages with Latin scripts are supported. For usages requiring
|
||||
direct use of ``xindy``, user will have to customize the files
|
||||
:file:`Makefile` and :file:`latexmkrc` which are written to LaTeX
|
||||
build repertory. This can be done via
|
||||
:confval:`latex_additional_files` and customized such files located
|
||||
in source repertory.
|
||||
If ``True``, the PDF build from the LaTeX files created by Sphinx
|
||||
will use :program:`xindy` (doc__) rather than :program:`makeindex`
|
||||
for preparing the index of general terms (from :rst:dir:`index`
|
||||
usage). This means that words with UTF-8 characters will get
|
||||
ordered correctly for the :confval:`language`.
|
||||
|
||||
__ http://xindy.sourceforge.net/
|
||||
|
||||
This option is recommended in case of :confval:`latex_engine` set
|
||||
to ``xelatex`` or ``lualatex`` (it is even mandatory for the latter
|
||||
as the PDF build is broken if some indexed terms start with a
|
||||
non-ascii character). It is without effect in case of
|
||||
:confval:`platex` (Japanese documents). Even if
|
||||
:confval:`latex_engine` is left to its default, the option is
|
||||
recommended as soon as indexed terms use non-ascii characters.
|
||||
- This option is ignored if :confval:`latex_engine` is ``'platex'``
|
||||
(Japanese documents) as :program:`mendex` is used in that case.
|
||||
|
||||
- The default is ``True`` for ``'xelatex'`` or ``'lualatex'`` as
|
||||
:program:`makeindex`, if any indexed term starts with a non-ascii
|
||||
character, creates ``.ind`` file containing invalid bytes for
|
||||
UTF-8 encoding. With ``'lualatex'`` this then breaks the PDF
|
||||
build. Notice that :program:`xindy` supports most but not
|
||||
all European languages.
|
||||
|
||||
- The default is ``False`` for ``'pdflatex'`` but ``True`` is
|
||||
recommended for non-English documents as soon as some indexed
|
||||
terms use non-ascii characters from the language script.
|
||||
Cyrillic scripts are (transparently) supported with
|
||||
``'pdflatex'`` thanks to a specific Sphinx-contributed ``xindy``
|
||||
style file :file:`cyrLICRutf8.xdy`.
|
||||
|
||||
As :program:`xindy` does not support the same range of languages
|
||||
as ``LaTeX/babel`` does, the default :program:`makeindex` for
|
||||
``'pdflatex'`` may be preferred in some circumstances, although
|
||||
the index will be ill-formed probably.
|
||||
|
||||
.. versionadded:: 1.8
|
||||
|
||||
|
@ -44,30 +44,66 @@ 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'
|
||||
}
|
||||
XINDY_LANG_OPTIONS = {
|
||||
# language codes from docutils.writers.latex2e.Babel
|
||||
# ! xindy language names may differ from those in use by LaTeX/babel
|
||||
# ! xindy does not support all Latin scripts as recognized by LaTeX/babel
|
||||
# ! not all xindy-supported languages appear in Babel.language_codes
|
||||
# cd /usr/local/texlive/2018/texmf-dist/xindy/modules/lang
|
||||
# find . -name '*utf8.xdy'
|
||||
# LATIN
|
||||
'sq': '-L albanian -C utf8 ',
|
||||
'hr': '-L croatian -C utf8 ',
|
||||
'cs': '-L czech -C utf8 ',
|
||||
'da': '-L danish -C utf8 ',
|
||||
'nl': '-L dutch -C ij-as-ij-utf8 ',
|
||||
'en': '-L english -C utf8 ',
|
||||
'eo': '-L esperanto -C utf8 ',
|
||||
'et': '-L estonian -C utf8 ',
|
||||
'fi': '-L finnish -C utf8 ',
|
||||
'fr': '-L french -C utf8 ',
|
||||
'de': '-L german -C din5007-utf8 ',
|
||||
'is': '-L icelandic -C utf8 ',
|
||||
'it': '-L italian -C utf8 ',
|
||||
'la': '-L latin -C utf8 ',
|
||||
'lv': '-L latvian -C utf8 ',
|
||||
'lt': '-L lithuanian -C utf8 ',
|
||||
'dsb': '-L lower-sorbian -C utf8 ',
|
||||
'ds': '-L lower-sorbian -C utf8 ', # trick, no conflict
|
||||
'nb': '-L norwegian -C utf8 ',
|
||||
'no': '-L norwegian -C utf8 ', # and what about nynorsk?
|
||||
'pl': '-L polish -C utf8 ',
|
||||
'pt': '-L portuguese -C utf8 ',
|
||||
'ro': '-L romanian -C utf8 ',
|
||||
'sk': '-L slovak -C small-utf8 ', # there is also slovak-large
|
||||
'sl': '-L slovenian -C utf8 ',
|
||||
'es': '-L spanish -C modern-utf8 ', # there is also spanish-traditional
|
||||
'sv': '-L swedish -C utf8 ',
|
||||
'tr': '-L turkish -C utf8 ',
|
||||
'hsb': '-L upper-sorbian -C utf8 ',
|
||||
'hs': '-L upper-sorbian -C utf8 ', # trick, no conflict
|
||||
'vi': '-L vietnamese -C utf8 ',
|
||||
# CYRILLIC
|
||||
# for usage with pdflatex, needs also cyrLICRutf8.xdy module
|
||||
'be': '-L belarusian -C utf8 ',
|
||||
'bg': '-L bulgarian -C utf8 ',
|
||||
'mk': '-L macedonian -C utf8 ',
|
||||
'mn': '-L mongolian -C cyrillic-utf8 ',
|
||||
'ru': '-L russian -C utf8 ',
|
||||
'sr': '-L serbian -C utf8 ',
|
||||
'sh-cyrl': '-L serbian -C utf8 ',
|
||||
'sh': '-L serbian -C utf8 ', # trick, no conflict
|
||||
'uk': '-L ukrainian -C utf8 ',
|
||||
# GREEK
|
||||
# can work only with xelatex/lualatex, not supported by texindy+pdflatex
|
||||
'el': '-L greek -C utf8 ',
|
||||
# FIXME, not compatible with [:2] slice but does Sphinx support Greek ?
|
||||
'el-polyton': '-L greek -C polytonic-utf8 ',
|
||||
} # type: Dict[unicode, unicode]
|
||||
|
||||
XINDY_CYRILLIC_SCRIPTS = [
|
||||
'be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk',
|
||||
] # type: List[unicode]
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -257,14 +293,23 @@ class LaTeXBuilder(Builder):
|
||||
self.copy_image_files()
|
||||
|
||||
# copy TeX support files from texinputs
|
||||
# configure usage of xindy (impacts Makefile and latexmkrc)
|
||||
# FIXME: convert this rather to a confval with suitable default
|
||||
# according to language ? but would require extra documentation
|
||||
if self.config.language:
|
||||
xindy_lang = \
|
||||
XINDY_LANGUAGES.get(self.config.language[:2], 'general')
|
||||
xindy_lang_option = \
|
||||
XINDY_LANG_OPTIONS.get(self.config.language[:2],
|
||||
'-L general -C utf8 ')
|
||||
xindy_cyrillic = self.config.language[:2] in XINDY_CYRILLIC_SCRIPTS
|
||||
else:
|
||||
xindy_lang = 'english'
|
||||
context = {'latex_engine': self.config.latex_engine,
|
||||
'latex_use_xindy': self.config.latex_use_xindy,
|
||||
'xindy_lang': xindy_lang}
|
||||
xindy_lang_option = '-L english -C utf8 '
|
||||
xindy_cyrillic = False
|
||||
context = {
|
||||
'latex_engine': self.config.latex_engine,
|
||||
'xindy_use': self.config.latex_use_xindy,
|
||||
'xindy_lang_option': xindy_lang_option,
|
||||
'xindy_cyrillic': xindy_cyrillic,
|
||||
}
|
||||
logger.info(bold(__('copying TeX support files...')))
|
||||
staticdirname = path.join(package_dir, 'texinputs')
|
||||
for filename in os.listdir(staticdirname):
|
||||
@ -349,6 +394,12 @@ def default_latex_docclass(config):
|
||||
return {}
|
||||
|
||||
|
||||
def default_latex_use_xindy(config):
|
||||
# type: (Config) -> bool
|
||||
""" Better default latex_use_xindy settings for specific engines. """
|
||||
return config.latex_engine in {'xelatex', 'lualatex'}
|
||||
|
||||
|
||||
def setup(app):
|
||||
# type: (Sphinx) -> Dict[unicode, Any]
|
||||
app.add_builder(LaTeXBuilder)
|
||||
@ -366,7 +417,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_use_xindy', default_latex_use_xindy, 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])
|
||||
|
@ -13,6 +13,11 @@
|
||||
\ifdefined\pdfpxdimen
|
||||
\let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
|
||||
\fi \sphinxpxdimen=<%= pxunit %>\relax
|
||||
<% if use_xindy -%>
|
||||
%% turn off hyperref patch of \index as sphinx.xdy xindy module takes care of
|
||||
%% suitable \hyperpage mark-up, working around hyperref-xindy incompatibility
|
||||
\PassOptionsToPackage{hyperindex=false}{hyperref}
|
||||
<% endif -%>
|
||||
<%= passoptionstopackages %>
|
||||
\PassOptionsToPackage{warn}{textcomp}
|
||||
<%= inputenc %>
|
||||
|
@ -22,10 +22,13 @@ 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 xindy_use -%}
|
||||
export XINDYOPTS = {{ xindy_lang_option }} -M sphinx.xdy
|
||||
{% if latex_engine == 'pdflatex' and xindy_cyrillic -%}
|
||||
XINDYOPTS += -M cyrLICRutf8.xdy
|
||||
{% endif -%}
|
||||
{% if latex_engine == 'xelatex' or latex_engine == 'lualatex' -%}
|
||||
export XINDYOPTS += -I xelatex
|
||||
XINDYOPTS += -I xelatex
|
||||
{% endif -%}
|
||||
{% endif -%}
|
||||
# format: pdf or dvi (used only by archive targets)
|
||||
|
103
sphinx/texinputs/cyrLICRutf8.xdy
Normal file
103
sphinx/texinputs/cyrLICRutf8.xdy
Normal file
@ -0,0 +1,103 @@
|
||||
;; -*- coding: utf-8; mode: Lisp; -*-
|
||||
;; style file for xindy
|
||||
;; filename: cyrLICRutf8.xdy
|
||||
;; description: style file for xindy which maps back LaTeX Internal
|
||||
;; Character Representation of Cyrillic to utf-8
|
||||
;; usage: for use with pdflatex produced .idx files.
|
||||
;; This module must be loaded after the rule for suppressing space
|
||||
;; characters has been executed, hence after module sphinx.xdy.
|
||||
;; Contributed by the Sphinx team, July 2018.
|
||||
(merge-rule "\IeC{\'\CYRG}" "Ѓ" :string)
|
||||
(merge-rule "\IeC{\'\CYRK}" "Ќ" :string)
|
||||
(merge-rule "\IeC{\'\cyrg}" "ѓ" :string)
|
||||
(merge-rule "\IeC{\'\cyrk}" "ќ" :string)
|
||||
(merge-rule "\IeC{\CYRA}" "А" :string)
|
||||
(merge-rule "\IeC{\CYRB}" "Б" :string)
|
||||
(merge-rule "\IeC{\CYRC}" "Ц" :string)
|
||||
(merge-rule "\IeC{\CYRCH}" "Ч" :string)
|
||||
(merge-rule "\IeC{\CYRD}" "Д" :string)
|
||||
(merge-rule "\IeC{\CYRDJE}" "Ђ" :string)
|
||||
(merge-rule "\IeC{\CYRDZE}" "Ѕ" :string)
|
||||
(merge-rule "\IeC{\CYRDZHE}" "Џ" :string)
|
||||
(merge-rule "\IeC{\CYRE}" "Е" :string)
|
||||
(merge-rule "\IeC{\CYREREV}" "Э" :string)
|
||||
(merge-rule "\IeC{\CYRERY}" "Ы" :string)
|
||||
(merge-rule "\IeC{\CYRF}" "Ф" :string)
|
||||
(merge-rule "\IeC{\CYRG}" "Г" :string)
|
||||
(merge-rule "\IeC{\CYRGUP}" "Ґ" :string)
|
||||
(merge-rule "\IeC{\CYRH}" "Х" :string)
|
||||
(merge-rule "\IeC{\CYRHRDSN}" "Ъ" :string)
|
||||
(merge-rule "\IeC{\CYRI}" "И" :string)
|
||||
(merge-rule "\IeC{\CYRIE}" "Є" :string)
|
||||
(merge-rule "\IeC{\CYRII}" "І" :string)
|
||||
(merge-rule "\IeC{\CYRISHRT}" "Й" :string)
|
||||
(merge-rule "\IeC{\CYRJE}" "Ј" :string)
|
||||
(merge-rule "\IeC{\CYRK}" "К" :string)
|
||||
(merge-rule "\IeC{\CYRL}" "Л" :string)
|
||||
(merge-rule "\IeC{\CYRLJE}" "Љ" :string)
|
||||
(merge-rule "\IeC{\CYRM}" "М" :string)
|
||||
(merge-rule "\IeC{\CYRN}" "Н" :string)
|
||||
(merge-rule "\IeC{\CYRNJE}" "Њ" :string)
|
||||
(merge-rule "\IeC{\CYRO}" "О" :string)
|
||||
(merge-rule "\IeC{\CYRP}" "П" :string)
|
||||
(merge-rule "\IeC{\CYRR}" "Р" :string)
|
||||
(merge-rule "\IeC{\CYRS}" "С" :string)
|
||||
(merge-rule "\IeC{\CYRSFTSN}" "Ь" :string)
|
||||
(merge-rule "\IeC{\CYRSH}" "Ш" :string)
|
||||
(merge-rule "\IeC{\CYRSHCH}" "Щ" :string)
|
||||
(merge-rule "\IeC{\CYRT}" "Т" :string)
|
||||
(merge-rule "\IeC{\CYRTSHE}" "Ћ" :string)
|
||||
(merge-rule "\IeC{\CYRU}" "У" :string)
|
||||
(merge-rule "\IeC{\CYRUSHRT}" "Ў" :string)
|
||||
(merge-rule "\IeC{\CYRV}" "В" :string)
|
||||
(merge-rule "\IeC{\CYRYA}" "Я" :string)
|
||||
(merge-rule "\IeC{\CYRYI}" "Ї" :string)
|
||||
(merge-rule "\IeC{\CYRYO}" "Ё" :string)
|
||||
(merge-rule "\IeC{\CYRYU}" "Ю" :string)
|
||||
(merge-rule "\IeC{\CYRZ}" "З" :string)
|
||||
(merge-rule "\IeC{\CYRZH}" "Ж" :string)
|
||||
(merge-rule "\IeC{\cyra}" "а" :string)
|
||||
(merge-rule "\IeC{\cyrb}" "б" :string)
|
||||
(merge-rule "\IeC{\cyrc}" "ц" :string)
|
||||
(merge-rule "\IeC{\cyrch}" "ч" :string)
|
||||
(merge-rule "\IeC{\cyrd}" "д" :string)
|
||||
(merge-rule "\IeC{\cyrdje}" "ђ" :string)
|
||||
(merge-rule "\IeC{\cyrdze}" "ѕ" :string)
|
||||
(merge-rule "\IeC{\cyrdzhe}" "џ" :string)
|
||||
(merge-rule "\IeC{\cyre}" "е" :string)
|
||||
(merge-rule "\IeC{\cyrerev}" "э" :string)
|
||||
(merge-rule "\IeC{\cyrery}" "ы" :string)
|
||||
(merge-rule "\IeC{\cyrf}" "ф" :string)
|
||||
(merge-rule "\IeC{\cyrg}" "г" :string)
|
||||
(merge-rule "\IeC{\cyrgup}" "ґ" :string)
|
||||
(merge-rule "\IeC{\cyrh}" "х" :string)
|
||||
(merge-rule "\IeC{\cyrhrdsn}" "ъ" :string)
|
||||
(merge-rule "\IeC{\cyri}" "и" :string)
|
||||
(merge-rule "\IeC{\cyrie}" "є" :string)
|
||||
(merge-rule "\IeC{\cyrii}" "і" :string)
|
||||
(merge-rule "\IeC{\cyrishrt}" "й" :string)
|
||||
(merge-rule "\IeC{\cyrje}" "ј" :string)
|
||||
(merge-rule "\IeC{\cyrk}" "к" :string)
|
||||
(merge-rule "\IeC{\cyrl}" "л" :string)
|
||||
(merge-rule "\IeC{\cyrlje}" "љ" :string)
|
||||
(merge-rule "\IeC{\cyrm}" "м" :string)
|
||||
(merge-rule "\IeC{\cyrn}" "н" :string)
|
||||
(merge-rule "\IeC{\cyrnje}" "њ" :string)
|
||||
(merge-rule "\IeC{\cyro}" "о" :string)
|
||||
(merge-rule "\IeC{\cyrp}" "п" :string)
|
||||
(merge-rule "\IeC{\cyrr}" "р" :string)
|
||||
(merge-rule "\IeC{\cyrs}" "с" :string)
|
||||
(merge-rule "\IeC{\cyrsftsn}" "ь" :string)
|
||||
(merge-rule "\IeC{\cyrsh}" "ш" :string)
|
||||
(merge-rule "\IeC{\cyrshch}" "щ" :string)
|
||||
(merge-rule "\IeC{\cyrt}" "т" :string)
|
||||
(merge-rule "\IeC{\cyrtshe}" "ћ" :string)
|
||||
(merge-rule "\IeC{\cyru}" "у" :string)
|
||||
(merge-rule "\IeC{\cyrushrt}" "ў" :string)
|
||||
(merge-rule "\IeC{\cyrv}" "в" :string)
|
||||
(merge-rule "\IeC{\cyrya}" "я" :string)
|
||||
(merge-rule "\IeC{\cyryi}" "ї" :string)
|
||||
(merge-rule "\IeC{\cyryo}" "ё" :string)
|
||||
(merge-rule "\IeC{\cyryu}" "ю" :string)
|
||||
(merge-rule "\IeC{\cyrz}" "з" :string)
|
||||
(merge-rule "\IeC{\cyrzh}" "ж" :string)
|
@ -10,8 +10,8 @@ $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';
|
||||
{% if xindy_use -%}
|
||||
$makeindex = 'xindy ' . $ENV{'XINDYOPTS'} . ' %O -o %D %S';
|
||||
{% else -%}
|
||||
$makeindex = 'makeindex -s python.ist %O -o %D %S';
|
||||
{% endif -%}
|
||||
|
@ -3,7 +3,7 @@ headings_flag 1
|
||||
heading_prefix " \\bigletter "
|
||||
|
||||
preamble "\\begin{sphinxtheindex}
|
||||
\\let\\bigletter\\sphinxstyleindexletterhead
|
||||
\\let\\bigletter\\sphinxstyleindexlettergroup
|
||||
|
||||
"
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
(markup-index :open "\begin{sphinxtheindex}
|
||||
\let\lettergroup\sphinxstyleindexletterhead
|
||||
\let\lettergroupDefault\sphinxstyleindexxindygroupheadsymbols
|
||||
|
||||
"
|
||||
:close "
|
||||
|
||||
\end{sphinxtheindex}
|
||||
"
|
||||
:tree)
|
||||
|
||||
;; End
|
||||
|
||||
;; Local Variables:
|
||||
;; mode: lisp
|
||||
;; End:
|
@ -470,8 +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}
|
||||
% for usage with xindy: this string gets internationalized in preamble
|
||||
\newcommand*{\sphinxnonalphabeticalgroupname}{}
|
||||
|
||||
%% COLOR (general)
|
||||
%
|
||||
@ -1596,9 +1596,10 @@
|
||||
\def\sphinxstyleindexentry #1{\texttt{#1}}
|
||||
\def\sphinxstyleindexextra #1{ \emph{(#1)}}
|
||||
\def\sphinxstyleindexpageref #1{, \pageref{#1}}
|
||||
\def\sphinxstyleindexletterhead #1{{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
|
||||
\def\sphinxstyleindexxindygroupheadsymbols
|
||||
{{\Large\sffamily\sphinxsymbolsandnumbersname}\nopagebreak\vspace{1mm}}
|
||||
\def\sphinxstyleindexlettergroup #1%
|
||||
{{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
|
||||
\def\sphinxstyleindexlettergroupDefault #1%
|
||||
{{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}}
|
||||
\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip}
|
||||
\let\sphinxstylesidebartitle\sphinxstyletopictitle
|
||||
\protected\def\sphinxstyleothertitle #1{\textbf{#1}}
|
||||
|
133
sphinx/texinputs/sphinx.xdy
Normal file
133
sphinx/texinputs/sphinx.xdy
Normal file
@ -0,0 +1,133 @@
|
||||
;;; -*- mode: lisp; coding: utf-8; -*-
|
||||
|
||||
;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This
|
||||
;; configuration is a workaround, which requires to pass option
|
||||
;; hyperindex=false to hyperref.
|
||||
;; textit and emph not currently used by Sphinx LaTeX writer.
|
||||
(define-attributes (("textbf" "textit" "emph" "default")))
|
||||
(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf")
|
||||
(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit")
|
||||
(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph")
|
||||
(markup-locref :open "\hyperpage{" :close "}" :attr "default")
|
||||
|
||||
(require "numeric-sort.xdy")
|
||||
|
||||
;; xindy base module latex.xdy loads tex.xdy and the latter instructs
|
||||
;; xindy to ignore **all** TeX macros in .idx entries, except those
|
||||
;; explicitely described in merge rule. But when after applying all
|
||||
;; merge rules an empty string results, xindy raises an error:
|
||||
|
||||
;; ERROR: CHAR: index 0 should be less than the length of the string
|
||||
|
||||
;; For example when using pdflatex with utf-8 characters the index
|
||||
;; file will contain \IeC macros and they will get ignored except if
|
||||
;; suitable merge rules are loaded early. The texindy script coming
|
||||
;; with xindy provides this, but only for Latin scripts. The texindy
|
||||
;; man page says to use rather xelatex or lualatex in case of Cyrillic
|
||||
;; scripts.
|
||||
|
||||
;; Sphinx contributes cyrLICRutf8.xdy to provide support for Cyrillic
|
||||
;; scripts for the pdflatex engine.
|
||||
|
||||
;; Another issue caused by xindy ignoring all TeX macros except those
|
||||
;; explicitely declared reveals itself when attempting to index ">>>",
|
||||
;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX
|
||||
;; escaping.
|
||||
|
||||
;; To fix this, Sphinx does **not** use texindy, and does not even
|
||||
;; load the xindy latex.xdy base module.
|
||||
|
||||
;(require "latex.xdy")
|
||||
|
||||
;; Rather it incorporates some suitable extracts from latex.xdy and
|
||||
;; tex.xdy with additional Sphinx contributed rules.
|
||||
|
||||
;;;;;;;; extracts from tex.xdy (discarding most original comments):
|
||||
|
||||
;;;
|
||||
;;; TeX conventions
|
||||
;;;
|
||||
|
||||
;; Discard leading and trailing white space. Collapse multiple white
|
||||
;; space characters to blank.
|
||||
|
||||
(merge-rule "^ +" "" :eregexp)
|
||||
(merge-rule " +$" "" :eregexp)
|
||||
(merge-rule " +" " " :eregexp)
|
||||
|
||||
;; Handle TeX markup
|
||||
|
||||
(merge-rule "\\([{}$%&#])" "\1" :eregexp)
|
||||
|
||||
;;;;;;;; end of extracts from xindy's tex.xdy
|
||||
|
||||
;;;;;;;; extracts from latex.xdy:
|
||||
|
||||
;; Standard location classes: arabic and roman numbers, and alphabets.
|
||||
|
||||
(define-location-class "arabic-page-numbers" ("arabic-numbers"))
|
||||
(define-location-class "roman-page-numbers" ("roman-numbers-lowercase"))
|
||||
(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase"))
|
||||
(define-location-class "alpha-page-numbers" ("alpha"))
|
||||
(define-location-class "Alpha-page-numbers" ("ALPHA"))
|
||||
|
||||
;; Output Markup
|
||||
|
||||
(markup-letter-group-list :sep "~n~n \indexspace~n")
|
||||
|
||||
(markup-indexentry :open "~n \item " :depth 0)
|
||||
(markup-indexentry :open "~n \subitem " :depth 1)
|
||||
(markup-indexentry :open "~n \subsubitem " :depth 2)
|
||||
|
||||
(markup-locclass-list :open ", " :sep ", ")
|
||||
(markup-locref-list :sep ", ")
|
||||
|
||||
;;;;;;;; end of extracts from latex.xdy
|
||||
|
||||
;; Sphinx additions, cf sphinx.util.texescape for rationale
|
||||
;;
|
||||
;; blanks are already ignored from above merge-rules, so no space
|
||||
;; character after TeX control words, despite the fact that they will
|
||||
;; be present in .idx file.
|
||||
|
||||
(merge-rule "\\sphinxleftcurlybrace\{\}" "{")
|
||||
(merge-rule "\\sphinxrightcurlybrace\{\}" "}")
|
||||
(merge-rule "\\_" "_")
|
||||
(merge-rule "\{\[\}" "[")
|
||||
(merge-rule "\{\]\}" "]")
|
||||
(merge-rule "\{\}`" "`")
|
||||
(merge-rule "\\textbackslash\{\}" "\\")
|
||||
(merge-rule "\\textasciitilde\{\}" "~~")
|
||||
(merge-rule "\\textless\{\}" "<")
|
||||
(merge-rule "\\textgreater\{\}" ">")
|
||||
(merge-rule "\\textasciicircum\{\}" "^")
|
||||
(merge-rule "\\P\{\}" "¶")
|
||||
(merge-rule "\\S\{\}" "§")
|
||||
(merge-rule "\\texteuro\{\}" "€")
|
||||
(merge-rule "\\\(\\infty\\\)" "∞")
|
||||
(merge-rule "\\\(\\pm\\\)" "±")
|
||||
(merge-rule "\\\(\\rightarrow\\\)" "→")
|
||||
(merge-rule "\\\(\\checkmark\\\)" "✓")
|
||||
(merge-rule "\\textendash\{\}" "–")
|
||||
(merge-rule "\\textbar\{\}" "|")
|
||||
|
||||
;; This xindy module provides some basic support for "see"
|
||||
(require "makeindex.xdy")
|
||||
|
||||
;; This creates one-letter headings and works fine with utf-8 letters.
|
||||
;; For Cyrillic and pdflatex necessitates cyrLICRutf8.xdy to be loaded too.
|
||||
(require "latin-lettergroups.xdy")
|
||||
|
||||
;; currently we don't (know how to easily) separate "Numbers" from
|
||||
;; "Symbols" with xindy as is the case with makeindex.
|
||||
(markup-index :open "\begin{sphinxtheindex}
|
||||
\let\lettergroup\sphinxstyleindexlettergroup
|
||||
\let\lettergroupDefault\sphinxstyleindexlettergroupDefault
|
||||
|
||||
"
|
||||
:close "
|
||||
|
||||
\end{sphinxtheindex}
|
||||
"
|
||||
:tree)
|
||||
|
@ -497,6 +497,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
'release': self.encode(builder.config.release),
|
||||
'author': document.settings.author, # treat as a raw LaTeX code
|
||||
'indexname': _('Index'),
|
||||
'use_xindy': builder.config.latex_use_xindy,
|
||||
})
|
||||
if not self.elements['releasename'] and self.elements['release']:
|
||||
self.elements.update({
|
||||
@ -675,7 +676,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
'\\literalblockcontinuesname', self.encode(_('continues on next page'))
|
||||
) +
|
||||
self.babel_renewcommand(
|
||||
'\\sphinxsymbolsandnumbersname', self.encode(_('Symbols and Numbers'))
|
||||
'\\sphinxnonalphabeticalgroupname', self.encode(_('Non-alphabetical'))
|
||||
)
|
||||
)
|
||||
self.elements['pageautorefname'] = \
|
||||
@ -859,7 +860,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
def generate(content, collapsed):
|
||||
# type: (List[Tuple[unicode, List[Tuple[unicode, unicode, unicode, unicode, unicode]]]], bool) -> None # NOQA
|
||||
ret.append('\\begin{sphinxtheindex}\n')
|
||||
ret.append('\\let\\bigletter\\sphinxstyleindexletterhead\n')
|
||||
ret.append('\\let\\bigletter\\sphinxstyleindexlettergroup\n')
|
||||
for i, (letter, entries) in enumerate(content):
|
||||
if i > 0:
|
||||
ret.append('\\indexspace\n')
|
||||
@ -1922,8 +1923,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
# type: (nodes.Node, Pattern) -> None
|
||||
def escape(value):
|
||||
value = self.encode(value)
|
||||
value = value.replace(r'\{', r'{\sphinxleftcurlybrace}')
|
||||
value = value.replace(r'\}', r'{\sphinxrightcurlybrace}')
|
||||
value = value.replace(r'\{', r'\sphinxleftcurlybrace{}')
|
||||
value = value.replace(r'\}', r'\sphinxrightcurlybrace{}')
|
||||
value = value.replace('"', '""')
|
||||
value = value.replace('@', '"@')
|
||||
value = value.replace('!', '"!')
|
||||
|
Loading…
Reference in New Issue
Block a user