aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Writers')
-rw-r--r--src/Text/Pandoc/Writers/LaTeX.hs28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs
index b9e7e42a8..4ce2b44d1 100644
--- a/src/Text/Pandoc/Writers/LaTeX.hs
+++ b/src/Text/Pandoc/Writers/LaTeX.hs
@@ -32,7 +32,7 @@ import Text.Pandoc.Definition
import Text.Pandoc.Shared
import Text.Pandoc.Templates
import Text.Printf ( printf )
-import Data.List ( (\\), isSuffixOf, intersperse )
+import Data.List ( (\\), isSuffixOf, isPrefixOf, intersperse )
import Data.Char ( toLower )
import Control.Monad.State
import Text.PrettyPrint.HughesPJ hiding ( Str )
@@ -50,6 +50,7 @@ data WriterState =
, stUrl :: Bool -- true if document has visible URL link
, stGraphics :: Bool -- true if document contains images
, stLHS :: Bool -- true if document has literate haskell code
+ , stBook :: Bool -- true if document uses book or memoir class
}
-- | Convert Pandoc to LaTeX.
@@ -60,10 +61,16 @@ writeLaTeX options document =
stVerbInNote = False, stEnumerate = False,
stTable = False, stStrikeout = False, stSubscript = False,
stLink = False, stUrl = False, stGraphics = False,
- stLHS = False }
+ stLHS = False, stBook = False }
pandocToLaTeX :: WriterOptions -> Pandoc -> State WriterState String
pandocToLaTeX options (Pandoc (Meta title authors date) blocks) = do
+ let template = writerTemplate options
+ let usesBookClass x = "\\documentclass" `isPrefixOf` x &&
+ ("{memoir}" `isSuffixOf` x || "{book}" `isSuffixOf` x ||
+ "{report}" `isSuffixOf` x)
+ when (any usesBookClass (lines template)) $
+ modify $ \s -> s{stBook = True}
titletext <- liftM render $ inlineListToLaTeX title
authorsText <- mapM (liftM render . inlineListToLaTeX) authors
dateText <- liftM render $ inlineListToLaTeX date
@@ -93,7 +100,7 @@ pandocToLaTeX options (Pandoc (Meta title authors date) blocks) = do
[ ("lhs", "yes") | stLHS st ] ++
[ ("graphics", "yes") | stGraphics st ]
return $ if writerStandalone options
- then renderTemplate context $ writerTemplate options
+ then renderTemplate context template
else main
-- escape things as needed for LaTeX
@@ -195,10 +202,17 @@ blockToLaTeX (Header level lst) = do
else do
res <- inlineListToLaTeX lstNoNotes
return $ char '[' <> res <> char ']'
- return $ if (level > 0) && (level <= 3)
- then text ("\\" ++ (concat (replicate (level - 1) "sub")) ++
- "section") <> optional <> char '{' <> txt <> text "}\n"
- else txt <> char '\n'
+ let stuffing = optional <> char '{' <> txt <> char '}'
+ book <- liftM stBook get
+ return $ case (book, level) of
+ (True, 1) -> text "\\chapter" <> stuffing <> char '\n'
+ (True, 2) -> text "\\section" <> stuffing <> char '\n'
+ (True, 3) -> text "\\subsection" <> stuffing <> char '\n'
+ (True, 4) -> text "\\subsubsection" <> stuffing <> char '\n'
+ (False, 1) -> text "\\section" <> stuffing <> char '\n'
+ (False, 2) -> text "\\subsection" <> stuffing <> char '\n'
+ (False, 3) -> text "\\subsubsection" <> stuffing <> char '\n'
+ _ -> txt <> char '\n'
blockToLaTeX (Table caption aligns widths heads rows) = do
headers <- tableRowToLaTeX heads
captionText <- inlineListToLaTeX caption