[latex3-commits] [l3svn] branch master updated: Merge upper/lower and mixed case changers (fixes #378)

noreply at latex-project.org noreply at latex-project.org
Fri Jul 14 23:10:42 CEST 2017


This is an automated email from the git hooks/post-receive script.

joseph pushed a commit to branch master
in repository l3svn.

The following commit(s) were added to refs/heads/master by this push:
       new  8f024a6   Merge upper/lower and mixed case changers (fixes #378)
8f024a6 is described below

commit 8f024a6b2e858c249ff7cf36645f4618e7711dc4
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Fri Jul 14 22:09:20 2017 +0100

    Merge upper/lower and mixed case changers (fixes #378)
    
    The upper/lower code already covered active chars in pdfTeX,
    but the split meant that mixed case didn't. Bringing them together
    addresses this.
---
 l3kernel/l3candidates.dtx               |  357 ++++++++++++++-----------------
 l3kernel/l3str.dtx                      |    4 +-
 l3kernel/testfiles/m3expl001.luatex.tlg |  103 +++++----
 l3kernel/testfiles/m3expl001.ptex.tlg   |   31 ++-
 l3kernel/testfiles/m3expl001.tlg        |   33 ++-
 l3kernel/testfiles/m3expl001.uptex.tlg  |   33 ++-
 l3kernel/testfiles/m3expl001.xetex.tlg  |  103 +++++----
 l3kernel/testfiles/m3expl003.luatex.tlg |  103 +++++----
 l3kernel/testfiles/m3expl003.ptex.tlg   |   31 ++-
 l3kernel/testfiles/m3expl003.tlg        |   33 ++-
 l3kernel/testfiles/m3expl003.uptex.tlg  |   33 ++-
 l3kernel/testfiles/m3expl003.xetex.tlg  |  103 +++++----
 l3kernel/testfiles/m3tl013.tlg          |    8 +-
 13 files changed, 461 insertions(+), 514 deletions(-)

diff --git a/l3kernel/l3candidates.dtx b/l3kernel/l3candidates.dtx
index e827aed..9b0dfff 100644
--- a/l3kernel/l3candidates.dtx
+++ b/l3kernel/l3candidates.dtx
@@ -2409,16 +2409,14 @@
 % \begin{macro}[EXP]{\tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n}
 % \begin{macro}[EXP]{\tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn}
 %   The user level functions here are all wrappers around the internal
-%   functions for case changing. Note that \cs{tl_mixed_case:nn} could be
-%   done without an internal, but this way the logic is slightly clearer as
-%   everything essentially follows the same path.
+%   functions for case changing.
 %    \begin{macrocode}
 \cs_new:Npn \tl_lower_case:n { \@@_change_case:nnn { lower } { } }
 \cs_new:Npn \tl_upper_case:n { \@@_change_case:nnn { upper } { } }
-\cs_new:Npn \tl_mixed_case:n { \@@_mixed_case:nn { } }
+\cs_new:Npn \tl_mixed_case:n { \@@_change_case:nnn { mixed } { } }
 \cs_new:Npn \tl_lower_case:nn { \@@_change_case:nnn { lower } }
 \cs_new:Npn \tl_upper_case:nn { \@@_change_case:nnn { upper } }
-\cs_new:Npn \tl_mixed_case:nn { \@@_mixed_case:nn }
+\cs_new:Npn \tl_mixed_case:nn { \@@_change_case:nnn { mixed } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2436,6 +2434,12 @@
 %   }
 % \begin{macro}[aux, EXP]{\@@_change_case_end:wn}
 % \begin{macro}[aux, EXP]{\@@_change_case_group:nwnn}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_group_lower:nnnn ,
+%     \@@_change_case_group_upper:nnnn ,
+%     \@@_change_case_group_mixed:nnnn
+%   }
 % \begin{macro}[aux, EXP]{\@@_change_case_space:wnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nwnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:NNNnnn}
@@ -2445,17 +2449,29 @@
 % \begin{macro}[aux, EXP]{\@@_change_case_math_group:nwNNnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_math_space:wNNnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nnnn}
-% \begin{macro}[aux, EXP]{\@@_change_case_char:Nnn}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_char_lower:Nnn ,
+%     \@@_change_case_char_upper:Nnn ,
+%     \@@_change_case_char_mixed:Nnn
+%   }
 % \begin{macro}[aux, EXP]{\@@_change_case_char:nN}
 % \begin{macro}[aux, EXP]
 %   {\@@_change_case_char_auxi:nN, \@@_change_case_char_auxii:nN}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_char_mixed:N,
+%     \@@_change_case_char_lower:N,
+%     \@@_change_case_char_upper:N
+%   }
 % \begin{macro}[aux]
-%   {\@@_lookup_lower:N, \@@_lookup_upper:N, \@@_lookup_title:N}
+%   {\@@_lookup_mixed:N, \@@_lookup_lower:N, \@@_lookup_upper:N}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNNNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nn}
-% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:Nnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:Nn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:NnN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_accents:NN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:N}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:NN}
@@ -2464,6 +2480,10 @@
 % \begin{macro}[aux, EXP]{\@@_change_case_if_expandable:NTF}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:NN}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip:N}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip:NN}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip_tidy:Nwn}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_switch:w}
 %   The mechanism for the core conversion of case is based on the idea that
 %   we can use a loop to grab the entire token list plus a quark: the latter is
 %   used as an end marker and to avoid any brace stripping. Depending on the
@@ -2528,6 +2548,10 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
   {
+    \use:c { @@_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4}
+  }
+\cs_new:Npn \@@_change_case_group_lower:nnnn #1#2#3#4
+  {
     \@@_change_case_output:own
       {
         \exp_after:wN
@@ -2538,6 +2562,26 @@
       }
     \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
+\cs_new_eq:NN \@@_change_case_group_upper:nnnn
+  \@@_change_case_group_lower:nnnn
+%    \end{macrocode}
+%  For the \enquote{mixed} case, a group is taken as forcing a switch to lower
+%  casing. That means we need a separate auxiliary. (Tracking whether we have
+%  found a first character inside a group and transferring the information out
+%  looks pretty horrible.)
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_group_mixed:nnnn #1#2#3#4
+  {
+    \@@_change_case_output:own
+      {
+        \exp_after:wN
+          {
+            \exp:w
+            \@@_change_case_aux:nnn {#3} {#4} {#1}
+          }
+      }
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4}
+  }
 \exp_last_unbraced:NNo \cs_new:Npn \@@_change_case_space:wnn \c_space_tl
   {
     \@@_change_case_output:nwn { ~ }
@@ -2635,8 +2679,8 @@
 \cs_new:Npn \@@_change_case_N_type:Nnnn #1#2#3#4
   {
     \token_if_cs:NTF #1
-      { \@@_change_case_cs_letterlike:Nnn #1 {#3} { } }
-      { \@@_change_case_char:Nnn #1 {#3} {#4} }
+      { \@@_change_case_cs_letterlike:Nn #1 {#3} }
+      { \use:c { @@_change_case_char_ #3 :Nnn } #1 {#3} {#4} }
     \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
 %    \end{macrocode}
@@ -2649,7 +2693,7 @@
 %   whereas the core lookup table does not and also guarantees an output so
 %   \texttt{f}-type expansion may be used to obtain the case-changed result.
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_char:Nnn #1#2#3
+\cs_new:Npn \@@_change_case_char_lower:Nnn #1#2#3
   {
     \cs_if_exist_use:cF { @@_change_case_ #2 _ #3 :Nnw }
       { \use_ii:nn }
@@ -2659,6 +2703,24 @@
             { \@@_change_case_char:nN {#2} #1 }
         }
   }
+\cs_new_eq:NN \@@_change_case_char_upper:Nnn
+  \@@_change_case_char_lower:Nnn
+%    \end{macrocode}
+%   For mixed case, the code is somewhat different: there is a need to
+%   look up both mixed and upper case chars and we have to cover the
+%   situation where there is a character to skip over.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_char_mixed:Nnn #1#2#3
+  {
+    \@@_change_case_mixed_switch:w
+    \cs_if_exist_use:cF { @@_change_case_mixed_ #3 :Nnw }
+      {
+        \cs_if_exist_use:cF { @@_change_case_upper_ #3 :Nnw }
+          { \use_ii:nn }
+      }
+        #1
+        { \@@_change_case_mixed_skip:N #1 }
+  }
 %    \end{macrocode}
 %   For Unicode engines we can handle all characters directly. However, for
 %   the $8$-bit engines the aim is to deal with (a subset of) Unicode (UTF-8)
@@ -2689,14 +2751,37 @@
           { \@@_change_case_char_auxi:nN {#1} #2 }
        }
   }
+%    \end{macrocode}
+%   To allow for the special case of mixed case, we insert here a
+%   action-dependent auxiliary.
+%    \begin{macrocode}
 \cs_new:Npn \@@_change_case_char_auxi:nN #1#2
+  { \use:c { @@_change_case_char_ #1 :N  } #2 }
+\cs_new:Npn \@@_change_case_char_lower:N #1
   {
     \@@_change_case_output:fwn
       {
-        \cs_if_exist_use:cF { c__unicode_ #1 _ \token_to_str:N #2 _tl }
-          { \@@_change_case_char_auxii:nN {#1} #2 }
+        \cs_if_exist_use:cF { c__unicode_lower_ \token_to_str:N #1 _tl }
+          { \@@_change_case_char_auxii:nN { lower } #1 }
       }
   }
+\cs_new:Npn \@@_change_case_char_upper:N #1
+  {
+    \@@_change_case_output:fwn
+      {
+        \cs_if_exist_use:cF { c__unicode_upper_ \token_to_str:N #1 _tl }
+          { \@@_change_case_char_auxii:nN { upper } #1 }
+      }
+  }
+\cs_new:Npn \@@_change_case_char_mixed:N #1
+  {
+    \cs_if_exist:cTF { c__unicode_mixed_ \token_to_str:N #1 _tl }
+      {
+        \@@_change_case_output:fwn
+          { \tl_use:c { c__unicode_mixed_ \token_to_str:N #1 _tl } }
+      }
+      { \@@_change_case_char_upper:N #1 }
+  }
 \cs_if_exist:NTF \utex_char:D
   {
     \cs_new:Npn \@@_change_case_char_auxii:nN #1#2
@@ -2711,7 +2796,7 @@
       }
     \cs_new_protected:Npn \@@_lookup_lower:N #1 { \tex_lccode:D `#1 }
     \cs_new_protected:Npn \@@_lookup_upper:N #1 { \tex_uccode:D `#1 }
-    \cs_new_eq:NN \@@_lookup_title:N \@@_lookup_upper:N
+    \cs_new_eq:NN \@@_lookup_mixed:N \@@_lookup_upper:N
   }
   {
     \cs_new:Npn \@@_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
@@ -2737,10 +2822,19 @@
 %   ones to deal with. Letter-like control sequences are a simple look-up,
 %   while for accents the loop is much as done elsewhere. Notice that
 %   we have a no-op test to make sure there is no unexpected expansion of
-%   letter-like input. The third argument here is needed for mixed casing,
-%   where it if there is a hit there has to be a change-of-path.
+%   letter-like input. The split into two parts here allows us to insert
+%   the \enquote{switch} code for mixed casing.
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_cs_letterlike:Nnn #1#2#3
+\cs_new:Npn \@@_change_case_cs_letterlike:Nn #1#2
+  {
+    \str_if_eq:nnTF {#2} { mixed }
+      {
+        \@@_change_case_cs_letterlike:NnN #1 { upper }
+          \@@_change_case_mixed_switch:w
+      }
+      { \@@_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: }
+  }
+\cs_new:Npn \@@_change_case_cs_letterlike:NnN #1#2#3
   {
     \cs_if_exist:cTF { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl }
       {
@@ -2851,6 +2945,51 @@
 \cs_new:Npn \@@_change_case_cs_expand:NN #1#2
   { \exp_after:wN #2 #1 }
 %    \end{macrocode}
+%  For mixed case, there is an additional list of exceptions to deal with:
+%  once that is sorted, we can move on back to the main loop.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_mixed_skip:N #1
+  {
+    \exp_after:wN \@@_change_case_mixed_skip:NN
+      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
+      \q_recursion_tail \q_recursion_stop
+  }
+\cs_new:Npn \@@_change_case_mixed_skip:NN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:nn {#2}
+      { \@@_change_case_char:nN { mixed } #1 }
+    \int_compare:nNnT { `#1 }  = { `#2 }
+      {
+        \use_i_delimit_by_q_recursion_stop:nw
+          {
+            \@@_change_case_output:nwn {#1}
+            \@@_change_case_mixed_skip_tidy:Nwn
+          }
+      }
+    \@@_change_case_mixed_skip:NN #1
+  }
+\cs_new:Npn \@@_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3
+  {
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { mixed }
+  }
+%    \end{macrocode}
+%   Needed to switch from mixed to lower casing when we have found a
+%   first character in the former mode.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_mixed_switch:w
+  #1 \@@_change_case_loop:wnn #2 \q_recursion_stop #3
+  {
+    #1
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 % \end{macro}
 % \end{macro}
 % \end{macro}
@@ -3510,7 +3649,7 @@
           \group_end:
         }
       \@@_tmp:w { 00DF } { SS } { upper }
-      \@@_tmp:w { 00DF } { Ss } { title }
+      \@@_tmp:w { 00DF } { Ss } { mixed }
       \@@_tmp:w { 0131 } { I }  { upper }
     }
   \group_end:
@@ -3554,188 +3693,6 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}[aux, EXP]{\@@_mixed_case:nn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_aux:nn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_loop:wn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_group:nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_space:wn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:NNNnn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nnn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_letterlike:Nw}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_char:N}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip:N}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip:NN}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip_tidy:Nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_char:nN}
-%   Mixed (title) casing requires some custom handling of the case changing
-%   of the first letter in the input followed by a switch to the normal
-%   lower casing routine. That could be covered by passing a set of functions
-%   to generic routines, but at the cost of making the process rather opaque.
-%   Instead, the approach taken here is to use a dedicated set of functions
-%   which keep the different loop requirements clearly separate.
-%
-%   The main loop looks for the first \enquote{real} char in the input
-%   (skipping any pre-letter chars). Once one is found, it is case changed to
-%   upper case but first checking that there is not an entry in the exceptions
-%   list. Note that simply grabbing the first token in the input is no good
-%   here: it can't handle pre-letter tokens or any special treatment of the
-%   first letter found (\emph{e.g.}~words starting with \texttt{i} in
-%   Turkish). Spaces at the start of the input are passed through without
-%   counting as being the \enquote{start} of the first word, while a brace
-%   group is assumed to be contain the first char with everything after the
-%   brace therefore lower cased.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case:nn #1#2
-  {
-    \etex_unexpanded:D \exp_after:wN
-      {
-        \exp:w
-        \@@_mixed_case_aux:nn {#1} {#2}
-      }
-  }
-\cs_new:Npn \@@_mixed_case_aux:nn #1#2
-  {
-    \group_align_safe_begin:
-    \@@_mixed_case_loop:wn
-      #2 \q_recursion_tail \q_recursion_stop {#1}
-    \@@_change_case_result:n { }
-  }
-\cs_new:Npn \@@_mixed_case_loop:wn #1 \q_recursion_stop
-  {
-    \tl_if_head_is_N_type:nTF {#1}
-      { \@@_mixed_case_N_type:Nwn }
-      {
-        \tl_if_head_is_group:nTF {#1}
-          { \@@_mixed_case_group:nwn }
-          { \@@_mixed_case_space:wn }
-      }
-    #1 \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_group:nwn #1#2 \q_recursion_stop #3
-  {
-    \@@_change_case_output:own
-      {
-        \exp_after:wN
-          {
-            \exp:w
-            \@@_mixed_case_aux:nn {#3} {#1}
-          }
-      }
-    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-  }
-\exp_last_unbraced:NNo \cs_new:Npn \@@_mixed_case_space:wn \c_space_tl
-  {
-    \@@_change_case_output:nwn { ~ }
-    \@@_mixed_case_loop:wn
-  }
-\cs_new:Npn \@@_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
-  {
-    \quark_if_recursion_tail_stop_do:Nn #1
-      { \@@_change_case_end:wn }
-    \exp_after:wN \@@_mixed_case_N_type:NNNnn
-      \exp_after:wN #1 \l_tl_case_change_math_tl
-      \q_recursion_tail ? \q_recursion_stop {#2}
-  }
-\cs_new:Npn \@@_mixed_case_N_type:NNNnn #1#2#3
-  {
-    \quark_if_recursion_tail_stop_do:Nn #2
-      { \@@_mixed_case_N_type:Nnn #1 }
-    \token_if_eq_meaning:NNTF #1 #2
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \@@_change_case_math:NNNnnn
-              #1 #3 \@@_mixed_case_loop:wn
-          }
-      }
-      { \@@_mixed_case_N_type:NNNnn #1 }
-  }
-%    \end{macrocode}
-%   The business end of the loop is here: there is first a need to deal
-%   with any control sequence cases before looking for characters to skip.
-%   If there is a hit for a letter-like control sequence, switch to lower
-%   casing.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case_N_type:Nnn #1#2#3
-  {
-    \token_if_cs:NTF #1
-      {
-        \@@_change_case_cs_letterlike:Nnn #1 { upper }
-          { \@@_mixed_case_letterlike:Nw }
-        \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3}
-      }
-      {
-        \@@_mixed_case_char:Nn #1 {#3}
-        \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-      }
-  }
-\cs_new:Npn \@@_mixed_case_letterlike:Nw #1#2 \q_recursion_stop
-  { \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } }
-%    \end{macrocode}
-%   As detailed above, handling a mixed case char means first looking for
-%   exceptions then treating as an upper cased letter, but with a list of
-%   tokens to skip over too.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case_char:Nn #1#2
-  {
-    \cs_if_exist_use:cF { @@_change_case_mixed_ #2 :Nnw }
-      {
-        \cs_if_exist_use:cF { @@_change_case_upper_ #2 :Nnw }
-          { \use_ii:nn }
-      }
-        #1
-        { \@@_mixed_case_skip:N #1 }
-  }
-\cs_new:Npn \@@_mixed_case_skip:N #1
-  {
-    \exp_after:wN \@@_mixed_case_skip:NN
-      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
-      \q_recursion_tail \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_skip:NN #1#2
-  {
-    \quark_if_recursion_tail_stop_do:nn {#2}
-      { \@@_mixed_case_char:N #1 }
-    \int_compare:nNnT { `#1 }  = { `#2 }
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \@@_change_case_output:nwn {#1}
-            \@@_mixed_case_skip_tidy:Nwn
-          }
-      }
-    \@@_mixed_case_skip:NN #1
-  }
-\cs_new:Npn \@@_mixed_case_skip_tidy:Nwn #1#2 \q_recursion_stop #3
-  {
-    \@@_mixed_case_loop:wn #2 \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_char:N #1
-  {
-    \cs_if_exist:cTF { c__unicode_title_  #1 _tl }
-      {
-        \@@_change_case_output:fwn
-          { \tl_use:c { c__unicode_title_ #1 _tl } }
-      }
-      { \@@_change_case_char:nN { upper } #1 }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:Nw}
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:NNw}
diff --git a/l3kernel/l3str.dtx b/l3kernel/l3str.dtx
index 19eb9f5..bdc0ee4 100644
--- a/l3kernel/l3str.dtx
+++ b/l3kernel/l3str.dtx
@@ -1702,7 +1702,7 @@
           \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
           \else:
             \tl_const:cx
-              { c_@@_title_ \utex_char:D "#1 _tl }
+              { c_@@_mixed_ \utex_char:D "#1 _tl }
               { \utex_char:D "#7 }
           \fi:
         }
@@ -1742,7 +1742,7 @@
       \use:n { \@@_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
       \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
       \else:
-        \use:n { \@@_parse_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop
+        \use:n { \@@_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop
       \fi:
     }
   \cs_set_protected:Npn \@@_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 850f15b..eb89070 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -811,18 +811,18 @@ Defining \g_tmpb_str on line ...
 Defining \str_show:n on line ...
 Defining \str_show:N on line ...
 Defining \str_show:c on line ...
-Defining \c__unicode_title_DŽ_tl on line ...
-Defining \c__unicode_title_Dž_tl on line ...
-Defining \c__unicode_title_dž_tl on line ...
-Defining \c__unicode_title_LJ_tl on line ...
-Defining \c__unicode_title_Lj_tl on line ...
-Defining \c__unicode_title_lj_tl on line ...
-Defining \c__unicode_title_NJ_tl on line ...
-Defining \c__unicode_title_Nj_tl on line ...
-Defining \c__unicode_title_nj_tl on line ...
-Defining \c__unicode_title_DZ_tl on line ...
-Defining \c__unicode_title_Dz_tl on line ...
-Defining \c__unicode_title_dz_tl on line ...
+Defining \c__unicode_mixed_DŽ_tl on line ...
+Defining \c__unicode_mixed_Dž_tl on line ...
+Defining \c__unicode_mixed_dž_tl on line ...
+Defining \c__unicode_mixed_LJ_tl on line ...
+Defining \c__unicode_mixed_Lj_tl on line ...
+Defining \c__unicode_mixed_lj_tl on line ...
+Defining \c__unicode_mixed_NJ_tl on line ...
+Defining \c__unicode_mixed_Nj_tl on line ...
+Defining \c__unicode_mixed_nj_tl on line ...
+Defining \c__unicode_mixed_DZ_tl on line ...
+Defining \c__unicode_mixed_Dz_tl on line ...
+Defining \c__unicode_mixed_dz_tl on line ...
 Defining \c__unicode_fold_^^b5_tl on line ...
 Defining \c__unicode_fold_^^df_tl on line ...
 Defining \c__unicode_fold_İ_tl on line ...
@@ -1027,34 +1027,34 @@ Defining \c__unicode_fold_ﬕ_tl on line ...
 Defining \c__unicode_fold_ﬖ_tl on line ...
 Defining \c__unicode_fold_ﬗ_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_lower_İ_tl on line ...
 Defining \c__unicode_upper_ff_tl on line ...
-Defining \c__unicode_title_ff_tl on line ...
+Defining \c__unicode_mixed_ff_tl on line ...
 Defining \c__unicode_upper_fi_tl on line ...
-Defining \c__unicode_title_fi_tl on line ...
+Defining \c__unicode_mixed_fi_tl on line ...
 Defining \c__unicode_upper_fl_tl on line ...
-Defining \c__unicode_title_fl_tl on line ...
+Defining \c__unicode_mixed_fl_tl on line ...
 Defining \c__unicode_upper_ffi_tl on line ...
-Defining \c__unicode_title_ffi_tl on line ...
+Defining \c__unicode_mixed_ffi_tl on line ...
 Defining \c__unicode_upper_ffl_tl on line ...
-Defining \c__unicode_title_ffl_tl on line ...
+Defining \c__unicode_mixed_ffl_tl on line ...
 Defining \c__unicode_upper_ſt_tl on line ...
-Defining \c__unicode_title_ſt_tl on line ...
+Defining \c__unicode_mixed_ſt_tl on line ...
 Defining \c__unicode_upper_st_tl on line ...
-Defining \c__unicode_title_st_tl on line ...
+Defining \c__unicode_mixed_st_tl on line ...
 Defining \c__unicode_upper_և_tl on line ...
-Defining \c__unicode_title_և_tl on line ...
+Defining \c__unicode_mixed_և_tl on line ...
 Defining \c__unicode_upper_ﬓ_tl on line ...
-Defining \c__unicode_title_ﬓ_tl on line ...
+Defining \c__unicode_mixed_ﬓ_tl on line ...
 Defining \c__unicode_upper_ﬔ_tl on line ...
-Defining \c__unicode_title_ﬔ_tl on line ...
+Defining \c__unicode_mixed_ﬔ_tl on line ...
 Defining \c__unicode_upper_ﬕ_tl on line ...
-Defining \c__unicode_title_ﬕ_tl on line ...
+Defining \c__unicode_mixed_ﬕ_tl on line ...
 Defining \c__unicode_upper_ﬖ_tl on line ...
-Defining \c__unicode_title_ﬖ_tl on line ...
+Defining \c__unicode_mixed_ﬖ_tl on line ...
 Defining \c__unicode_upper_ﬗ_tl on line ...
-Defining \c__unicode_title_ﬗ_tl on line ...
+Defining \c__unicode_mixed_ﬗ_tl on line ...
 Defining \c__unicode_upper_ʼn_tl on line ...
 Defining \c__unicode_upper_ΐ_tl on line ...
 Defining \c__unicode_upper_ΰ_tl on line ...
@@ -1135,23 +1135,23 @@ Defining \c__unicode_upper_ῌ_tl on line ...
 Defining \c__unicode_upper_ῳ_tl on line ...
 Defining \c__unicode_upper_ῼ_tl on line ...
 Defining \c__unicode_upper_ᾲ_tl on line ...
-Defining \c__unicode_title_ᾲ_tl on line ...
+Defining \c__unicode_mixed_ᾲ_tl on line ...
 Defining \c__unicode_upper_ᾴ_tl on line ...
-Defining \c__unicode_title_ᾴ_tl on line ...
+Defining \c__unicode_mixed_ᾴ_tl on line ...
 Defining \c__unicode_upper_ῂ_tl on line ...
-Defining \c__unicode_title_ῂ_tl on line ...
+Defining \c__unicode_mixed_ῂ_tl on line ...
 Defining \c__unicode_upper_ῄ_tl on line ...
-Defining \c__unicode_title_ῄ_tl on line ...
+Defining \c__unicode_mixed_ῄ_tl on line ...
 Defining \c__unicode_upper_ῲ_tl on line ...
-Defining \c__unicode_title_ῲ_tl on line ...
+Defining \c__unicode_mixed_ῲ_tl on line ...
 Defining \c__unicode_upper_ῴ_tl on line ...
-Defining \c__unicode_title_ῴ_tl on line ...
+Defining \c__unicode_mixed_ῴ_tl on line ...
 Defining \c__unicode_upper_ᾷ_tl on line ...
-Defining \c__unicode_title_ᾷ_tl on line ...
+Defining \c__unicode_mixed_ᾷ_tl on line ...
 Defining \c__unicode_upper_ῇ_tl on line ...
-Defining \c__unicode_title_ῇ_tl on line ...
+Defining \c__unicode_mixed_ῇ_tl on line ...
 Defining \c__unicode_upper_ῷ_tl on line ...
-Defining \c__unicode_title_ῷ_tl on line ...
+Defining \c__unicode_mixed_ῷ_tl on line ...
 Defining \__seq_item:n on line ...
 Defining \l__seq_internal_a_tl on line ...
 Defining \l__seq_internal_b_tl on line ...
@@ -5524,6 +5524,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5533,14 +5536,20 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
-Defining \__tl_lookup_title:N on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_lookup_mixed:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5549,6 +5558,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5607,20 +5620,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 40dcb2e..d0d643a 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -5515,6 +5515,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5524,15 +5527,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5541,6 +5550,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5598,20 +5611,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 9cfb511..3642f7e 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -5515,6 +5515,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5524,15 +5527,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5541,6 +5550,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5772,7 +5785,7 @@ Defining \c__unicode_upper_^^c8^^99_tl on line ...
 Defining \c__unicode_lower_^^c8^^9a_tl on line ...
 Defining \c__unicode_upper_^^c8^^9b_tl on line ...
 Defining \c__unicode_upper_^^c3^^9f_tl on line ...
-Defining \c__unicode_title_^^c3^^9f_tl on line ...
+Defining \c__unicode_mixed_^^c3^^9f_tl on line ...
 Defining \c__unicode_upper_^^c4^^b1_tl on line ...
 Defining \c__tl_change_case_lower_\AA_tl on line ...
 Defining \c__tl_change_case_upper_\aa_tl on line ...
@@ -5799,20 +5812,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 049e381..796c240 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -5513,6 +5513,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5522,15 +5525,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5539,6 +5548,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5770,7 +5783,7 @@ Defining \c__unicode_upper_ș_tl on line ...
 Defining \c__unicode_lower_Ț_tl on line ...
 Defining \c__unicode_upper_ț_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_upper_ı_tl on line ...
 Defining \c__tl_change_case_lower_\AA_tl on line ...
 Defining \c__tl_change_case_upper_\aa_tl on line ...
@@ -5797,20 +5810,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 8095075..47e31d3 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -809,18 +809,18 @@ Defining \g_tmpb_str on line ...
 Defining \str_show:n on line ...
 Defining \str_show:N on line ...
 Defining \str_show:c on line ...
-Defining \c__unicode_title_DŽ_tl on line ...
-Defining \c__unicode_title_Dž_tl on line ...
-Defining \c__unicode_title_dž_tl on line ...
-Defining \c__unicode_title_LJ_tl on line ...
-Defining \c__unicode_title_Lj_tl on line ...
-Defining \c__unicode_title_lj_tl on line ...
-Defining \c__unicode_title_NJ_tl on line ...
-Defining \c__unicode_title_Nj_tl on line ...
-Defining \c__unicode_title_nj_tl on line ...
-Defining \c__unicode_title_DZ_tl on line ...
-Defining \c__unicode_title_Dz_tl on line ...
-Defining \c__unicode_title_dz_tl on line ...
+Defining \c__unicode_mixed_DŽ_tl on line ...
+Defining \c__unicode_mixed_Dž_tl on line ...
+Defining \c__unicode_mixed_dž_tl on line ...
+Defining \c__unicode_mixed_LJ_tl on line ...
+Defining \c__unicode_mixed_Lj_tl on line ...
+Defining \c__unicode_mixed_lj_tl on line ...
+Defining \c__unicode_mixed_NJ_tl on line ...
+Defining \c__unicode_mixed_Nj_tl on line ...
+Defining \c__unicode_mixed_nj_tl on line ...
+Defining \c__unicode_mixed_DZ_tl on line ...
+Defining \c__unicode_mixed_Dz_tl on line ...
+Defining \c__unicode_mixed_dz_tl on line ...
 Defining \c__unicode_fold_^^b5_tl on line ...
 Defining \c__unicode_fold_^^df_tl on line ...
 Defining \c__unicode_fold_İ_tl on line ...
@@ -1025,34 +1025,34 @@ Defining \c__unicode_fold_ﬕ_tl on line ...
 Defining \c__unicode_fold_ﬖ_tl on line ...
 Defining \c__unicode_fold_ﬗ_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_lower_İ_tl on line ...
 Defining \c__unicode_upper_ff_tl on line ...
-Defining \c__unicode_title_ff_tl on line ...
+Defining \c__unicode_mixed_ff_tl on line ...
 Defining \c__unicode_upper_fi_tl on line ...
-Defining \c__unicode_title_fi_tl on line ...
+Defining \c__unicode_mixed_fi_tl on line ...
 Defining \c__unicode_upper_fl_tl on line ...
-Defining \c__unicode_title_fl_tl on line ...
+Defining \c__unicode_mixed_fl_tl on line ...
 Defining \c__unicode_upper_ffi_tl on line ...
-Defining \c__unicode_title_ffi_tl on line ...
+Defining \c__unicode_mixed_ffi_tl on line ...
 Defining \c__unicode_upper_ffl_tl on line ...
-Defining \c__unicode_title_ffl_tl on line ...
+Defining \c__unicode_mixed_ffl_tl on line ...
 Defining \c__unicode_upper_ſt_tl on line ...
-Defining \c__unicode_title_ſt_tl on line ...
+Defining \c__unicode_mixed_ſt_tl on line ...
 Defining \c__unicode_upper_st_tl on line ...
-Defining \c__unicode_title_st_tl on line ...
+Defining \c__unicode_mixed_st_tl on line ...
 Defining \c__unicode_upper_և_tl on line ...
-Defining \c__unicode_title_և_tl on line ...
+Defining \c__unicode_mixed_և_tl on line ...
 Defining \c__unicode_upper_ﬓ_tl on line ...
-Defining \c__unicode_title_ﬓ_tl on line ...
+Defining \c__unicode_mixed_ﬓ_tl on line ...
 Defining \c__unicode_upper_ﬔ_tl on line ...
-Defining \c__unicode_title_ﬔ_tl on line ...
+Defining \c__unicode_mixed_ﬔ_tl on line ...
 Defining \c__unicode_upper_ﬕ_tl on line ...
-Defining \c__unicode_title_ﬕ_tl on line ...
+Defining \c__unicode_mixed_ﬕ_tl on line ...
 Defining \c__unicode_upper_ﬖ_tl on line ...
-Defining \c__unicode_title_ﬖ_tl on line ...
+Defining \c__unicode_mixed_ﬖ_tl on line ...
 Defining \c__unicode_upper_ﬗ_tl on line ...
-Defining \c__unicode_title_ﬗ_tl on line ...
+Defining \c__unicode_mixed_ﬗ_tl on line ...
 Defining \c__unicode_upper_ʼn_tl on line ...
 Defining \c__unicode_upper_ΐ_tl on line ...
 Defining \c__unicode_upper_ΰ_tl on line ...
@@ -1133,23 +1133,23 @@ Defining \c__unicode_upper_ῌ_tl on line ...
 Defining \c__unicode_upper_ῳ_tl on line ...
 Defining \c__unicode_upper_ῼ_tl on line ...
 Defining \c__unicode_upper_ᾲ_tl on line ...
-Defining \c__unicode_title_ᾲ_tl on line ...
+Defining \c__unicode_mixed_ᾲ_tl on line ...
 Defining \c__unicode_upper_ᾴ_tl on line ...
-Defining \c__unicode_title_ᾴ_tl on line ...
+Defining \c__unicode_mixed_ᾴ_tl on line ...
 Defining \c__unicode_upper_ῂ_tl on line ...
-Defining \c__unicode_title_ῂ_tl on line ...
+Defining \c__unicode_mixed_ῂ_tl on line ...
 Defining \c__unicode_upper_ῄ_tl on line ...
-Defining \c__unicode_title_ῄ_tl on line ...
+Defining \c__unicode_mixed_ῄ_tl on line ...
 Defining \c__unicode_upper_ῲ_tl on line ...
-Defining \c__unicode_title_ῲ_tl on line ...
+Defining \c__unicode_mixed_ῲ_tl on line ...
 Defining \c__unicode_upper_ῴ_tl on line ...
-Defining \c__unicode_title_ῴ_tl on line ...
+Defining \c__unicode_mixed_ῴ_tl on line ...
 Defining \c__unicode_upper_ᾷ_tl on line ...
-Defining \c__unicode_title_ᾷ_tl on line ...
+Defining \c__unicode_mixed_ᾷ_tl on line ...
 Defining \c__unicode_upper_ῇ_tl on line ...
-Defining \c__unicode_title_ῇ_tl on line ...
+Defining \c__unicode_mixed_ῇ_tl on line ...
 Defining \c__unicode_upper_ῷ_tl on line ...
-Defining \c__unicode_title_ῷ_tl on line ...
+Defining \c__unicode_mixed_ῷ_tl on line ...
 Defining \__seq_item:n on line ...
 Defining \l__seq_internal_a_tl on line ...
 Defining \l__seq_internal_b_tl on line ...
@@ -5498,6 +5498,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5507,14 +5510,20 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
-Defining \__tl_lookup_title:N on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_lookup_mixed:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5523,6 +5532,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5581,20 +5594,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 96b8a0c..1a9c92c 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -811,18 +811,18 @@ Defining \g_tmpb_str on line ...
 Defining \str_show:n on line ...
 Defining \str_show:N on line ...
 Defining \str_show:c on line ...
-Defining \c__unicode_title_DŽ_tl on line ...
-Defining \c__unicode_title_Dž_tl on line ...
-Defining \c__unicode_title_dž_tl on line ...
-Defining \c__unicode_title_LJ_tl on line ...
-Defining \c__unicode_title_Lj_tl on line ...
-Defining \c__unicode_title_lj_tl on line ...
-Defining \c__unicode_title_NJ_tl on line ...
-Defining \c__unicode_title_Nj_tl on line ...
-Defining \c__unicode_title_nj_tl on line ...
-Defining \c__unicode_title_DZ_tl on line ...
-Defining \c__unicode_title_Dz_tl on line ...
-Defining \c__unicode_title_dz_tl on line ...
+Defining \c__unicode_mixed_DŽ_tl on line ...
+Defining \c__unicode_mixed_Dž_tl on line ...
+Defining \c__unicode_mixed_dž_tl on line ...
+Defining \c__unicode_mixed_LJ_tl on line ...
+Defining \c__unicode_mixed_Lj_tl on line ...
+Defining \c__unicode_mixed_lj_tl on line ...
+Defining \c__unicode_mixed_NJ_tl on line ...
+Defining \c__unicode_mixed_Nj_tl on line ...
+Defining \c__unicode_mixed_nj_tl on line ...
+Defining \c__unicode_mixed_DZ_tl on line ...
+Defining \c__unicode_mixed_Dz_tl on line ...
+Defining \c__unicode_mixed_dz_tl on line ...
 Defining \c__unicode_fold_^^b5_tl on line ...
 Defining \c__unicode_fold_^^df_tl on line ...
 Defining \c__unicode_fold_İ_tl on line ...
@@ -1027,34 +1027,34 @@ Defining \c__unicode_fold_ﬕ_tl on line ...
 Defining \c__unicode_fold_ﬖ_tl on line ...
 Defining \c__unicode_fold_ﬗ_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_lower_İ_tl on line ...
 Defining \c__unicode_upper_ff_tl on line ...
-Defining \c__unicode_title_ff_tl on line ...
+Defining \c__unicode_mixed_ff_tl on line ...
 Defining \c__unicode_upper_fi_tl on line ...
-Defining \c__unicode_title_fi_tl on line ...
+Defining \c__unicode_mixed_fi_tl on line ...
 Defining \c__unicode_upper_fl_tl on line ...
-Defining \c__unicode_title_fl_tl on line ...
+Defining \c__unicode_mixed_fl_tl on line ...
 Defining \c__unicode_upper_ffi_tl on line ...
-Defining \c__unicode_title_ffi_tl on line ...
+Defining \c__unicode_mixed_ffi_tl on line ...
 Defining \c__unicode_upper_ffl_tl on line ...
-Defining \c__unicode_title_ffl_tl on line ...
+Defining \c__unicode_mixed_ffl_tl on line ...
 Defining \c__unicode_upper_ſt_tl on line ...
-Defining \c__unicode_title_ſt_tl on line ...
+Defining \c__unicode_mixed_ſt_tl on line ...
 Defining \c__unicode_upper_st_tl on line ...
-Defining \c__unicode_title_st_tl on line ...
+Defining \c__unicode_mixed_st_tl on line ...
 Defining \c__unicode_upper_և_tl on line ...
-Defining \c__unicode_title_և_tl on line ...
+Defining \c__unicode_mixed_և_tl on line ...
 Defining \c__unicode_upper_ﬓ_tl on line ...
-Defining \c__unicode_title_ﬓ_tl on line ...
+Defining \c__unicode_mixed_ﬓ_tl on line ...
 Defining \c__unicode_upper_ﬔ_tl on line ...
-Defining \c__unicode_title_ﬔ_tl on line ...
+Defining \c__unicode_mixed_ﬔ_tl on line ...
 Defining \c__unicode_upper_ﬕ_tl on line ...
-Defining \c__unicode_title_ﬕ_tl on line ...
+Defining \c__unicode_mixed_ﬕ_tl on line ...
 Defining \c__unicode_upper_ﬖ_tl on line ...
-Defining \c__unicode_title_ﬖ_tl on line ...
+Defining \c__unicode_mixed_ﬖ_tl on line ...
 Defining \c__unicode_upper_ﬗ_tl on line ...
-Defining \c__unicode_title_ﬗ_tl on line ...
+Defining \c__unicode_mixed_ﬗ_tl on line ...
 Defining \c__unicode_upper_ʼn_tl on line ...
 Defining \c__unicode_upper_ΐ_tl on line ...
 Defining \c__unicode_upper_ΰ_tl on line ...
@@ -1135,23 +1135,23 @@ Defining \c__unicode_upper_ῌ_tl on line ...
 Defining \c__unicode_upper_ῳ_tl on line ...
 Defining \c__unicode_upper_ῼ_tl on line ...
 Defining \c__unicode_upper_ᾲ_tl on line ...
-Defining \c__unicode_title_ᾲ_tl on line ...
+Defining \c__unicode_mixed_ᾲ_tl on line ...
 Defining \c__unicode_upper_ᾴ_tl on line ...
-Defining \c__unicode_title_ᾴ_tl on line ...
+Defining \c__unicode_mixed_ᾴ_tl on line ...
 Defining \c__unicode_upper_ῂ_tl on line ...
-Defining \c__unicode_title_ῂ_tl on line ...
+Defining \c__unicode_mixed_ῂ_tl on line ...
 Defining \c__unicode_upper_ῄ_tl on line ...
-Defining \c__unicode_title_ῄ_tl on line ...
+Defining \c__unicode_mixed_ῄ_tl on line ...
 Defining \c__unicode_upper_ῲ_tl on line ...
-Defining \c__unicode_title_ῲ_tl on line ...
+Defining \c__unicode_mixed_ῲ_tl on line ...
 Defining \c__unicode_upper_ῴ_tl on line ...
-Defining \c__unicode_title_ῴ_tl on line ...
+Defining \c__unicode_mixed_ῴ_tl on line ...
 Defining \c__unicode_upper_ᾷ_tl on line ...
-Defining \c__unicode_title_ᾷ_tl on line ...
+Defining \c__unicode_mixed_ᾷ_tl on line ...
 Defining \c__unicode_upper_ῇ_tl on line ...
-Defining \c__unicode_title_ῇ_tl on line ...
+Defining \c__unicode_mixed_ῇ_tl on line ...
 Defining \c__unicode_upper_ῷ_tl on line ...
-Defining \c__unicode_title_ῷ_tl on line ...
+Defining \c__unicode_mixed_ῷ_tl on line ...
 Defining \__seq_item:n on line ...
 Defining \l__seq_internal_a_tl on line ...
 Defining \l__seq_internal_b_tl on line ...
@@ -5525,6 +5525,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5534,14 +5537,20 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
-Defining \__tl_lookup_title:N on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_lookup_mixed:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5550,6 +5559,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5608,20 +5621,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 5414d8d..0b673fc 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -5516,6 +5516,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5525,15 +5528,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5542,6 +5551,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5599,20 +5612,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 088616d..68a4166 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -5516,6 +5516,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5525,15 +5528,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5542,6 +5551,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5773,7 +5786,7 @@ Defining \c__unicode_upper_^^c8^^99_tl on line ...
 Defining \c__unicode_lower_^^c8^^9a_tl on line ...
 Defining \c__unicode_upper_^^c8^^9b_tl on line ...
 Defining \c__unicode_upper_^^c3^^9f_tl on line ...
-Defining \c__unicode_title_^^c3^^9f_tl on line ...
+Defining \c__unicode_mixed_^^c3^^9f_tl on line ...
 Defining \c__unicode_upper_^^c4^^b1_tl on line ...
 Defining \c__tl_change_case_lower_\AA_tl on line ...
 Defining \c__tl_change_case_upper_\aa_tl on line ...
@@ -5800,20 +5813,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index e12b528..8428edb 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -5514,6 +5514,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5523,15 +5526,21 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nNNNNN on line ...
 Defining \__tl_change_case_char_UTFviii:nnN on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5540,6 +5549,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5771,7 +5784,7 @@ Defining \c__unicode_upper_ș_tl on line ...
 Defining \c__unicode_lower_Ț_tl on line ...
 Defining \c__unicode_upper_ț_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_upper_ı_tl on line ...
 Defining \c__tl_change_case_lower_\AA_tl on line ...
 Defining \c__tl_change_case_upper_\aa_tl on line ...
@@ -5798,20 +5811,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index b09b578..b458dc7 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -809,18 +809,18 @@ Defining \g_tmpb_str on line ...
 Defining \str_show:n on line ...
 Defining \str_show:N on line ...
 Defining \str_show:c on line ...
-Defining \c__unicode_title_DŽ_tl on line ...
-Defining \c__unicode_title_Dž_tl on line ...
-Defining \c__unicode_title_dž_tl on line ...
-Defining \c__unicode_title_LJ_tl on line ...
-Defining \c__unicode_title_Lj_tl on line ...
-Defining \c__unicode_title_lj_tl on line ...
-Defining \c__unicode_title_NJ_tl on line ...
-Defining \c__unicode_title_Nj_tl on line ...
-Defining \c__unicode_title_nj_tl on line ...
-Defining \c__unicode_title_DZ_tl on line ...
-Defining \c__unicode_title_Dz_tl on line ...
-Defining \c__unicode_title_dz_tl on line ...
+Defining \c__unicode_mixed_DŽ_tl on line ...
+Defining \c__unicode_mixed_Dž_tl on line ...
+Defining \c__unicode_mixed_dž_tl on line ...
+Defining \c__unicode_mixed_LJ_tl on line ...
+Defining \c__unicode_mixed_Lj_tl on line ...
+Defining \c__unicode_mixed_lj_tl on line ...
+Defining \c__unicode_mixed_NJ_tl on line ...
+Defining \c__unicode_mixed_Nj_tl on line ...
+Defining \c__unicode_mixed_nj_tl on line ...
+Defining \c__unicode_mixed_DZ_tl on line ...
+Defining \c__unicode_mixed_Dz_tl on line ...
+Defining \c__unicode_mixed_dz_tl on line ...
 Defining \c__unicode_fold_^^b5_tl on line ...
 Defining \c__unicode_fold_^^df_tl on line ...
 Defining \c__unicode_fold_İ_tl on line ...
@@ -1025,34 +1025,34 @@ Defining \c__unicode_fold_ﬕ_tl on line ...
 Defining \c__unicode_fold_ﬖ_tl on line ...
 Defining \c__unicode_fold_ﬗ_tl on line ...
 Defining \c__unicode_upper_^^df_tl on line ...
-Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_mixed_^^df_tl on line ...
 Defining \c__unicode_lower_İ_tl on line ...
 Defining \c__unicode_upper_ff_tl on line ...
-Defining \c__unicode_title_ff_tl on line ...
+Defining \c__unicode_mixed_ff_tl on line ...
 Defining \c__unicode_upper_fi_tl on line ...
-Defining \c__unicode_title_fi_tl on line ...
+Defining \c__unicode_mixed_fi_tl on line ...
 Defining \c__unicode_upper_fl_tl on line ...
-Defining \c__unicode_title_fl_tl on line ...
+Defining \c__unicode_mixed_fl_tl on line ...
 Defining \c__unicode_upper_ffi_tl on line ...
-Defining \c__unicode_title_ffi_tl on line ...
+Defining \c__unicode_mixed_ffi_tl on line ...
 Defining \c__unicode_upper_ffl_tl on line ...
-Defining \c__unicode_title_ffl_tl on line ...
+Defining \c__unicode_mixed_ffl_tl on line ...
 Defining \c__unicode_upper_ſt_tl on line ...
-Defining \c__unicode_title_ſt_tl on line ...
+Defining \c__unicode_mixed_ſt_tl on line ...
 Defining \c__unicode_upper_st_tl on line ...
-Defining \c__unicode_title_st_tl on line ...
+Defining \c__unicode_mixed_st_tl on line ...
 Defining \c__unicode_upper_և_tl on line ...
-Defining \c__unicode_title_և_tl on line ...
+Defining \c__unicode_mixed_և_tl on line ...
 Defining \c__unicode_upper_ﬓ_tl on line ...
-Defining \c__unicode_title_ﬓ_tl on line ...
+Defining \c__unicode_mixed_ﬓ_tl on line ...
 Defining \c__unicode_upper_ﬔ_tl on line ...
-Defining \c__unicode_title_ﬔ_tl on line ...
+Defining \c__unicode_mixed_ﬔ_tl on line ...
 Defining \c__unicode_upper_ﬕ_tl on line ...
-Defining \c__unicode_title_ﬕ_tl on line ...
+Defining \c__unicode_mixed_ﬕ_tl on line ...
 Defining \c__unicode_upper_ﬖ_tl on line ...
-Defining \c__unicode_title_ﬖ_tl on line ...
+Defining \c__unicode_mixed_ﬖ_tl on line ...
 Defining \c__unicode_upper_ﬗ_tl on line ...
-Defining \c__unicode_title_ﬗ_tl on line ...
+Defining \c__unicode_mixed_ﬗ_tl on line ...
 Defining \c__unicode_upper_ʼn_tl on line ...
 Defining \c__unicode_upper_ΐ_tl on line ...
 Defining \c__unicode_upper_ΰ_tl on line ...
@@ -1133,23 +1133,23 @@ Defining \c__unicode_upper_ῌ_tl on line ...
 Defining \c__unicode_upper_ῳ_tl on line ...
 Defining \c__unicode_upper_ῼ_tl on line ...
 Defining \c__unicode_upper_ᾲ_tl on line ...
-Defining \c__unicode_title_ᾲ_tl on line ...
+Defining \c__unicode_mixed_ᾲ_tl on line ...
 Defining \c__unicode_upper_ᾴ_tl on line ...
-Defining \c__unicode_title_ᾴ_tl on line ...
+Defining \c__unicode_mixed_ᾴ_tl on line ...
 Defining \c__unicode_upper_ῂ_tl on line ...
-Defining \c__unicode_title_ῂ_tl on line ...
+Defining \c__unicode_mixed_ῂ_tl on line ...
 Defining \c__unicode_upper_ῄ_tl on line ...
-Defining \c__unicode_title_ῄ_tl on line ...
+Defining \c__unicode_mixed_ῄ_tl on line ...
 Defining \c__unicode_upper_ῲ_tl on line ...
-Defining \c__unicode_title_ῲ_tl on line ...
+Defining \c__unicode_mixed_ῲ_tl on line ...
 Defining \c__unicode_upper_ῴ_tl on line ...
-Defining \c__unicode_title_ῴ_tl on line ...
+Defining \c__unicode_mixed_ῴ_tl on line ...
 Defining \c__unicode_upper_ᾷ_tl on line ...
-Defining \c__unicode_title_ᾷ_tl on line ...
+Defining \c__unicode_mixed_ᾷ_tl on line ...
 Defining \c__unicode_upper_ῇ_tl on line ...
-Defining \c__unicode_title_ῇ_tl on line ...
+Defining \c__unicode_mixed_ῇ_tl on line ...
 Defining \c__unicode_upper_ῷ_tl on line ...
-Defining \c__unicode_title_ῷ_tl on line ...
+Defining \c__unicode_mixed_ῷ_tl on line ...
 Defining \__seq_item:n on line ...
 Defining \l__seq_internal_a_tl on line ...
 Defining \l__seq_internal_b_tl on line ...
@@ -5499,6 +5499,9 @@ Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
+Defining \__tl_change_case_group_lower:nnnn on line ...
+Defining \__tl_change_case_group_upper:nnnn on line ...
+Defining \__tl_change_case_group_mixed:nnnn on line ...
 Defining \__tl_change_case_space:wnn on line ...
 Defining \__tl_change_case_N_type:Nwnn on line ...
 Defining \__tl_change_case_N_type:NNNnnn on line ...
@@ -5508,14 +5511,20 @@ Defining \__tl_change_case_math:NwNNnn on line ...
 Defining \__tl_change_case_math_group:nwNNnn on line ...
 Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
-Defining \__tl_change_case_char:Nnn on line ...
+Defining \__tl_change_case_char_lower:Nnn on line ...
+Defining \__tl_change_case_char_upper:Nnn on line ...
+Defining \__tl_change_case_char_mixed:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
 Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_lower:N on line ...
+Defining \__tl_change_case_char_upper:N on line ...
+Defining \__tl_change_case_char_mixed:N on line ...
 Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
-Defining \__tl_lookup_title:N on line ...
-Defining \__tl_change_case_cs_letterlike:Nnn on line ...
+Defining \__tl_lookup_mixed:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_letterlike:NnN on line ...
 Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
@@ -5524,6 +5533,10 @@ Defining \__tl_change_case_protect:wNN on line ...
 Defining \__tl_change_case_if_expandable:NTF on line ...
 Defining \__tl_change_case_cs_expand:Nnw on line ...
 Defining \__tl_change_case_cs_expand:NN on line ...
+Defining \__tl_change_case_mixed_skip:N on line ...
+Defining \__tl_change_case_mixed_skip:NN on line ...
+Defining \__tl_change_case_mixed_skip_tidy:Nwn on line ...
+Defining \__tl_change_case_mixed_switch:w on line ...
 Defining \__tl_change_case_lower_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_sigma:w on line ...
 Defining \__tl_change_case_lower_sigma:Nw on line ...
@@ -5582,20 +5595,6 @@ Defining \c__tl_change_case_upper_\th_tl on line ...
 Defining \c__tl_change_case_upper_\i_tl on line ...
 Defining \c__tl_change_case_upper_\j_tl on line ...
 Defining \l_tl_case_change_accents_tl on line ...
-Defining \__tl_mixed_case:nn on line ...
-Defining \__tl_mixed_case_aux:nn on line ...
-Defining \__tl_mixed_case_loop:wn on line ...
-Defining \__tl_mixed_case_group:nwn on line ...
-Defining \__tl_mixed_case_space:wn on line ...
-Defining \__tl_mixed_case_N_type:Nwn on line ...
-Defining \__tl_mixed_case_N_type:NNNnn on line ...
-Defining \__tl_mixed_case_N_type:Nnn on line ...
-Defining \__tl_mixed_case_letterlike:Nw on line ...
-Defining \__tl_mixed_case_char:Nn on line ...
-Defining \__tl_mixed_case_skip:N on line ...
-Defining \__tl_mixed_case_skip:NN on line ...
-Defining \__tl_mixed_case_skip_tidy:Nwn on line ...
-Defining \__tl_mixed_case_char:N on line ...
 Defining \__tl_change_case_mixed_nl:Nnw on line ...
 Defining \__tl_change_case_mixed_nl:Nw on line ...
 Defining \__tl_change_case_mixed_nl:NNw on line ...
diff --git a/l3kernel/testfiles/m3tl013.tlg b/l3kernel/testfiles/m3tl013.tlg
index 0507384..f57accf 100644
--- a/l3kernel/testfiles/m3tl013.tlg
+++ b/l3kernel/testfiles/m3tl013.tlg
@@ -49,7 +49,7 @@ TEST 6: Unicode case changing
 ============================================================
 ^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
 ^^c3^^85^^c3^^89^^c3^^8e^^c3^^98^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
-^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
+^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
 ============================================================
 ============================================================
 TEST 7: Unicode case changing exceptions
@@ -77,8 +77,8 @@ RAGIP HUL^^c3^^9bS^^c4^^b0 ^^c3^^96ZDEM
 RAGIP HUL^^c3^^9bSI ^^c3^^96ZDEM
 Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
 Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
-Ip hul^^c3^^bbsi ^^c3^^b6zdem
-Ip hul^^c3^^bbsi ^^c3^^b6zdem
+^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
+^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
 ============================================================
 ============================================================
 TEST 10: Lithuanian
@@ -109,7 +109,7 @@ Im
 ============================================================
 TEST 12: Mixed case exceptions
 ============================================================
-SSoo
+Ssoo
 ^^c7^^85!
 ============================================================
 ============================================================

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the latex3-commits mailing list