Wed, 10 Nov 2010 17:45:37 +0000
|
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
|
|
|