diff --git a/data/templates/default.latex b/data/templates/default.latex index aacb48bba..b76562f7b 100644 --- a/data/templates/default.latex +++ b/data/templates/default.latex @@ -383,10 +383,10 @@ $endif$ $endif$ \begin{document} -$if(title)$ -$if(book-class)$ +$if(has-frontmatter)$ \frontmatter $endif$ +$if(title)$ $if(beamer)$ \frame{\titlepage} $else$ @@ -430,18 +430,18 @@ $endif$ $if(lof)$ \listoffigures $endif$ -$if(book-class)$ +$if(has-frontmatter)$ \mainmatter $endif$ $body$ -$if(book-class)$ +$if(has-frontmatter)$ \backmatter $endif$ $if(natbib)$ $if(bibliography)$ $if(biblio-title)$ -$if(book-class)$ +$if(has-chapters)$ \renewcommand\bibname{$biblio-title$} $else$ \renewcommand\refname{$biblio-title$} diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index 2bfde42cf..0c9f37dc7 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -63,7 +63,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 + , stHasChapters :: Bool -- true if document has chapters , stCsquotes :: Bool -- true if document uses csquotes , stHighlighting :: Bool -- true if document has highlighted code , stIncremental :: Bool -- true if beamer lists should be displayed bit by bit @@ -88,10 +88,10 @@ startingState options = WriterState { , stUrl = False , stGraphics = False , stLHS = False - , stBook = case writerTopLevelDivision options of - TopLevelPart -> True - TopLevelChapter -> True - _ -> False + , stHasChapters = case writerTopLevelDivision options of + TopLevelPart -> True + TopLevelChapter -> True + _ -> False , stCsquotes = False , stHighlighting = False , stIncremental = writerIncremental options @@ -128,7 +128,6 @@ pandocToLaTeX options (Pandoc meta blocks) = do isInternalLink _ = [] modify $ \s -> s{ stInternalLinks = query isInternalLink blocks' } let template = fromMaybe "" $ writerTemplate options - -- set stBook depending on documentclass let colwidth = if writerWrapText options == WrapAuto then Just $ writerColumns options else Nothing @@ -138,17 +137,25 @@ pandocToLaTeX options (Pandoc meta blocks) = do (fmap render' . blockListToLaTeX) (fmap render' . inlineListToLaTeX) meta - let bookClasses = ["memoir","book","report","scrreprt","scrbook"] - let documentClass = case P.parse pDocumentClass "template" template of - Right r -> r - Left _ -> "" - case lookup "documentclass" (writerVariables options) `mplus` - fmap stringify (lookupMeta "documentclass" meta) of - Just x | x `elem` bookClasses -> modify $ \s -> s{stBook = True} - | otherwise -> return () - Nothing | documentClass `elem` bookClasses - -> modify $ \s -> s{stBook = True} - | otherwise -> return () + let chaptersClasses = ["memoir","book","report","scrreprt","scrbook"] + let frontmatterClasses = ["memoir","book","scrreprt","scrbook"] + -- these have \frontmatter etc. + beamer <- gets stBeamer + let documentClass = + case lookup "documentclass" (writerVariables options) `mplus` + fmap stringify (lookupMeta "documentclass" meta) of + Just x -> x + Nothing -> + case P.parse pDocumentClass "template" template of + Right r -> r + Left _ + | beamer -> "beamer" + | otherwise -> case writerTopLevelDivision options of + TopLevelPart -> "book" + TopLevelChapter -> "book" + _ -> "article" + when (documentClass `elem` chaptersClasses) $ + modify $ \s -> s{ stHasChapters = True } -- check for \usepackage...{csquotes}; if present, we'll use -- \enquote{...} for smart quotes: let headerIncludesField :: FromJSON a => Maybe a @@ -163,7 +170,6 @@ pandocToLaTeX options (Pandoc meta blocks) = do else case reverse blocks' of Header 1 _ il : _ -> (init blocks', il) _ -> (blocks', []) - beamer <- gets stBeamer blocks''' <- if beamer then toSlides blocks'' else return blocks'' @@ -197,17 +203,13 @@ pandocToLaTeX options (Pandoc meta blocks) = do let context = defField "toc" (writerTableOfContents options) $ defField "toc-depth" (show (writerTOCDepth options - - if stBook st + if stHasChapters st then 1 else 0)) $ defField "body" main $ defField "title-meta" titleMeta $ defField "author-meta" (intercalate "; " authorsMeta) $ - defField "documentclass" (if beamer - then ("beamer" :: String) - else if stBook st - then "book" - else "article") $ + defField "documentclass" documentClass $ defField "verbatim-in-note" (stVerbInNote st) $ defField "tables" (stTable st) $ defField "strikeout" (stStrikeout st) $ @@ -215,7 +217,8 @@ pandocToLaTeX options (Pandoc meta blocks) = do defField "numbersections" (writerNumberSections options) $ defField "lhs" (stLHS st) $ defField "graphics" (stGraphics st) $ - defField "book-class" (stBook st) $ + defField "has-chapters" (stHasChapters st) $ + defField "has-frontmatter" (documentClass `elem` frontmatterClasses) $ defField "listings" (writerListings options || stLHS st) $ defField "beamer" beamer $ (if stHighlighting st @@ -991,7 +994,7 @@ sectionHeader unnumbered ident level lst = do else braces (text "\\texorpdfstring" <> braces txt <> braces (text plain)) - book <- gets stBook + book <- gets stHasChapters opts <- gets stOptions let topLevelDivision = if book && writerTopLevelDivision opts == TopLevelDefault then TopLevelChapter