Close #1990: Use caption of toctree to title of \tableofcontents in LaTeX

This commit is contained in:
Takeshi KOMIYA 2015-08-21 12:59:54 +09:00
parent bf7b410f6a
commit 20d992cdf5
7 changed files with 76 additions and 10 deletions

View File

@ -102,11 +102,22 @@ class LaTeXBuilder(Builder):
doctree.settings = docsettings
doctree.settings.author = author
doctree.settings.title = title
doctree.settings.contentsname = self.get_contentsname(docname)
doctree.settings.docname = docname
doctree.settings.docclass = docclass
docwriter.write(doctree, destination)
self.info("done")
def get_contentsname(self, indexfile):
tree = self.env.get_doctree(indexfile)
contentsname = None
for toctree in tree.traverse(addnodes.toctree):
if toctree['caption']:
contentsname = toctree['caption']
break
return contentsname
def assemble_doctree(self, indexfile, toctree_only, appendices):
self.docnames = set([indexfile] + appendices)
self.info(darkgreen(indexfile) + " ", nonl=1)

View File

@ -43,6 +43,7 @@ HEADER = r'''%% Generated by Sphinx.
\usepackage{sphinx}
\usepackage{multirow}
%(usepackages)s
%(contentsname)s
%(numfig_format)s
%(preamble)s
@ -159,6 +160,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
'longtable': '\\usepackage{longtable}',
'usepackages': '',
'numfig_format': '',
'contentsname': '',
'preamble': '',
'title': '',
'date': '',
@ -248,6 +250,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
return '\\usepackage{%s}' % (packagename,)
usepackages = (declare_package(*p) for p in builder.usepackages)
self.elements['usepackages'] += "\n".join(usepackages)
if getattr(document.settings, 'contentsname', None):
self.elements['contentsname'] = self.babel_renewcommand(builder, '\\contentsname', document.settings.contentsname)
self.elements['numfig_format'] = self.generate_numfig_format(builder)
# allow the user to override them all
self.elements.update(builder.config.latex_elements)
@ -329,8 +333,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
encode('ascii', 'backslashreplace').decode('ascii').\
replace('\\', '_')
def generate_numfig_format(self, builder):
ret = []
def babel_renewcommand(self, builder, command, definition):
if builder.config.language == 'ja':
babel_prefix = ''
babel_suffix = ''
@ -349,15 +352,27 @@ class LaTeXTranslator(nodes.NodeVisitor):
babel_prefix = ''
babel_suffix = ''
return ('%s\\renewcommand{%s}{%s}%s\n' %
(babel_prefix, command, definition, babel_suffix))
def generate_contentsname(self, builder, document):
print '---'
print '---'
print '---'
for toctree in document.traverse(addnodes.toctree):
if toctree['caption']:
print toctree['caption']
return ''
def generate_numfig_format(self, builder):
ret = []
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))
definition = text_type(figure[0]).translate(tex_escape_map)
ret.append(self.babel_renewcommand(builder, '\\figurename', definition))
if figure[1]:
ret.append('\\makeatletter\n')
ret.append('\\def\\fnum@figure{\\figurename\\thefigure%s}\n' %
@ -369,10 +384,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
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))
definition = text_type(table[0]).translate(tex_escape_map)
ret.append(self.babel_renewcommand(builder, '\\tablename', definition))
if table[1]:
ret.append('\\makeatletter\n')
ret.append('\\def\\fnum@table{\\tablename\\thetable%s}\n' %

View File

@ -0,0 +1,4 @@
===
Bar
===

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
master_doc = 'index'
html_theme = 'classic'

View File

@ -0,0 +1,4 @@
===
Foo
===

View File

@ -0,0 +1,8 @@
test-tocdepth
=============
.. toctree::
:caption: Table of content
foo
bar

View File

@ -275,3 +275,25 @@ def test_latex_add_latex_package(app, status, warning):
result = (app.outdir / 'SphinxTests.tex').text(encoding='utf8')
assert '\\usepackage{foo}' in result
assert '\\usepackage[baz]{bar}' in result
@with_app(buildername='latex', testroot='contentsname')
def test_contentsname(app, status, warning):
app.builder.build_all()
result = (app.outdir / 'Python.tex').text(encoding='utf8')
print(result)
print(status.getvalue())
print(warning.getvalue())
assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}'
in result)
@with_app(buildername='latex', testroot='contentsname',
confoverrides={'language': 'ja'})
def test_contentsname_with_language_ja(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{\\contentsname}{Table of content}' in result