On 29/08/2015 9:26 a.m., Bruno Le Floch wrote: > Joseph understood your point perfectly well. Xparse takes care of > matching nested parentheses, and does that expandably too. It would be > possible for Andrew to abuse xparse to grab his parenthesized group, > but I am not sure whether I want to advise this or not. It would also > be possible to simply copy the code, but finding out where this is > done in xparse's code is non-trivial. I could also just provide code > that does that, but it would take 30 minutes to get completely right > and clean (the code needs to carefully preserve braces when grabbing > delimited arguments, for instance). Using \tl_set_rescan:Nnn seems > reasonable given the above. > Bruno The suggestion that the documentation note the use of empty setups for \tl_set_rescan:Nnn seems to have sparked a wider discussion (much of it beyond me, but interesting as a spectator). The final area where I've used rescanning is in parsing nested commas for functions of multiple arguments. l3fp has max and min. It is easy to translate an expression involving possibly nested \max and \min to a form that l3fp can digest. All the hard parsing work is conducted out of sight in l3fp. But there are other functions, like greatest common divisor, \gcd, which have no corresponding l3fp member. To handle an expression like \gcd(15,24,33) I equate a comma list to the argument 15,24,33 then pop the items of the comma list into token list variables which can be converted to integers and fed to the gcd algorithm. But for a nested expression like \gcd(\max(7+\max(5,2),8),\min(24,29),10+5,\gcd(30,45,6)) the argument of the outer \gcd can't be equated to a comma list without mangling the mathematical syntax. I've treated this by rescanning ( and ) to group begin and end in the argument token list, then equating a comma list to the rescanned argument. The individual items of the comma list are now the correct ones. The token lists resulting on popping items from the comma list are then rescanned with an empty setup to get everything back to "normal", converted to integers and fed to the gcd algorithm. To me the way rescanning cuts through the complexity makes it seem (as they say in medicine of an effective drug) like a magic bullet. Andrew --- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus