git.iko.soy/typeable/pandoc
on master help sign in
Add support for multiprenote and multipostnote arguments in LaTeX. (#4930)

* Add support for multiprenote and multipostnote arguments. The multiprenotes occur before the first prefix of a multicite, and the multipostnotes follow the last suffix. * Add test for multiprenote and multipostnote.

commit72363cd2fc3941d921eea892d48ef5e9a4654888 authorBrian Leung <bkleung89@gmail.com> dateTue 25 Sep 2018, 20:49 (8 years ago) parent881a1e0
2 files changed+82−1
src/Text/Pandoc/Readers/LaTeX.hs+34−1 test/command/4928.md+48
src/Text/Pandoc/Readers/LaTeX.hs+34−1
@@ -662,6 +662,11 @@ bracketed parser = try $ do
662662 symbol '['
663663 mconcat <$> manyTill parser (symbol ']')
664664
665+parenWrapped :: PandocMonad m => Monoid a => LP m a -> LP m a
666+parenWrapped parser = try $ do
667+ symbol '('
668+ mconcat <$> manyTill parser (symbol ')')
669+
665670dimenarg :: PandocMonad m => LP m Text
666671dimenarg = try $ do
667672 ch <- option False $ True <$ symbol '='
@@ -1470,7 +1475,21 @@ citationLabel = do
14701475cites :: PandocMonad m => CitationMode -> Bool -> LP m [Citation]
14711476cites mode multi = try $ do
14721477 cits <- if multi
1473− then many1 simpleCiteArgs
1478+ then do
1479+ multiprenote <- optionMaybe $ toList <$> paropt
1480+ multipostnote <- optionMaybe $ toList <$> paropt
1481+ let (pre, suf) = case (multiprenote, multipostnote) of
1482+ (Just s , Nothing) -> (mempty, s)
1483+ (Nothing , Just t) -> (mempty, t)
1484+ (Just s , Just t ) -> (s, t)
1485+ _ -> (mempty, mempty)
1486+ tempCits <- many1 simpleCiteArgs
1487+ case tempCits of
1488+ (k:ks) -> case ks of
1489+ (_:_) -> return $ ((addMprenote pre k):init ks) ++
1490+ [addMpostnote suf (last ks)]
1491+ _ -> return [addMprenote pre (addMpostnote suf k)]
1492+ _ -> return [[]]
14741493 else count 1 simpleCiteArgs
14751494 let cs = concat cits
14761495 return $ case mode of
@@ -1478,6 +1497,17 @@ cites mode multi = try $ do
14781497 (c:rest) -> c {citationMode = mode} : rest
14791498 [] -> []
14801499 _ -> map (\a -> a {citationMode = mode}) cs
1500+ where mprenote (k:ks) = (k:ks) ++ [Space]
1501+ mprenote _ = mempty
1502+ mpostnote (k:ks) = [Str ",", Space] ++ (k:ks)
1503+ mpostnote _ = mempty
1504+ addMprenote mpn (k:ks) =
1505+ let mpnfinal = case citationPrefix k of
1506+ (_:_) -> mprenote mpn
1507+ _ -> mpn
1508+ in addPrefix mpnfinal (k:ks)
1509+ addMprenote _ _ = []
1510+ addMpostnote = addSuffix . mpostnote
14811511
14821512citation :: PandocMonad m => String -> CitationMode -> Bool -> LP m Inlines
14831513citation name mode multi = do
@@ -1548,6 +1578,9 @@ singleChar = try $ do
15481578opt :: PandocMonad m => LP m Inlines
15491579opt = bracketed inline <|> (str . T.unpack <$> rawopt)
15501580
1581+paropt :: PandocMonad m => LP m Inlines
1582+paropt = parenWrapped inline
1583+
15511584rawopt :: PandocMonad m => LP m Text
15521585rawopt = do
15531586 inner <- untokenize <$> bracketedToks
test/command/4928.mdnew file+48
@@ -0,0 +1,48 @@
1+```
2+% pandoc -f latex -t native
3+\cites(Multiprenote)(multipostnote)[23][42]{Knu86}[65]{Nie72}
4+^D
5+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "Multiprenote",Space,Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65",Str ",",Space,Str "multipostnote"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites(Multiprenote)(multipostnote)[23][42]{Knu86}[65]{Nie72}"]]]
6+```
7+
8+```
9+% pandoc -f latex -t native
10+\cites(Multiprenote)()[23][42]{Knu86}[65]{Nie72}
11+^D
12+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "Multiprenote",Space,Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites(Multiprenote)()[23][42]{Knu86}[65]{Nie72}"]]]
13+```
14+
15+```
16+% pandoc -f latex -t native
17+\cites()(multipostnote)[23][42]{Knu86}[65]{Nie72}
18+^D
19+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65",Str ",",Space,Str "multipostnote"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites()(multipostnote)[23][42]{Knu86}[65]{Nie72}"]]]
20+```
21+
22+```
23+% pandoc -f latex -t native
24+\cites()()[23][42]{Knu86}[65]{Nie72}
25+^D
26+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites()()[23][42]{Knu86}[65]{Nie72}"]]]
27+```
28+
29+```
30+% pandoc -f latex -t native
31+\cites(multipostnote)[23][42]{Knu86}[65]{Nie72}
32+^D
33+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65",Str ",",Space,Str "multipostnote"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites(multipostnote)[23][42]{Knu86}[65]{Nie72}"]]]
34+```
35+
36+```
37+% pandoc -f latex -t native
38+\cites(Multiprenote)(multipostnote){Knu86}
39+^D
40+[Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "Multiprenote"], citationSuffix = [Str ",",Space,Str "multipostnote"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\cites(Multiprenote)(multipostnote){Knu86}"]]]
41+```
42+
43+```
44+% pandoc -f latex -t native
45+\footcites(Multiprenote)(multipostnote)[23][42]{Knu86}[65]{Nie72}
46+^D
47+[Para [Note [Para [Cite [Citation {citationId = "Knu86", citationPrefix = [Str "Multiprenote",Space,Str "23"], citationSuffix = [Str "42"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Nie72", citationPrefix = [], citationSuffix = [Str "65",Str ",",Space,Str "multipostnote"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline (Format "latex") "\\footcites(Multiprenote)(multipostnote)[23][42]{Knu86}[65]{Nie72}"],Str "."]]]]
48+```