git.iko.soy/typeable/pandoc
on master help sign in
Add support for multiprenote and multipostnote arguments in LaTeX. (#4930)
72363cdBrian Leung
src/Text/Pandoc/Readers/LaTeX.hs+34−1
@@ -662,6 +662,11 @@ bracketed parser = try $ do
662 symbol '['
662 symbol '['
663 mconcat <$> manyTill parser (symbol ']')
663 mconcat <$> manyTill parser (symbol ']')
664
664
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+
665dimenarg :: PandocMonad m => LP m Text
670dimenarg :: PandocMonad m => LP m Text
666dimenarg = try $ do
671dimenarg = try $ do
667 ch <- option False $ True <$ symbol '='
672 ch <- option False $ True <$ symbol '='
@@ -1470,7 +1475,21 @@ citationLabel = do
1470cites :: PandocMonad m => CitationMode -> Bool -> LP m [Citation]
1475cites :: PandocMonad m => CitationMode -> Bool -> LP m [Citation]
1471cites mode multi = try $ do
1476cites mode multi = try $ do
1472 cits <- if multi
1477 cits <- if multi
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)
1473− then many1 simpleCiteArgs
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 [[]]
1474 else count 1 simpleCiteArgs
1493 else count 1 simpleCiteArgs
1475 let cs = concat cits
1494 let cs = concat cits
1476 return $ case mode of
1495 return $ case mode of
@@ -1478,6 +1497,17 @@ cites mode multi = try $ do
1478 (c:rest) -> c {citationMode = mode} : rest
1497 (c:rest) -> c {citationMode = mode} : rest
1479 [] -> []
1498 [] -> []
1480 _ -> map (\a -> a {citationMode = mode}) cs
1499 _ -> 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
1481
1511
1482citation :: PandocMonad m => String -> CitationMode -> Bool -> LP m Inlines
1512citation :: PandocMonad m => String -> CitationMode -> Bool -> LP m Inlines
1483citation name mode multi = do
1513citation name mode multi = do
@@ -1548,6 +1578,9 @@ singleChar = try $ do
1548opt :: PandocMonad m => LP m Inlines
1578opt :: PandocMonad m => LP m Inlines
1549opt = bracketed inline <|> (str . T.unpack <$> rawopt)
1579opt = bracketed inline <|> (str . T.unpack <$> rawopt)
1550
1580
1581+paropt :: PandocMonad m => LP m Inlines
1582+paropt = parenWrapped inline
1583+
1551rawopt :: PandocMonad m => LP m Text
1584rawopt :: PandocMonad m => LP m Text
1552rawopt = do
1585rawopt = do
1553 inner <- untokenize <$> bracketedToks
1586 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+```