diff options
author | John MacFarlane <jgm@berkeley.edu> | 2011-01-14 14:45:04 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2011-01-14 14:45:04 -0800 |
commit | 81403b8d80907c85410493e27ef777c133b55ece (patch) | |
tree | 543c91ca67c35fbf59b9538bac495c23e1faa59a | |
parent | ba1d0d30707d64b783fba5428dc8abd7dddca45b (diff) | |
download | pandoc-81403b8d80907c85410493e27ef777c133b55ece.tar.gz |
LateX writer: In nonsimple tables, put cells in \parbox.
Otherwise we can get problems with linebreaks, and cell spacing
isn't right.
Thanks to Jef Allbright for pointing out the problem.
-rw-r--r-- | src/Text/Pandoc/Writers/LaTeX.hs | 21 | ||||
-rw-r--r-- | tests/tables.latex | 173 |
2 files changed, 70 insertions, 124 deletions
diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index 6ed605a05..fbf443a03 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -34,7 +34,7 @@ import Text.Pandoc.Generic import Text.Pandoc.Shared import Text.Pandoc.Templates import Text.Printf ( printf ) -import Data.List ( (\\), isSuffixOf, isPrefixOf, intercalate ) +import Data.List ( (\\), isSuffixOf, isPrefixOf, intercalate, intersperse ) import Data.Char ( toLower, isPunctuation ) import Control.Monad.State import Text.Pandoc.Pretty @@ -241,9 +241,9 @@ blockToLaTeX (Header level lst) = do blockToLaTeX (Table caption aligns widths heads rows) = do headers <- if all null heads then return empty - else liftM ($$ "\\hline") $ tableRowToLaTeX heads + else liftM ($$ "\\hline") $ (tableRowToLaTeX widths) heads captionText <- inlineListToLaTeX caption - rows' <- mapM tableRowToLaTeX rows + rows' <- mapM (tableRowToLaTeX widths) rows let colDescriptors = concat $ zipWith toColDescriptor widths aligns let tableBody = text ("\\begin{tabular}{" ++ colDescriptors ++ "}") $$ headers $$ vcat rows' $$ "\\end{tabular}" @@ -267,16 +267,19 @@ toColDescriptor width align = ">{\\PBS" ++ AlignRight -> "\\raggedleft" AlignCenter -> "\\centering" AlignDefault -> "\\raggedright") ++ - "\\hspace{0pt}}p{" ++ printf "%.2f" width ++ - "\\columnwidth}" + "\\hspace{0pt}}p{" ++ printf "%.2f" width ++ "\\columnwidth}" blockListToLaTeX :: [Block] -> State WriterState Doc blockListToLaTeX lst = mapM blockToLaTeX lst >>= return . vcat -tableRowToLaTeX :: [[Block]] -> State WriterState Doc -tableRowToLaTeX cols = mapM blockListToLaTeX cols >>= - return . ($$ text "\\\\") . foldl (\row item -> row $$ - (if isEmpty row then text "" else text " & ") <> item) empty +tableRowToLaTeX :: [Double] -> [[Block]] -> State WriterState Doc +tableRowToLaTeX widths cols = do + renderedCells <- mapM blockListToLaTeX cols + let toCell 0 c = c + toCell w c = "\\parbox{" <> text (printf "%.2f" w) <> + "\\columnwidth}{" <> c <> cr <> "}" + let cells = zipWith toCell widths renderedCells + return $ (hcat $ intersperse (" & ") cells) <> "\\\\" listItemToLaTeX :: [Block] -> State WriterState Doc listItemToLaTeX lst = blockListToLaTeX lst >>= return . (text "\\item" $$) . diff --git a/tests/tables.latex b/tests/tables.latex index 7f29b72c3..89bcf9d9f 100644 --- a/tests/tables.latex +++ b/tests/tables.latex @@ -3,27 +3,11 @@ Simple table with caption: \begin{table}[h] \begin{center} \begin{tabular}{rlcl} -Right - & Left - & Center - & Default -\\ +Right & Left & Center & Default\\ \hline -12 - & 12 - & 12 - & 12 -\\ -123 - & 123 - & 123 - & 123 -\\ -1 - & 1 - & 1 - & 1 -\\ +12 & 12 & 12 & 12\\ +123 & 123 & 123 & 123\\ +1 & 1 & 1 & 1\\ \end{tabular} \end{center} \caption{Demonstration of simple table syntax.} @@ -33,27 +17,11 @@ Simple table without caption: \begin{center} \begin{tabular}{rlcl} -Right - & Left - & Center - & Default -\\ +Right & Left & Center & Default\\ \hline -12 - & 12 - & 12 - & 12 -\\ -123 - & 123 - & 123 - & 123 -\\ -1 - & 1 - & 1 - & 1 -\\ +12 & 12 & 12 & 12\\ +123 & 123 & 123 & 123\\ +1 & 1 & 1 & 1\\ \end{tabular} \end{center} @@ -62,27 +30,11 @@ Simple table indented two spaces: \begin{table}[h] \begin{center} \begin{tabular}{rlcl} -Right - & Left - & Center - & Default -\\ +Right & Left & Center & Default\\ \hline -12 - & 12 - & 12 - & 12 -\\ -123 - & 123 - & 123 - & 123 -\\ -1 - & 1 - & 1 - & 1 -\\ +12 & 12 & 12 & 12\\ +123 & 123 & 123 & 123\\ +1 & 1 & 1 & 1\\ \end{tabular} \end{center} \caption{Demonstration of simple table syntax.} @@ -93,22 +45,23 @@ Multiline table with caption: \begin{table}[h] \begin{center} \begin{tabular}{>{\PBS\centering\hspace{0pt}}p{0.15\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.14\columnwidth}>{\PBS\raggedleft\hspace{0pt}}p{0.16\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.34\columnwidth}} -Centered Header - & Left Aligned - & Right Aligned - & Default aligned -\\ +\parbox{0.15\columnwidth}{Centered Header +} & \parbox{0.14\columnwidth}{Left Aligned +} & \parbox{0.16\columnwidth}{Right Aligned +} & \parbox{0.34\columnwidth}{Default aligned +}\\ \hline -First - & row - & 12.0 - & Example of a row that spans multiple lines. -\\ -Second - & row - & 5.0 - & Here's another one. Note the blank line between rows. -\\ +\parbox{0.15\columnwidth}{First +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{12.0 +} & \parbox{0.34\columnwidth}{Example of a row that spans multiple lines. +}\\ +\parbox{0.15\columnwidth}{Second +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{5.0 +} & \parbox{0.34\columnwidth}{Here's another one. Note the blank line between +rows. +}\\ \end{tabular} \end{center} \caption{Here's the caption. It may span multiple lines.} @@ -118,22 +71,23 @@ Multiline table without caption: \begin{center} \begin{tabular}{>{\PBS\centering\hspace{0pt}}p{0.15\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.14\columnwidth}>{\PBS\raggedleft\hspace{0pt}}p{0.16\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.34\columnwidth}} -Centered Header - & Left Aligned - & Right Aligned - & Default aligned -\\ +\parbox{0.15\columnwidth}{Centered Header +} & \parbox{0.14\columnwidth}{Left Aligned +} & \parbox{0.16\columnwidth}{Right Aligned +} & \parbox{0.34\columnwidth}{Default aligned +}\\ \hline -First - & row - & 12.0 - & Example of a row that spans multiple lines. -\\ -Second - & row - & 5.0 - & Here's another one. Note the blank line between rows. -\\ +\parbox{0.15\columnwidth}{First +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{12.0 +} & \parbox{0.34\columnwidth}{Example of a row that spans multiple lines. +}\\ +\parbox{0.15\columnwidth}{Second +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{5.0 +} & \parbox{0.34\columnwidth}{Here's another one. Note the blank line between +rows. +}\\ \end{tabular} \end{center} @@ -141,21 +95,9 @@ Table without column headers: \begin{center} \begin{tabular}{rlcr} -12 - & 12 - & 12 - & 12 -\\ -123 - & 123 - & 123 - & 123 -\\ -1 - & 1 - & 1 - & 1 -\\ +12 & 12 & 12 & 12\\ +123 & 123 & 123 & 123\\ +1 & 1 & 1 & 1\\ \end{tabular} \end{center} @@ -163,16 +105,17 @@ Multiline table without column headers: \begin{center} \begin{tabular}{>{\PBS\centering\hspace{0pt}}p{0.15\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.14\columnwidth}>{\PBS\raggedleft\hspace{0pt}}p{0.16\columnwidth}>{\PBS\raggedright\hspace{0pt}}p{0.34\columnwidth}} -First - & row - & 12.0 - & Example of a row that spans multiple lines. -\\ -Second - & row - & 5.0 - & Here's another one. Note the blank line between rows. -\\ +\parbox{0.15\columnwidth}{First +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{12.0 +} & \parbox{0.34\columnwidth}{Example of a row that spans multiple lines. +}\\ +\parbox{0.15\columnwidth}{Second +} & \parbox{0.14\columnwidth}{row +} & \parbox{0.16\columnwidth}{5.0 +} & \parbox{0.34\columnwidth}{Here's another one. Note the blank line between +rows. +}\\ \end{tabular} \end{center} |