Skip to content

Commit 716607f

Browse files
authored
Merge pull request #6838 from tk0miya/6837_nested_table
Close #6837: LaTeX: Support a nested table
2 parents 26cd301 + 72fa75c commit 716607f

File tree

5 files changed

+46
-5
lines changed

5 files changed

+46
-5
lines changed

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Features added
2121
* #6910: inheritance_diagram: Make the background of diagrams transparent
2222
* #6446: duration: Add ``sphinx.ext.durations`` to inspect which documents slow
2323
down the build
24+
* #6837: LaTeX: Support a nested table
2425

2526
Bugs fixed
2627
----------

sphinx/writers/latex.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ def __init__(self, document: nodes.document, builder: "LaTeXBuilder") -> None:
646646
latex_engine=self.config.latex_engine)
647647
self.context = [] # type: List[Any]
648648
self.descstack = [] # type: List[str]
649-
self.table = None # type: Table
649+
self.tables = [] # type: List[Table]
650650
self.next_table_colspec = None # type: str
651651
self.bodystack = [] # type: List[List[str]]
652652
self.footnote_restricted = None # type: nodes.Element
@@ -783,6 +783,14 @@ def render(self, template_name: str, variables: Dict) -> str:
783783

784784
return renderer.render(template_name, variables)
785785

786+
@property
787+
def table(self) -> Table:
788+
"""Get current table."""
789+
if self.tables:
790+
return self.tables[-1]
791+
else:
792+
return None
793+
786794
def visit_document(self, node: Element) -> None:
787795
self.curfilestack.append(node.get('docname', ''))
788796
if self.first_document == 1:
@@ -1079,11 +1087,21 @@ def visit_tabular_col_spec(self, node: Element) -> None:
10791087
raise nodes.SkipNode
10801088

10811089
def visit_table(self, node: Element) -> None:
1082-
if self.table:
1090+
if len(self.tables) == 1:
1091+
if self.table.get_table_type() == 'longtable':
1092+
raise UnsupportedError(
1093+
'%s:%s: longtable does not support nesting a table.' %
1094+
(self.curfilestack[-1], node.line or ''))
1095+
else:
1096+
# change type of parent table to tabular
1097+
# see https://groups.google.com/d/msg/sphinx-users/7m3NeOBixeo/9LKP2B4WBQAJ
1098+
self.table.has_problematic = True
1099+
elif len(self.tables) > 2:
10831100
raise UnsupportedError(
1084-
'%s:%s: nested tables are not yet implemented.' %
1101+
'%s:%s: deeply nested tables are not implemented.' %
10851102
(self.curfilestack[-1], node.line or ''))
1086-
self.table = Table(node)
1103+
1104+
self.tables.append(Table(node))
10871105
if self.next_table_colspec:
10881106
self.table.colspec = '{%s}\n' % self.next_table_colspec
10891107
if 'colwidths-given' in node.get('classes', []):
@@ -1100,7 +1118,7 @@ def depart_table(self, node: Element) -> None:
11001118
self.body.append(table)
11011119
self.body.append("\n")
11021120

1103-
self.table = None
1121+
self.tables.pop()
11041122

11051123
def visit_colspec(self, node: Element) -> None:
11061124
self.table.colcount += 1

tests/roots/test-nested-tables/conf.py

Whitespace-only changes.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
nested-tables
2+
=============
3+
4+
.. list-table::
5+
:header-rows: 1
6+
7+
* - heading
8+
- heading
9+
* - content
10+
- .. list-table::
11+
:header-rows: 1
12+
13+
* - heading
14+
- heading
15+
* - content
16+
- content

tests/test_build_latex.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,3 +1470,9 @@ def test_latex_elements_extrapackages(app, status, warning):
14701470
app.builder.build_all()
14711471
result = (app.outdir / 'test.tex').text()
14721472
assert r'\usepackage{foo}' in result
1473+
1474+
1475+
@pytest.mark.sphinx('latex', testroot='nested-tables')
1476+
def test_latex_nested_tables(app, status, warning):
1477+
app.builder.build_all()
1478+
assert '' == warning.getvalue()

0 commit comments

Comments
 (0)