git.iko.soy/typeable/pandoc
on master help sign in
rawLaTeXBlock: don't expand macros in macro definitions!

Closes #4653. Note that this only affected LaTeX in markdown. Added regression test.

commit58447bba98cb162b21c30755e0e237f890160a1e authorJohn MacFarlane <jgm@berkeley.edu> dateTue 15 May 2018, 09:15 (8 years ago) parent2936967
2 files changed+19−11
src/Text/Pandoc/Readers/LaTeX.hs+11−11 test/command/4653.md+8
src/Text/Pandoc/Readers/LaTeX.hs+11−11
@@ -242,8 +242,8 @@ withVerbatimMode parser = do
242242 return result
243243
244244rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
245− => LP m a -> LP m a -> ParserT String s m (a, String)
246−rawLaTeXParser parser valParser = do
245+ => Bool -> LP m a -> LP m a -> ParserT String s m (a, String)
246+rawLaTeXParser retokenize parser valParser = do
247247 inp <- getInput
248248 let toks = tokenize "source" $ T.pack inp
249249 pstate <- getState
@@ -254,10 +254,11 @@ rawLaTeXParser parser valParser = do
254254 case res' of
255255 Left _ -> mzero
256256 Right toks' -> do
257− res <- lift $ runParserT (do doMacros 0
258− -- retokenize, applying macros
259− ts <- many (satisfyTok (const True))
260− setInput ts
257+ res <- lift $ runParserT (do when retokenize $ do
258+ -- retokenize, applying macros
259+ doMacros 0
260+ ts <- many (satisfyTok (const True))
261+ setInput ts
261262 rawparser)
262263 lstate' "chunk" toks'
263264 case res of
@@ -284,20 +285,19 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
284285 => ParserT String s m String
285286rawLaTeXBlock = do
286287 lookAhead (try (char '\\' >> letter))
287− -- we don't want to apply newly defined latex macros to their own
288− -- definitions:
289− snd <$> rawLaTeXParser (environment <|> macroDef <|> blockCommand) blocks
288+ snd <$> (rawLaTeXParser False macroDef blocks
289+ <|> rawLaTeXParser True(environment <|> macroDef <|> blockCommand) blocks)
290290
291291rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
292292 => ParserT String s m String
293293rawLaTeXInline = do
294294 lookAhead (try (char '\\' >> letter))
295− snd <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inlines
295+ snd <$> rawLaTeXParser True (inlineEnvironment <|> inlineCommand') inlines
296296
297297inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
298298inlineCommand = do
299299 lookAhead (try (char '\\' >> letter))
300− fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand') inlines
300+ fst <$> rawLaTeXParser True (inlineEnvironment <|> inlineCommand') inlines
301301
302302tokenize :: SourceName -> Text -> [Tok]
303303tokenize sourcename = totoks (initialPos sourcename)
test/command/4653.mdnew file+8
@@ -0,0 +1,8 @@
1+```
2+% pandoc -t latex
3+\let\tex\TeX
4+\renewcommand{\TeX}{\tex\xspace}
5+^D
6+\let\tex\TeX
7+\renewcommand{\TeX}{\tex\xspace}
8+```