@@ -44,6 +44,7 @@ module Text.Pandoc.Readers.LaTeX ( readLaTeX,
44import Control.Applicative (many, optional, (<|>))
44import Control.Applicative (many, optional, (<|>))
45import Control.Monad
45import Control.Monad
46import Control.Monad.Except (throwError)
46import Control.Monad.Except (throwError)
47+import Control.Monad.Trans (lift)
47import Data.Char (chr, isAlphaNum, isLetter, ord, isDigit)
48import Data.Char (chr, isAlphaNum, isLetter, ord, isDigit)
48import Data.Default
49import Data.Default
49import Data.Text (Text)
50import Data.Text (Text)
@@ -203,18 +204,22 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
203 => ParserT String s m String
204 => ParserT String s m String
204rawLaTeXBlock = do
205rawLaTeXBlock = do
205 lookAhead (try (char '\\' >> letter))
206 lookAhead (try (char '\\' >> letter))
207+ rawLaTeXParser (environment <|> macroDef <|> blockCommand)
209+rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
210+ => LP m a -> ParserT String s m String
211+rawLaTeXParser parser = do
206 inp <- getInput
212 inp <- getInput
207 let toks = tokenize $ T.pack inp
213 let toks = tokenize $ T.pack inp
210− withRaw (environment <|> macroDef <|> blockCommand)
212 pstate <- getState
214 pstate <- getState
213 let lstate = def{ sOptions = extractReaderOptions pstate }
215 let lstate = def{ sOptions = extractReaderOptions pstate }
216+ res <- lift $ runParserT ((,) <$> try (snd <$> withRaw parser) <*> getState)
214− res <- runParserT rawblock lstate "source" toks
217+ lstate "source" toks
215 case res of
218 case res of
216 Left _ -> mzero
219 Left _ -> mzero
220+ Right (raw, st) -> do
221+ updateState (updateMacros (const $ sMacros st))
217− Right raw -> takeP (T.length (untokenize raw))
222+ takeP (T.length (untokenize raw))
219macro :: (PandocMonad m, HasMacros s, HasReaderOptions s)
224macro :: (PandocMonad m, HasMacros s, HasReaderOptions s)
220 => ParserT String s m Blocks
225 => ParserT String s m Blocks
@@ -222,21 +227,8 @@ macro = do
222 guardEnabled Ext_latex_macros
227 guardEnabled Ext_latex_macros
223 lookAhead (char '\\' *> oneOfStrings ["new", "renew", "provide"] *>
228 lookAhead (char '\\' *> oneOfStrings ["new", "renew", "provide"] *>
224 oneOfStrings ["command", "environment"])
229 oneOfStrings ["command", "environment"])
225− inp <- getInput
230+ mempty <$ rawLaTeXParser macroDef
226− let toks = tokenize $ T.pack inp
231+ -- since we're applying macros, we remove the defns
228− (_, raw) <- withRaw $ try macroDef
232− let lstate = def{ sOptions = extractReaderOptions pstate
233− , sMacros = extractMacros pstate }
234− res <- runParserT rawblock lstate "source" toks
237− Right (raw, st) -> do
238− updateState (updateMacros (const $ sMacros st))
239− mempty <$ takeP (T.length (untokenize raw))
241applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
233applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
242 => String -> ParserT String s m String
234 => String -> ParserT String s m String
@@ -252,24 +244,10 @@ applyMacros s = do
252 Right s' -> return s') <|> return s
244 Right s' -> return s') <|> return s
254rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
246rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
255− => ParserT String s m String
247+ => ParserT String s m String
256rawLaTeXInline = do
248rawLaTeXInline = do
257 lookAhead (try (char '\\' >> letter) <|> char '$')
249 lookAhead (try (char '\\' >> letter) <|> char '$')
259− let toks = tokenize $ T.pack inp
261− (_, raw) <- try $ withRaw (inlineEnvironment <|> inlineCommand')
250+ rawLaTeXParser (inlineEnvironment <|> inlineCommand')
265− let lstate = def{ sOptions = extractReaderOptions pstate
266− , sMacros = extractMacros pstate }
267− res <- runParserT rawinline lstate "source" toks
270− Right (raw, s) -> do
271− updateState $ updateMacros (const $ sMacros s)
272− takeP (T.length (untokenize raw))
274inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
252inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
275inlineCommand = do
253inlineCommand = do