diff options
author | John MacFarlane <jgm@berkeley.edu> | 2017-10-19 12:52:12 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-10-19 13:23:50 -0700 |
commit | 28bb5d610dc8c96a014f610d53b937ea7b9d977e (patch) | |
tree | 23847968f8a6a3702192e0b198224dcfe9edecbe | |
parent | e941ba05b911d01a51614b0b0060f705b2000688 (diff) | |
download | pandoc-28bb5d610dc8c96a014f610d53b937ea7b9d977e.tar.gz |
LaTeX reader: support `\expandafter`.
Closes #3983.
-rw-r--r-- | src/Text/Pandoc/Readers/LaTeX.hs | 25 | ||||
-rw-r--r-- | test/command/3983.md | 29 |
2 files changed, 48 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 089d3d741..37becf59f 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -372,11 +372,14 @@ totoks pos t = | otherwise -> Tok pos Symbol (T.singleton c) : totoks (incSourceColumn pos 1) rest - where isSpaceOrTab ' ' = True - isSpaceOrTab '\t' = True - isSpaceOrTab _ = False - isLetterOrAt '@' = True - isLetterOrAt c = isLetter c +isSpaceOrTab :: Char -> Bool +isSpaceOrTab ' ' = True +isSpaceOrTab '\t' = True +isSpaceOrTab _ = False + +isLetterOrAt :: Char -> Bool +isLetterOrAt '@' = True +isLetterOrAt c = isLetter c isLowerHex :: Char -> Bool isLowerHex x = x >= '0' && x <= '9' || x >= 'a' && x <= 'f' @@ -411,10 +414,19 @@ doMacros n = do Tok spos (CtrlSeq "end") _ : Tok _ Symbol "{" : Tok _ Word name : Tok _ Symbol "}" : ts -> handleMacros spos ("end" <> name) ts + Tok _ (CtrlSeq "expandafter") _ : t : ts + -> do setInput ts + doMacros n + getInput >>= setInput . combineTok t Tok spos (CtrlSeq name) _ : ts -> handleMacros spos name ts _ -> return () - where handleMacros spos name ts = do + where combineTok (Tok spos (CtrlSeq name) x) (Tok _ Word w : ts) + | T.all isLetterOrAt w = + Tok spos (CtrlSeq (name <> w)) (x1 <> w <> x2) : ts + where (x1, x2) = T.break isSpaceOrTab x + combineTok t ts = t:ts + handleMacros spos name ts = do macros <- sMacros <$> getState case M.lookup name macros of Nothing -> return () @@ -439,6 +451,7 @@ doMacros n = do else doMacros (n + 1) ExpandWhenDefined -> return () + setpos :: SourcePos -> Tok -> Tok setpos spos (Tok _ tt txt) = Tok spos tt txt diff --git a/test/command/3983.md b/test/command/3983.md new file mode 100644 index 000000000..7eaeb99f0 --- /dev/null +++ b/test/command/3983.md @@ -0,0 +1,29 @@ +``` +pandoc -f latex -t native +\def\filename@area{foo:bar:baz} +\makeatletter +\graphicspath\expandafter{\expandafter{\filename@area}}% +\makeatother +^D +[RawBlock (Format "latex") "\\makeatletter" +,RawBlock (Format "latex") "\\makeatother"] +``` + +``` +pandoc -f latex -t native +\makeatletter + \newcommand\urlfootnote@[1]{\footnote{\url@{#1}}} + \DeclareRobustCommand{\urlfootnote}{\hyper@normalise\urlfootnote@} +\makeatother +^D +[RawBlock (Format "latex") "\\makeatletter" +,RawBlock (Format "latex") "\\makeatother"] +``` + +``` +pandoc -f latex -t native +\def\foo{bar} +\expandafter\bam\foo +^D +[RawBlock (Format "latex") "\\bambar"] +``` |