Anonymous avatar Anonymous committed 3d8e4e3

Fix handling of Verbatim within tables.

Comments (0)

Files changed (3)

doc/markup/misc.rst

    By default, Sphinx uses a table layout with ``L`` for every column.
 
    .. versionadded:: 0.2.1
+
+.. warning::
+
+   Tables that contain literal blocks cannot be set with ``tabulary``.  They are
+   therefore set with the standard LaTeX ``tabular`` environment.  Also, the
+   verbatim environment used for literal blocks only works in ``p{width}``
+   columns, which means that by default, Sphinx generates such column specs for
+   such tables.  Use the :dir:`tabularcolumns` directive to get finer control
+   over such tables.

sphinx/latexwriter.py

     def __init__(self):
         self.col = 0
         self.colcount = 0
+        self.colspec = None
         self.had_head = False
+        self.has_verbatim = False
 
 
 class Desc(object):
         if self.table:
             raise NotImplementedError('Nested tables are not supported.')
         self.table = Table()
-        self.body.append('\n\\begin{tabulary}{\\textwidth}')
+        self.tablebody = []
+        # Redirect body output until table is finished.
+        self._body = self.body
+        self.body = self.tablebody
     def depart_table(self, node):
-        self.body.append('\\end{tabulary}\n\n')
+        self.body = self._body
+        if self.table.has_verbatim:
+            self.body.append('\n\\begin{tabular}')
+        else:
+            self.body.append('\n\\begin{tabulary}{\\textwidth}')
+        if self.table.colspec:
+            self.body.append(self.table.colspec)
+        else:
+            if self.table.has_verbatim:
+                colwidth = 0.95 / self.table.colcount
+                colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount
+                self.body.append('{|' + colspec + '}\n')
+            else:
+                self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
+        self.body.extend(self.tablebody)
+        if self.table.has_verbatim:
+            self.body.append('\\end{tabular}\n\n')
+        else:
+            self.body.append('\\end{tabulary}\n\n')
         self.table = None
+        self.tablebody = None
 
     def visit_colspec(self, node):
         self.table.colcount += 1
 
     def visit_thead(self, node):
         if self.next_table_colspec:
-            self.body.append('{%s}\n' % self.next_table_colspec)
-        else:
-            self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
+            self.table.colspec = '{%s}\n' % self.next_table_colspec
         self.next_table_colspec = None
         self.body.append('\\hline\n')
         self.table.had_head = True
         hlcode = self.highlighter.highlight_block(code, lang, linenos)
         # workaround for Unicode issue
         hlcode = hlcode.replace(u'€', u'@texteuro[]')
+        # must use original Verbatim environment and "tabular" environment
+        if self.table:
+            hlcode = hlcode.replace('\\begin{Verbatim}',
+                                    '\\begin{OriginalVerbatim}')
+            self.table.has_verbatim = True
         # get consistent trailer
         hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
         hlcode = hlcode.rstrip() + '\n'
-        self.body.append('\n' + hlcode + '\\end{Verbatim}\n')
+        self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' %
+                         (self.table and 'Original' or ''))
         self.verbatim = None
     visit_doctest_block = visit_literal_block
     depart_doctest_block = depart_literal_block

sphinx/texinputs/sphinx.sty

 \newcommand{\py@modulebadkey}{{--just-some-junk--}}
 
 % Redefine the Verbatim environment to allow border and background colors.
-%
-\let\py@OldVerbatim=\Verbatim
-\let\py@OldEndVerbatim=\endVerbatim
+% The original environment is still used for verbatims within tables.
+\let\OriginalVerbatim=\Verbatim
+\let\endOriginalVerbatim=\endVerbatim
 
 % Play with vpsace to be able to keep the indentation.
 \newlength\distancetoright
   }%
   \item\MakeFramed {\FrameRestore}%
      \small%
-    \py@OldVerbatim[#1]%
+    \OriginalVerbatim[#1]%
 }
 \renewcommand{\endVerbatim}{%
-    \py@OldEndVerbatim%
+    \endOriginalVerbatim%
   \endMakeFramed%
   \endlist%
 }
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.