Skip to content

Commit

Permalink
Fix #6149: LaTeX: :index: role titles causes build error of LaTeX
Browse files Browse the repository at this point in the history
  • Loading branch information
tk0miya committed Mar 9, 2019
1 parent 9f283bc commit 05d3e37
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Expand Up @@ -21,6 +21,8 @@ Bugs fixed
* #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 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
* #6047: autodoc: ``autofunction`` emits a warning for method objects
* #6028: graphviz: Ensure the graphviz filenames are reproducible
Expand Down
5 changes: 3 additions & 2 deletions sphinx/builders/latex/__init__.py
Expand Up @@ -20,7 +20,7 @@
from sphinx.builders.latex.transforms import (
BibliographyTransform, CitationReferenceTransform, MathReferenceTransform,
FootnoteDocnameUpdater, LaTeXFootnoteTransform, LiteralBlockTransform,
ShowUrlsTransform, DocumentTargetTransform,
ShowUrlsTransform, DocumentTargetTransform, IndexInSectionTitleTransform,
)
from sphinx.config import string_classes, ENUM
from sphinx.environment import NoUri
Expand Down Expand Up @@ -284,7 +284,8 @@ def apply_transforms(self, doctree):
ShowUrlsTransform,
LaTeXFootnoteTransform,
LiteralBlockTransform,
DocumentTargetTransform])
DocumentTargetTransform,
IndexInSectionTitleTransform])
transformer.apply_transforms()

def finish(self):
Expand Down
37 changes: 37 additions & 0 deletions sphinx/builders/latex/transforms.py
Expand Up @@ -596,3 +596,40 @@ def apply(self):
section = node.next_node(nodes.section)
if section:
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)
Empty file.
5 changes: 5 additions & 0 deletions tests/roots/test-index_on_title/contents.rst
@@ -0,0 +1,5 @@
index_on_title
==============

Test for :index:`index` in top level title
------------------------------------------
11 changes: 10 additions & 1 deletion tests/test_build_latex.py
Expand Up @@ -1349,6 +1349,15 @@ def test_latex_labels(app, status, warning):
r'\label{\detokenize{otherdoc:otherdoc}}'
r'\label{\detokenize{otherdoc::doc}}' in result)


# Embeded standalone hyperlink reference (refs: #5948)
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)

0 comments on commit 05d3e37

Please sign in to comment.