From 814bdbdbef0075f056667c368901856c7fd311da Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 4 Nov 2025 14:30:05 +0100 Subject: Better handling of `\makeatletter` in parsing raw LaTeX. Closes #11270. --- src/Text/Pandoc/Readers/LaTeX.hs | 14 +++++++++++++- test/command/11270.md | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/command/11270.md diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 11419b15f..f12c73d7b 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -144,7 +144,8 @@ rawLaTeXBlock = do toks <- getInputTokens snd <$> ( rawLaTeXParser toks - (macroDef (const mempty) <|> + (makeAtLetterSection <|> + macroDef (const mempty) <|> do choice (map controlSeq ["include", "input", "subfile", "usepackage"]) skipMany opt @@ -154,6 +155,17 @@ rawLaTeXBlock = do (void (environment <|> blockCommand)) (mconcat <$> many (block <|> beginOrEndCommand))) +makeAtLetterSection :: PandocMonad m => LP m () +makeAtLetterSection = try $ do + controlSeq "makeatletter" + void $ manyTill + ( whitespace + <|> newlineTok + <|> macroDef (const ()) + <|> void environment + <|> void blockCommand + ) (controlSeq "makeatother") + -- See #4667 for motivation; sometimes people write macros -- that just evaluate to a begin or end command, which blockCommand -- won't accept. diff --git a/test/command/11270.md b/test/command/11270.md new file mode 100644 index 000000000..7cf681033 --- /dev/null +++ b/test/command/11270.md @@ -0,0 +1,25 @@ +``` +% pandoc -f markdown -t native -s +--- +header-includes: | + \makeatletter + \beamer@ignorenonframefalse + \makeatother +... + +^D +Pandoc + Meta + { unMeta = + fromList + [ ( "header-includes" + , MetaBlocks + [ RawBlock + (Format "tex") + "\\makeatletter\n\\beamer@ignorenonframefalse\n\\makeatother" + ] + ) + ] + } + [] +``` -- cgit v1.2.3