@@ -44,6 +44,7 @@ module Text.Pandoc.Readers.LaTeX ( readLaTeX,
4444import Control.Applicative (many, optional, (<|>))
4545import Control.Monad
4646import Control.Monad.Except (throwError)
47+import Control.Monad.Trans (lift)
4748import Data.Char (chr, isAlphaNum, isLetter, ord, isDigit)
4849import Data.Default
4950import Data.Text (Text)
@@ -203,18 +204,22 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
203204 => ParserT String s m String
204205rawLaTeXBlock = do
205206 lookAhead (try (char '\\' >> letter))
207+ rawLaTeXParser (environment <|> macroDef <|> blockCommand)
208+
209+rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
210+ => LP m a -> ParserT String s m String
211+rawLaTeXParser parser = do
206212 inp <- getInput
207213 let toks = tokenize $ T.pack inp
208− let rawblock = do
209− (_, raw) <- try $
210− withRaw (environment <|> macroDef <|> blockCommand)
211− return raw
212214 pstate <- getState
213215 let lstate = def{ sOptions = extractReaderOptions pstate }
214− res <- runParserT rawblock lstate "source" toks
216+ res <- lift $ runParserT ((,) <$> try (snd <$> withRaw parser) <*> getState)
217+ lstate "source" toks
215218 case res of
216219 Left _ -> mzero
217− Right raw -> takeP (T.length (untokenize raw))
220+ Right (raw, st) -> do
221+ updateState (updateMacros (const $ sMacros st))
222+ takeP (T.length (untokenize raw))
218223
219224macro :: (PandocMonad m, HasMacros s, HasReaderOptions s)
220225 => ParserT String s m Blocks
@@ -222,21 +227,8 @@ macro = do
222227 guardEnabled Ext_latex_macros
223228 lookAhead (char '\\' *> oneOfStrings ["new", "renew", "provide"] *>
224229 oneOfStrings ["command", "environment"])
225− inp <- getInput
226− let toks = tokenize $ T.pack inp
227− let rawblock = do
228− (_, raw) <- withRaw $ try macroDef
229− st <- getState
230− return (raw, st)
231− pstate <- getState
232− let lstate = def{ sOptions = extractReaderOptions pstate
233− , sMacros = extractMacros pstate }
234− res <- runParserT rawblock lstate "source" toks
235− case res of
236− Left _ -> mzero
237− Right (raw, st) -> do
238− updateState (updateMacros (const $ sMacros st))
239− mempty <$ takeP (T.length (untokenize raw))
230+ mempty <$ rawLaTeXParser macroDef
231+ -- since we're applying macros, we remove the defns
240232
241233applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
242234 => String -> ParserT String s m String
@@ -252,24 +244,10 @@ applyMacros s = do
252244 Right s' -> return s') <|> return s
253245
254246rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
255− => ParserT String s m String
247+ => ParserT String s m String
256248rawLaTeXInline = do
257249 lookAhead (try (char '\\' >> letter) <|> char '$')
258− inp <- getInput
259− let toks = tokenize $ T.pack inp
260− let rawinline = do
261− (_, raw) <- try $ withRaw (inlineEnvironment <|> inlineCommand')
262− st <- getState
263− return (raw, st)
264− pstate <- getState
265− let lstate = def{ sOptions = extractReaderOptions pstate
266− , sMacros = extractMacros pstate }
267− res <- runParserT rawinline lstate "source" toks
268− case res of
269− Left _ -> mzero
270− Right (raw, s) -> do
271− updateState $ updateMacros (const $ sMacros s)
272− takeP (T.length (untokenize raw))
250+ rawLaTeXParser (inlineEnvironment <|> inlineCommand')
273251
274252inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
275253inlineCommand = do