diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index ccd7a8bf2..b534ce534 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -40,6 +40,7 @@ HEADER = r'''%% Generated by Sphinx. %(fncychap)s %(longtable)s \usepackage{sphinx} +\usepackage{multirow} %(preamble)s \title{%(title)s} @@ -251,6 +252,9 @@ class LaTeXTranslator(nodes.NodeVisitor): self.no_contractions = 0 self.compact_list = 0 self.first_param = 0 + self.previous_spanning_row = 0 + self.previous_spanning_column = 0 + self.remember_multirow = {} def astext(self): return (HEADER % self.elements + @@ -715,22 +719,41 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_row(self, node): self.table.col = 0 def depart_row(self, node): - self.body.append('\\\\\\hline\n') + if self.previous_spanning_row == 1: + self.previous_spanning_row = 0 + self.body.append('\\\\\n') + else: + self.body.append('\\\\\\hline\n') self.table.rowcount += 1 def visit_entry(self, node): - if 'morerows' in node or 'morecols' in node: - raise UnsupportedError('%s:%s: column or row spanning cells are ' - 'not yet implemented.' % - (self.curfilestack[-1], node.line or '')) + if self.remember_multirow.has_key('0') and self.remember_multirow['0'] > 1: + self.body.append(' & ') if self.table.col > 0: self.body.append(' & ') self.table.col += 1 + self.context.append('') + if 'morerows' in node: + self.body.append(' \multirow{') + self.previous_spanning_row = 1 + self.body.append(str(node.get('morerows') + 1)) + self.body.append('}{*}{') + self.context.append('}') + self.remember_multirow[str(self.table.col)] = node.get('morerows') + 1; + if 'morecols' in node: + self.body.append(' \multicolumn{') + self.body.append(str(node.get('morecols') + 1)) + if self.table.col == 1: + self.body.append('}{|l|}{') + else: + self.body.append('}{l|}{') + self.context.append('}') if isinstance(node.parent.parent, nodes.thead): self.body.append('\\textbf{') self.context.append('}') - else: - self.context.append('') + if self.remember_multirow.has_key(str(self.table.col + 1)) and self.remember_multirow[str(self.table.col + 1)] > 1: + self.remember_multirow[str(self.table.col + 1)] -= 1 + self.context.append(' & ') def depart_entry(self, node): self.body.append(self.context.pop()) # header