git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Support simple `\def` macros.
c806ef1John MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+21−2
@@ -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
1538
1538
1539letmacro :: PandocMonad m => LP m (Text, Macro)
1539letmacro :: PandocMonad m => LP m (Text, Macro)
1540letmacro = do
1540letmacro = do
1541− pos <- getPosition
1542 controlSeq "let"
1541 controlSeq "let"
1543 Tok _ (CtrlSeq name) _ <- anyControlSeq
1542 Tok _ (CtrlSeq name) _ <- anyControlSeq
1544 optional $ symbol '='
1543 optional $ symbol '='
1544+ spaces
1545 contents <- braced <|> ((:[]) <$> anyControlSeq)
1545 contents <- braced <|> ((:[]) <$> anyControlSeq)
1546 return (name, Macro ExpandWhenDefined 0 Nothing contents)
1546 return (name, Macro ExpandWhenDefined 0 Nothing contents)
1547
1547
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+
1548newcommand :: PandocMonad m => LP m (Text, Macro)
1567newcommand :: PandocMonad m => LP m (Text, Macro)
1549newcommand = do
1568newcommand = do
1550 pos <- getPosition
1569 pos <- getPosition
test/command/macros.md+28
@@ -38,3 +38,31 @@ expanded at point of use:
38\emph{ouk}
38\emph{ouk}
39```
39```
40
40
41+```
42+% pandoc -f latex -t latex
43+\def\BDpos{}
44+\def\BDneg{-}
45+\def\beq{\begin{align}}
46+\def\eeq{\end{align}}
47+\def\e#1{\emph{#1}}
48+\def\f#1#2{\emph{#1--#2}}
49+
50+$5\BDneg 6\BDpos 7$
51+
52+\beq
53+x &= y\\
54+\eeq
55+
56+\e{hi}
57+
58+\f{hi}{ok}
59+^D
60+\(5-67\)
61+
62+\[\begin{aligned}
63+x &= y\\\end{aligned}\]
64+
65+\emph{hi}
66+
67+\emph{hi--ok}
68+```