git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Improve handling of raw LaTeX (for markdown etc.).
06bc037John MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+32−31
@@ -242,21 +242,30 @@ withVerbatimMode parser = do
242 return result
242 return result
243
243
244rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
244rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
245− => LP m a -> ParserT String s m (a, String)
245+ => LP m a -> LP m a -> ParserT String s m (a, String)
246−rawLaTeXParser parser = do
246+rawLaTeXParser parser valParser = do
247 inp <- getInput
247 inp <- getInput
248 let toks = tokenize "source" $ T.pack inp
248 let toks = tokenize "source" $ T.pack inp
249 pstate <- getState
249 pstate <- getState
250− let lstate = def{ sOptions = extractReaderOptions pstate
250+ let lstate = def{ sOptions = extractReaderOptions pstate }
251− , sMacros = extractMacros pstate }
251+ let lstate' = lstate { sMacros = extractMacros pstate }
252− let rawparser = (,) <$> withRaw parser <*> getState
252+ let rawparser = (,) <$> withRaw valParser <*> getState
253− res <- lift $ runParserT rawparser lstate "chunk" toks
253+ res' <- lift $ runParserT (snd <$> withRaw parser) lstate "chunk" toks
254− case res of
254+ case res' of
255 Left _ -> mzero
255 Left _ -> mzero
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
256− Right ((val, raw), st) -> do
265+ Right ((val, raw), st) -> do
257− updateState (updateMacros (sMacros st <>))
266+ updateState (updateMacros (sMacros st <>))
258− rawstring <- takeP (T.length (untokenize raw))
267+ _ <- takeP (T.length (untokenize toks'))
259− return (val, rawstring)
268+ return (val, T.unpack (untokenize raw))
260
269
261applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
270applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
262 => String -> ParserT String s m String
271 => String -> ParserT String s m String
@@ -277,19 +286,18 @@ rawLaTeXBlock = do
277 lookAhead (try (char '\\' >> letter))
286 lookAhead (try (char '\\' >> letter))
278 -- we don't want to apply newly defined latex macros to their own
287 -- we don't want to apply newly defined latex macros to their own
279 -- definitions:
288 -- definitions:
280− snd <$> rawLaTeXParser macroDef
289+ snd <$> rawLaTeXParser (environment <|> macroDef <|> blockCommand) block
281− <|> ((snd <$> rawLaTeXParser (environment <|> blockCommand)) >>= applyMacros)
282
290
283rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
291rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
284 => ParserT String s m String
292 => ParserT String s m String
285rawLaTeXInline = do
293rawLaTeXInline = do
286 lookAhead (try (char '\\' >> letter))
294 lookAhead (try (char '\\' >> letter))
287− rawLaTeXParser (inlineEnvironment <|> inlineCommand') >>= applyMacros . snd
295+ snd <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inline
288
296
289inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
297inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
290inlineCommand = do
298inlineCommand = do
291 lookAhead (try (char '\\' >> letter))
299 lookAhead (try (char '\\' >> letter))
292− fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
300+ fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inline
293
301
294tokenize :: SourceName -> Text -> [Tok]
302tokenize :: SourceName -> Text -> [Tok]
295tokenize sourcename = totoks (initialPos sourcename)
303tokenize sourcename = totoks (initialPos sourcename)
@@ -1703,6 +1711,9 @@ treatAsBlock = Set.fromList
1703 , "clearpage"
1711 , "clearpage"
1704 , "pagebreak"
1712 , "pagebreak"
1705 , "titleformat"
1713 , "titleformat"
1714+ , "listoffigures"
1715+ , "listoftables"
1716+ , "write"
1706 ]
1717 ]
1707
1718
1708isInlineCommand :: Text -> Bool
1719isInlineCommand :: Text -> Bool
@@ -2165,19 +2176,6 @@ environments = M.fromList
2165 codeBlockWith attr <$> verbEnv "lstlisting")
2176 codeBlockWith attr <$> verbEnv "lstlisting")
2166 , ("minted", minted)
2177 , ("minted", minted)
2167 , ("obeylines", obeylines)
2178 , ("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*")
2181 , ("tikzpicture", rawVerbEnv "tikzpicture")
2179 , ("tikzpicture", rawVerbEnv "tikzpicture")
2182 -- etoolbox
2180 -- etoolbox
2183 , ("ifstrequal", ifstrequal)
2181 , ("ifstrequal", ifstrequal)
@@ -2188,11 +2186,14 @@ environments = M.fromList
2188 ]
2186 ]
2189
2187
2190environment :: PandocMonad m => LP m Blocks
2188environment :: PandocMonad m => LP m Blocks
2191−environment = do
2189+environment = try $ do
2192 controlSeq "begin"
2190 controlSeq "begin"
2193 name <- untokenize <$> braced
2191 name <- untokenize <$> braced
2194− M.findWithDefault mzero name environments
2192+ M.findWithDefault mzero name environments <|>
2193+ if M.member name (inlineEnvironments
2194+ :: M.Map Text (LP PandocPure Inlines))
2195+ then mzero
2195− <|> rawEnv name
2196+ else rawEnv name
2196
2197
2197env :: PandocMonad m => Text -> LP m a -> LP m a
2198env :: PandocMonad m => Text -> LP m a -> LP m a
2198env name p = p <* end_ name
2199env name p = p <* end_ name