LaTeX writer: Fix tables

- [x] Fix a bug introduced in 66378062b6, which
  causes the table caption to repeat across all pages
- [x] Address the issues discussed
  [here](https://groups.google.com/forum/#!msg/pandoc-discuss/qMu6_5lYy0o/ZAU7lzAIKw0J)
  regarding the extra vertical space.
  - [ ] NOTE: This will cause multiline table cells to appear unpadded. See
    http://tex.stackexchange.com/questions/34971
  - [x] Use [`\tabularnewline`](http://tex.stackexchange.com/questions/78796)
    instead of `\\`.
This commit is contained in:
Jose Luis Duran 2014-08-28 02:02:20 +00:00
parent 8f2aa45d69
commit f1d330b7b5
2 changed files with 74 additions and 65 deletions

View file

@ -471,12 +471,18 @@ blockToLaTeX (Header level (id',classes,_) lst) =
blockToLaTeX (Table caption aligns widths heads rows) = do
headers <- if all null heads
then return empty
else ($$ "\\midrule\\endhead") `fmap`
else ($$ "\\midrule\n") `fmap`
(tableRowToLaTeX True aligns widths) heads
let endhead = if all null heads
then empty
else text "\\endhead"
captionText <- inlineListToLaTeX caption
let capt = if isEmpty captionText
then empty
else text "\\caption" <> braces captionText <> "\\\\"
else text "\\caption" <> braces captionText
<> "\\tabularnewline\n\\toprule\n"
<> headers
<> "\\endfirsthead"
rows' <- mapM (tableRowToLaTeX False aligns widths) rows
let colDescriptors = text $ concat $ map toColDescriptor aligns
modify $ \s -> s{ stTable = True }
@ -484,8 +490,9 @@ blockToLaTeX (Table caption aligns widths heads rows) = do
braces ("@{}" <> colDescriptors <> "@{}")
-- the @{} removes extra space at beginning and end
$$ capt
$$ "\\toprule\\addlinespace"
$$ "\\toprule"
$$ headers
$$ endhead
$$ vcat rows'
$$ "\\bottomrule"
$$ "\\end{longtable}"
@ -512,7 +519,7 @@ tableRowToLaTeX header aligns widths cols = do
let scaleFactor = 0.97 ** fromIntegral (length aligns)
let widths' = map (scaleFactor *) widths
cells <- mapM (tableCellToLaTeX header) $ zip3 widths' aligns cols
return $ hsep (intersperse "&" cells) $$ "\\\\\\addlinespace"
return $ hsep (intersperse "&" cells) <> "\\tabularnewline"
-- For simple latex tables (without minipages or parboxes),
-- we need to go to some lengths to get line breaks working:

View file

@ -1,58 +1,57 @@
Simple table with caption:
\begin{longtable}[c]{@{}rlcl@{}}
\caption{Demonstration of simple table syntax.}\\
\toprule\addlinespace
Right & Left & Center & Default
\\\addlinespace
\midrule\endhead
12 & 12 & 12 & 12
\\\addlinespace
123 & 123 & 123 & 123
\\\addlinespace
1 & 1 & 1 & 1
\\\addlinespace
\caption{Demonstration of simple table syntax.}\tabularnewline
\toprule
Right & Left & Center & Default\tabularnewline
\midrule
\endfirsthead
\toprule
Right & Left & Center & Default\tabularnewline
\midrule
\endhead
12 & 12 & 12 & 12\tabularnewline
123 & 123 & 123 & 123\tabularnewline
1 & 1 & 1 & 1\tabularnewline
\bottomrule
\end{longtable}
Simple table without caption:
\begin{longtable}[c]{@{}rlcl@{}}
\toprule\addlinespace
Right & Left & Center & Default
\\\addlinespace
\midrule\endhead
12 & 12 & 12 & 12
\\\addlinespace
123 & 123 & 123 & 123
\\\addlinespace
1 & 1 & 1 & 1
\\\addlinespace
\toprule
Right & Left & Center & Default\tabularnewline
\midrule
\endhead
12 & 12 & 12 & 12\tabularnewline
123 & 123 & 123 & 123\tabularnewline
1 & 1 & 1 & 1\tabularnewline
\bottomrule
\end{longtable}
Simple table indented two spaces:
\begin{longtable}[c]{@{}rlcl@{}}
\caption{Demonstration of simple table syntax.}\\
\toprule\addlinespace
Right & Left & Center & Default
\\\addlinespace
\midrule\endhead
12 & 12 & 12 & 12
\\\addlinespace
123 & 123 & 123 & 123
\\\addlinespace
1 & 1 & 1 & 1
\\\addlinespace
\caption{Demonstration of simple table syntax.}\tabularnewline
\toprule
Right & Left & Center & Default\tabularnewline
\midrule
\endfirsthead
\toprule
Right & Left & Center & Default\tabularnewline
\midrule
\endhead
12 & 12 & 12 & 12\tabularnewline
123 & 123 & 123 & 123\tabularnewline
1 & 1 & 1 & 1\tabularnewline
\bottomrule
\end{longtable}
Multiline table with caption:
\begin{longtable}[c]{@{}clrl@{}}
\caption{Here's the caption. It may span multiple lines.}\\
\toprule\addlinespace
\caption{Here's the caption. It may span multiple lines.}\tabularnewline
\toprule
\begin{minipage}[b]{0.13\columnwidth}\centering
Centered Header
\end{minipage} & \begin{minipage}[b]{0.12\columnwidth}\raggedright
@ -61,9 +60,21 @@ Left Aligned
Right Aligned
\end{minipage} & \begin{minipage}[b]{0.30\columnwidth}\raggedright
Default aligned
\end{minipage}
\\\addlinespace
\midrule\endhead
\end{minipage}\tabularnewline
\midrule
\endfirsthead
\toprule
\begin{minipage}[b]{0.13\columnwidth}\centering
Centered Header
\end{minipage} & \begin{minipage}[b]{0.12\columnwidth}\raggedright
Left Aligned
\end{minipage} & \begin{minipage}[b]{0.14\columnwidth}\raggedleft
Right Aligned
\end{minipage} & \begin{minipage}[b]{0.30\columnwidth}\raggedright
Default aligned
\end{minipage}\tabularnewline
\midrule
\endhead
\begin{minipage}[t]{0.13\columnwidth}\centering
First
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -72,8 +83,7 @@ row
12.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Example of a row that spans multiple lines.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\begin{minipage}[t]{0.13\columnwidth}\centering
Second
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -82,15 +92,14 @@ row
5.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Here's another one. Note the blank line between rows.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\bottomrule
\end{longtable}
Multiline table without caption:
\begin{longtable}[c]{@{}clrl@{}}
\toprule\addlinespace
\toprule
\begin{minipage}[b]{0.13\columnwidth}\centering
Centered Header
\end{minipage} & \begin{minipage}[b]{0.12\columnwidth}\raggedright
@ -99,9 +108,9 @@ Left Aligned
Right Aligned
\end{minipage} & \begin{minipage}[b]{0.30\columnwidth}\raggedright
Default aligned
\end{minipage}
\\\addlinespace
\midrule\endhead
\end{minipage}\tabularnewline
\midrule
\endhead
\begin{minipage}[t]{0.13\columnwidth}\centering
First
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -110,8 +119,7 @@ row
12.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Example of a row that spans multiple lines.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\begin{minipage}[t]{0.13\columnwidth}\centering
Second
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -120,28 +128,24 @@ row
5.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Here's another one. Note the blank line between rows.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\bottomrule
\end{longtable}
Table without column headers:
\begin{longtable}[c]{@{}rlcr@{}}
\toprule\addlinespace
12 & 12 & 12 & 12
\\\addlinespace
123 & 123 & 123 & 123
\\\addlinespace
1 & 1 & 1 & 1
\\\addlinespace
\toprule
12 & 12 & 12 & 12\tabularnewline
123 & 123 & 123 & 123\tabularnewline
1 & 1 & 1 & 1\tabularnewline
\bottomrule
\end{longtable}
Multiline table without column headers:
\begin{longtable}[c]{@{}clrl@{}}
\toprule\addlinespace
\toprule
\begin{minipage}[t]{0.13\columnwidth}\centering
First
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -150,8 +154,7 @@ row
12.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Example of a row that spans multiple lines.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\begin{minipage}[t]{0.13\columnwidth}\centering
Second
\end{minipage} & \begin{minipage}[t]{0.12\columnwidth}\raggedright
@ -160,7 +163,6 @@ row
5.0
\end{minipage} & \begin{minipage}[t]{0.30\columnwidth}\raggedright
Here's another one. Note the blank line between rows.
\end{minipage}
\\\addlinespace
\end{minipage}\tabularnewline
\bottomrule
\end{longtable}