git.iko.soy/typeable/pandoc
on master help sign in
LaTeX writer: use `cslreferences` environment for csl bibliographies.
0fe635dJohn MacFarlane
data/templates/default.latex+7
@@ -359,6 +359,13 @@ $for(bibliography)$
359\addbibresource{$bibliography$}
359\addbibresource{$bibliography$}
360$endfor$
360$endfor$
361$endif$
361$endif$
362+$if(csl-refs)$
363+\newlength{\cslhangindent} % set up new length
364+\setlength{\cslhangindent}{$if(csl-hanging-indent)$2em$else$0em$endif$}
365+\newenvironment{cslreferences}%
366+ {\everypar{\setlength{\hangindent}{\cslhangindent}}}%
367+ {\par} % by default, this env does not change anything
368+$endif$
362
369
363$if(title)$
370$if(title)$
364\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
371\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
src/Text/Pandoc/Writers/LaTeX.hs+18−3
@@ -72,6 +72,8 @@ data WriterState =
72 , stInternalLinks :: [String] -- list of internal link targets
72 , stInternalLinks :: [String] -- list of internal link targets
73 , stBeamer :: Bool -- produce beamer
73 , stBeamer :: Bool -- produce beamer
74 , stEmptyLine :: Bool -- true if no content on line
74 , stEmptyLine :: Bool -- true if no content on line
75+ , stHasCslRefs :: Bool -- has a Div with class refs
76+ , stCslHangingIndent :: Bool -- use hanging indent for bib
75 }
77 }
76
78
77startingState :: WriterOptions -> WriterState
79startingState :: WriterOptions -> WriterState
@@ -100,7 +102,9 @@ startingState options = WriterState {
100 , stIncremental = writerIncremental options
102 , stIncremental = writerIncremental options
101 , stInternalLinks = []
103 , stInternalLinks = []
102 , stBeamer = False
104 , stBeamer = False
103− , stEmptyLine = True }
105+ , stEmptyLine = True
106+ , stHasCslRefs = False
107+ , stCslHangingIndent = False }
104
108
105-- | Convert Pandoc to LaTeX.
109-- | Convert Pandoc to LaTeX.
106writeLaTeX :: PandocMonad m => WriterOptions -> Pandoc -> m Text
110writeLaTeX :: PandocMonad m => WriterOptions -> Pandoc -> m Text
@@ -237,6 +241,8 @@ pandocToLaTeX options (Pandoc meta blocks) = do
237 then id
241 then id
238 else defField "dir" ("ltr" :: Text)) $
242 else defField "dir" ("ltr" :: Text)) $
239 defField "section-titles" True $
243 defField "section-titles" True $
244+ defField "csl-refs" (stHasCslRefs st) $
245+ defField "csl-hanging-indent" (stCslHangingIndent st) $
240 defField "geometry" geometryFromMargins $
246 defField "geometry" geometryFromMargins $
241 (case T.unpack . render Nothing <$>
247 (case T.unpack . render Nothing <$>
242 getField "papersize" metadata of
248 getField "papersize" metadata of
@@ -456,10 +462,11 @@ toSlides bs = do
456 concat `fmap` mapM (elementToBeamer slideLevel) (hierarchicalize bs')
462 concat `fmap` mapM (elementToBeamer slideLevel) (hierarchicalize bs')
457
463
458elementToBeamer :: PandocMonad m => Int -> Element -> LW m [Block]
464elementToBeamer :: PandocMonad m => Int -> Element -> LW m [Block]
459−elementToBeamer _slideLevel (Blk (Div attr bs)) = do
465+elementToBeamer _slideLevel (Blk (Div attrs bs)) = do
460 -- make sure we support "blocks" inside divs
466 -- make sure we support "blocks" inside divs
461 bs' <- concat `fmap` mapM (elementToBeamer 0) (hierarchicalize bs)
467 bs' <- concat `fmap` mapM (elementToBeamer 0) (hierarchicalize bs)
462− return [Div attr bs']
468+ return [Div attrs bs']
469+
463elementToBeamer _slideLevel (Blk b) = return [b]
470elementToBeamer _slideLevel (Blk b) = return [b]
464elementToBeamer slideLevel (Sec lvl _num (ident,classes,kvs) tit elts)
471elementToBeamer slideLevel (Sec lvl _num (ident,classes,kvs) tit elts)
465 | lvl > slideLevel = do
472 | lvl > slideLevel = do
@@ -547,6 +554,14 @@ blockToLaTeX (Div (identifier,classes,kvs) bs)
547 modify $ \s -> s{ stIncremental = oldIncremental }
554 modify $ \s -> s{ stIncremental = oldIncremental }
548 return result
555 return result
549 else blockToLaTeX $ Div (identifier,classes',kvs) bs
556 else blockToLaTeX $ Div (identifier,classes',kvs) bs
557+ | identifier == "refs" = do
558+ modify $ \st -> st{ stHasCslRefs = True
559+ , stCslHangingIndent =
560+ "hanging-indent" `elem` classes }
561+ contents <- blockListToLaTeX bs
562+ return $ "\\begin{cslreferences}" $$
563+ contents $$
564+ "\\end{cslreferences}"
550 | otherwise = do
565 | otherwise = do
551 beamer <- gets stBeamer
566 beamer <- gets stBeamer
552 linkAnchor' <- hypertarget True identifier empty
567 linkAnchor' <- hypertarget True identifier empty