On 26/08/2015 5:10 a.m., Joseph Wright wrote:
[log in to unmask]" type="cite">
On 26/08/2015 12:34, Bruno Le Floch wrote:
Thank you for the responses. I was remiss. I didn't make it clear that
looking inside braced groups was not the concern, rather to replace (or
remove) a list of tokens that might include braced groups. I've been
reworking the code of a package that turns latex expressions into
expressions that can be digested by l3fp. In fact, this particular issue
has now been reworked away, but the problem had been to remove a varying
expression, e.g. \sqrt{123}  or \frac{1-x}{1+x}, from the initial
segment of a formula. Rescanning { and } to "other" allowed me to use
\tl_remove:Nn successfully. Although I can think of other means of doing
this, they seem cumbersome by comparison.

Andrew
\tl_set:No \l_result_tl { \use_none:nn \sqrt{123} + 123 }

could be a better approach in many cases, no?

Bruno

I hadn't thought of the \use_none:... functions. (There is much of expl3 which is *not* at my fingertips.) Thank you, and I see that they can absorb up to 9 tokens.

[log in to unmask]" type="cite">
I'm not quite clear if the outcome needs to be that the calculation
remains the same :-) For the simple case of 'drop the \sqrt', presumably
some wrapper is needed

    \cs_new_protected:Npn \my_calc:n #1
      {
        \tl_set:Nn \l__my_tl {#1}
        \tl_replace_all:Nnn \l__my_tl { \sqrt } { \use_none:n }
        % Further replacements
        \tl_set:Nx \l__my_tl { \l__my_tl }
      }

I'd though probably go for something like

    \cs_new_protected:Npn \my_calc:n #1
      {
        \group_begin:
         \cs_set:Npn \sqrt ##1 { sqrt( ##1 ) }
         % Further replacements
         \fp_set:Nn \l__my_fp {#1}
        \exp_args:NNNV \group_end:
        \fp_set:Nn \l__my_fp \l__my_fp
      }

i.e. set up the various TeX commands to convert expandably into their fp
equivalents, then set an fp before 'smuggling' the result out the group.

Depending on the exact spec these approaches could be combined: for
example \frac{1-x}{1+x} clearly has to go, which might be done with

    \cs_set_eq:NN \frac \use_none:nn

in the second approach or

    \tl_replace_all:Nnn \l__my_tl { \frace} { \use_none:nn }

in the first.

The key point is none of this needs rescanning :-)

Joseph
OK, at first glance I was a bit overwhelmed but having had a little time to see what you are doing, this is helpful.

Dare I continue the theme? For instance I have used rescanning of ( and ) to "group begin" and "group end" to obtain the parenthesised arguments of functions "at one gulp", e.g.

\max(<variable number of terms>)

or the parenthesised part (the inner sum) of

\sum_{k=0}^{\infty}\frac{(-1)^{k}}{2^{k+1}}\left(\sum_{n=0}^{k}(-1)^{n}\binom{k}{n}\frac{1}{(k-n)!}\right)

(= 1/e).

Finally, in arguing against changing catcodes you are assuming a greater knowledge of TeX than I possess. There must be a reason for this deprecation. The great joy of discovering expl3 was that it made TeX programming available to someone familiar with basic (or even, dare I say it, line-numbered BASIC) programming concepts but with only a meagre knowledge of TeX. (So, for instance, I wonder why you use \cs_new_protected
:Npn above rather than \cs_new:Npn or \cs_new_nopar:Npn. Interfaces3.pdf is thin on such matters.)

Andrew
LyX Document



Avast logo

This email has been checked for viruses by Avast antivirus software.
www.avast.com