git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Improve handling of raw LaTeX (for markdown etc.).

Previously there were some bugs in how macros were handled. Closes #4589, #4594.

commit06bc0376d1cc26b254e9f85a5dd7e29c4e969c3c authorJohn MacFarlane <jgm@berkeley.edu> dateWed 25 Apr 2018, 23:20 (9 years ago) parentaba0f7e
1 file changed+32−31
src/Text/Pandoc/Readers/LaTeX.hs+32−31
src/Text/Pandoc/Readers/LaTeX.hs+32−31
@@ -242,21 +242,30 @@ withVerbatimMode parser = do
242242 return result
243243
244244rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
245− => LP m a -> ParserT String s m (a, String)
246−rawLaTeXParser parser = do
245+ => LP m a -> LP m a -> ParserT String s m (a, String)
246+rawLaTeXParser parser valParser = do
247247 inp <- getInput
248248 let toks = tokenize "source" $ T.pack inp
249249 pstate <- getState
250− let lstate = def{ sOptions = extractReaderOptions pstate
251− , sMacros = extractMacros pstate }
252− let rawparser = (,) <$> withRaw parser <*> getState
253− res <- lift $ runParserT rawparser lstate "chunk" toks
254− case res of
250+ let lstate = def{ sOptions = extractReaderOptions pstate }
251+ let lstate' = lstate { sMacros = extractMacros pstate }
252+ let rawparser = (,) <$> withRaw valParser <*> getState
253+ res' <- lift $ runParserT (snd <$> withRaw parser) lstate "chunk" toks
254+ case res' of
255255 Left _ -> mzero
256− Right ((val, raw), st) -> do
257− updateState (updateMacros (sMacros st <>))
258− rawstring <- takeP (T.length (untokenize raw))
259− return (val, rawstring)
256+ Right toks' -> do
257+ res <- lift $ runParserT (do doMacros 0
258+ -- retokenize, applying macros
259+ ts <- many (satisfyTok (const True))
260+ setInput ts
261+ rawparser)
262+ lstate' "chunk" toks'
263+ case res of
264+ Left _ -> mzero
265+ Right ((val, raw), st) -> do
266+ updateState (updateMacros (sMacros st <>))
267+ _ <- takeP (T.length (untokenize toks'))
268+ return (val, T.unpack (untokenize raw))
260269
261270applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
262271 => String -> ParserT String s m String
@@ -277,19 +286,18 @@ rawLaTeXBlock = do
277286 lookAhead (try (char '\\' >> letter))
278287 -- we don't want to apply newly defined latex macros to their own
279288 -- definitions:
280− snd <$> rawLaTeXParser macroDef
281− <|> ((snd <$> rawLaTeXParser (environment <|> blockCommand)) >>= applyMacros)
289+ snd <$> rawLaTeXParser (environment <|> macroDef <|> blockCommand) block
282290
283291rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
284292 => ParserT String s m String
285293rawLaTeXInline = do
286294 lookAhead (try (char '\\' >> letter))
287− rawLaTeXParser (inlineEnvironment <|> inlineCommand') >>= applyMacros . snd
295+ snd <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inline
288296
289297inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
290298inlineCommand = do
291299 lookAhead (try (char '\\' >> letter))
292− fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
300+ fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inline
293301
294302tokenize :: SourceName -> Text -> [Tok]
295303tokenize sourcename = totoks (initialPos sourcename)
@@ -1703,6 +1711,9 @@ treatAsBlock = Set.fromList
17031711 , "clearpage"
17041712 , "pagebreak"
17051713 , "titleformat"
1714+ , "listoffigures"
1715+ , "listoftables"
1716+ , "write"
17061717 ]
17071718
17081719isInlineCommand :: Text -> Bool
@@ -2165,19 +2176,6 @@ environments = M.fromList
21652176 codeBlockWith attr <$> verbEnv "lstlisting")
21662177 , ("minted", minted)
21672178 , ("obeylines", obeylines)
2168− , ("displaymath", mathEnvWith para Nothing "displaymath")
2169− , ("equation", mathEnvWith para Nothing "equation")
2170− , ("equation*", mathEnvWith para Nothing "equation*")
2171− , ("gather", mathEnvWith para (Just "gathered") "gather")
2172− , ("gather*", mathEnvWith para (Just "gathered") "gather*")
2173− , ("multline", mathEnvWith para (Just "gathered") "multline")
2174− , ("multline*", mathEnvWith para (Just "gathered") "multline*")
2175− , ("eqnarray", mathEnvWith para (Just "aligned") "eqnarray")
2176− , ("eqnarray*", mathEnvWith para (Just "aligned") "eqnarray*")
2177− , ("align", mathEnvWith para (Just "aligned") "align")
2178− , ("align*", mathEnvWith para (Just "aligned") "align*")
2179− , ("alignat", mathEnvWith para (Just "aligned") "alignat")
2180− , ("alignat*", mathEnvWith para (Just "aligned") "alignat*")
21812179 , ("tikzpicture", rawVerbEnv "tikzpicture")
21822180 -- etoolbox
21832181 , ("ifstrequal", ifstrequal)
@@ -2188,11 +2186,14 @@ environments = M.fromList
21882186 ]
21892187
21902188environment :: PandocMonad m => LP m Blocks
2191−environment = do
2189+environment = try $ do
21922190 controlSeq "begin"
21932191 name <- untokenize <$> braced
2194− M.findWithDefault mzero name environments
2195− <|> rawEnv name
2192+ M.findWithDefault mzero name environments <|>
2193+ if M.member name (inlineEnvironments
2194+ :: M.Map Text (LP PandocPure Inlines))
2195+ then mzero
2196+ else rawEnv name
21962197
21972198env :: PandocMonad m => Text -> LP m a -> LP m a
21982199env name p = p <* end_ name