@@ -1521,7 +1521,7 @@ macroDef :: PandocMonad m => LP m Blocks
15211521macroDef = do
15221522 mempty <$ ((commandDef <|> environmentDef) <* doMacros 0)
15231523 where commandDef = do
1524− (name, macro') <- newcommand <|> letmacro
1524+ (name, macro') <- newcommand <|> letmacro <|> defmacro
15251525 guardDisabled Ext_latex_macros <|>
15261526 updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
15271527 environmentDef = do
@@ -1538,13 +1538,32 @@ macroDef = do
15381538
15391539letmacro :: PandocMonad m => LP m (Text, Macro)
15401540letmacro = do
1541− pos <- getPosition
15421541 controlSeq "let"
15431542 Tok _ (CtrlSeq name) _ <- anyControlSeq
15441543 optional $ symbol '='
1544+ spaces
15451545 contents <- braced <|> ((:[]) <$> anyControlSeq)
15461546 return (name, Macro ExpandWhenDefined 0 Nothing contents)
15471547
1548+defmacro :: PandocMonad m => LP m (Text, Macro)
1549+defmacro = try $ do
1550+ controlSeq "def"
1551+ Tok _ (CtrlSeq name) _ <- anyControlSeq
1552+ numargs <- option 0 $ argSeq 1
1553+ contents <- withVerbatimMode braced
1554+ return (name, Macro ExpandWhenUsed numargs Nothing contents)
1555+
1556+-- Note: we don't yet support fancy things like #1.#2
1557+argSeq :: PandocMonad m => Int -> LP m Int
1558+argSeq n = do
1559+ Tok _ (Arg i) _ <- satisfyTok isArgTok
1560+ guard $ i == n
1561+ argSeq (n+1) <|> return n
1562+
1563+isArgTok :: Tok -> Bool
1564+isArgTok (Tok _ (Arg _) _) = True
1565+isArgTok _ = False
1566+
15481567newcommand :: PandocMonad m => LP m (Text, Macro)
15491568newcommand = do
15501569 pos <- getPosition