From 75ddff242281e0d1a20737527a334a1fce9af38d Mon Sep 17 00:00:00 2001 From: John MacFarlane <jgm@berkeley.edu> Date: Wed, 16 Mar 2022 14:34:47 -0700 Subject: [PATCH] Allow formatted bibliography to be placed in metadata fields. This modifies `processCitations` so that pandoc will look not just in the document body but in metadata for a Div with id `refs` in which to place the formatted bibliography. Thus, one can include a metadata field, say `refs`, whose content is an empty div with id `refs`, and the formatted bibliography will be put into this metadata field. It may then be interpolated into a template using the variable `refs`. Closes #7969. Closes #526 by providing a way to interpolate references into a template. --- MANUAL.txt | 13 +++++++++++++ src/Text/Pandoc/Citeproc.hs | 27 ++++++++++++++------------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/MANUAL.txt b/MANUAL.txt index 8351a597a..a4bb5fad8 100644 --- a/MANUAL.txt +++ b/MANUAL.txt @@ -5975,6 +5975,19 @@ The bibliography will be inserted after this heading. Note that the `unnumbered` class will be added to this heading, so that the section will not be numbered. +If you want to put the bibliography into a variable in your +template, one way to do that is to put the div with id `refs` +into a metadata field, e.g. + + --- + refs: | + ::: {#refs} + ::: + ... + +You can then put the variable `$refs$` into your template where +you want the bibliography to be placed. + ## Including uncited items in the bibliography If you want to include items in the bibliography without actually diff --git a/src/Text/Pandoc/Citeproc.hs b/src/Text/Pandoc/Citeproc.hs index 973e6bc17..d8c6d6cc3 100644 --- a/src/Text/Pandoc/Citeproc.hs +++ b/src/Text/Pandoc/Citeproc.hs @@ -108,8 +108,8 @@ processCitations (Pandoc meta bs) = do evalState (walkM insertResolvedCitations $ Pandoc meta' bs) $ cits return $ walk removeQuoteSpan - $ Pandoc meta'' - $ insertRefs refkvs classes meta'' (B.toList bibs) bs' + $ insertRefs refkvs classes (B.toList bibs) + $ Pandoc meta'' bs' removeQuoteSpan :: Inline -> Inline removeQuoteSpan (Span ("",["csl-quoted"],[]) xs) = Span nullAttr xs @@ -461,23 +461,24 @@ isYesValue _ = False -- if document contains a Div with id="refs", insert -- references as its contents. Otherwise, insert references -- at the end of the document in a Div with id="refs" -insertRefs :: [(Text,Text)] -> [Text] -> Meta -> [Block] -> [Block] -> [Block] -insertRefs _ _ _ [] bs = bs -insertRefs refkvs refclasses meta refs bs = +insertRefs :: [(Text,Text)] -> [Text] -> [Block] -> Pandoc -> Pandoc +insertRefs _ _ [] d = d +insertRefs refkvs refclasses refs (Pandoc meta bs) = if isRefRemove meta - then bs - else case runState (walkM go bs) False of - (bs', True) -> bs' - (_, False) - -> case refTitle meta of + then Pandoc meta bs + else case runState (walkM go (Pandoc meta bs)) False of + (d', True) -> d' + (Pandoc meta' bs', False) + -> Pandoc meta' $ + case refTitle meta of Nothing -> - case reverse bs of + case reverse bs' of Header lev (id',classes,kvs) ys : xs -> reverse xs ++ [Header lev (id',addUnNumbered classes,kvs) ys, Div ("refs",refclasses,refkvs) refs] - _ -> bs ++ [refDiv] - Just ils -> bs ++ + _ -> bs' ++ [refDiv] + Just ils -> bs' ++ [Header 1 ("bibliography", ["unnumbered"], []) ils, refDiv] where