git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: some improvements in macro parsing.

Fixed applyMacros so that it operates on the whole string, not just the first token! Don't remove macro definitions from the output, even if Ext_latex_macros is set, so that macros will be applied. Since they're only applied to math in Markdown, removing the macros can have bad effects. Even for math macros, keeping them should be harmless.

commitbe14e2b5013a442989a338c13baa4d16881f849e authorJohn MacFarlane <jgm@berkeley.edu> dateSun 23 Jul 2017, 20:46 (9 years ago) parentd453b33
3 files changed+28−19
src/Text/Pandoc/Readers/LaTeX.hs+19−19 test/command/macros.md+8 test/markdown-reader-more.native+1
src/Text/Pandoc/Readers/LaTeX.hs+19−19
@@ -200,12 +200,6 @@ withVerbatimMode parser = do
200200 updateState $ \st -> st{ sVerbatimMode = False }
201201 return result
202202
203−rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
204− => ParserT String s m String
205−rawLaTeXBlock = do
206− lookAhead (try (char '\\' >> letter))
207− rawLaTeXParser (environment <|> macroDef <|> blockCommand)
208−
209203rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
210204 => LP m a -> ParserT String s m String
211205rawLaTeXParser parser = do
@@ -218,7 +212,7 @@ rawLaTeXParser parser = do
218212 case res of
219213 Left _ -> mzero
220214 Right (raw, st) -> do
221− updateState (updateMacros (const $ sMacros st))
215+ updateState (updateMacros ((sMacros st) <>))
222216 takeP (T.length (untokenize raw))
223217
224218macro :: (PandocMonad m, HasMacros s, HasReaderOptions s)
@@ -227,21 +221,26 @@ macro = do
227221 guardEnabled Ext_latex_macros
228222 lookAhead (char '\\' *> oneOfStrings ["new", "renew", "provide"] *>
229223 oneOfStrings ["command", "environment"])
230− mempty <$ rawLaTeXParser macroDef
231− -- since we're applying macros, we remove the defns
224+ rawBlock "latex" <$> rawLaTeXParser macroDef
232225
233226applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
234227 => String -> ParserT String s m String
235−applyMacros s = do
236− (guardEnabled Ext_latex_macros >>
237− do let retokenize = doMacros 0 *> (toksToString <$> getInput)
228+applyMacros s = (guardDisabled Ext_latex_macros >> return s) <|>
229+ do let retokenize = doMacros 0 *>
230+ (toksToString <$> many (satisfyTok (const True)))
238231 pstate <- getState
239232 let lstate = def{ sOptions = extractReaderOptions pstate
240233 , sMacros = extractMacros pstate }
241234 res <- runParserT retokenize lstate "math" (tokenize (T.pack s))
242235 case res of
243236 Left e -> fail (show e)
244− Right s' -> return s') <|> return s
237+ Right s' -> return s'
238+
239+rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
240+ => ParserT String s m String
241+rawLaTeXBlock = do
242+ lookAhead (try (char '\\' >> letter))
243+ rawLaTeXParser (environment <|> macroDef <|> blockCommand)
245244
246245rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
247246 => ParserT String s m String
@@ -1503,17 +1502,18 @@ authors = try $ do
15031502
15041503macroDef :: PandocMonad m => LP m Blocks
15051504macroDef = do
1506− guardEnabled Ext_latex_macros
15071505 mempty <$ ((commandDef <|> environmentDef) <* doMacros 0)
15081506 where commandDef = do
15091507 (name, macro') <- newcommand
1510− updateState $ \s -> s{ sMacros = M.insert name macro' (sMacros s) }
1508+ guardDisabled Ext_latex_macros <|>
1509+ updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
15111510 environmentDef = do
15121511 (name, macro1, macro2) <- newenvironment
1513− updateState $ \s -> s{ sMacros =
1514− M.insert name macro1 (sMacros s) }
1515− updateState $ \s -> s{ sMacros =
1516− M.insert ("end" <> name) macro2 (sMacros s) }
1512+ guardDisabled Ext_latex_macros <|>
1513+ do updateState $ \s -> s{ sMacros =
1514+ M.insert name macro1 (sMacros s) }
1515+ updateState $ \s -> s{ sMacros =
1516+ M.insert ("end" <> name) macro2 (sMacros s) }
15171517 -- @\newenvironment{envname}[n-args][default]{begin}{end}@
15181518 -- is equivalent to
15191519 -- @\newcommand{\envname}[n-args][default]{begin}@
test/command/macros.mdnew file+8
@@ -0,0 +1,8 @@
1+```
2+% pandoc -t markdown
3+\newcommand{\my}{\phi}
4+$\my+\my$
5+^D
6+\newcommand{\my}{\phi}
7+$\phi+\phi$
8+```
test/markdown-reader-more.native+1
@@ -56,6 +56,7 @@ Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "Author",S
5656,OrderedList (3,Example,TwoParens)
5757 [[Plain [Str "Third",Space,Str "example."]]]
5858,Header 2 ("macros",[],[]) [Str "Macros"]
59+,RawBlock (Format "latex") "\\newcommand{\\tuple}[1]{\\langle #1 \\rangle}"
5960,Para [Math InlineMath "\\langle x,y \\rangle"]
6061,Header 2 ("case-insensitive-references",[],[]) [Str "Case-insensitive",Space,Str "references"]
6162,Para [Link ("",[],[]) [Str "Fum"] ("/fum","")]