diff --git a/CHANGES b/CHANGES index 1f60c6f9c..2cf1b72cb 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ Release 0.6.4 (in development) ============================== +* #295: Fix escaping of hyperref targets in LaTeX output. + * #302: Fix links generated by the ``:doc:`` role for LaTeX output. * #286: collect todo nodes after the whole document has been read; diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 8a8285ecf..8e1a6a80b 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -246,6 +246,9 @@ class LaTeXTranslator(nodes.NodeVisitor): return (HEADER % self.elements + self.highlighter.get_stylesheet() + u''.join(self.body) + FOOTER % self.elements) + def idescape(self, id): + return str(unicode(id).translate(tex_escape_map)) + def visit_document(self, node): self.footnotestack.append(self.collect_footnotes(node)) self.curfilestack.append(node.get('docname', '')) @@ -459,7 +462,7 @@ class LaTeXTranslator(nodes.NodeVisitor): d = self.descstack[-1] d.cls = d.cls.rstrip('.') if node.parent['desctype'] != 'describe' and node['ids']: - hyper = '\\hypertarget{%s}{}' % node['ids'][0] + hyper = '\\hypertarget{%s}{}' % self.idescape(node['ids'][0]) else: hyper = '' if d.count == 0: @@ -750,7 +753,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_term(self, node): ctx = '] \\leavevmode' if node.has_key('ids') and node['ids']: - ctx += '\\hypertarget{%s}{}' % node['ids'][0] + ctx += '\\hypertarget{%s}{}' % self.idescape(node['ids'][0]) self.body.append('\\item[') self.context.append(ctx) def depart_term(self, node):