@@ -286,7 +286,23 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
286286rawLaTeXBlock = do
287287 lookAhead (try (char '\\' >> letter))
288288 snd <$> (rawLaTeXParser False macroDef blocks
289− <|> rawLaTeXParser True(environment <|> macroDef <|> blockCommand) blocks)
289+ <|> rawLaTeXParser True
290+ (environment <|> macroDef <|> blockCommand)
291+ (mconcat <$> (many (block <|> beginOrEndCommand))))
292+
293+-- See #4667 for motivation; sometimes people write macros
294+-- that just evaluate to a begin or end command, which blockCommand
295+-- won't accept.
296+beginOrEndCommand :: PandocMonad m => LP m Blocks
297+beginOrEndCommand = try $ do
298+ Tok _ (CtrlSeq name) txt <- anyControlSeq
299+ guard $ name == "begin" || name == "end"
300+ (envname, rawargs) <- withRaw braced
301+ if M.member (untokenize envname)
302+ (inlineEnvironments :: M.Map Text (LP PandocPure Inlines))
303+ then mzero
304+ else return $ rawBlock "latex"
305+ (T.unpack (txt <> untokenize rawargs))
290306
291307rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
292308 => ParserT String s m String