@@ -403,30 +403,30 @@ doMacros n = do
403 Tok spos (CtrlSeq (name <> w)) (x1 <> w <> x2) : ts
403 Tok spos (CtrlSeq (name <> w)) (x1 <> w <> x2) : ts
404 where (x1, x2) = T.break isSpaceOrTab x
404 where (x1, x2) = T.break isSpaceOrTab x
405 combineTok t ts = t:ts
405 combineTok t ts = t:ts
406+ matchTok (Tok _ toktype txt) =
407+ satisfyTok (\(Tok _ toktype' txt') ->
408+ toktype == toktype' &&
410+ matchPattern toks = try $ mapM_ matchTok toks
411+ getargs argmap [] = return argmap
412+ getargs argmap (Pattern toks : rest) = try $ do
415+ getargs argmap (ArgNum i : Pattern toks : rest) =
417+ x <- mconcat <$> manyTill
418+ (braced <|> ((:[]) <$> anyTok))
420+ getargs (M.insert i x argmap) rest
421+ getargs argmap (ArgNum i : rest) = do
422+ x <- try $ spaces >> bracedOrToken
423+ getargs (M.insert i x argmap) rest
406 handleMacros spos name ts = do
424 handleMacros spos name ts = do
407 macros <- sMacros <$> getState
425 macros <- sMacros <$> getState
408 case M.lookup name macros of
426 case M.lookup name macros of
409 Nothing -> return ()
427 Nothing -> return ()
410 Just (Macro expansionPoint argspecs optarg newtoks) -> do
428 Just (Macro expansionPoint argspecs optarg newtoks) -> do
411 setInput ts
429 setInput ts
412− let matchTok (Tok _ toktype txt) =
413− satisfyTok (\(Tok _ toktype' txt') ->
414− toktype == toktype' &&
416− let matchPattern toks = try $ mapM_ matchTok toks
417− let getargs argmap [] = return argmap
418− getargs argmap (Pattern toks : rest) = try $ do
421− getargs argmap (ArgNum i : Pattern toks : rest) =
423− x <- mconcat <$> manyTill
424− (braced <|> ((:[]) <$> anyTok))
426− getargs (M.insert i x argmap) rest
427− getargs argmap (ArgNum i : rest) = do
428− x <- try $ spaces >> bracedOrToken
429− getargs (M.insert i x argmap) rest
430 args <- case optarg of
430 args <- case optarg of
431 Nothing -> getargs M.empty argspecs
431 Nothing -> getargs M.empty argspecs
432 Just o -> do
432 Just o -> do
@@ -442,12 +442,13 @@ doMacros n = do
442 -- see #4007
442 -- see #4007
443 addTok _ (Tok _ (CtrlSeq x) txt)
443 addTok _ (Tok _ (CtrlSeq x) txt)
444 acc@(Tok _ Word _ : _)
444 acc@(Tok _ Word _ : _)
445− | not (T.null txt) &&
445+ | not (T.null txt)
446− isLetter (T.last txt) =
446+ , isLetter (T.last txt) =
447 Tok spos (CtrlSeq x) (txt <> " ") : acc
447 Tok spos (CtrlSeq x) (txt <> " ") : acc
448 addTok _ t acc = setpos spos t : acc
448 addTok _ t acc = setpos spos t : acc
449 ts' <- getInput
449 ts' <- getInput
450 setInput $ foldr (addTok False) ts' newtoks
450 setInput $ foldr (addTok False) ts' newtoks
451 case expansionPoint of
452 case expansionPoint of
452 ExpandWhenUsed ->
453 ExpandWhenUsed ->
453 if n > 20 -- detect macro expansion loops
454 if n > 20 -- detect macro expansion loops