LATEX-L Archives

Mailing list for the LaTeX3 project

LATEX-L@LISTSERV.UNI-HEIDELBERG.DE

Options: Use Forum View

Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
Joseph Wright <[log in to unmask]>
Reply To:
Mailing list for the LaTeX3 project <[log in to unmask]>
Date:
Wed, 26 Aug 2015 13:10:51 +0100
Content-Type:
text/plain
Parts/Attachments:
text/plain (82 lines)
On 26/08/2015 12:34, Bruno Le Floch wrote:
> On 8/26/15, aparsloe <[log in to unmask]> wrote:
>> On 25/08/2015 1:35 a.m., Joseph Wright wrote:
>>> On 25/08/2015 07:05, Joseph Wright wrote:
>>>> On 26/08/2015 00:44, aparsloe wrote:
>>>>> (1) I wanted to use \tl_replace_all:Nnn on a token list that might
>>>>> contain braced groups. Using \tl_set_rescan:Nnn to change the category
>>>>> codes of { and } seemed the most direct way of proceeding. (Then
>>>>> resetting the category codes after replacement with an empty setup.)
>>>> I see what you mean (I have a similar case in siunitx, for historical
>>>> reasons). We'll explore what we can do with this: there are
>>>> mapping-based approaches one can imagine that will enter brace groups.
>>>> (We do that for \tl_lower_case:n, for example). However, for a general
>>>> 'search and replace' I'd be slightly wary as the TeX convention that
>>>> stuff in brace groups is 'special' is quite prevalent. (Depending on
>>>> performance requirements, you might also look at l3regex if you are
>>>> doing the replacement only very rarely.)
>>> It would be useful here to see what your real use case is, as that's
>>> often illustrative.
>>> --
>>> Joseph Wright
>> 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'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

ATOM RSS1 RSS2