git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: use raw latex as fallback for Cites.

This way you can still get the raw latex back, even if you don't process with citeproc. Previously, cites were not visible at all unless you specified --biblio on the command line and converted them using citeproc, or used --natbib or --biblatex.

commitdf3f3ddb6eacc01b2462a862eb7bf8ee6db6b9f7 authorJohn MacFarlane <fiddlosopher@gmail.com> dateMon 6 Feb 2012, 12:41 (15 years ago) parent630c9f8
3 files changed+82−76
src/Tests/Readers/LaTeX.hs+24−22 src/Text/Pandoc/Readers/LaTeX.hs+57−53 tests/latex-reader.native+1−1
src/Tests/Readers/LaTeX.hs+24−22
@@ -7,7 +7,6 @@ import Tests.Helpers
77import Tests.Arbitrary()
88import Text.Pandoc.Builder
99import Text.Pandoc
10−import Data.Monoid (mempty)
1110
1211latex :: String -> Pandoc
1312latex = readLaTeX defaultParserState
@@ -65,16 +64,19 @@ baseCitation = Citation{ citationId = "item1"
6564 , citationNoteNum = 0
6665 , citationHash = 0 }
6766
67+rt :: String -> Inlines
68+rt = rawInline "latex"
69+
6870natbibCitations :: Test
6971natbibCitations = testGroup "natbib"
7072 [ "citet" =: "\\citet{item1}"
71− =?> para (cite [baseCitation] mempty)
73+ =?> para (cite [baseCitation] (rt "\\citet{item1}"))
7274 , "suffix" =: "\\citet[p.~30]{item1}"
7375 =?> para
74− (cite [baseCitation{ citationSuffix = toList $ text "p.\160\&30" }] mempty)
76+ (cite [baseCitation{ citationSuffix = toList $ text "p.\160\&30" }] (rt "\\citet[p.~30]{item1}"))
7577 , "suffix long" =: "\\citet[p.~30, with suffix]{item1}"
7678 =?> para (cite [baseCitation{ citationSuffix =
77− toList $ text "p.\160\&30, with suffix" }] mempty)
79+ toList $ text "p.\160\&30, with suffix" }] (rt "\\citet[p.~30, with suffix]{item1}"))
7880 , "multiple" =: "\\citeauthor{item1} \\citetext{\\citeyear{item1}; \\citeyear[p.~30]{item2}; \\citealp[see also][]{item3}}"
7981 =?> para (cite [baseCitation{ citationMode = AuthorInText }
8082 ,baseCitation{ citationMode = SuppressAuthor
@@ -83,7 +85,7 @@ natbibCitations = testGroup "natbib"
8385 ,baseCitation{ citationId = "item3"
8486 , citationPrefix = [Str "see",Space,Str "also"]
8587 , citationMode = NormalCitation }
86− ] mempty)
88+ ] (rt "\\citetext{\\citeyear{item1}; \\citeyear[p.~30]{item2}; \\citealp[see also][]{item3}}"))
8789 , "group" =: "\\citetext{\\citealp[see][p.~34--35]{item1}; \\citealp[also][chap. 3]{item3}}"
8890 =?> para (cite [baseCitation{ citationMode = NormalCitation
8991 , citationPrefix = [Str "see"]
@@ -92,36 +94,36 @@ natbibCitations = testGroup "natbib"
9294 , citationId = "item3"
9395 , citationPrefix = [Str "also"]
9496 , citationSuffix = [Str "chap.",Space,Str "3"] }
95− ] mempty)
97+ ] (rt "\\citetext{\\citealp[see][p.~34--35]{item1}; \\citealp[also][chap. 3]{item3}}"))
9698 , "suffix and locator" =: "\\citep[pp.~33, 35--37, and nowhere else]{item1}"
9799 =?> para (cite [baseCitation{ citationMode = NormalCitation
98− , citationSuffix = [Str "pp.\160\&33,",Space,Str "35\8211\&37,",Space,Str "and",Space,Str "nowhere",Space, Str "else"] }] mempty)
100+ , citationSuffix = [Str "pp.\160\&33,",Space,Str "35\8211\&37,",Space,Str "and",Space,Str "nowhere",Space, Str "else"] }] (rt "\\citep[pp.~33, 35--37, and nowhere else]{item1}"))
99101 , "suffix only" =: "\\citep[and nowhere else]{item1}"
100102 =?> para (cite [baseCitation{ citationMode = NormalCitation
101− , citationSuffix = toList $ text "and nowhere else" }] mempty)
103+ , citationSuffix = toList $ text "and nowhere else" }] (rt "\\citep[and nowhere else]{item1}"))
102104 , "no author" =: "\\citeyearpar{item1}, and now Doe with a locator \\citeyearpar[p.~44]{item2}"
103− =?> para (cite [baseCitation{ citationMode = SuppressAuthor }] mempty <>
105+ =?> para (cite [baseCitation{ citationMode = SuppressAuthor }] (rt "\\citeyearpar{item1}") <>
104106 text ", and now Doe with a locator " <>
105107 cite [baseCitation{ citationMode = SuppressAuthor
106108 , citationSuffix = [Str "p.\160\&44"]
107− , citationId = "item2" }] mempty)
109+ , citationId = "item2" }] (rt "\\citeyearpar[p.~44]{item2}"))
108110 , "markup" =: "\\citep[\\emph{see}][p. \\textbf{32}]{item1}"
109111 =?> para (cite [baseCitation{ citationMode = NormalCitation
110112 , citationPrefix = [Emph [Str "see"]]
111113 , citationSuffix = [Str "p.",Space,
112− Strong [Str "32"]] }] mempty)
114+ Strong [Str "32"]] }] (rt "\\citep[\\emph{see}][p. \\textbf{32}]{item1}"))
113115 ]
114116
115117biblatexCitations :: Test
116118biblatexCitations = testGroup "biblatex"
117119 [ "textcite" =: "\\textcite{item1}"
118− =?> para (cite [baseCitation] mempty)
120+ =?> para (cite [baseCitation] (rt "\\textcite{item1}"))
119121 , "suffix" =: "\\textcite[p.~30]{item1}"
120122 =?> para
121− (cite [baseCitation{ citationSuffix = toList $ text "p.\160\&30" }] mempty)
123+ (cite [baseCitation{ citationSuffix = toList $ text "p.\160\&30" }] (rt "\\textcite[p.~30]{item1}"))
122124 , "suffix long" =: "\\textcite[p.~30, with suffix]{item1}"
123125 =?> para (cite [baseCitation{ citationSuffix =
124− toList $ text "p.\160\&30, with suffix" }] mempty)
126+ toList $ text "p.\160\&30, with suffix" }] (rt "\\textcite[p.~30, with suffix]{item1}"))
125127 , "multiple" =: "\\textcites{item1}[p.~30]{item2}[see also][]{item3}"
126128 =?> para (cite [baseCitation{ citationMode = AuthorInText }
127129 ,baseCitation{ citationMode = NormalCitation
@@ -130,7 +132,7 @@ biblatexCitations = testGroup "biblatex"
130132 ,baseCitation{ citationId = "item3"
131133 , citationPrefix = [Str "see",Space,Str "also"]
132134 , citationMode = NormalCitation }
133− ] mempty)
135+ ] (rt "\\textcites{item1}[p.~30]{item2}[see also][]{item3}"))
134136 , "group" =: "\\autocites[see][p.~34--35]{item1}[also][chap. 3]{item3}"
135137 =?> para (cite [baseCitation{ citationMode = NormalCitation
136138 , citationPrefix = [Str "see"]
@@ -139,24 +141,24 @@ biblatexCitations = testGroup "biblatex"
139141 , citationId = "item3"
140142 , citationPrefix = [Str "also"]
141143 , citationSuffix = [Str "chap.",Space,Str "3"] }
142− ] mempty)
144+ ] (rt "\\autocites[see][p.~34--35]{item1}[also][chap. 3]{item3}"))
143145 , "suffix and locator" =: "\\autocite[pp.~33, 35--37, and nowhere else]{item1}"
144146 =?> para (cite [baseCitation{ citationMode = NormalCitation
145− , citationSuffix = [Str "pp.\160\&33,",Space,Str "35\8211\&37,",Space,Str "and",Space,Str "nowhere",Space, Str "else"] }] mempty)
147+ , citationSuffix = [Str "pp.\160\&33,",Space,Str "35\8211\&37,",Space,Str "and",Space,Str "nowhere",Space, Str "else"] }] (rt "\\autocite[pp.~33, 35--37, and nowhere else]{item1}"))
146148 , "suffix only" =: "\\autocite[and nowhere else]{item1}"
147149 =?> para (cite [baseCitation{ citationMode = NormalCitation
148− , citationSuffix = toList $ text "and nowhere else" }] mempty)
150+ , citationSuffix = toList $ text "and nowhere else" }] (rt "\\autocite[and nowhere else]{item1}"))
149151 , "no author" =: "\\autocite*{item1}, and now Doe with a locator \\autocite*[p.~44]{item2}"
150− =?> para (cite [baseCitation{ citationMode = SuppressAuthor }] mempty <>
152+ =?> para (cite [baseCitation{ citationMode = SuppressAuthor }] (rt "\\autocite*{item1}") <>
151153 text ", and now Doe with a locator " <>
152154 cite [baseCitation{ citationMode = SuppressAuthor
153155 , citationSuffix = [Str "p.\160\&44"]
154− , citationId = "item2" }] mempty)
156+ , citationId = "item2" }] (rt "\\autocite*[p.~44]{item2}"))
155157 , "markup" =: "\\autocite[\\emph{see}][p. \\textbf{32}]{item1}"
156158 =?> para (cite [baseCitation{ citationMode = NormalCitation
157159 , citationPrefix = [Emph [Str "see"]]
158160 , citationSuffix = [Str "p.",Space,
159− Strong [Str "32"]] }] mempty)
161+ Strong [Str "32"]] }] (rt "\\autocite[\\emph{see}][p. \\textbf{32}]{item1}"))
160162 , "parencite" =: "\\parencite{item1}"
161− =?> para (cite [baseCitation{ citationMode = NormalCitation }] mempty)
163+ =?> para (cite [baseCitation{ citationMode = NormalCitation }] (rt "\\parencite{item1}"))
162164 ]
src/Text/Pandoc/Readers/LaTeX.hs+57−53
@@ -250,7 +250,8 @@ blockCommands = M.fromList $
250250 -- newcommand, etc. should be parsed by macro, but we need this
251251 -- here so these aren't parsed as inline commands to ignore
252252 , "special", "pdfannot", "pdfstringdef"
253− , "bibliography", "maketitle", "makeindex", "makeglossary"
253+ , "bibliography", "bibliographystyle"
254+ , "maketitle", "makeindex", "makeglossary"
254255 , "addcontentsline", "addtocontents", "addtocounter"
255256 -- \ignore{} is used conventionally in literate haskell for definitions
256257 -- that are to be processed by the compiler but not printed.
@@ -394,60 +395,60 @@ inlineCommands = M.fromList $
394395 pure (link url "" lab))
395396 , ("includegraphics", optional opt *> (unescapeURL <$> braced) >>=
396397 (\src -> pure (image src "" (str "image"))))
397− , ("cite", citation NormalCitation False)
398− , ("citep", citation NormalCitation False)
399− , ("citep*", citation NormalCitation False)
400− , ("citeal", citation NormalCitation False)
401− , ("citealp", citation NormalCitation False)
402− , ("citealp*", citation NormalCitation False)
403− , ("autocite", citation NormalCitation False)
404− , ("footcite", citation NormalCitation False)
405− , ("parencite", citation NormalCitation False)
406− , ("supercite", citation NormalCitation False)
407− , ("footcitetext", citation NormalCitation False)
408− , ("citeyearpar", citation SuppressAuthor False)
409− , ("citeyear", citation SuppressAuthor False)
410− , ("autocite*", citation SuppressAuthor False)
411− , ("cite*", citation SuppressAuthor False)
412− , ("parencite*", citation SuppressAuthor False)
413− , ("textcite", citation AuthorInText False)
414− , ("citet", citation AuthorInText False)
415− , ("citet*", citation AuthorInText False)
416− , ("citealt", citation AuthorInText False)
417− , ("citealt*", citation AuthorInText False)
418− , ("textcites", citation AuthorInText True)
419− , ("cites", citation NormalCitation True)
420− , ("autocites", citation NormalCitation True)
421− , ("footcites", citation NormalCitation True)
422− , ("parencites", citation NormalCitation True)
423− , ("supercites", citation NormalCitation True)
424− , ("footcitetexts", citation NormalCitation True)
425− , ("Autocite", citation NormalCitation False)
426− , ("Footcite", citation NormalCitation False)
427− , ("Parencite", citation NormalCitation False)
428− , ("Supercite", citation NormalCitation False)
429− , ("Footcitetext", citation NormalCitation False)
430− , ("Citeyearpar", citation SuppressAuthor False)
431− , ("Citeyear", citation SuppressAuthor False)
432− , ("Autocite*", citation SuppressAuthor False)
433− , ("Cite*", citation SuppressAuthor False)
434− , ("Parencite*", citation SuppressAuthor False)
435− , ("Textcite", citation AuthorInText False)
436− , ("Textcites", citation AuthorInText True)
437− , ("Cites", citation NormalCitation True)
438− , ("Autocites", citation NormalCitation True)
439− , ("Footcites", citation NormalCitation True)
440− , ("Parencites", citation NormalCitation True)
441− , ("Supercites", citation NormalCitation True)
442− , ("Footcitetexts", citation NormalCitation True)
398+ , ("cite", citation "cite" NormalCitation False)
399+ , ("citep", citation "citep" NormalCitation False)
400+ , ("citep*", citation "citep*" NormalCitation False)
401+ , ("citeal", citation "citeal" NormalCitation False)
402+ , ("citealp", citation "citealp" NormalCitation False)
403+ , ("citealp*", citation "citealp*" NormalCitation False)
404+ , ("autocite", citation "autocite" NormalCitation False)
405+ , ("footcite", citation "footcite" NormalCitation False)
406+ , ("parencite", citation "parencite" NormalCitation False)
407+ , ("supercite", citation "supercite" NormalCitation False)
408+ , ("footcitetext", citation "footcitetext" NormalCitation False)
409+ , ("citeyearpar", citation "citeyearpar" SuppressAuthor False)
410+ , ("citeyear", citation "citeyear" SuppressAuthor False)
411+ , ("autocite*", citation "autocite*" SuppressAuthor False)
412+ , ("cite*", citation "cite*" SuppressAuthor False)
413+ , ("parencite*", citation "parencite*" SuppressAuthor False)
414+ , ("textcite", citation "textcite" AuthorInText False)
415+ , ("citet", citation "citet" AuthorInText False)
416+ , ("citet*", citation "citet*" AuthorInText False)
417+ , ("citealt", citation "citealt" AuthorInText False)
418+ , ("citealt*", citation "citealt*" AuthorInText False)
419+ , ("textcites", citation "textcites" AuthorInText True)
420+ , ("cites", citation "cites" NormalCitation True)
421+ , ("autocites", citation "autocites" NormalCitation True)
422+ , ("footcites", citation "footcites" NormalCitation True)
423+ , ("parencites", citation "parencites" NormalCitation True)
424+ , ("supercites", citation "supercites" NormalCitation True)
425+ , ("footcitetexts", citation "footcitetexts" NormalCitation True)
426+ , ("Autocite", citation "Autocite" NormalCitation False)
427+ , ("Footcite", citation "Footcite" NormalCitation False)
428+ , ("Parencite", citation "Parencite" NormalCitation False)
429+ , ("Supercite", citation "Supercite" NormalCitation False)
430+ , ("Footcitetext", citation "Footcitetext" NormalCitation False)
431+ , ("Citeyearpar", citation "Citeyearpar" SuppressAuthor False)
432+ , ("Citeyear", citation "Citeyear" SuppressAuthor False)
433+ , ("Autocite*", citation "Autocite*" SuppressAuthor False)
434+ , ("Cite*", citation "Cite*" SuppressAuthor False)
435+ , ("Parencite*", citation "Parencite*" SuppressAuthor False)
436+ , ("Textcite", citation "Textcite" AuthorInText False)
437+ , ("Textcites", citation "Textcites" AuthorInText True)
438+ , ("Cites", citation "Cites" NormalCitation True)
439+ , ("Autocites", citation "Autocites" NormalCitation True)
440+ , ("Footcites", citation "Footcites" NormalCitation True)
441+ , ("Parencites", citation "Parencites" NormalCitation True)
442+ , ("Supercites", citation "Supercites" NormalCitation True)
443+ , ("Footcitetexts", citation "Footcitetexts" NormalCitation True)
443444 , ("citetext", complexNatbibCitation NormalCitation)
444445 , ("citeauthor", (try (tok *> optional sp *> controlSeq "citetext") *>
445446 complexNatbibCitation AuthorInText)
446− <|> citation AuthorInText False)
447+ <|> citation "citeauthor" AuthorInText False)
447448 ] ++ map ignoreInlines
448449 -- these commands will be ignored unless --parse-raw is specified,
449450 -- in which case they will appear as raw latex blocks:
450− [ "index" ]
451+ [ "index", "nocite" ]
451452
452453unescapeURL :: String -> String
453454unescapeURL ('\\':x:xs) | isEscapable x = x:unescapeURL xs
@@ -839,8 +840,10 @@ cites mode multi = try $ do
839840 AuthorInText -> c {citationMode = mode} : cs
840841 _ -> map (\a -> a {citationMode = mode}) (c:cs)
841842
842−citation :: CitationMode -> Bool -> LP Inlines
843−citation mode multi = (flip cite mempty) <$> cites mode multi
843+citation :: String -> CitationMode -> Bool -> LP Inlines
844+citation name mode multi = do
845+ (c,raw) <- withRaw $ cites mode multi
846+ return $ cite c (rawInline "latex" $ "\\" ++ name ++ raw)
844847
845848complexNatbibCitation :: CitationMode -> LP Inlines
846849complexNatbibCitation mode = try $ do
@@ -858,8 +861,9 @@ complexNatbibCitation mode = try $ do
858861 skipSpaces
859862 optional $ char ';'
860863 return $ addPrefix pref $ addSuffix suff $ cits'
861− (c:cits) <- grouped parseOne
862− return $ cite (c{ citationMode = mode }:cits) mempty
864+ (c:cits, raw) <- withRaw $ grouped parseOne
865+ return $ cite (c{ citationMode = mode }:cits)
866+ (rawInline "latex" $ "\\citetext" ++ raw)
863867
864868-- tables
865869
tests/latex-reader.native+1−1
@@ -259,7 +259,7 @@ Pandoc (Meta {docTitle = [Str "Pandoc",Space,Str "Test",Space,Str "Suite"], docA
259259,HorizontalRule
260260,Header 1 [Str "LaTeX"]
261261,BulletList
262− [[Para [Cite [Citation {citationId = "smith.1899", citationPrefix = [], citationSuffix = [Str "22-23"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] []]]
262+ [[Para [Cite [Citation {citationId = "smith.1899", citationPrefix = [], citationSuffix = [Str "22-23"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [RawInline "latex" "\\cite[22-23]{smith.1899}"]]]
263263 ,[Para [RawInline "latex" "\\doublespacing"]]
264264 ,[Para [Math InlineMath "2+2=4"]]
265265 ,[Para [Math InlineMath "x \\in y"]]