@@ -1521,7 +1521,7 @@ macroDef :: PandocMonad m => LP m Blocks
1521macroDef = do
1521macroDef = do
1522 mempty <$ ((commandDef <|> environmentDef) <* doMacros 0)
1522 mempty <$ ((commandDef <|> environmentDef) <* doMacros 0)
1523 where commandDef = do
1523 where commandDef = do
1524− (name, macro') <- newcommand <|> letmacro
1524+ (name, macro') <- newcommand <|> letmacro <|> defmacro
1525 guardDisabled Ext_latex_macros <|>
1525 guardDisabled Ext_latex_macros <|>
1526 updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
1526 updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
1527 environmentDef = do
1527 environmentDef = do
@@ -1538,13 +1538,32 @@ macroDef = do
1539letmacro :: PandocMonad m => LP m (Text, Macro)
1539letmacro :: PandocMonad m => LP m (Text, Macro)
1540letmacro = do
1540letmacro = do
1542 controlSeq "let"
1541 controlSeq "let"
1543 Tok _ (CtrlSeq name) _ <- anyControlSeq
1542 Tok _ (CtrlSeq name) _ <- anyControlSeq
1544 optional $ symbol '='
1543 optional $ symbol '='
1545 contents <- braced <|> ((:[]) <$> anyControlSeq)
1545 contents <- braced <|> ((:[]) <$> anyControlSeq)
1546 return (name, Macro ExpandWhenDefined 0 Nothing contents)
1546 return (name, Macro ExpandWhenDefined 0 Nothing contents)
1548+defmacro :: PandocMonad m => LP m (Text, Macro)
1551+ Tok _ (CtrlSeq name) _ <- anyControlSeq
1552+ numargs <- option 0 $ argSeq 1
1553+ contents <- withVerbatimMode braced
1554+ return (name, Macro ExpandWhenUsed numargs Nothing contents)
1556+-- Note: we don't yet support fancy things like #1.#2
1557+argSeq :: PandocMonad m => Int -> LP m Int
1559+ Tok _ (Arg i) _ <- satisfyTok isArgTok
1561+ argSeq (n+1) <|> return n
1563+isArgTok :: Tok -> Bool
1564+isArgTok (Tok _ (Arg _) _) = True
1548newcommand :: PandocMonad m => LP m (Text, Macro)
1567newcommand :: PandocMonad m => LP m (Text, Macro)
1549newcommand = do
1568newcommand = do
1550 pos <- getPosition
1569 pos <- getPosition