From 1ee7f5a16334769d1ddbeae1e7f32f7d6410c08d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 23 Feb 2015 00:29:05 +0900 Subject: [PATCH 1/3] #1719 Use numfig_format for prefix of captions in LaTeX builder --- CHANGES | 1 + sphinx/writers/latex.py | 36 ++++++++++++++++++++++++++++ tests/test_build_latex.py | 49 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/CHANGES b/CHANGES index d0c0e0fd0..65c1ac95f 100644 --- a/CHANGES +++ b/CHANGES @@ -95,6 +95,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..d287e50ab 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() self.highlighter = highlighting.PygmentsBridge('latex', builder.config.pygments_style, builder.config.trim_doctest_flags) @@ -323,6 +326,39 @@ class LaTeXTranslator(nodes.NodeVisitor): encode('ascii', 'backslashreplace').decode('ascii').\ replace('\\', '_') + def generate_numfig_format(self): + ret = [] + + figure = self.builder.config.numfig_format['figure'].split('%s', 1) + if len(figure) == 1: + ret.append(r'\def\fnum@figure{%s}' % figure[0]) + else: + ret.append(r'\renewcommand{\figurename}{%s}' % figure[0]) + if figure[1]: + ret.append(r'\makeatletter') + ret.append(r'\def\fnum@figure{\figurename\thefigure%s}' % figure[1]) + ret.append(r'\makeatother') + + table = self.builder.config.numfig_format['table'].split('%s', 1) + if len(table) == 1: + ret.append(r'\def\fnum@table{%s}' % table[0]) + else: + ret.append(r'\renewcommand{\tablename}{%s}' % table[0]) + if table[1]: + ret.append(r'\makeatletter') + ret.append(r'\def\fnum@table{\tablename\thetable%s}' % table[1]) + ret.append(r'\makeatother') + + code = self.builder.config.numfig_format['code-block'].split('%s', 1) + if len(code) == 1: + pass # FIXME + else: + ret.append(r'\floatname{literal-block}{%s}' % code[0]) + if table[1]: + pass # FIXME + + return '\n'.join(ret) + def generate_indices(self): def generate(content, collapsed): ret.append('\\begin{theindex}\n') diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index ad8afab6f..9bdd8c2e2 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -166,6 +166,55 @@ 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 '\\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 + + +@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 + + +@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 '\\ref{index:fig1}' in result assert '\\ref{baz:fig22}' in result assert '\\ref{index:table-1}' in result From 9f060278364dc6bc2068a25106c2ec75bada027a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 3 Mar 2015 00:53:06 +0900 Subject: [PATCH 2/3] #1719 Add prefix to linkname of :numref: on LaTeX mode --- sphinx/writers/latex.py | 40 +++++++++++++++++++++++---------------- tests/test_build_latex.py | 34 +++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index d287e50ab..5c3d98cdb 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -331,33 +331,40 @@ class LaTeXTranslator(nodes.NodeVisitor): figure = self.builder.config.numfig_format['figure'].split('%s', 1) if len(figure) == 1: - ret.append(r'\def\fnum@figure{%s}' % figure[0]) + ret.append('\\def\\fnum@figure{%s}\n' % + text_type(figure[0]).translate(tex_escape_map)) else: - ret.append(r'\renewcommand{\figurename}{%s}' % figure[0]) + ret.append('\\renewcommand{\\figurename}{%s}\n' % + text_type(figure[0]).translate(tex_escape_map)) if figure[1]: - ret.append(r'\makeatletter') - ret.append(r'\def\fnum@figure{\figurename\thefigure%s}' % figure[1]) - ret.append(r'\makeatother') + 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(r'\def\fnum@table{%s}' % table[0]) + ret.append('\\def\\fnum@table{%s}\n' % + text_type(table[0]).translate(tex_escape_map)) else: - ret.append(r'\renewcommand{\tablename}{%s}' % table[0]) + ret.append('\\renewcommand{\\tablename}{%s}\n' % + text_type(table[0]).translate(tex_escape_map)) if table[1]: - ret.append(r'\makeatletter') - ret.append(r'\def\fnum@table{\tablename\thetable%s}' % table[1]) - ret.append(r'\makeatother') + 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') - code = self.builder.config.numfig_format['code-block'].split('%s', 1) - if len(code) == 1: + codeblock = self.builder.config.numfig_format['code-block'].split('%s', 1) + if len(codeblock) == 1: pass # FIXME else: - ret.append(r'\floatname{literal-block}{%s}' % code[0]) + ret.append('\\floatname{literal-block}{%s}\n' % + text_type(codeblock[0]).translate(tex_escape_map)) if table[1]: pass # FIXME - return '\n'.join(ret) + return ''.join(ret) def generate_indices(self): def generate(content, collapsed): @@ -1326,8 +1333,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 9bdd8c2e2..85c0abe33 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -169,12 +169,12 @@ def test_numref(app, status, warning): assert '\\renewcommand{\\figurename}{Fig. }' in result assert '\\renewcommand{\\tablename}{Table }' in result assert '\\floatname{literal-block}{Listing }' 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]{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', @@ -189,7 +189,7 @@ def test_numref_with_prefix1(app, status, warning): print(status.getvalue()) print(warning.getvalue()) assert '\\renewcommand{\\figurename}{Figure:}' in result - assert '\\renewcommand{\\tablename}{Tab_}' 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 @@ -197,6 +197,12 @@ def test_numref_with_prefix1(app, status, warning): 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', @@ -212,15 +218,15 @@ def test_numref_with_prefix2(app, status, warning): print(warning.getvalue()) assert '\\renewcommand{\\figurename}{Figure:}' in result assert '\\def\\fnum@figure{\\figurename\\thefigure.}' in result - assert '\\renewcommand{\\tablename}{Tab_}' in result + assert '\\renewcommand{\\tablename}{Tab\\_}' in result assert '\\def\\fnum@table{\\tablename\\thetable:}' 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} \\textbar{} }' in result + assert '\\hyperref[baz:code22]{Code-\\ref{baz:code22}}' in result @with_app(buildername='latex') From a434486dfb406c4090ed58cce268c8fd9fb115f0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 7 Mar 2015 18:01:29 +0900 Subject: [PATCH 3/3] Use babel to change prefix of captions --- sphinx/writers/latex.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 5c3d98cdb..bdd1257bf 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -251,7 +251,7 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.elements['extraclassoptions']: self.elements['classoptions'] += ',' + \ self.elements['extraclassoptions'] - self.elements['numfig_format'] = self.generate_numfig_format() + self.elements['numfig_format'] = self.generate_numfig_format(builder) self.highlighter = highlighting.PygmentsBridge('latex', builder.config.pygments_style, builder.config.trim_doctest_flags) @@ -326,16 +326,31 @@ class LaTeXTranslator(nodes.NodeVisitor): encode('ascii', 'backslashreplace').decode('ascii').\ replace('\\', '_') - def generate_numfig_format(self): + 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('\\renewcommand{\\figurename}{%s}\n' % - text_type(figure[0]).translate(tex_escape_map)) + 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' % @@ -347,8 +362,10 @@ class LaTeXTranslator(nodes.NodeVisitor): ret.append('\\def\\fnum@table{%s}\n' % text_type(table[0]).translate(tex_escape_map)) else: - ret.append('\\renewcommand{\\tablename}{%s}\n' % - text_type(table[0]).translate(tex_escape_map)) + 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' %