Fix #6149: LaTeX: :index: role titles causes build error of LaTeX

This commit is contained in:
Takeshi KOMIYA 2019-03-09 17:41:12 +09:00
parent 9f283bc3f1
commit 05d3e37ef7
6 changed files with 57 additions and 3 deletions

View File

@ -21,6 +21,8 @@ Bugs fixed
* #6046: LaTeX: ``TypeError`` is raised when invalid latex_elements given * #6046: LaTeX: ``TypeError`` is raised when invalid latex_elements given
* #6067: LaTeX: images having a target are concatenated to next line * #6067: LaTeX: images having a target are concatenated to next line
* #6067: LaTeX: images having a target are not aligned even if specified * #6067: LaTeX: images having a target are not aligned even if specified
* #6149: LaTeX: ``:index:`` role in titles causes ``Use of \@icentercr doesn't
match its definition`` error on latexpdf build
* #6019: imgconverter: Including multipage PDF fails * #6019: imgconverter: Including multipage PDF fails
* #6047: autodoc: ``autofunction`` emits a warning for method objects * #6047: autodoc: ``autofunction`` emits a warning for method objects
* #6028: graphviz: Ensure the graphviz filenames are reproducible * #6028: graphviz: Ensure the graphviz filenames are reproducible

View File

@ -20,7 +20,7 @@ from sphinx.builders import Builder
from sphinx.builders.latex.transforms import ( from sphinx.builders.latex.transforms import (
BibliographyTransform, CitationReferenceTransform, MathReferenceTransform, BibliographyTransform, CitationReferenceTransform, MathReferenceTransform,
FootnoteDocnameUpdater, LaTeXFootnoteTransform, LiteralBlockTransform, FootnoteDocnameUpdater, LaTeXFootnoteTransform, LiteralBlockTransform,
ShowUrlsTransform, DocumentTargetTransform, ShowUrlsTransform, DocumentTargetTransform, IndexInSectionTitleTransform,
) )
from sphinx.config import string_classes, ENUM from sphinx.config import string_classes, ENUM
from sphinx.environment import NoUri from sphinx.environment import NoUri
@ -284,7 +284,8 @@ class LaTeXBuilder(Builder):
ShowUrlsTransform, ShowUrlsTransform,
LaTeXFootnoteTransform, LaTeXFootnoteTransform,
LiteralBlockTransform, LiteralBlockTransform,
DocumentTargetTransform]) DocumentTargetTransform,
IndexInSectionTitleTransform])
transformer.apply_transforms() transformer.apply_transforms()
def finish(self): def finish(self):

View File

@ -596,3 +596,40 @@ class DocumentTargetTransform(SphinxTransform):
section = node.next_node(nodes.section) section = node.next_node(nodes.section)
if section: if section:
section['ids'].append(':doc') # special label for :doc: section['ids'].append(':doc') # special label for :doc:
class IndexInSectionTitleTransform(SphinxTransform):
"""Move index nodes in section title to outside of the title.
LaTeX index macro is not compatible with some handling of section titles
such as uppercasing done on LaTeX side (cf. fncychap handling of ``\\chapter``).
Moving the index node to after the title node fixes that.
Before::
<section>
<title>
blah blah <index entries=[...]/>blah
<paragraph>
blah blah blah
...
After::
<section>
<title>
blah blah blah
<index entries=[...]/>
<paragraph>
blah blah blah
...
"""
default_priority = 400
def apply(self):
for node in self.document.traverse(nodes.title):
if isinstance(node.parent, nodes.section):
for i, index in enumerate(node.traverse(addnodes.index)):
# move the index node next to the section title
node.remove(index)
node.parent.insert(i + 1, index)

View File

View File

@ -0,0 +1,5 @@
index_on_title
==============
Test for :index:`index` in top level title
------------------------------------------

View File

@ -1349,6 +1349,15 @@ def test_latex_labels(app, status, warning):
r'\label{\detokenize{otherdoc:otherdoc}}' r'\label{\detokenize{otherdoc:otherdoc}}'
r'\label{\detokenize{otherdoc::doc}}' in result) r'\label{\detokenize{otherdoc::doc}}' in result)
# Embeded standalone hyperlink reference (refs: #5948) # Embeded standalone hyperlink reference (refs: #5948)
assert result.count(r'\label{\detokenize{index:section1}}') == 1 assert result.count(r'\label{\detokenize{index:section1}}') == 1
@pytest.mark.sphinx('latex', testroot='index_on_title')
def test_index_on_title(app, status, warning):
app.builder.build_all()
result = (app.outdir / 'Python.tex').text(encoding='utf8')
assert ('\\chapter{Test for index in top level title}\n'
'\\label{\\detokenize{contents:test-for-index-in-top-level-title}}'
'\\index{index@\\spxentry{index}}\n'
in result)