Print

Print


On 13/02/2011, at 12:31 PM, Bruno Le Floch wrote:

> His method yields
> "\Uppercase{Som{e } {te{x}t} with $math$.}" -> "SOMe  te{x}t WITH $math$."
> Mine yields:
> "\Uppercase{Som{e } {te{x}t} with $math$.}" -> "SOM{E } {TE{X}T} WITH $MATH$."
> 
> Two questions:
> - what precise behaviour do we want an uppercase function to have? Note that
> we could even provide hooks to let the user choose. (See near the
> bottom of this long email.)
> - what do you think of the advantages/drawbacks described below?


My personal opinion on uppercasing/lowercasing is that it should be a property of the font; some OpenType fonts allow you to do this with, e.g. in fontspec:

    \addfontfeature{Letters=Uppercase}

(although there might not be a "Letters=Lowercase", which is weird. I guess that one is less useful.) In effect, this replaces all lowercase *glyphs* by uppercase variations. But this is highly font-dependent until we are all using LuaTeX and can dynamically add OpenType font features like this.

Anyway, regarding the examples above, I think the behaviour to emulate is David Carlisle's \MakeTextUppercase:

\documentclass{article}
\usepackage{textcase}
\begin{document}
\MakeUppercase{abc {def} {g{h}i} $x+y=z$}\par
\MakeTextUppercase{abc {def} {g{h}i} $x+y=z$}
\end{document}

So this is kinda half-way between your and Joseph's example.

However, if you're just talking about *strings* and not text, then I think the "all letters uppercase" is the way to go. So if we're speaking in expl3 terms, I'd expect \tl_to_uppercase:n{abc $x+y=z$} to output "ABC $X+Y=Z$" whereas I'd expect \TextUppercase of the same to produce  "ABC $x+y=z$".

* * *

In terms of the algorithms to perform these operations, I prefer the way Joseph's code executes (e.g., keeping the number of csnames low) but I prefer the extensibility of Bruno's (although I suspect Bruno's is faster -- but a better question to ask is whether Joseph's is too slow).

For the extensibility thing, I'm wondering for Joseph's code if the "\prg_case_str:nnn {#1} { { a } { A } ..." code could be written as something like "\prg_case_str:nVn {#1} \g_uc_replacements_tl { <else> }".

Cheers,
-- Will