From c806ef1b150147ecaf5a4781e2ac1ce921559ca4 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Mon, 7 Aug 2017 16:06:19 -0700 Subject: LaTeX reader: Support simple `\def` macros. Note that we still don't support macros with fancy parameter delimiters, like \def\foo#1..#2{...} --- src/Text/Pandoc/Readers/LaTeX.hs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src/Text/Pandoc/Readers/LaTeX.hs') diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 7004f2ba5..b9d4de935 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -1521,7 +1521,7 @@ macroDef :: PandocMonad m => LP m Blocks macroDef = do mempty <$ ((commandDef <|> environmentDef) <* doMacros 0) where commandDef = do - (name, macro') <- newcommand <|> letmacro + (name, macro') <- newcommand <|> letmacro <|> defmacro guardDisabled Ext_latex_macros <|> updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) }) environmentDef = do @@ -1538,13 +1538,32 @@ macroDef = do letmacro :: PandocMonad m => LP m (Text, Macro) letmacro = do - pos <- getPosition controlSeq "let" Tok _ (CtrlSeq name) _ <- anyControlSeq optional $ symbol '=' + spaces contents <- braced <|> ((:[]) <$> anyControlSeq) return (name, Macro ExpandWhenDefined 0 Nothing contents) +defmacro :: PandocMonad m => LP m (Text, Macro) +defmacro = try $ do + controlSeq "def" + Tok _ (CtrlSeq name) _ <- anyControlSeq + numargs <- option 0 $ argSeq 1 + contents <- withVerbatimMode braced + return (name, Macro ExpandWhenUsed numargs Nothing contents) + +-- Note: we don't yet support fancy things like #1.#2 +argSeq :: PandocMonad m => Int -> LP m Int +argSeq n = do + Tok _ (Arg i) _ <- satisfyTok isArgTok + guard $ i == n + argSeq (n+1) <|> return n + +isArgTok :: Tok -> Bool +isArgTok (Tok _ (Arg _) _) = True +isArgTok _ = False + newcommand :: PandocMonad m => LP m (Text, Macro) newcommand = do pos <- getPosition -- cgit v1.2.3