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:
Bruno Le Floch <[log in to unmask]>
Reply To:
Mailing list for the LaTeX3 project <[log in to unmask]>
Date:
Tue, 25 Aug 2015 13:34:56 +0200
Content-Type:
text/plain
Parts/Attachments:
text/plain (51 lines)
On 8/25/15, Joseph Wright <[log in to unmask]> 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.)
>
>> (2) Using \fp_to_scientific:n on the result of an l3fp calculation
>> produces, say, 6.023e23. I want to write this as 6.023 \times 10^{23},
>> but the "e" of 6.023e23 doesn't have its "usual" catcode so
>> \tl_replace_once:Nnn doesn't find the "e". (I presume "e" has catcode
>> "other" -- I haven't checked.) Hence I rescan 6.023e23 with an empty
>> setup and then use \tl_replace_once:Nnn (which now does find the "e").
>
> I see that we don't mention the catcode of "e" here: we should do
> (Bruno?). For this particular use case, I'd set up your search using a
> detokenized e
>
>     \cs_generate_variant:Nn \tl_replace_all:Nnn { Nx }
>     \tl_replace_all:Nnn <input> { \tl_to_str:n { e } } { \times }
>
> but probably with a dedicated function
>
>     \cs_new:Npn \__mymodule_format:n #1
>       { \__mymodule_format:w #1 \q_stop }
>     \use:x
>      {
>        \cs_new:Npn \exp_not:N \__mymodule_format:w
>           ##1 \tl_to_str:n { e } ##2 \exp_not:N \q_stop
>      }
>      { \exp_not:n { #1 \times 10 ^ {##2} } }
>
> which can be made more 'robust' if you need to allow for cases where
> there is no "e".

Actually, should we just make the "e" output by \fp_to_scientific:n
into a letter "e" rather than an other "e"?  That's trivial to change,
and would be in line with how \int_to_roman:n produces letter
catcodes.  I don't remember my rationale for outputting an other "e".

Bruno

ATOM RSS1 RSS2