diff --git a/CHANGES b/CHANGES index c6e351171..c84ebae54 100644 --- a/CHANGES +++ b/CHANGES @@ -98,6 +98,7 @@ Bugs fixed now renamed to ``div.literal-block-wrapper``. * ``sphinx.util.pycompat`` has been restored in its backwards-compatibility; slated for removal in Sphinx 1.4. +* #1719: LaTeX writer does not respect ``numref_format`` option in captions Release 1.3b2 (released Dec 5, 2014) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index b92f84a0c..bdd1257bf 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -43,6 +43,7 @@ HEADER = r'''%% Generated by Sphinx. \usepackage{sphinx} \usepackage{multirow} %(usepackages)s +%(numfig_format)s %(preamble)s \title{%(title)s} @@ -155,6 +156,7 @@ class LaTeXTranslator(nodes.NodeVisitor): 'fncychap': '\\usepackage[Bjarne]{fncychap}', 'longtable': '\\usepackage{longtable}', 'usepackages': '', + 'numfig_format': '', 'preamble': '', 'title': '', 'date': '', @@ -249,6 +251,7 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.elements['extraclassoptions']: self.elements['classoptions'] += ',' + \ self.elements['extraclassoptions'] + self.elements['numfig_format'] = self.generate_numfig_format(builder) self.highlighter = highlighting.PygmentsBridge('latex', builder.config.pygments_style, builder.config.trim_doctest_flags) @@ -323,6 +326,63 @@ class LaTeXTranslator(nodes.NodeVisitor): encode('ascii', 'backslashreplace').decode('ascii').\ replace('\\', '_') + def generate_numfig_format(self, builder): + ret = [] + if builder.config.language == 'ja': + babel_prefix = '' + babel_suffix = '' + else: + if builder.config.language: + language = ExtBabel(builder.config.language).get_language() + if language is None: + language = 'english' + else: + language = 'english' + + babel_prefix = '\\addto\\captions%s{' % language + babel_suffix = '}' + + figure = self.builder.config.numfig_format['figure'].split('%s', 1) + if len(figure) == 1: + ret.append('\\def\\fnum@figure{%s}\n' % + text_type(figure[0]).translate(tex_escape_map)) + else: + ret.append('%s\\renewcommand{\\figurename}{%s}%s\n' % + (babel_prefix, + text_type(figure[0]).translate(tex_escape_map), + babel_suffix)) + if figure[1]: + ret.append('\\makeatletter\n') + ret.append('\\def\\fnum@figure{\\figurename\\thefigure%s}\n' % + text_type(figure[1]).translate(tex_escape_map)) + ret.append('\\makeatother\n') + + table = self.builder.config.numfig_format['table'].split('%s', 1) + if len(table) == 1: + ret.append('\\def\\fnum@table{%s}\n' % + text_type(table[0]).translate(tex_escape_map)) + else: + ret.append('%s\\renewcommand{\\tablename}{%s}%s\n' % + (babel_prefix, + text_type(table[0]).translate(tex_escape_map), + babel_suffix)) + if table[1]: + ret.append('\\makeatletter\n') + ret.append('\\def\\fnum@table{\\tablename\\thetable%s}\n' % + text_type(table[1]).translate(tex_escape_map)) + ret.append('\\makeatother\n') + + codeblock = self.builder.config.numfig_format['code-block'].split('%s', 1) + if len(codeblock) == 1: + pass # FIXME + else: + ret.append('\\floatname{literal-block}{%s}\n' % + text_type(codeblock[0]).translate(tex_escape_map)) + if table[1]: + pass # FIXME + + return ''.join(ret) + def generate_indices(self): def generate(content, collapsed): ret.append('\\begin{theindex}\n') @@ -1290,8 +1350,9 @@ class LaTeXTranslator(nodes.NodeVisitor): id = node.get('refuri', '')[1:].replace('#', ':') ref = '\\ref{%s}' % self.idescape(id) - title = node.get('title', '#') - self.body.append(title.replace('#', ref)) + title = text_type(node.get('title', '#')).translate(tex_escape_map) + hyperref = '\\hyperref[%s]{%s}' % (self.idescape(id), title.replace('\\#', ref)) + self.body.append(hyperref) raise nodes.SkipNode diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index ad8afab6f..85c0abe33 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -166,12 +166,67 @@ def test_numref(app, status, warning): print(result) print(status.getvalue()) print(warning.getvalue()) + assert '\\renewcommand{\\figurename}{Fig. }' in result + assert '\\renewcommand{\\tablename}{Table }' in result + assert '\\floatname{literal-block}{Listing }' in result + assert '\\hyperref[index:fig1]{Fig. \\ref{index:fig1}}' in result + assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result + assert '\\hyperref[index:table-1]{Table \\ref{index:table-1}}' in result + assert '\\hyperref[baz:table22]{Table:\\ref{baz:table22}}' in result + assert '\\hyperref[index:code-1]{Listing \\ref{index:code-1}}' in result + assert '\\hyperref[baz:code22]{Code-\\ref{baz:code22}}' in result + + +@with_app(buildername='latex', testroot='numfig', + confoverrides={'numfig': True, + 'numfig_format': {'figure': 'Figure:%s', + 'table': 'Tab_%s', + 'code-block': 'Code-%s'}}) +def test_numref_with_prefix1(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\renewcommand{\\figurename}{Figure:}' in result + assert '\\renewcommand{\\tablename}{Tab\\_}' in result + assert '\\floatname{literal-block}{Code-}' in result assert '\\ref{index:fig1}' in result assert '\\ref{baz:fig22}' in result assert '\\ref{index:table-1}' in result assert '\\ref{baz:table22}' in result assert '\\ref{index:code-1}' in result assert '\\ref{baz:code22}' in result + assert '\\hyperref[index:fig1]{Figure:\\ref{index:fig1}}' in result + assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result + assert '\\hyperref[index:table-1]{Tab\\_\\ref{index:table-1}}' in result + assert '\\hyperref[baz:table22]{Table:\\ref{baz:table22}}' in result + assert '\\hyperref[index:code-1]{Code-\\ref{index:code-1}}' in result + assert '\\hyperref[baz:code22]{Code-\\ref{baz:code22}}' in result + + +@with_app(buildername='latex', testroot='numfig', + confoverrides={'numfig': True, + 'numfig_format': {'figure': 'Figure:%s.', + 'table': 'Tab_%s:', + 'code-block': 'Code-%s | '}}) +def test_numref_with_prefix2(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\renewcommand{\\figurename}{Figure:}' in result + assert '\\def\\fnum@figure{\\figurename\\thefigure.}' in result + assert '\\renewcommand{\\tablename}{Tab\\_}' in result + assert '\\def\\fnum@table{\\tablename\\thetable:}' in result + assert '\\floatname{literal-block}{Code-}' in result + assert '\\hyperref[index:fig1]{Figure:\\ref{index:fig1}.}' in result + assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result + assert '\\hyperref[index:table-1]{Tab\\_\\ref{index:table-1}:}' in result + assert '\\hyperref[baz:table22]{Table:\\ref{baz:table22}}' in result + assert '\\hyperref[index:code-1]{Code-\\ref{index:code-1} \\textbar{} }' in result + assert '\\hyperref[baz:code22]{Code-\\ref{baz:code22}}' in result @with_app(buildername='latex')