Print

Print


On 10/11/2010 17:25, Rémy Oudompheng wrote:
> Hello everybody,
>
> I am interested in Unicode-capable TeX engines, and as such felt
> that after fontspec and unicode-math, polyglossia would deserve
> a rewrite for expl3. polyglossia currently uses etoolbox to
> provide features much similar to what is offered by the LaTeX3
> packages, notably a lot of keyval-like features. I found benefits
> in the nice syntax offered by l3keys, and the \prg_case_str
> function for example.
>
> You may find a Git repository at
>    http://github.com/remyoudompheng/polyglossia
>
> I am looking for help in testing this, hoping that you will like it,
> and I have also a question: for some reason, in polyglossia
> we need to (un)capitalize words for use in csnames.
>
> I think I can produce somthing like this in LaTeX 3:
>
> \def\art{abc}
> \def\func#1{\tl_to_uppercase:n{\tl_head:n{#1}}{\tl_tail:n #1}}
> \def\frou#1{\exp_args:Nf\func#1}
> \frou\art
>
> produces Abc as expected.
>
> The TeX code is polyglossia is like this:
>
> \def\xpg@uppercasefirst#1{\expandafter\xpg@@uppercasefirst #1}
> \def\xpg@@uppercasefirst#1{%
>         \if a#1A\else
>         \if b#1B\else
>         \if c#1C\else
>         \if d#1D\else
>           ... \fi\fi\fi\fi
>
> I have been trying to replace it by something like
>
> \cs_new:Npn \polyg_uppercase_first:x{\tl_to_uppercase:n{\tl_head:n{#1}{\tl_tail:n
> #1}}
>
> or some combination using \exp_args but the result was never
> equivalent, since in polyglossia the input may be a complicated
> macro and the output will be surrounded by \csname..\endcsname
>
> How should I do that ?
>
> Regards,
>    Rémy Oudompheng.
>

Hello Rémy,

The issue of \tl_uppercase:n / \tl_lowercase:n is one that is on the 
list of things for the team to revisit and sort out properly. I guess 
now might be a good time to do that!

For the moment, my approach to get this expandable would be to use 
\prg_case_str:nnn, which works nicely:

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_nopar:Npn \tl_upper_first:n #1 {
   \prg_case_str:nnn
     { \tl_head:n {#1} }
     {
       { a } { A }
       { b } { B }
       { c } { C }
       { d } { D }
       { e } { E }
       { f } { F }
       { g } { G }
       { h } { H }
       { i } { I }
       { j } { J }
       { k } { K }
       { l } { L }
       { m } { M }
       { n } { N }
       { o } { O }
       { p } { P }
       { q } { Q }
       { r } { R }
       { s } { S }
       { t } { T }
       { u } { U }
       { v } { V }
       { w } { W }
       { x } { X }
       { y } { Y }
       { z } { Z }
     }
     { \tl_head:n {#1} }
   \tl_tail:n {#1}
}
\edef\test{\tl_upper_first:n{abc}}\show\test
\ExplSyntaxOff
\begin{document}
\end{document}

This is more-or-less the same as the current implementation you have in 
the sense that all cases are considered. However, to my mind it's rather 
easier to read. The lower-case version would be done similarly but with 
a reversal of the input and output cases.
-- 
Joseph Wright