diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 832d34dfa..0d2b2bc97 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -32,7 +32,7 @@ from sphinx.util import split_into, logging from sphinx.util.docutils import SphinxTranslator from sphinx.util.nodes import clean_astext, get_prev_node from sphinx.util.template import LaTeXRenderer -from sphinx.util.texescape import tex_escape_map, tex_replace_map +from sphinx.util.texescape import escape, tex_replace_map try: from docutils.utils.roman import toRoman @@ -499,6 +499,9 @@ class LaTeXTranslator(SphinxTranslator): self.compact_list = 0 self.first_param = 0 + # escape helper + self.escape = escape + # sort out some elements self.elements = self.builder.context.copy() @@ -757,8 +760,7 @@ class LaTeXTranslator(SphinxTranslator): for i, (letter, entries) in enumerate(content): if i > 0: ret.append('\\indexspace\n') - ret.append('\\bigletter{%s}\n' % - str(letter).translate(tex_escape_map)) + ret.append('\\bigletter{%s}\n' % self.escape(letter)) for entry in entries: if not entry[3]: continue @@ -913,14 +915,13 @@ class LaTeXTranslator(SphinxTranslator): if not self.elements['title']: # text needs to be escaped since it is inserted into # the output literally - self.elements['title'] = node.astext().translate(tex_escape_map) + self.elements['title'] = self.escape(node.astext()) self.this_is_the_title = 0 raise nodes.SkipNode else: short = '' if node.traverse(nodes.image): - short = ('[%s]' % - ' '.join(clean_astext(node).split()).translate(tex_escape_map)) + short = ('[%s]' % self.escape(' '.join(clean_astext(node).split()))) try: self.body.append(r'\%s%s{' % (self.sectionnames[self.sectionlevel], short)) @@ -1954,8 +1955,7 @@ class LaTeXTranslator(SphinxTranslator): else: id = node.get('refuri', '')[1:].replace('#', ':') - title = node.get('title', '%s') - title = str(title).translate(tex_escape_map).replace('\\%s', '%s') + title = self.escape(node.get('title', '%s')).replace('\\%s', '%s') if '\\{name\\}' in title or '\\{number\\}' in title: # new style format (cf. "Fig.%{number}") title = title.replace('\\{name\\}', '{name}').replace('\\{number\\}', '{number}') @@ -2403,7 +2403,7 @@ class LaTeXTranslator(SphinxTranslator): def encode(self, text): # type: (str) -> str - text = str(text).translate(tex_escape_map) + text = self.escape(text) if self.literal_whitespace: # Insert a blank before the newline, to avoid # ! LaTeX Error: There's no line here to end. @@ -2614,33 +2614,31 @@ class LaTeXTranslator(SphinxTranslator): ret = [] # type: List[str] figure = self.builder.config.numfig_format['figure'].split('%s', 1) if len(figure) == 1: - ret.append('\\def\\fnum@figure{%s}\n' % - str(figure[0]).strip().translate(tex_escape_map)) + ret.append('\\def\\fnum@figure{%s}\n' % self.escape(figure[0]).strip()) else: - definition = escape_abbr(str(figure[0]).translate(tex_escape_map)) + definition = escape_abbr(self.escape(figure[0])) ret.append(self.babel_renewcommand('\\figurename', definition)) ret.append('\\makeatletter\n') ret.append('\\def\\fnum@figure{\\figurename\\thefigure{}%s}\n' % - str(figure[1]).translate(tex_escape_map)) + self.escape(figure[1])) 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' % - str(table[0]).strip().translate(tex_escape_map)) + ret.append('\\def\\fnum@table{%s}\n' % self.escape(table[0]).strip()) else: - definition = escape_abbr(str(table[0]).translate(tex_escape_map)) + definition = escape_abbr(self.escape(table[0])) ret.append(self.babel_renewcommand('\\tablename', definition)) ret.append('\\makeatletter\n') ret.append('\\def\\fnum@table{\\tablename\\thetable{}%s}\n' % - str(table[1]).translate(tex_escape_map)) + self.escape(table[1])) ret.append('\\makeatother\n') codeblock = self.builder.config.numfig_format['code-block'].split('%s', 1) if len(codeblock) == 1: pass # FIXME else: - definition = str(codeblock[0]).strip().translate(tex_escape_map) + definition = self.escape(codeblock[0]).strip() ret.append(self.babel_renewcommand('\\literalblockname', definition)) if codeblock[1]: pass # FIXME