git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Properly handle \providecommand and environment...

They are now ignored if the corresponding command or environment is already defined. Closes #5635.

commit178416194617b330b280a5e4a9e894258c0f8b1f authorJohn MacFarlane <jgm@berkeley.edu> dateSat 13 Jul 2019, 15:51 (7 years ago) parent53e3075
2 files changed+53−21
src/Text/Pandoc/Readers/LaTeX.hs+30−21 test/command/5635.md+23
src/Text/Pandoc/Readers/LaTeX.hs+30−21
@@ -1502,12 +1502,15 @@ macroDef =
15021502 guardDisabled Ext_latex_macros <|>
15031503 updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
15041504 environmentDef = do
1505− (name, macro1, macro2) <- newenvironment
1506− guardDisabled Ext_latex_macros <|>
1507− do updateState $ \s -> s{ sMacros =
1508− M.insert name macro1 (sMacros s) }
1509− updateState $ \s -> s{ sMacros =
1510− M.insert ("end" <> name) macro2 (sMacros s) }
1505+ mbenv <- newenvironment
1506+ case mbenv of
1507+ Nothing -> return ()
1508+ Just (name, macro1, macro2) -> do
1509+ guardDisabled Ext_latex_macros <|>
1510+ do updateState $ \s -> s{ sMacros =
1511+ M.insert name macro1 (sMacros s) }
1512+ updateState $ \s -> s{ sMacros =
1513+ M.insert ("end" <> name) macro2 (sMacros s) }
15111514 -- @\newenvironment{envname}[n-args][default]{begin}{end}@
15121515 -- is equivalent to
15131516 -- @\newcommand{\envname}[n-args][default]{begin}@
@@ -1580,14 +1583,16 @@ newcommand = do
15801583 : (contents' ++
15811584 [ Tok pos Symbol "}", Tok pos Symbol "}" ])
15821585 _ -> contents'
1583− when (mtype == "newcommand") $ do
1584− macros <- sMacros <$> getState
1585− case M.lookup name macros of
1586− Just _ -> report $ MacroAlreadyDefined (T.unpack txt) pos
1587− Nothing -> return ()
1588− return (name, Macro ExpandWhenUsed argspecs optarg contents)
1589−
1590−newenvironment :: PandocMonad m => LP m (Text, Macro, Macro)
1586+ macros <- sMacros <$> getState
1587+ case M.lookup name macros of
1588+ Just macro
1589+ | mtype == "newcommand" -> do
1590+ report $ MacroAlreadyDefined (T.unpack txt) pos
1591+ return (name, macro)
1592+ | mtype == "providecommand" -> return (name, macro)
1593+ _ -> return (name, Macro ExpandWhenUsed argspecs optarg contents)
1594+
1595+newenvironment :: PandocMonad m => LP m (Maybe (Text, Macro, Macro))
15911596newenvironment = do
15921597 pos <- getPosition
15931598 Tok _ (CtrlSeq mtype) _ <- controlSeq "newenvironment" <|>
@@ -1604,13 +1609,17 @@ newenvironment = do
16041609 let argspecs = map (\i -> ArgNum i) [1..numargs]
16051610 startcontents <- spaces >> bracedOrToken
16061611 endcontents <- spaces >> bracedOrToken
1607− when (mtype == "newenvironment") $ do
1608− macros <- sMacros <$> getState
1609− case M.lookup name macros of
1610− Just _ -> report $ MacroAlreadyDefined (T.unpack name) pos
1611− Nothing -> return ()
1612− return (name, Macro ExpandWhenUsed argspecs optarg startcontents,
1613− Macro ExpandWhenUsed [] Nothing endcontents)
1612+ macros <- sMacros <$> getState
1613+ case M.lookup name macros of
1614+ Just _
1615+ | mtype == "newenvironment" -> do
1616+ report $ MacroAlreadyDefined (T.unpack name) pos
1617+ return Nothing
1618+ | mtype == "provideenvironment" -> do
1619+ return Nothing
1620+ _ -> return $ Just (name,
1621+ Macro ExpandWhenUsed argspecs optarg startcontents,
1622+ Macro ExpandWhenUsed [] Nothing endcontents)
16141623
16151624bracketedNum :: PandocMonad m => LP m Int
16161625bracketedNum = do
test/command/5635.mdnew file+23
@@ -0,0 +1,23 @@
1+```
2+% pandoc -f latex -t plain
3+\providecommand{\test}{foo}
4+\providecommand{\test}{bar}
5+
6+The value is: \test
7+^D
8+The value is: foo
9+```
10+
11+```
12+% pandoc -f latex -t plain
13+\provideenvironment{test}{startfoo}{stopfoo}
14+\provideenvironment{test}{startbar}{stopbar}
15+
16+\begin{test}
17+Hi
18+\end{test}
19+^D
20+startfoo Hi stopfoo
21+```
22+
23+