aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-10-19 12:52:12 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2017-10-19 13:23:50 -0700
commit28bb5d610dc8c96a014f610d53b937ea7b9d977e (patch)
tree23847968f8a6a3702192e0b198224dcfe9edecbe
parente941ba05b911d01a51614b0b0060f705b2000688 (diff)
downloadpandoc-28bb5d610dc8c96a014f610d53b937ea7b9d977e.tar.gz
LaTeX reader: support `\expandafter`.
Closes #3983.
-rw-r--r--src/Text/Pandoc/Readers/LaTeX.hs25
-rw-r--r--test/command/3983.md29
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"]
+```