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 +++++++++++++++++++++-- test/command/macros.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) 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 diff --git a/test/command/macros.md b/test/command/macros.md index 49a648c79..46179e3c7 100644 --- a/test/command/macros.md +++ b/test/command/macros.md @@ -38,3 +38,31 @@ expanded at point of use: \emph{ouk} ``` +``` +% pandoc -f latex -t latex +\def\BDpos{} +\def\BDneg{-} +\def\beq{\begin{align}} +\def\eeq{\end{align}} +\def\e#1{\emph{#1}} +\def\f#1#2{\emph{#1--#2}} + +$5\BDneg 6\BDpos 7$ + +\beq +x &= y\\ +\eeq + +\e{hi} + +\f{hi}{ok} +^D +\(5-67\) + +\[\begin{aligned} +x &= y\\\end{aligned}\] + +\emph{hi} + +\emph{hi--ok} +``` -- cgit v1.2.3