From a1647b6bb9f89141a9ba5b3579cc1bce8d4b18c2 Mon Sep 17 00:00:00 2001 From: jfbu Date: Sun, 3 Apr 2016 16:21:28 +0200 Subject: [PATCH] Fix broken numeric reference in PDF hyperlinks to "Listing " code-blocks The `\label` is now inserted into the caption on top of the Verbatim, and `\ref` will work as expected. No need for `\phantomsection`. modified: sphinx/writers/latex.py modified: tests/test_directive_code.py --- sphinx/writers/latex.py | 11 ++++++----- tests/test_directive_code.py | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 943f5a170..801726f4e 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1445,8 +1445,8 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.in_container_literal_block: self.body.append('\\needspace{\\literalblockneedspace}') self.body.append('\\vspace{\\literalblockcaptiontopvspace}\n') - self.body.append(self.context.pop()) - self.body.append('\\SphinxSetupCaptionForVerbatim{literal-block}{') + self.body.append('\\SphinxSetupCaptionForVerbatim{literal-block}{' + + self.context.pop()) elif self.in_minipage and isinstance(node.parent, nodes.figure): self.body.append('\\captionof{figure}{') else: @@ -1992,14 +1992,15 @@ class LaTeXTranslator(nodes.NodeVisitor): for id in self.pop_hyperlink_ids('code-block'): ids += self.hypertarget(id, anchor=False) if node['ids']: - ids += self.hypertarget(node['ids'][0]) + # suppress with anchor=False \phantomsection generation + ids += self.hypertarget(node['ids'][0], anchor=False) self.body.append('\n') - self.context.append(ids + '\n') + if ids: + self.context.append(ids) # will be used in visit_caption def depart_container(self, node): if node.get('literal_block'): self.in_container_literal_block -= 1 - # self.body.append(self.context.pop()) moved to visit_caption def visit_decoration(self, node): pass diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index 6f7b749b1..59a440b53 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -64,7 +64,7 @@ def test_code_block_caption_html(app, status, warning): def test_code_block_caption_latex(app, status, warning): app.builder.build_all() latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\SphinxSetupCaptionForVerbatim{literal-block}{caption \\emph{test} rb}' + caption = '\\SphinxSetupCaptionForVerbatim{literal-block}{\label{caption:caption-test-rb}caption \\emph{test} rb}' assert caption in latex @@ -229,7 +229,7 @@ def test_literalinclude_caption_html(app, status, warning): def test_literalinclude_caption_latex(app, status, warning): app.builder.build('index') latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\SphinxSetupCaptionForVerbatim{literal-block}{caption \\textbf{test} py}' + caption = '\\SphinxSetupCaptionForVerbatim{literal-block}{\label{caption:caption-test-py}caption \\textbf{test} py}' assert caption in latex