git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Support simple `\def` macros.

Note that we still don't support macros with fancy parameter delimiters, like \def\foo#1..#2{...}

commitc806ef1b150147ecaf5a4781e2ac1ce921559ca4 authorJohn MacFarlane <jgm@berkeley.edu> dateMon 7 Aug 2017, 16:06 (9 years ago) parent9e6b9cd
2 files changed+49−2
src/Text/Pandoc/Readers/LaTeX.hs+21−2 test/command/macros.md+28
src/Text/Pandoc/Readers/LaTeX.hs+21−2
@@ -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
test/command/macros.md+28
@@ -38,3 +38,31 @@ expanded at point of use:
3838\emph{ouk}
3939```
4040
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+```