diff options
author | Norbert Preining <norbert@preining.info> | 2023-10-24 03:01:00 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-10-24 03:01:00 +0000 |
commit | 7fc03b60d145610ff8e62c3d3a0d5fe037f6597d (patch) | |
tree | 5a571652d167dc38829a038550b6a7fbb8b57b2c /macros/latex/contrib/l3kernel/l3text-case.dtx | |
parent | 6864ad38da5412fd65e655da307e368cea282091 (diff) |
CTAN sync 202310240300
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3text-case.dtx')
-rw-r--r-- | macros/latex/contrib/l3kernel/l3text-case.dtx | 1366 |
1 files changed, 698 insertions, 668 deletions
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx index 0e20a797f0..e34e9043a5 100644 --- a/macros/latex/contrib/l3kernel/l3text-case.dtx +++ b/macros/latex/contrib/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2023-10-10} +% \date{Released 2023-10-23} % % \maketitle % @@ -77,16 +77,17 @@ % { % \text_lowercase:n, % \text_uppercase:n, -% \text_titlecase:n, +% \text_titlecase_all:n, % \text_titlecase_first:n % } % \begin{macro}[EXP] % { % \text_lowercase:nn, % \text_uppercase:nn, -% \text_titlecase:nn, +% \text_titlecase_all:nn, % \text_titlecase_first:nn % } +% \begin{macro}[EXP]{\@@_change_case:nnn} % The user level functions here are all wrappers around the internal % functions for case changing. % \begin{macrocode} @@ -94,31 +95,34 @@ { \@@_change_case:nnn { lower } { } {#1} } \cs_new:Npn \text_uppercase:n #1 { \@@_change_case:nnn { upper } { } {#1} } -\cs_new:Npn \text_titlecase:n #1 +\cs_new:Npn \text_titlecase_all:n #1 { \@@_change_case:nnn { title } { } {#1} } \cs_new:Npn \text_titlecase_first:n #1 - { \@@_change_case:nnn { titleonly } { } {#1} } + { \@@_change_case:nnnn { title } { break } { } {#1} } \cs_new:Npn \text_lowercase:nn #1#2 { \@@_change_case:nnn { lower } {#1} {#2} } \cs_new:Npn \text_uppercase:nn #1#2 { \@@_change_case:nnn { upper } {#1} {#2} } -\cs_new:Npn \text_titlecase:nn #1#2 +\cs_new:Npn \text_titlecase_all:nn #1#2 { \@@_change_case:nnn { title } {#1} {#2} } \cs_new:Npn \text_titlecase_first:nn #1#2 - { \@@_change_case:nnn { titleonly } {#1} {#2} } + { \@@_change_case:nnnn { title } { break } {#1} {#2} } +\cs_new:Npn \@@_change_case:nnn #1#2#3 + { \@@_change_case:nnnn {#1} {#1} {#2} {#3} } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}[EXP] % { -% \@@_change_case:nnn , -% \@@_change_case_auxi:nnn , -% \@@_change_case_auxii:nnn +% \@@_change_case:nnnn , +% \@@_change_case_auxi:nnnn , +% \@@_change_case_auxii:nnnn % } -% \begin{macro}[EXP]{\@@_change_case_BCP:nnn} -% \begin{macro}[EXP]{\@@_change_case_BCP:nnw} -% \begin{macro}[EXP]{\@@_change_case_BCP:nnnnw} +% \begin{macro}[EXP]{\@@_change_case_BCP:nnnn} +% \begin{macro}[EXP]{\@@_change_case_BCP:nnnw} +% \begin{macro}[EXP]{\@@_change_case_BCP:nnnnnw} % \begin{macro}[EXP] % { % \@@_change_case_store:n, \@@_change_case_store:o, @@ -128,74 +132,69 @@ % \begin{macro}[EXP]{\@@_change_case_store:nw} % \begin{macro}[EXP]{\@@_change_case_result:n} % \begin{macro}[EXP]{\@@_change_case_end:w} -% \begin{macro}[EXP]{\@@_change_case_loop:nnw} -% \begin{macro}[EXP]{\@@_change_case_break:w} +% \begin{macro}[EXP]{\@@_change_case_loop:nnnw} +% \begin{macro}[EXP]{\@@_change_case_break:w, \@@_change_case_break_aux:w} % \begin{macro}[EXP] % { -% \@@_change_case_group_lower:nnn , -% \@@_change_case_group_upper:nnn , -% \@@_change_case_group_title:nnn , -% \@@_change_case_group_titleonly:nnn +% \@@_change_case_group_lower:nnnn , +% \@@_change_case_group_upper:nnnn , +% \@@_change_case_group_title:nnnn % } -% \begin{macro}[EXP]{\@@_change_case_space:nnw} % \begin{macro}[EXP] -% {\@@_change_case_N_type:nnN, \@@_change_case_N_type_aux:nnN} -% \begin{macro}[EXP]{\@@_change_case_N_type:nnnN} -% \begin{macro}[EXP]{\@@_change_case_math_search:nnNNN} -% \begin{macro}[EXP]{\@@_change_case_math_loop:nnNw} -% \begin{macro}[EXP]{\@@_change_case_math_N_type:nnNN} -% \begin{macro}[EXP]{\@@_change_case_math_group:nnNn} -% \begin{macro}[EXP]{\@@_change_case_math_space:nnNw} -% \begin{macro}[EXP]{\@@_change_case_cs_check:nnN} -% \begin{macro}[EXP]{\@@_change_case_exclude:nnN} -% \begin{macro}[EXP]{\@@_change_case_exclude:nnnN} -% \begin{macro}[EXP]{\@@_change_case_exclude:nnNN} -% \begin{macro}[EXP]{\@@_change_case_exclude:nnNw} -% \begin{macro}[EXP]{\@@_change_case_exclude:nnNnn} -% \begin{macro}[EXP]{\@@_change_case_replace:nnN} -% \begin{macro}[EXP]{\@@_change_case_replace:nnn, \@@_change_case_replace:vnn} -% \begin{macro}[EXP]{\@@_change_case_switch:nnN} +% {\@@_change_case_space:nnnw, \@@_change_case_space_break:nnnw} % \begin{macro}[EXP] -% { -% \@@_change_case_switch_lower:nnNnnnn , -% \@@_change_case_switch_upper:nnNnnnn , -% \@@_change_case_switch_title:nnNnnnn , -% \@@_change_case_switch_titleonly:nnNnnnn -% } +% {\@@_change_case_N_type:nnnN, \@@_change_case_N_type_aux:nnnN} +% \begin{macro}[EXP]{\@@_change_case_N_type:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_math_search:nnnNNN} +% \begin{macro}[EXP]{\@@_change_case_math_loop:nnnNw} +% \begin{macro}[EXP]{\@@_change_case_math_N_type:nnnNN} +% \begin{macro}[EXP]{\@@_change_case_math_group:nnnNn} +% \begin{macro}[EXP]{\@@_change_case_math_space:nnnNw} +% \begin{macro}[EXP]{\@@_change_case_cs_check:nnnN} +% \begin{macro}[EXP]{\@@_change_case_exclude:nnnN} +% \begin{macro}[EXP]{\@@_change_case_exclude:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_exclude:nnnNN} +% \begin{macro}[EXP]{\@@_change_case_exclude:nnnNw} +% \begin{macro}[EXP]{\@@_change_case_exclude:nnnNnn} +% \begin{macro}[EXP]{\@@_change_case_replace:nnnN} +% \begin{macro}[EXP]{\@@_change_case_replace:nnnn, \@@_change_case_replace:vnnn} +% \begin{macro}[EXP]{\@@_change_case_switch:nnnN} % \begin{macro}[EXP] % { -% \@@_change_case_letterlike_lower:nnN , -% \@@_change_case_letterlike_upper:nnN , -% \@@_change_case_letterlike_title:nnN , -% \@@_change_case_letterlike_titleonly:nnN +% \@@_change_case_switch_lower:nnnNnnnn , +% \@@_change_case_switch_upper:nnnNnnnn , +% \@@_change_case_switch_title:nnnNnnnn % } -% \begin{macro}[EXP]{\@@_change_case_letterlike:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_skip:nnw} +% \begin{macro}[EXP]{\@@_change_case_skip_N_type:nnN} +% \begin{macro}[EXP]{\@@_change_case_skip_group:nnn} +% \begin{macro}[EXP]{\@@_change_case_skip_space:nnw} % \begin{macro}[EXP] % { -% \@@_change_case_custom_lower:nnn , -% \@@_change_case_custom_title:nnn , -% \@@_change_case_custom_upper:nnn , -% \@@_change_case_custom_titleonly:nnn +% \@@_change_case_letterlike_lower:nnnN , +% \@@_change_case_letterlike_upper:nnnN , +% \@@_change_case_letterlike_title:nnnN % } -% \begin{macro}[EXP]{\@@_change_case_custom:nnn} +% \begin{macro}[EXP]{\@@_change_case_letterlike:nnnnnN} % \begin{macro}[EXP] % { -% \@@_change_case_codepoint_lower:nnn , -% \@@_change_case_codepoint_upper:nnn , -% \@@_change_case_codepoint_title:nnn , -% \@@_change_case_codepoint_titleonly:nnn +% \@@_change_case_custom_lower:nnnn , +% \@@_change_case_custom_title:nnnn , +% \@@_change_case_custom_upper:nnnn % } -% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnn} -% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnw} -% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnN} +% \begin{macro}[EXP]{\@@_change_case_custom:nnnnn} % \begin{macro}[EXP] % { -% \@@_change_case_codepoint_title:nn , -% \@@_change_case_codepoint_titleonly:nn +% \@@_change_case_codepoint_lower:nnnn , +% \@@_change_case_codepoint_upper:nnnn , +% \@@_change_case_codepoint_title:nnnn % } -% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnnn} -% \begin{macro}[EXP] -% {\@@_change_case_codepoint:nnnn, \@@_change_case_codepoint_aux:nnnn} +% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnn} +% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnw} +% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnn} +% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnnnn} +% \begin{macro}[EXP]{\@@_change_case_codepoint:nnnnn} % \begin{macro}[EXP]{\@@_change_case_codepoint:nn} % \begin{macro}[EXP] % { @@ -203,13 +202,15 @@ % \@@_change_case_codepoint:fnn , % \@@_change_case_codepoint_aux:nnn % } +% \begin{macro}[EXP]{\@@_change_case_codepoint_aux:nnn} +% \begin{macro}[EXP]{\@@_change_case_codepoint_aux:nn} +% \begin{macro}[EXP]{\@@_change_case_catcode:nn} % \begin{macro}[EXP] % { -% \@@_change_case_next_lower:nn , -% \@@_change_case_next_upper:nn , -% \@@_change_case_next_title:nn , -% \@@_change_case_next_titleonly:nn , -% \@@_change_case_next_end:nn +% \@@_change_case_next_lower:nnn , +% \@@_change_case_next_upper:nnn , +% \@@_change_case_next_title:nnn , +% \@@_change_case_next_end:nnn % } % As for the expansion code, the business end of case changing is the % handling of \texttt{N}-type tokens. First, we expand the input fully @@ -231,45 +232,50 @@ % wrap the entire result in exactly one \cs{exp_not:n}, or rather in the % kernel version. % \begin{macrocode} -\cs_new:Npn \@@_change_case:nnn #1#2#3 +\cs_new:Npn \@@_change_case:nnnn #1#2#3#4 { \__kernel_exp_not:w \exp_after:wN { \exp:w - \exp_args:Ne \@@_change_case_auxi:nnn - { \text_expand:n {#3} } - {#1} {#2} + \exp_args:Ne \@@_change_case_auxi:nnnn + { \text_expand:n {#4} } + {#1} {#2} {#3} } } -\cs_new:Npn \@@_change_case_auxi:nnn #1#2#3 - { \exp_args:No \@@_change_case_BCP:nnn { \tl_to_str:n {#3} } {#1} {#2} } -\cs_new:Npe \@@_change_case_BCP:nnn #1#2#3 +\cs_new:Npn \@@_change_case_auxi:nnnn #1#2#3#4 { - \exp_not:N \@@_change_case_BCP:nnw - {#2} {#3} #1 \tl_to_str:n { -x- -x- } \exp_not:N \q_@@_stop + \exp_args:No \@@_change_case_BCP:nnnn + { \tl_to_str:n {#4} } {#1} {#2} {#3} + } +\cs_new:Npe \@@_change_case_BCP:nnnn #1#2#3#4 + { + \exp_not:N \@@_change_case_BCP:nnnw + {#2} {#3} {#4} #1 \tl_to_str:n { -x- -x- } \exp_not:N \q_@@_stop } \use:e { - \cs_new:Npn \exp_not:N \@@_change_case_BCP:nnw - #1#2#3 \tl_to_str:n { -x- } #4 \tl_to_str:n { -x- } #5 + \cs_new:Npn \exp_not:N \@@_change_case_BCP:nnnw + #1#2#3#4 \tl_to_str:n { -x- } #5 \tl_to_str:n { -x- } #6 \exp_not:N \q_@@_stop } - { \@@_change_case_BCP:nnnnw {#1} {#2} {#4} {#3} #3 - - \q_@@_stop } -\cs_new:Npn \@@_change_case_BCP:nnnnw #1#2#3#4#5 - #6 - #7 \q_@@_stop + { \@@_change_case_BCP:nnnnnw {#1} {#2} {#3} {#5} {#4} #4 - \q_@@_stop } +\cs_new:Npn \@@_change_case_BCP:nnnnnw #1#2#3#4#5#6 - #7 \q_@@_stop { - \cs_if_exist:cTF { @@_change_case_ #2 _ #5 -x- #3 :nnnn } - { \@@_change_case_auxii:nnn {#1} {#2} { #5 -x- #3 } } + \bool_lazy_or:nnTF + { \cs_if_exist_p:c { @@_change_case_ #2 _ #6 -x- #4 :nnnnn } } + { \tl_if_exist_p:c { l_@@_ #2 case_special_ #6 -x- #4 _tl } } + { \@@_change_case_auxii:nnnn {#1} {#2} {#3} { #6 -x- #4 } } { - \cs_if_exist:cTF { @@_change_case_ #2 _ #5 :nnnn } - { \@@_change_case_auxii:nnn {#1} {#2} {#5} } - { \@@_change_case_auxii:nnn {#1} {#2} {#4} } + \cs_if_exist:cTF { @@_change_case_ #2 _ #6 :nnnnn } + { \@@_change_case_auxii:nnnn {#1} {#2} {#3} {#6} } + { \@@_change_case_auxii:nnnn {#1} {#2} {#3} {#5} } } } -\cs_new:Npn \@@_change_case_auxii:nnn #1#2#3 +\cs_new:Npn \@@_change_case_auxii:nnnn #1#2#3#4 { \group_align_safe_begin: - \cs_if_exist_use:c { @@_change_case_boundary_ #2 _ #3 :Nnnw } - \@@_change_case_loop:nnw {#2} {#3} #1 + \cs_if_exist_use:c { @@_change_case_boundary_ #2 _ #4 :Nnnnw } + \@@_change_case_loop:nnnw {#2} {#3} {#4} #1 \q_@@_recursion_tail \q_@@_recursion_stop \@@_change_case_result:n { } } @@ -290,20 +296,23 @@ % \end{macrocode} % The main loop is the standard \texttt{tl action} type. % \begin{macrocode} -\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_loop:nnnw #1#2#3#4 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#3} - { \@@_change_case_N_type:nnN } + \tl_if_head_is_N_type:nTF {#4} + { \@@_change_case_N_type:nnnN } { - \tl_if_head_is_group:nTF {#3} - { \use:c { @@_change_case_group_ #1 :nnn } } - { \@@_change_case_space:nnw } + \tl_if_head_is_group:nTF {#4} + { \use:c { @@_change_case_group_ #1 :nnnn } } + { \@@_change_case_space:nnnw } } - {#1} {#2} #3 \q_@@_recursion_stop + {#1} {#2} {#3} #4 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_break:w #1 \q_@@_recursion_tail \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_break:w + { \@@_change_case_break_aux:w \prg_do_nothing: } +\cs_new:Npn \@@_change_case_break_aux:w + #1 \q_@@_recursion_tail \q_@@_recursion_stop { - \@@_change_case_store:n {#1} + \@@_change_case_store:o {#1} \@@_change_case_end:w } % \end{macrocode} @@ -315,53 +324,47 @@ % having too much testing, we use a two-step process here to allow the % titlecase functions to be separate. % \begin{macrocode} -\cs_new:Npn \@@_change_case_group_lower:nnn #1#2#3 +\cs_new:Npn \@@_change_case_group_lower:nnnn #1#2#3#4 { \@@_change_case_store:o { \exp_after:wN { \exp:w - \@@_change_case_auxii:nnn {#3} {#1} {#2} + \@@_change_case_auxii:nnnn {#4} {#1} {#2} {#3} } } - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } -\cs_new_eq:NN \@@_change_case_group_upper:nnn - \@@_change_case_group_lower:nnn -\cs_new:Npn \@@_change_case_group_title:nnn #1#2#3 +\cs_new_eq:NN \@@_change_case_group_upper:nnnn + \@@_change_case_group_lower:nnnn +\cs_new:Npn \@@_change_case_group_title:nnnn #1#2#3#4 { \@@_change_case_store:o { \exp_after:wN { \exp:w - \@@_change_case_auxii:nnn {#3} {#1} {#2} + \@@_change_case_auxii:nnnn {#4} {#1} {#2} {#3} } } - \@@_change_case_loop:nnw { lower } {#2} - } -\cs_new:Npn \@@_change_case_group_titleonly:nnn #1#2#3 - { - \@@_change_case_store:o - { - \exp_after:wN - { - \exp:w - \@@_change_case_auxii:nnn {#3} {#1} {#2} - } - } - \@@_change_case_break:w + \@@_change_case_skip:nnw {#2} {#3} } \use:e { - \cs_new:Npn \exp_not:N \@@_change_case_space:nnw #1#2 \c_space_tl + \cs_new:Npn \exp_not:N \@@_change_case_space:nnnw #1#2#3 \c_space_tl } { \@@_change_case_store:n { ~ } - \cs_if_exist_use:c { @@_change_case_boundary_ #1 _ #2 :Nnnw } - \@@_change_case_loop:nnw {#1} {#2} + \cs_if_exist_use:cF { @@_change_case_space_ #2 :nnn } + { + \cs_if_exist_use:c { @@_change_case_boundary_ #1 _ #3 :Nnnnw } + \@@_change_case_loop:nnnw + } + {#2} {#2} {#3} } +\cs_new:Npn \@@_change_case_space_break:nnn #1#2#3 + { \@@_change_case_break:w } % \end{macrocode} % The first step of handling \texttt{N}-type tokens is to filter out the % end-of-loop. That has to be done separately from the first real step @@ -371,85 +374,85 @@ % (i.e.~there is no assumption of \enquote{well-behaved} input in terms of % math mode). % \begin{macrocode} -\cs_new:Npn \@@_change_case_N_type:nnN #1#2#3 +\cs_new:Npn \@@_change_case_N_type:nnnN #1#2#3#4 { - \@@_if_q_recursion_tail_stop_do:Nn #3 + \@@_if_q_recursion_tail_stop_do:Nn #4 { \@@_change_case_end:w } - \@@_change_case_N_type_aux:nnN {#1} {#2} #3 + \@@_change_case_N_type_aux:nnnN {#1} {#2} {#3} #4 } -\cs_new:Npn \@@_change_case_N_type_aux:nnN #1#2#3 +\cs_new:Npn \@@_change_case_N_type_aux:nnnN #1#2#3#4 { - \exp_args:NV \@@_change_case_N_type:nnnN - \l_text_math_delims_tl {#1} {#2} #3 + \exp_args:NV \@@_change_case_N_type:nnnnN + \l_text_math_delims_tl {#1} {#2} {#3} #4 } -\cs_new:Npn \@@_change_case_N_type:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_N_type:nnnnN #1#2#3#4#5 { - \@@_change_case_math_search:nnNNN {#2} {#3} #4 #1 + \@@_change_case_math_search:nnnNNN {#2} {#3} {#4} #5 #1 \q_@@_recursion_tail \q_@@_recursion_tail \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_math_search:nnNNN #1#2#3#4#5 +\cs_new:Npn \@@_change_case_math_search:nnnNNN #1#2#3#4#5#6 { - \@@_if_q_recursion_tail_stop_do:Nn #4 - { \@@_change_case_cs_check:nnN {#1} {#2} #3 } - \token_if_eq_meaning:NNTF #3 #4 + \@@_if_q_recursion_tail_stop_do:Nn #5 + { \@@_change_case_cs_check:nnnN {#1} {#2} {#3} #4 } + \token_if_eq_meaning:NNTF #4 #5 { \@@_use_i_delimit_by_q_recursion_stop:nw { - \@@_change_case_store:n {#3} - \@@_change_case_math_loop:nnNw {#1} {#2} #5 + \@@_change_case_store:n {#4} + \@@_change_case_math_loop:nnnNw {#1} {#2} {#3} #6 } } - { \@@_change_case_math_search:nnNNN {#1} {#2} #3 } + { \@@_change_case_math_search:nnnNNN {#1} {#2} {#3} #4 } } -\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_math_loop:nnnNw #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_math_N_type:nnNN } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_math_N_type:nnnNN } { - \tl_if_head_is_group:nTF {#4} - { \@@_change_case_math_group:nnNn } - { \@@_change_case_math_space:nnNw } + \tl_if_head_is_group:nTF {#5} + { \@@_change_case_math_group:nnnNn } + { \@@_change_case_math_space:nnnNw } } - {#1} {#2} #3 #4 \q_@@_recursion_stop + {#1} {#2} {#3} #4 #5 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_math_N_type:nnNN #1#2#3#4 +\cs_new:Npn \@@_change_case_math_N_type:nnnNN #1#2#3#4#5 { - \@@_if_q_recursion_tail_stop_do:Nn #4 + \@@_if_q_recursion_tail_stop_do:Nn #5 { \@@_change_case_end:w } - \@@_change_case_store:n {#4} - \token_if_eq_meaning:NNTF #4 #3 - { \@@_change_case_loop:nnw {#1} {#2} } - { \@@_change_case_math_loop:nnNw {#1} {#2} #3 } + \@@_change_case_store:n {#5} + \token_if_eq_meaning:NNTF #5 #4 + { \@@_change_case_loop:nnnw {#1} {#2} {#3} } + { \@@_change_case_math_loop:nnnNw {#1} {#2} {#3} #4 } } -\cs_new:Npn \@@_change_case_math_group:nnNn #1#2#3#4 +\cs_new:Npn \@@_change_case_math_group:nnnNn #1#2#3#4#5 { - \@@_change_case_store:n { {#4} } - \@@_change_case_math_loop:nnNw {#1} {#2} #3 + \@@_change_case_store:n { {#5} } + \@@_change_case_math_loop:nnnNw {#1} {#2} {#3} #4 } \use:e { - \cs_new:Npn \exp_not:N \@@_change_case_math_space:nnNw #1#2#3 + \cs_new:Npn \exp_not:N \@@_change_case_math_space:nnnNw #1#2#3#4 \c_space_tl } { \@@_change_case_store:n { ~ } - \@@_change_case_math_loop:nnNw {#1} {#2} #3 + \@@_change_case_math_loop:nnnNw {#1} {#2} {#3} #4 } % \end{macrocode} % Once potential math-mode cases are filtered out the next stage is to % test if the token grabbed is a control sequence: the two routes the code % may take are then very different. % \begin{macrocode} -\cs_new:Npn \@@_change_case_cs_check:nnN #1#2#3 +\cs_new:Npn \@@_change_case_cs_check:nnnN #1#2#3#4 { - \token_if_cs:NTF #3 - { \@@_change_case_exclude:nnN {#1} {#2} } + \token_if_cs:NTF #4 + { \@@_change_case_exclude:nnnN {#1} {#2} {#3} } { \@@_codepoint_process:nN - { \use:c { @@_change_case_custom_ #1 :nnn } {#1} {#2} } + { \use:c { @@_change_case_custom_ #1 :nnnn } {#1} {#2} {#3} } } - #3 + #4 } % \end{macrocode} % To deal with a control sequence there is first a need to test if it is @@ -457,92 +460,115 @@ % done using a loop as for the other special cases. If a hit is found then % the argument is grabbed and passed through as-is. % \begin{macrocode} -\cs_new:Npn \@@_change_case_exclude:nnN #1#2#3 +\cs_new:Npn \@@_change_case_exclude:nnnN #1#2#3#4 { - \exp_args:Ne \@@_change_case_exclude:nnnN + \exp_args:Ne \@@_change_case_exclude:nnnnN { \exp_not:V \l_text_math_arg_tl \exp_not:V \l_text_case_exclude_arg_tl } - {#1} {#2} #3 + {#1} {#2} {#3} #4 } -\cs_new:Npn \@@_change_case_exclude:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_exclude:nnnnN #1#2#3#4#5 { - \@@_change_case_exclude:nnNN {#2} {#3} #4 #1 + \@@_change_case_exclude:nnnNN {#2} {#3} {#4} #5 #1 \q_@@_recursion_tail \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_exclude:nnNN #1#2#3#4 +\cs_new:Npn \@@_change_case_exclude:nnnNN #1#2#3#4#5 { - \@@_if_q_recursion_tail_stop_do:Nn #4 - { \@@_change_case_replace:nnN {#1} {#2} #3 } - \str_if_eq:nnTF {#3} {#4} + \@@_if_q_recursion_tail_stop_do:Nn #5 + { \@@_change_case_replace:nnnN {#1} {#2} {#3} #4 } + \str_if_eq:nnTF {#4} {#5} { \@@_use_i_delimit_by_q_recursion_stop:nw - { \@@_change_case_exclude:nnNw {#1} {#2} #3 } + { \@@_change_case_exclude:nnnNw {#1} {#2} {#3} #4 } } - { \@@_change_case_exclude:nnNN {#1} {#2} #3 } + { \@@_change_case_exclude:nnnNN {#1} {#2} {#3} #4 } } -\cs_new:Npn \@@_change_case_exclude:nnNw #1#2#3#4# - { \@@_change_case_exclude:nnNnn {#1} {#2} {#3} {#4} } -\cs_new:Npn \@@_change_case_exclude:nnNnn #1#2#3#4#5 +\cs_new:Npn \@@_change_case_exclude:nnnNw #1#2#3#4#5# + { \@@_change_case_exclude:nnnNnn {#1} {#2} {#3} {#4} {#5} } +\cs_new:Npn \@@_change_case_exclude:nnnNnn #1#2#3#4#5#6 { - \tl_if_blank:nTF {#4} - { \@@_change_case_store:n { #3 {#5} } } + \tl_if_blank:nTF {#5} + { \@@_change_case_store:n { #4 {#6} } } { \@@_change_case_store:o { - \exp_after:wN #3 - \exp:w \@@_change_case_auxii:nnn {#4} {#1} {#2} - {#5} + \exp_after:wN #4 + \exp:w \@@_change_case_auxii:nnnn {#5} {#1} {#2} {#3} + {#6} } } - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } % \end{macrocode} % Deal with any specialist replacement for case changing. % \begin{macrocode} -\cs_new:Npn \@@_change_case_replace:nnN #1#2#3 +\cs_new:Npn \@@_change_case_replace:nnnN #1#2#3#4 { - \cs_if_exist:cTF { l_@@_case_ \token_to_str:N #3 _tl } + \cs_if_exist:cTF { l_@@_case_ \token_to_str:N #4 _tl } { - \@@_change_case_replace:vnn - { l_@@_case_ \token_to_str:N #3 _tl } {#1} {#2} + \@@_change_case_replace:vnnn + { l_@@_case_ \token_to_str:N #4 _tl } {#1} {#2} {#3} } - { \@@_change_case_switch:nnN {#1} {#2} #3 } + { \@@_change_case_switch:nnnN {#1} {#2} {#3} #4 } } -\cs_new:Npn \@@_change_case_replace:nnn #1#2#3 - { \@@_change_case_loop:nnw {#2} {#3} #1 } -\cs_generate_variant:Nn \@@_change_case_replace:nnn { v } +\cs_new:Npn \@@_change_case_replace:nnnn #1#2#3#4 + { \@@_change_case_loop:nnnw {#2} {#3} {#4} #1 } +\cs_generate_variant:Nn \@@_change_case_replace:nnnn { v } % \end{macrocode} % Allow for manually-controlled case switching. % \begin{macrocode} -\cs_new:Npn \@@_change_case_switch:nnN #1#2#3 +\cs_new:Npn \@@_change_case_switch:nnnN #1#2#3#4 + { + \cs_if_eq:NNTF #4 \text_case_switch:nnnn + { \use:c { @@_change_case_switch_ #1 :nnnNnnnn } } + { \use:c { @@_change_case_letterlike_ #1 :nnnN } } + {#1} {#2} {#3} #4 + } +\cs_new:Npn \@@_change_case_switch_lower:nnnNnnnn #1#2#3#4#5#6#7#8 { - \cs_if_eq:NNTF #3 \text_case_switch:nnnn - { \use:c { @@_change_case_switch_ #1 :nnNnnnn } } - { \use:c { @@_change_case_letterlike_ #1 :nnN } } - {#1} {#2} #3 + \@@_change_case_store:n {#7} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } -\cs_new:Npn \@@_change_case_switch_lower:nnNnnnn #1#2#3#4#5#6#7 +\cs_new:Npn \@@_change_case_switch_upper:nnnNnnnn #1#2#3#4#5#6#7#8 { \@@_change_case_store:n {#6} - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } -\cs_new:Npn \@@_change_case_switch_upper:nnNnnnn #1#2#3#4#5#6#7 +\cs_new:Npn \@@_change_case_switch_title:nnnNnnnn #1#2#3#4#5#6#7#8 { - \@@_change_case_store:n {#5} - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_store:n {#8} + \@@_change_case_skip:nnw {#2} {#3} } -\cs_new:Npn \@@_change_case_switch_title:nnNnnnn #1#2#3#4#5#6#7 +% \end{macrocode} +% Skip over material quickly after titlecase-first-only initials +% \begin{macrocode} +\cs_new:Npn \@@_change_case_skip:nnw #1#2#3 \q_@@_recursion_stop { - \@@_change_case_store:n {#7} - \@@_change_case_loop:nnw {#1} {#2} + \tl_if_head_is_N_type:nTF {#3} + { \@@_change_case_skip_N_type:nnN } + { + \tl_if_head_is_group:nTF {#3} + { \@@_change_case_skip_group:nnn } + { \@@_change_case_skip_space:nnw } + } + {#1} {#2} #3 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_switch_titleonly:nnNnnnn #1#2#3#4#5#6#7 +\cs_new:Npn \@@_change_case_skip_N_type:nnN #1#2#3 { - \@@_change_case_store:n {#7} - \@@_change_case_break:w + \@@_if_q_recursion_tail_stop_do:Nn #3 + { \@@_change_case_end:w } + \@@_change_case_store:n {#3} + \@@_change_case_skip:nnw {#1} {#2} + } +\cs_new:Npn \@@_change_case_skip_group:nnn #1#2#3 + { + \@@_change_case_store:n { {#3} } + \@@_change_case_skip:nnw {#1} {#2} } +\cs_new:Npn \@@_change_case_skip_space:nnw #1#2 + { \@@_change_case_space:nnnw {#1} {#1} {#2} } % \end{macrocode} % Letter-like commands may still be present: they are set up using a simple % lookup approach, so can easily be handled with no loop. If there is no @@ -550,68 +576,64 @@ % are all available only in upper- and lowercase, so titlecasing maps to the % uppercase version. % \begin{macrocode} -\cs_new:Npn \@@_change_case_letterlike_lower:nnN #1#2#3 - { \@@_change_case_letterlike:nnnnN {#1} {#1} {#1} {#2} #3 } -\cs_new_eq:NN \@@_change_case_letterlike_upper:nnN - \@@_change_case_letterlike_lower:nnN -\cs_new:Npn \@@_change_case_letterlike_title:nnN #1#2#3 - { \@@_change_case_letterlike:nnnnN { upper } { lower } {#1} {#2} #3 } -\cs_new:Npn \@@_change_case_letterlike_titleonly:nnN #1#2#3 - { \@@_change_case_letterlike:nnnnN { upper } { end } {#1} {#2} #3 } -\cs_new:Npn \@@_change_case_letterlike:nnnnN #1#2#3#4#5 - { - \cs_if_exist:cTF { c_@@_ #1 case_ \token_to_str:N #5 _tl } +\cs_new:Npn \@@_change_case_letterlike_lower:nnnN #1#2#3#4 + { \@@_change_case_letterlike:nnnnnN {#1} {#1} {#1} {#2} {#3} #4 } +\cs_new_eq:NN \@@_change_case_letterlike_upper:nnnN + \@@_change_case_letterlike_lower:nnnN +\cs_new:Npn \@@_change_case_letterlike_title:nnnN #1#2#3#4 + { \@@_change_case_letterlike:nnnnnN { upper } { end } {#1} {#2} {#3} #4 } +\cs_new:Npn \@@_change_case_letterlike:nnnnnN #1#2#3#4#5#6 + { + \cs_if_exist:cTF { c_@@_ #1 case_ \token_to_str:N #6 _tl } { \@@_change_case_store:v - { c_@@_ #1 case_ \token_to_str:N #5 _tl } - \use:c { @@_change_case_next_ #2 :nn } {#2} {#4} + { c_@@_ #1 case_ \token_to_str:N #6 _tl } + \use:c { @@_change_case_next_ #2 :nnn } {#2} {#4} {#5} } { - \@@_change_case_store:n {#5} + \@@_change_case_store:n {#6} \cs_if_exist:cTF { c_@@_ \str_if_eq:nnTF {#1} { lower } { upper } { lower } - case_ \token_to_str:N #5 _tl + case_ \token_to_str:N #6 _tl } - { \use:c { @@_change_case_next_ #2 :nn } {#2} {#4} } - { \@@_change_case_loop:nnw {#3} {#4} } + { \use:c { @@_change_case_next_ #2 :nnn } {#2} {#4} {#5} } + { \@@_change_case_loop:nnnw {#3} {#4} {#5} } } } % \end{macrocode} % Check for a customised codepoint result. % \begin{macrocode} -\cs_new:Npn \@@_change_case_custom_lower:nnn #1#2#3 +\cs_new:Npn \@@_change_case_custom_lower:nnnn #1#2#3#4 { - \@@_change_case_custom:nnnnn {#1} {#2} {#3} {#1} - { \use:c { @@_change_case_codepoint_ #1 :nnn } {#1} {#2} {#3} } + \@@_change_case_custom:nnnnnn {#1} {#1} {#2} {#3} {#4} + { \use:c { @@_change_case_codepoint_ #1 :nnnn } {#1} {#2} {#3} {#4} } } -\cs_new_eq:NN \@@_change_case_custom_upper:nnn - \@@_change_case_custom_lower:nnn -\cs_new:Npn \@@_change_case_custom_title:nnn #1#2#3 +\cs_new_eq:NN \@@_change_case_custom_upper:nnnn + \@@_change_case_custom_lower:nnnn +\cs_new:Npn \@@_change_case_custom_title:nnnn #1#2#3#4 { - \@@_change_case_custom:nnnnn { title } {#2} {#3} {#1} + \@@_change_case_custom:nnnnnn { title } {#1} {#2} {#3} {#4} { - \@@_change_case_custom:nnnnn { upper } {#2} {#3} {#1} - { \use:c { @@_change_case_codepoint_ #1 :nnn } {#1} {#2} {#3} } + \@@_change_case_custom:nnnnnn { upper } {#1} {#2} {#3} {#4} + { \use:c { @@_change_case_codepoint_ #1 :nnnn } {#1} {#2} {#3} {#4} } } } -\cs_new_eq:NN \@@_change_case_custom_titleonly:nnn - \@@_change_case_custom_title:nnn -\cs_new:Npn \@@_change_case_custom:nnnnn #1#2#3#4#5 +\cs_new:Npn \@@_change_case_custom:nnnnnn #1#2#3#4#5#6 { - \tl_if_exist:cTF { l_@@_ #1 case _ \tl_to_str:n {#3} _ #2 _tl } + \tl_if_exist:cTF { l_@@_ #1 case _ \tl_to_str:n {#5} _ #4 _tl } { - \@@_change_case_replace:vnn - { l_@@_ #1 case _ \tl_to_str:n {#3} _ #2 _tl } {#4} {#2} + \@@_change_case_replace:vnnn + { l_@@_ #1 case _ \tl_to_str:n {#5} _ #4 _tl } {#2} {#3} {#4} } { - \tl_if_exist:cTF { l_@@_ #1 case _ \tl_to_str:n {#3} _tl } + \tl_if_exist:cTF { l_@@_ #1 case _ \tl_to_str:n {#5} _tl } { - \@@_change_case_replace:vnn - { l_@@_ #1 case _ \tl_to_str:n {#3} _tl } {#4} {#2} + \@@_change_case_replace:vnnn + { l_@@_ #1 case _ \tl_to_str:n {#5} _tl } {#2} {#3} {#4} } - {#5} + {#6} } } % \end{macrocode} @@ -620,17 +642,17 @@ % is there the special case of a terminal sigma. If not, then we pass to % a simple codepoint mapping. % \begin{macrocode} -\cs_new:Npn \@@_change_case_codepoint_lower:nnn #1#2#3 +\cs_new:Npn \@@_change_case_codepoint_lower:nnnn #1#2#3#4 { - \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnn } - { \@@_change_case_lower_sigma:nnnn } - {#1} {#1} {#2} {#3} + \cs_if_exist_use:cF { @@_change_case_lower_ #3 :nnnnn } + { \@@_change_case_lower_sigma:nnnnn } + {#1} {#1} {#2} {#3} {#4} } -\cs_new:Npn \@@_change_case_codepoint_upper:nnn #1#2#3 +\cs_new:Npn \@@_change_case_codepoint_upper:nnnn #1#2#3#4 { - \cs_if_exist_use:cF { @@_change_case_upper_ #2 :nnnn } - { \@@_change_case_codepoint:nnnn } - {#1} {#1} {#2} {#3} + \cs_if_exist_use:cF { @@_change_case_upper_ #3 :nnnnn } + { \@@_change_case_codepoint:nnnnn } + {#1} {#1} {#2} {#3} {#4} } % \end{macrocode} % If the current character is an uppercase sigma, the a check is made on the @@ -638,91 +660,87 @@ % then there is a look-ahead phase: the logic here is simply based on letters % or actives (to cover $8$-bit engines). % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_sigma:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_sigma:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "03A3 } - { \@@_change_case_lower_sigma:nnnw {#2} } - { \@@_change_case_codepoint:nnnn {#1} {#2} } - {#3} {#4} + \@@_codepoint_compare:nNnTF {#5} = { "03A3 } + { \@@_change_case_lower_sigma:nnnnw {#2} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} } + {#3} {#4} {#5} } -\cs_new:Npn \@@_change_case_lower_sigma:nnnw #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_lower_sigma:nnnnw #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_lower_sigma:nnnN {#3} } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_lower_sigma:nnnnN {#4} } { \@@_change_case_store:e - { \codepoint_generate:nn { "03C2 } { \@@_char_catcode:N #3 } } - \@@_change_case_loop:nnw + { \codepoint_generate:nn { "03C2 } { \@@_char_catcode:N #4 } } + \@@_change_case_loop:nnnw } - {#1} {#2} #4 \q_@@_recursion_stop + {#1} {#2} {#3} #5 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_lower_sigma:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_sigma:nnnnN #1#2#3#4#5 { \@@_change_case_store:e { \bool_lazy_or:nnTF - { \token_if_letter_p:N #4 } + { \token_if_letter_p:N #5 } { \bool_lazy_and_p:nn - { \token_if_active_p:N #4 } - { \int_compare_p:nNn {`#4} > { "80 } } + { \token_if_active_p:N #5 } + { \int_compare_p:nNn {`#5} > { "80 } } } { \codepoint_generate:nn { "03C3 } { \@@_char_catcode:N #1 } } { \codepoint_generate:nn { "03C2 } { \@@_char_catcode:N #1 } } } - \@@_change_case_loop:nnw {#2} {#3} #4 + \@@_change_case_loop:nnnw {#2} {#3} {#4} #5 } % \end{macrocode} % For titlecasing, we need to fully expand the new character to see if it % is a letter (or active). % \begin{macrocode} -\cs_new:Npn \@@_change_case_codepoint_title:nnn #1#2#3 +\cs_new:Npn \@@_change_case_codepoint_title:nnnn #1#2#3#4 { \bool_if:NTF \l_text_titlecase_check_letter_bool { - \tl_if_single:nTF {#3} + \tl_if_single:nTF {#4} { \bool_lazy_or:nnTF - { \token_if_letter_p:N #3 } + { \token_if_letter_p:N #4 } { \bool_lazy_and_p:nn - { \token_if_active_p:N #3 } - { ! \int_compare_p:nNn {`#3} < { "80 } } + { \token_if_active_p:N #4 } + { ! \int_compare_p:nNn {`#4} < { "80 } } } - { \use:c { @@_change_case_codepoint_ #1 :nn } } - { \@@_change_case_codepoint_title:nnnn { title } {#1} } + { \@@_change_case_codepoint_title:nnn } + { \@@_change_case_codepoint_title:nnnnn { title } {#1} } } - { \use:c { @@_change_case_codepoint_ #1 :nn } } + { \@@_change_case_codepoint_title:nnn } } - { \use:c { @@_change_case_codepoint_ #1 :nn } } - {#2} {#3} + { \@@_change_case_codepoint_title:nnn } + {#2} {#3} {#4} } -\cs_new_eq:NN \@@_change_case_codepoint_titleonly:nnn - \@@_change_case_codepoint_title:nnn -\cs_new:Npn \@@_change_case_codepoint_title:nn #1#2 - { \@@_change_case_codepoint_title:nnnn { title } { lower } {#1} {#2} } -\cs_new:Npn \@@_change_case_codepoint_titleonly:nn #1#2 - { \@@_change_case_codepoint_title:nnnn { title } { end } {#1} {#2} } -\cs_new:Npn \@@_change_case_codepoint_title:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_codepoint_title:nnn #1#2#3 + { \@@_change_case_codepoint_title:nnnnn { title } { end } {#1} {#2} {#3} } +\cs_new:Npn \@@_change_case_codepoint_title:nnnnn #1#2#3#4#5 { - \cs_if_exist_use:cF { @@_change_case_title_ #3 :nnnn } + \cs_if_exist_use:cF { @@_change_case_title_ #4 :nnnnn } { - \cs_if_exist_use:cF { @@_change_case_upper_ #3 :nnnn } - { \@@_change_case_codepoint:nnnn } + \cs_if_exist_use:cF { @@_change_case_upper_ #4 :nnnnn } + { \@@_change_case_codepoint:nnnnn } } - {#1} {#2} {#3} {#4} + {#1} {#2} {#3} {#4} {#5} } -\cs_new:Npn \@@_change_case_codepoint:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_codepoint:nnnnn #1#2#3#4#5 { \bool_lazy_and:nnTF - { \tl_if_single_p:n {#4} } - { \token_if_active_p:N #4 } - { \@@_change_case_store:n {#4} } + { \tl_if_single_p:n {#5} } + { \token_if_active_p:N #5 } + { \@@_change_case_store:n {#5} } { \@@_change_case_store:e - { \@@_change_case_codepoint:nn {#1} {#4} } + { \@@_change_case_codepoint:nn {#1} {#5} } } - \use:c { @@_change_case_next_ #2 :nn } {#2} {#3} + \use:c { @@_change_case_next_ #2 :nnn } {#2} {#3} {#4} } \cs_new:Npn \@@_change_case_codepoint:nn #1#2 { @@ -799,16 +817,14 @@ } } } -\cs_new:Npn \@@_change_case_next_lower:nn #1#2 - { \@@_change_case_loop:nnw {#1} {#2} } -\cs_new_eq:NN \@@_change_case_next_upper:nn - \@@_change_case_next_lower:nn -\cs_new_eq:NN \@@_change_case_next_title:nn - \@@_change_case_next_lower:nn -\cs_new_eq:NN \@@_change_case_next_titleonly:nn - \@@_change_case_next_lower:nn -\cs_new:Npn \@@_change_case_next_end:nn #1#2 - { \@@_change_case_break:w } +\cs_new:Npn \@@_change_case_next_lower:nnn #1#2#3 + { \@@_change_case_loop:nnnw {#1} {#2} {#3} } +\cs_new_eq:NN \@@_change_case_next_upper:nnn + \@@_change_case_next_lower:nnn +\cs_new_eq:NN \@@_change_case_next_title:nnn + \@@_change_case_next_lower:nnn +\cs_new:Npn \@@_change_case_next_end:nnn #1#2#3 + { \@@_change_case_skip:nnw {#2} {#3} } % \end{macrocode} % \end{macro} % \end{macro} @@ -853,6 +869,13 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \begin{macro}{\text_declare_case_equivalent:Nn} % Create equivalents to allow replacement. @@ -914,6 +937,7 @@ { \tl_clear_new:c { l_@@_ #2 case _ #1 _ #3 _tl } \tl_set:cn { l_@@_ #2 case _ #1 _ #3 _ tl } {#4} + \tl_clear_new:c { l_@@_ #2 case_special_ #3 _tl } } % \end{macrocode} % \end{macro} @@ -944,55 +968,58 @@ % \end{macro} % % \begin{macro}[EXP] -% {\@@_change_case_upper_de-x-eszett:nnnn, \@@_change_case_upper_de-alt:nnnn} +% { +% \@@_change_case_upper_de-x-eszett:nnnnn, +% \@@_change_case_upper_de-alt:nnnnn +% } % A simple alternative version for German. % \begin{macrocode} -\cs_new:cpn { @@_change_case_upper_de-x-eszett:nnnn } #1#2#3#4 +\cs_new:cpn { @@_change_case_upper_de-x-eszett:nnnnn } #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "00DF } + \@@_codepoint_compare:nNnTF {#5} = { "00DF } { \@@_change_case_store:e { \codepoint_generate:nn { "1E9E } - { \@@_change_case_catcode:nn {#4} { "1E9E } } + { \@@_change_case_catcode:nn {#5} { "1E9E } } } - \use:c { @@_change_case_next_ #2 :nn } - {#2} {#3} + \use:c { @@_change_case_next_ #2 :nnn } + {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } -\cs_new_eq:cc { @@_change_case_upper_de-alt:nnnn } - { @@_change_case_upper_de-x-eszett:nnnn } +\cs_new_eq:cc { @@_change_case_upper_de-alt:nnnnn } + { @@_change_case_upper_de-x-eszett:nnnnn } % \end{macrocode} % \end{macro} % % \begin{macro}[EXP] % { -% \@@_change_case_upper_el:nnnn , -% \@@_change_case_upper_el_aux:nnnn , -% \@@_change_case_upper_el-x-iota:nnnn +% \@@_change_case_upper_el:nnnnn , +% \@@_change_case_upper_el-x-iota:nnnnn , +% \@@_change_case_upper_el_aux:nnnnn % } -% \begin{macro}[EXP]{\@@_change_case_upper_el:nnn} -% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnw} +% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn} +% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnnw} % \begin{macro}[EXP] -% {\@@_change_case_upper_el:nnnN, \@@_change_case_upper_el_aux:nnnN} -% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnw} -% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnN} -% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnn} -% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:nnn} +% {\@@_change_case_upper_el:nnnnN, \@@_change_case_upper_el_aux:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnnw} +% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnnN} +% \begin{macro}[EXP]{\@@_change_case_upper_el_ypogegrammeni:nnnnnnn} +% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:nnnn} % \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:n} -% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnw} -% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnN} -% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnn} +% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnnw} +% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnnN} +% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnnnn} % \begin{macro}[EXP] % { % \@@_change_case_upper_el_ypogegrammeni:n , % \@@_change_case_upper_el-x-iota_ypogegrammeni:n % } % \begin{macro}[EXP]{\@@_change_case_upper_el_stress:nn} -% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnw} -% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnN} -% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnn} +% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnnw} +% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnnN} +% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnnn} % \begin{macro}[EXP,noTF] % { % \@@_change_case_if_greek:n , @@ -1017,65 +1044,65 @@ % for \pdfTeX{} so is best left unchanged, and the latter has issues concerning % how \texttt{LGR} outputs the input and output (differently!). % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el:nnnnn #1#2#3#4#5 { \bool_lazy_and:nnTF - { \@@_change_case_if_greek_p:n {#4} } + { \@@_change_case_if_greek_p:n {#5} } { ! \bool_lazy_or_p:nn - { \@@_codepoint_compare_p:nNn {#4} = { "0374 } } - { \@@_codepoint_compare_p:nNn {#4} = { "037E } } + { \@@_codepoint_compare_p:nNn {#5} = { "0374 } } + { \@@_codepoint_compare_p:nNn {#5} = { "037E } } } { - \@@_change_case_if_greek_spacing_diacritic:nTF {#4} + \@@_change_case_if_greek_spacing_diacritic:nTF {#5} { - \@@_change_case_store:n {#4} - \@@_change_case_loop:nnw + \@@_change_case_store:n {#5} + \@@_change_case_loop:nnnw } { - \exp_args:Ne \@@_change_case_upper_el:nnn + \exp_args:Ne \@@_change_case_upper_el:nnnn { \codepoint_to_nfd:n - { \@@_codepoint_from_chars:Nw #4 } + { \@@_codepoint_from_chars:Nw #5 } } } - {#2} {#3} + {#2} {#3} {#4} } { - \@@_codepoint_compare:nNnTF {#4} = { "0345 } + \@@_codepoint_compare:nNnTF {#5} = { "0345 } { \@@_change_case_store:e { \codepoint_generate:nn { "0399 } { \char_value_catcode:n { "0399 } } } - \@@_change_case_loop:nnw {#2} {#3} + \@@_change_case_loop:nnnw {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } } -\cs_new_eq:cN { @@_change_case_upper_el-x-iota:nnnn } - \@@_change_case_upper_el:nnnn -\cs_new:Npn \@@_change_case_upper_el:nnn #1#2#3 +\cs_new_eq:cN { @@_change_case_upper_el-x-iota:nnnnn } + \@@_change_case_upper_el:nnnnn +\cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4 { \@@_codepoint_process:nN - { \@@_change_case_upper_el:nnnw {#2} {#3} } #1 + { \@@_change_case_upper_el:nnnnw {#2} {#3} {#4} } #1 } % \end{macrocode} % At this stage we have the first NFD codepoint as |#3|. What we need to know % is whether after that we have another character, either from the NFD or % directly in the input. If not, we store the changed character at this stage. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el:nnnw #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_upper_el:nnnnw #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_upper_el:nnnN {#3} } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_upper_el:nnnnN {#4} } { \@@_change_case_store:e - { \@@_change_case_codepoint:nn { upper } {#3} } - \@@_change_case_loop:nnw + { \@@_change_case_codepoint:nn { upper } {#4} } + \@@_change_case_loop:nnnw } - {#1} {#2} #4 \q_@@_recursion_stop + {#1} {#2} {#3} #5 \q_@@_recursion_stop } % \end{macrocode} % Now, we check the detail of the next codepoint: again we filter out the @@ -1085,99 +1112,99 @@ % to move any ypogegrammeni to after accents (in case the input is not % normalised). The ypogegrammeni itself is handled separately. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el:nnnnN #1#2#3#4#5 { - \token_if_cs:NTF #4 + \token_if_cs:NTF #5 { \@@_change_case_store:e { \@@_change_case_codepoint:nn { upper } {#1} } - \@@_change_case_loop:nnw {#2} {#3} #4 + \@@_change_case_loop:nnnw {#2} {#3} {#4} #5 } { \@@_change_case_if_takes_ypogegrammeni:nTF {#1} { - \@@_change_case_upper_el_ypogegrammeni:nnnnnw - {#1} {#2} {#3} { } { } #4 + \@@_change_case_upper_el_ypogegrammeni:nnnnnnw + {#1} {#2} {#3} {#4} { } { } #5 } - { \@@_change_case_upper_el_aux:nnnN {#1} {#2} {#3} #4 } + { \@@_change_case_upper_el_aux:nnnnN {#1} {#2} {#3} {#4} #5 } } } -\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnw - #1#2#3#4#5#6 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnnw + #1#2#3#4#5#6#7 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#6} + \tl_if_head_is_N_type:nTF {#7} { - \@@_change_case_upper_el_ypogegrammeni:nnnnnN - {#1} {#2} {#3} {#4} {#5} + \@@_change_case_upper_el_ypogegrammeni:nnnnnnN + {#1} {#2} {#3} {#4} {#5} {#6} } - { \@@_change_case_upper_el_aux:nnnN {#1} {#2} {#3} #4#5 } - #6 \q_@@_recursion_stop + { \@@_change_case_upper_el_aux:nnnnN {#1} {#2} {#3} {#4} #5#6 } + #7 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnN #1#2#3#4#5#6 +\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnnN #1#2#3#4#5#6#7 { - \token_if_cs:NTF #6 - { \@@_change_case_upper_el_aux:nnnN {#1} {#2} {#3} #4#5 } + \token_if_cs:NTF #7 + { \@@_change_case_upper_el_aux:nnnnN {#1} {#2} {#3} {#4} #5#6 } { \@@_codepoint_process:nN { - \@@_change_case_upper_el_ypogegrammeni:nnnnnn - {#1} {#2} {#3} {#4} {#5} + \@@_change_case_upper_el_ypogegrammeni:nnnnnnn + {#1} {#2} {#3} {#4} {#5} {#6} } } - #6 + #7 } -\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnn #1#2#3#4#5#6 +\cs_new:Npn \@@_change_case_upper_el_ypogegrammeni:nnnnnnn #1#2#3#4#5#6#7 { - \@@_codepoint_compare:nNnTF {#6} = { "0345 } + \@@_codepoint_compare:nNnTF {#7} = { "0345 } { - \@@_change_case_upper_el_ypogegrammeni:nnnnnw - {#1} {#2} {#3} {#4} {#6} + \@@_change_case_upper_el_ypogegrammeni:nnnnnnw + {#1} {#2} {#3} {#4} {#5} {#7} } { \bool_lazy_or:nnTF - { \@@_change_case_if_greek_accent_p:n {#6} } - { \@@_change_case_if_greek_breathing_p:n {#6} } + { \@@_change_case_if_greek_accent_p:n {#7} } + { \@@_change_case_if_greek_breathing_p:n {#7} } { - \@@_change_case_upper_el_ypogegrammeni:nnnnnw - {#1} {#2} {#3} {#4#6} {#5} + \@@_change_case_upper_el_ypogegrammeni:nnnnnnw + {#1} {#2} {#3} {#4} {#5#7} {#6} } - { \@@_change_case_upper_el_aux:nnnN {#1} {#2} {#3} #4#5 #6 } + { \@@_change_case_upper_el_aux:nnnnN {#1} {#2} {#3} {#4} #5#6 #7 } } } -\cs_new:Npn \@@_change_case_upper_el_aux:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el_aux:nnnnN #1#2#3#4#5 { \@@_codepoint_process:nN - { \@@_change_case_upper_el_aux:nnnn {#1} {#2} {#3} } #4 + { \@@_change_case_upper_el_aux:nnnnn {#1} {#2} {#3} {#4} } #5 } -\cs_new:Npn \@@_change_case_upper_el_aux:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el_aux:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0308 } - { \@@_change_case_upper_el_dialytika:nnn {#2} {#3} {#1} } + \@@_codepoint_compare:nNnTF {#5} = { "0308 } + { \@@_change_case_upper_el_dialytika:nnnn {#2} {#3} {#4} {#1} } { - \@@_change_case_if_greek_accent:nTF {#4} - { \@@_change_case_upper_el_hiatus:nnnw {#2} {#3} {#1} } + \@@_change_case_if_greek_accent:nTF {#5} + { \@@_change_case_upper_el_hiatus:nnnnw {#2} {#3} {#4} {#1} } { - \@@_change_case_if_greek_breathing:nTF {#4} - { \@@_change_case_upper_el:nnn {#1} {#2} {#3} } + \@@_change_case_if_greek_breathing:nTF {#5} + { \@@_change_case_upper_el:nnnn {#1} {#2} {#3} {#4} } { - \@@_codepoint_compare:nNnTF {#4} = { "0345 } + \@@_codepoint_compare:nNnTF {#5} = { "0345 } { \@@_change_case_store:e - { \use:c { @@_change_case_upper_ #3 _ypogegrammeni:n } {#1} } - \@@_change_case_loop:nnw {#2} {#3} + { \use:c { @@_change_case_upper_ #4 _ypogegrammeni:n } {#1} } + \@@_change_case_loop:nnnw {#2} {#3} {#4} } { - \@@_change_case_if_greek_stress:nTF {#4} + \@@_change_case_if_greek_stress:nTF {#5} { \@@_change_case_store:e - { \@@_change_case_upper_el_stress:nn {#1} {#4} } - \@@_change_case_loop:nnw {#2} {#3} + { \@@_change_case_upper_el_stress:nn {#1} {#5} } + \@@_change_case_loop:nnnw {#2} {#3} {#4} } { \@@_change_case_store:e { \@@_change_case_codepoint:nn { upper } {#1} } - \@@_change_case_loop:nnw {#2} {#3} #4 + \@@_change_case_loop:nnnw {#2} {#3} {#4} #5 } } } @@ -1189,15 +1216,15 @@ % We know only two letters take it, so we can shortcut here on the second % part of the tests. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el_dialytika:nnn #1#2#3 +\cs_new:Npn \@@_change_case_upper_el_dialytika:nnnn #1#2#3#4 { - \@@_change_case_if_takes_dialytika:nTF {#3} - { \@@_change_case_upper_el_dialytika:n {#3} } + \@@_change_case_if_takes_dialytika:nTF {#4} + { \@@_change_case_upper_el_dialytika:n {#4} } { \@@_change_case_store:e - { \@@_change_case_codepoint:nn { upper } {#3} } + { \@@_change_case_codepoint:nn { upper } {#4} } } - \@@_change_case_upper_el_gobble:nnw {#1} {#2} + \@@_change_case_upper_el_gobble:nnnw {#1} {#2} {#3} } \cs_new:Npn \@@_change_case_upper_el_dialytika:n #1 { @@ -1220,41 +1247,41 @@ % Adding a hiatus needs some of the same ideas, but if there is not one we % skip this code point, hence needing a separate function. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnw - #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnnw + #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_upper_el_hiatus:nnnN {#3} } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_upper_el_hiatus:nnnnN {#4} } { \@@_change_case_store:e - { \@@_change_case_codepoint:nn { upper } {#3} } - \@@_change_case_loop:nnw + { \@@_change_case_codepoint:nn { upper } {#4} } + \@@_change_case_loop:nnnw } - {#1} {#2} #4 \q_@@_recursion_stop + {#1} {#2} {#3} #5 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnnN #1#2#3#4#5 { - \token_if_cs:NTF #4 + \token_if_cs:NTF #5 { \@@_change_case_store:e { \@@_change_case_codepoint:nn { upper } {#1} } - \@@_change_case_loop:nnw {#2} {#3} #4 + \@@_change_case_loop:nnnw {#2} {#3} {#4} #5 } { \@@_codepoint_process:nN - { \@@_change_case_upper_el_hiatus:nnnn {#1} {#2} {#3} } #4 + { \@@_change_case_upper_el_hiatus:nnnnn {#1} {#2} {#3} {#4} } #5 } } -\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_el_hiatus:nnnnn #1#2#3#4#5 { - \@@_change_case_if_takes_dialytika:nTF {#4} + \@@_change_case_if_takes_dialytika:nTF {#5} { \@@_change_case_store:e { \@@_change_case_codepoint:nn { upper } {#1} } - \@@_change_case_upper_el_dialytika:n {#4} - \@@_change_case_upper_el_gobble:nnw {#2} {#3} + \@@_change_case_upper_el_dialytika:n {#5} + \@@_change_case_upper_el_gobble:nnnw {#2} {#3} {#4} } - { \@@_change_case_upper_el:nnn {#1} {#2} {#3} #4 } + { \@@_change_case_upper_el:nnnn {#1} {#2} {#3} {#4} #5 } } % \end{macrocode} % Handling the \emph{ypogegrammeni} output depends on the selected approach @@ -1323,31 +1350,31 @@ % For clearing out trailing combining marks after we have dealt with % the first one. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_el_gobble:nnw - #1#2#3 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_upper_el_gobble:nnnw + #1#2#3#4 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#3} - { \@@_change_case_upper_el_gobble:nnN } - { \@@_change_case_loop:nnw } - {#1} {#2} #3 \q_@@_recursion_stop + \tl_if_head_is_N_type:nTF {#4} + { \@@_change_case_upper_el_gobble:nnnN } + { \@@_change_case_loop:nnnw } + {#1} {#2} {#3} #4 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_upper_el_gobble:nnN #1#2#3 +\cs_new:Npn \@@_change_case_upper_el_gobble:nnnN #1#2#3#4 { - \token_if_cs:NTF #3 - { \@@_change_case_loop:nnw {#1} {#2} } + \token_if_cs:NTF #4 + { \@@_change_case_loop:nnnw {#1} {#2} {#3} } { \@@_codepoint_process:nN - { \@@_change_case_upper_el_gobble:nnn {#1} {#2} } + { \@@_change_case_upper_el_gobble:nnnn {#1} {#2} {#3} } } - #3 + #4 } -\cs_new:Npn \@@_change_case_upper_el_gobble:nnn #1#2#3 +\cs_new:Npn \@@_change_case_upper_el_gobble:nnnn #1#2#3#4 { \bool_lazy_or:nnTF - { \@@_change_case_if_greek_accent_p:n {#3} } - { \@@_change_case_if_greek_breathing_p:n {#3} } - { \@@_change_case_upper_el_gobble:nnw {#1} {#2} } - { \@@_change_case_loop:nnw {#1} {#2} #3 } + { \@@_change_case_if_greek_accent_p:n {#4} } + { \@@_change_case_if_greek_breathing_p:n {#4} } + { \@@_change_case_upper_el_gobble:nnnw {#1} {#2} {#3} } + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } } % \end{macrocode} % Luckily the Greek range is limited and clear. @@ -1597,98 +1624,101 @@ % \end{macro} % \end{macro} % \begin{macro}[EXP] -% {\@@_change_case_boundary_upper_el:Nnnw, \@@_change_case_boundary_upper_el-x-iota:Nnnw} -% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnN} -% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnn} -% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnw} +% { +% \@@_change_case_boundary_upper_el:Nnnnw, +% \@@_change_case_boundary_upper_el-x-iota:Nnnnw +% } +% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnN} +% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnn} +% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnnw} % There is one things that need special treatment at start start of % words in Greek. For an isolated accent \emph{eta}, % which is handled by seeing if we have exactly one of the affected % codepoints followed by a space or brace group. % \begin{macrocode} -\cs_new:Npn \@@_change_case_boundary_upper_el:Nnnw - #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_boundary_upper_el:Nnnnw + #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_boundary_upper_el:nnN } - { \@@_change_case_loop:nnw } - {#2} {#3} #4 \q_@@_recursion_stop + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_boundary_upper_el:nnnN } + { \@@_change_case_loop:nnnw } + {#2} {#3} {#4} #5 \q_@@_recursion_stop } -\cs_new_eq:cN { @@_change_case_boundary_upper_el-x-iota:Nnnw } - \@@_change_case_boundary_upper_el:Nnnw -\cs_new:Npn \@@_change_case_boundary_upper_el:nnN #1#2#3 +\cs_new_eq:cN { @@_change_case_boundary_upper_el-x-iota:Nnnnw } + \@@_change_case_boundary_upper_el:Nnnnw +\cs_new:Npn \@@_change_case_boundary_upper_el:nnnN #1#2#3#4 { - \token_if_cs:NTF #3 - { \@@_change_case_loop:nnw {#1} {#2} } + \token_if_cs:NTF #4 + { \@@_change_case_loop:nnnw {#1} {#2} {#3} } { \@@_codepoint_process:nN - { \@@_change_case_boundary_upper_el:nnn {#1} {#2} } + { \@@_change_case_boundary_upper_el:nnnn {#1} {#2} {#3} } } - #3 + #4 } -\cs_new:Npn \@@_change_case_boundary_upper_el:nnn #1#2#3 +\cs_new:Npn \@@_change_case_boundary_upper_el:nnnn #1#2#3#4 { \bool_lazy_any:nTF { - { \@@_codepoint_compare_p:nNn {#3} = { "0389 } } - { \@@_codepoint_compare_p:nNn {#3} = { "03AE } } - { \@@_codepoint_compare_p:nNn {#3} = { "1F22 } } - { \@@_codepoint_compare_p:nNn {#3} = { "1F2A } } + { \@@_codepoint_compare_p:nNn {#4} = { "0389 } } + { \@@_codepoint_compare_p:nNn {#4} = { "03AE } } + { \@@_codepoint_compare_p:nNn {#4} = { "1F22 } } + { \@@_codepoint_compare_p:nNn {#4} = { "1F2A } } } - { \@@_change_case_boundary_upper_el:nnnw {#1} {#2} {#3} } - { \@@_change_case_breathing:nnn {#1} {#2} {#3} } + { \@@_change_case_boundary_upper_el:nnnnw {#1} {#2} {#3} {#4} } + { \@@_change_case_breathing:nnnn {#1} {#2} {#3} {#4} } } -\cs_new:Npn \@@_change_case_boundary_upper_el:nnnw - #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_boundary_upper_el:nnnnw + #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_loop:nnw {#1} {#2} #3 } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } { \@@_change_case_store:e { \codepoint_generate:nn { "0389 } - { \@@_change_case_catcode:nn {#3} { "0389 } } + { \@@_change_case_catcode:nn {#4} { "0389 } } } - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } - #4 \q_@@_recursion_stop + #5 \q_@@_recursion_stop } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} -% \begin{macro}[EXP]{\@@_change_case_breathing:nnn} % \begin{macro}[EXP]{\@@_change_case_breathing:nnnn} -% \begin{macro}[EXP]{\@@_change_case_breathing:nnnnw} +% \begin{macro}[EXP]{\@@_change_case_breathing:nnnnn} % \begin{macro}[EXP]{\@@_change_case_breathing:nnnnnw} -% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnnnn} -% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnnw} -% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnN} -% \begin{macro}[EXP]{\@@_change_case_breathing_dialytika:nnn} +% \begin{macro}[EXP]{\@@_change_case_breathing:nnnnnnw} +% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnnnnn} +% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnnnw} +% \begin{macro}[EXP]{\@@_change_case_breathing_aux:nnnN} +% \begin{macro}[EXP]{\@@_change_case_breathing_dialytika:nnnn} % In Greek, breathing diacritics are normally dropped when uppercasing: % see the code for the general case. However, for the first character % of a word, if there is a breather \emph{and} the next character takes % a \emph{dialytika}, it needs to be added. We start by checking if % the current codepoint is in the Greek range, then decomposing. % \begin{macrocode} -\cs_new:Npn \@@_change_case_breathing:nnn #1#2#3 +\cs_new:Npn \@@_change_case_breathing:nnnn #1#2#3#4 { - \@@_change_case_if_greek:nTF {#3} + \@@_change_case_if_greek:nTF {#4} { - \exp_args:Ne \@@_change_case_breathing:nnnn + \exp_args:Ne \@@_change_case_breathing:nnnnn { \codepoint_to_nfd:n - { \@@_codepoint_from_chars:Nw #3 } + { \@@_codepoint_from_chars:Nw #4 } } - {#1} {#2} {#3} + {#1} {#2} {#3} {#4} } - { \@@_change_case_loop:nnw {#1} {#2} #3 } + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } } -\cs_new:Npn \@@_change_case_breathing:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_breathing:nnnnn #1#2#3#4#5 { \@@_codepoint_process:nN - { \@@_change_case_breathing:nnnnw {#2} {#3} {#4} } + { \@@_change_case_breathing:nnnnnw {#2} {#3} {#4} {#5} } #1 \q_mark } % \end{macrocode} @@ -1699,36 +1729,36 @@ % and second if the final resulting codepoint is one of the two we % care about. % \begin{macrocode} -\cs_new:Npn \@@_change_case_breathing:nnnnw #1#2#3#4#5 \q_mark +\cs_new:Npn \@@_change_case_breathing:nnnnnw #1#2#3#4#5#6 \q_mark { - \tl_if_blank:nTF {#5} - { \@@_change_case_loop:nnw {#1} {#2} #3 } + \tl_if_blank:nTF {#6} + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } { \@@_codepoint_process:nN - { \@@_change_case_breathing:nnnnnw {#1} {#2} {#3} {#4} } - #5 \q_mark + { \@@_change_case_breathing:nnnnnnw {#1} {#2} {#3} {#4} {#5} } + #6 \q_mark } } -\cs_new:Npn \@@_change_case_breathing:nnnnnw #1#2#3#4#5#6 \q_mark +\cs_new:Npn \@@_change_case_breathing:nnnnnnw #1#2#3#4#5#6#7 \q_mark { - \tl_if_blank:nTF {#6} + \tl_if_blank:nTF {#7} { - \@@_change_case_breathing_aux:nnnnn - {#1} {#2} {#3} {#4} {#5} + \@@_change_case_breathing_aux:nnnnnn + {#1} {#2} {#3} {#4} {#5} {#6} } { \@@_codepoint_process:nN - { \@@_change_case_breathing:nnnnnw {#1} {#2} {#3} {#4} } - #6 \q_mark + { \@@_change_case_breathing:nnnnnnw {#1} {#2} {#3} {#4} {#5} } + #7 \q_mark } } -\cs_new:Npn \@@_change_case_breathing_aux:nnnnn #1#2#3#4#5 +\cs_new:Npn \@@_change_case_breathing_aux:nnnnnn #1#2#3#4#5#6 { \bool_lazy_or:nnTF - { \@@_codepoint_compare_p:nNn {#5} = { "0313 } } - { \@@_codepoint_compare_p:nNn {#5} = { "0314 } } - { \@@_change_case_breathing_aux:nnnw {#1} {#2} {#4} } - { \@@_change_case_loop:nnw {#1} {#2} #3 } + { \@@_codepoint_compare_p:nNn {#6} = { "0313 } } + { \@@_codepoint_compare_p:nNn {#6} = { "0314 } } + { \@@_change_case_breathing_aux:nnnnw {#1} {#2} {#3} {#5} } + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } } % \end{macrocode} % Now the lookahead can be fired: check the next codepoint and assess @@ -1736,29 +1766,29 @@ % breathing mark or generate the \emph{dialytika}: the % latter is code shared with the general mechanism. % \begin{macrocode} -\cs_new:Npn \@@_change_case_breathing_aux:nnnw #1#2#3#4 +\cs_new:Npn \@@_change_case_breathing_aux:nnnnw #1#2#3#4#5 \q_@@_recursion_stop { \@@_change_case_store:e - { \@@_change_case_codepoint:nn { upper } {#3} } - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_breathing_aux:nnN } - { \@@_change_case_loop:nnw } - {#1} {#2} #4 \q_@@_recursion_stop + { \@@_change_case_codepoint:nn { upper } {#4} } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_breathing_aux:nnnN } + { \@@_change_case_loop:nnnw } + {#1} {#2} {#3} #5 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_breathing_aux:nnN #1#2#3 +\cs_new:Npn \@@_change_case_breathing_aux:nnnN #1#2#3#4 { \@@_codepoint_process:nN - { \@@_change_case_breathing_dialytika:nnn {#1} {#2} } #3 + { \@@_change_case_breathing_dialytika:nnnn {#1} {#2} {#3} } #4 } -\cs_new:Npn \@@_change_case_breathing_dialytika:nnn #1#2#3 +\cs_new:Npn \@@_change_case_breathing_dialytika:nnnn #1#2#3#4 { - \@@_change_case_if_takes_dialytika:nTF {#3} + \@@_change_case_if_takes_dialytika:nTF {#4} { - \@@_change_case_upper_el_dialytika:n {#3} - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_upper_el_dialytika:n {#4} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } - { \@@_change_case_loop:nnw {#1} {#2} #3 } + { \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } } % \end{macrocode} % \end{macro} @@ -1769,88 +1799,88 @@ % \end{macro} % \end{macro} % \end{macro} -% \begin{macro}[EXP]{\@@_change_case_title_el:nnnn} +% \begin{macro}[EXP]{\@@_change_case_title_el:nnnnn} % Titlecasing retains accents, but to prevent the uppercasing code % from kicking in, there has to be an explicit function here. % \begin{macrocode} -\cs_new:Npn \@@_change_case_title_el:nnnn #1#2#3#4 - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } +\cs_new:Npn \@@_change_case_title_el:nnnnn #1#2#3#4#5 + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } % \end{macrocode} % \end{macro} % % \begin{macro}[EXP] % { -% \@@_change_case_upper_hy:nnnn , -% \@@_change_case_title_hy:nnnn , -% \@@_change_case_upper_hy-x-yiwn:nnnn , -% \@@_change_case_title_hy-x-yiwn:nnnn +% \@@_change_case_upper_hy:nnnnn , +% \@@_change_case_title_hy:nnnnn , +% \@@_change_case_upper_hy-x-yiwn:nnnnn , +% \@@_change_case_title_hy-x-yiwn:nnnnn % } % See \url{https://www.unicode.org/L2/L2020/20143-armenian-ech-yiwn.pdf}. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_hy:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_hy:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0587 } + \@@_codepoint_compare:nNnTF {#5} = { "0587 } { \@@_change_case_store:e { \codepoint_generate:nn { "0535 } - { \@@_change_case_catcode:nn {#4} { "0535 } } + { \@@_change_case_catcode:nn {#5} { "0535 } } \codepoint_generate:nn { "054E } - { \@@_change_case_catcode:nn {#4} { "054E } } + { \@@_change_case_catcode:nn {#5} { "054E } } } - \use:c { @@_change_case_next_ #2 :nn } - {#2} {#3} + \use:c { @@_change_case_next_ #2 :nnn } + {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } -\cs_new:Npn \@@_change_case_title_hy:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_title_hy:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0587 } + \@@_codepoint_compare:nNnTF {#5} = { "0587 } { \@@_change_case_store:e { \codepoint_generate:nn { "0535 } - { \@@_change_case_catcode:nn {#4} { "0535 } } + { \@@_change_case_catcode:nn {#5} { "0535 } } \codepoint_generate:nn { "057E } - { \@@_change_case_catcode:nn {#4} { "057E } } + { \@@_change_case_catcode:nn {#5} { "057E } } } - \use:c { @@_change_case_next_ #2 :nn } - {#2} {#3} + \use:c { @@_change_case_next_ #2 :nnn } + {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } -\cs_new:cpn { @@_change_case_upper_hy-x-yiwn:nnnn } #1#2#3#4 - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } -\cs_new_eq:cc { @@_change_case_title_hy-x-yiwn:nnnn } - { @@_change_case_upper_hy-x-yiwn:nnnn } +\cs_new:cpn { @@_change_case_upper_hy-x-yiwn:nnnnn } #1#2#3#4#5 + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } +\cs_new_eq:cc { @@_change_case_title_hy-x-yiwn:nnnnn } + { @@_change_case_upper_hy-x-yiwn:nnnnn } % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\@@_change_case_lower_la-x-medieval:nnnn} -% \begin{macro}[EXP]{\@@_change_case_upper_la-x-medieval:nnnn} +% \begin{macro}[EXP]{\@@_change_case_lower_la-x-medieval:nnnnn} +% \begin{macro}[EXP]{\@@_change_case_upper_la-x-medieval:nnnnn} % Simply swaps of characters. % \begin{macrocode} -\cs_new:cpn { @@_change_case_lower_la-x-medieval:nnnn } #1#2#3#4 +\cs_new:cpn { @@_change_case_lower_la-x-medieval:nnnnn } #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0056 } + \@@_codepoint_compare:nNnTF {#5} = { "0056 } { \@@_change_case_store:e - { \char_generate:nn { "0075 } { \@@_char_catcode:N #4 } } - \use:c { @@_change_case_next_ #2 :nn } - {#2} {#3} + { \char_generate:nn { "0075 } { \@@_char_catcode:N #5 } } + \use:c { @@_change_case_next_ #2 :nnn } + {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } -\cs_new:cpn { @@_change_case_upper_la-x-medieval:nnnn } #1#2#3#4 +\cs_new:cpn { @@_change_case_upper_la-x-medieval:nnnnn } #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0075 } + \@@_codepoint_compare:nNnTF {#5} = { "0075 } { \@@_change_case_store:e - { \char_generate:nn { "0056 } { \@@_char_catcode:N #4 } } - \use:c { @@_change_case_next_ #2 :nn } - {#2} {#3} + { \char_generate:nn { "0056 } { \@@_char_catcode:N #5 } } + \use:c { @@_change_case_next_ #2 :nnn } + {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } % \end{macrocode} % \end{macro} @@ -1858,62 +1888,62 @@ % % \begin{macro}[EXP] % { -% \@@_change_cases_lower_lt:nnnn , -% \@@_change_cases_lower_lt_auxi:nnnn , -% \@@_change_cases_lower_lt_auxii:nnnn +% \@@_change_cases_lower_lt:nnnnn , +% \@@_change_cases_lower_lt_auxi:nnnnn , +% \@@_change_cases_lower_lt_auxii:nnnnn % } -% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnw} -% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnN} -% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnn} +% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnnw} +% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnnN} +% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnnn} % For Lithuanian, the issue to be dealt with is dots over lower case % letters: these should be present if there is another accent. The first step % is a simple match attempt: look for the three uppercase accented letters % which should gain a dot-above char in their lowercase form. % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_lt:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_lt:nnnnn #1#2#3#4#5 { - \exp_args:Ne \@@_change_case_lower_lt_auxi:nnnn + \exp_args:Ne \@@_change_case_lower_lt_auxi:nnnnn { - \int_case:nn { \@@_codepoint_from_chars:Nw #4 } + \int_case:nn { \@@_codepoint_from_chars:Nw #5 } { { "00CC } { "0300 } { "00CD } { "0301 } { "0128 } { "0303 } } } - {#2} {#3} {#4} + {#2} {#3} {#4} {#5} } % \end{macrocode} % If there was a hit, output the result with the dot-above and move on. % Otherwise, look for one of the three letters that can take a combining % accent: I, J nd I-ogonek. % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_lt_auxi:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_lt_auxi:nnnnn #1#2#3#4#5 { \tl_if_blank:nTF {#1} { - \exp_args:Ne \@@_change_case_lower_lt_auxii:nnnn + \exp_args:Ne \@@_change_case_lower_lt_auxii:nnnnn { - \int_case:nn { \@@_codepoint_from_chars:Nw #4 } + \int_case:nn { \@@_codepoint_from_chars:Nw #5 } { { "0049 } { "0069 } { "004A } { "006A } { "012E } { "012F } } } - {#2} {#3} {#4} + {#2} {#3} {#4} {#5} } { \@@_change_case_store:e { \codepoint_generate:nn { "0069 } - { \@@_change_case_catcode:nn {#4} { "0069 } } + { \@@_change_case_catcode:nn {#5} { "0069 } } \codepoint_generate:nn { "0307 } - { \@@_change_case_catcode:nn {#4} { "0307 } } + { \@@_change_case_catcode:nn {#5} { "0307 } } \codepoint_generate:nn {#1} - { \@@_change_case_catcode:nn {#4} {#1} } + { \@@_change_case_catcode:nn {#5} {#1} } } - \@@_change_case_loop:nnw {#2} {#3} + \@@_change_case_loop:nnnw {#2} {#3} {#4} } } % \end{macrocode} @@ -1921,55 +1951,55 @@ % then need to look for a combining accent: as usual, we need to be aware of % the loop situation. % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_lt_auxii:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_lt_auxii:nnnnn #1#2#3#4#5 { \tl_if_blank:nTF {#1} - { \@@_change_case_codepoint:nnnn {#2} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#2} {#2} {#3} {#4} {#5} } { \@@_change_case_store:e { \codepoint_generate:nn {#1} - { \@@_change_case_catcode:nn {#4} {#1} } + { \@@_change_case_catcode:nn {#5} {#1} } } - \@@_change_case_lower_lt:nnw {#2} {#3} + \@@_change_case_lower_lt:nnnw {#2} {#3} {#4} } } -\cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_lower_lt:nnnw #1#2#3#4 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#3} - { \@@_change_case_lower_lt:nnN } - { \@@_change_case_loop:nnw } - {#1} {#2} #3 \q_@@_recursion_stop + \tl_if_head_is_N_type:nTF {#4} + { \@@_change_case_lower_lt:nnnN } + { \@@_change_case_loop:nnnw } + {#1} {#2} {#3} #4 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_lower_lt:nnN #1#2#3 +\cs_new:Npn \@@_change_case_lower_lt:nnnN #1#2#3#4 { \@@_codepoint_process:nN - { \@@_change_case_lower_lt:nnn {#1} {#2} } #3 + { \@@_change_case_lower_lt:nnnn {#1} {#2} {#3} } #4 } -\cs_new:Npn \@@_change_case_lower_lt:nnn #1#2#3 +\cs_new:Npn \@@_change_case_lower_lt:nnnn #1#2#3#4 { \bool_lazy_and:nnT { \bool_lazy_or_p:nn - { ! \tl_if_single_p:n {#3} } - { ! \token_if_cs_p:N #3 } + { ! \tl_if_single_p:n {#4} } + { ! \token_if_cs_p:N #4 } } { \bool_lazy_any_p:n { - { \@@_codepoint_compare_p:nNn {#3} = { "0300 } } - { \@@_codepoint_compare_p:nNn {#3} = { "0301 } } - { \@@_codepoint_compare_p:nNn {#3} = { "0303 } } + { \@@_codepoint_compare_p:nNn {#4} = { "0300 } } + { \@@_codepoint_compare_p:nNn {#4} = { "0301 } } + { \@@_codepoint_compare_p:nNn {#4} = { "0303 } } } } { \@@_change_case_store:e { \codepoint_generate:nn { "0307 } - { \@@_change_case_catcode:nn {#3} { "0307 } } + { \@@_change_case_catcode:nn {#4} { "0307 } } } } - \@@_change_case_loop:nnw {#1} {#2} #3 + \@@_change_case_loop:nnnw {#1} {#2} {#3} #4 } % \end{macrocode} % \end{macro} @@ -1978,64 +2008,64 @@ % \end{macro} % \begin{macro}[EXP] % { -% \@@_change_cases_upper_lt:nnnn , -% \@@_change_cases_upper_lt_aux:nnnn +% \@@_change_cases_upper_lt:nnnnn , +% \@@_change_cases_upper_lt_aux:nnnnn % } -% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnw} -% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnN} -% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnn} +% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnnw} +% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnnN} +% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnnn} % The uppercasing version: first find i/j/i-ogonek, then look for the % combining char: drop it if present. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_lt:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_lt:nnnnn #1#2#3#4#5 { - \exp_args:Ne \@@_change_case_upper_lt_aux:nnnn + \exp_args:Ne \@@_change_case_upper_lt_aux:nnnnn { - \int_case:nn { \@@_codepoint_from_chars:Nw #4 } + \int_case:nn { \@@_codepoint_from_chars:Nw #5 } { { "0069 } { "0049 } { "006A } { "004A } { "012F } { "012E } } } - {#2} {#3} {#4} + {#2} {#3} {#4} {#5} } -\cs_new:Npn \@@_change_case_upper_lt_aux:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_lt_aux:nnnnn #1#2#3#4#5 { \tl_if_blank:nTF {#1} - { \@@_change_case_codepoint:nnnn { upper } {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn { upper } {#2} {#3} {#4} {#5} } { \@@_change_case_store:e { \codepoint_generate:nn {#1} - { \@@_change_case_catcode:nn {#4} {#1} } + { \@@_change_case_catcode:nn {#5} {#1} } } - \@@_change_case_upper_lt:nnw {#2} {#3} + \@@_change_case_upper_lt:nnnw {#2} {#3} {#4} } } -\cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_upper_lt:nnnw #1#2#3#4 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#3} - { \@@_change_case_upper_lt:nnN } - { \use:c { @@_change_case_next_ #1 :nn } } - {#1} {#2} #3 \q_@@_recursion_stop + \tl_if_head_is_N_type:nTF {#4} + { \@@_change_case_upper_lt:nnnN } + { \use:c { @@_change_case_next_ #1 :nnn } } + {#1} {#2} {#3} #4 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_upper_lt:nnN #1#2#3 +\cs_new:Npn \@@_change_case_upper_lt:nnnN #1#2#3#4 { \@@_codepoint_process:nN - { \@@_change_case_upper_lt:nnn {#1} {#2} } #3 + { \@@_change_case_upper_lt:nnnn {#1} {#2} {#3} } #4 } -\cs_new:Npn \@@_change_case_upper_lt:nnn #1#2#3 +\cs_new:Npn \@@_change_case_upper_lt:nnnn #1#2#3#4 { \bool_lazy_and:nnTF { \bool_lazy_or_p:nn - { ! \tl_if_single_p:n {#3} } - { ! \token_if_cs_p:N #3 } + { ! \tl_if_single_p:n {#4} } + { ! \token_if_cs_p:N #4 } } - { \@@_codepoint_compare_p:nNn {#3} = { "0307 } } - { \use:c { @@_change_case_next_ #1 :nn } {#1} {#2} } - { \use:c { @@_change_case_next_ #1 :nn } {#1} {#2} #3 } + { \@@_codepoint_compare_p:nNn {#4} = { "0307 } } + { \use:c { @@_change_case_next_ #1 :nnn } {#1} {#2} {#3} } + { \use:c { @@_change_case_next_ #1 :nnn } {#1} {#2} {#3} #4 } } % \end{macrocode} % \end{macro} @@ -2044,84 +2074,84 @@ % \end{macro} % % \begin{macro}[EXP] -% {\@@_change_case_title_nl:nnnn, \@@_change_case_title_nl_aux:nnnn} -% \begin{macro}[EXP]{\@@_change_case_title_nl:nnw} -% \begin{macro}[EXP]{\@@_change_case_title_nl:nnN} +% {\@@_change_case_title_nl:nnnnn, \@@_change_case_title_nl_aux:nnnnn} +% \begin{macro}[EXP]{\@@_change_case_title_nl:nnnw} +% \begin{macro}[EXP]{\@@_change_case_title_nl:nnnN} % For Dutch, there is a single look-ahead test for \texttt{ij} when % title casing. If the appropriate letters are found, produce \texttt{IJ} % and gobble the \texttt{j}/\texttt{J}. % \begin{macrocode} -\cs_new:Npn \@@_change_case_title_nl:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_title_nl:nnnnn #1#2#3#4#5 { - \tl_if_single:nTF {#4} - { \@@_change_case_title_nl_aux:nnnn } - { \@@_change_case_codepoint:nnnn } - {#1} {#2} {#3} {#4} + \tl_if_single:nTF {#5} + { \@@_change_case_title_nl_aux:nnnnn } + { \@@_change_case_codepoint:nnnnn } + {#1} {#2} {#3} {#4} {#5} } -\cs_new:Npn \@@_change_case_title_nl_aux:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_title_nl_aux:nnnnn #1#2#3#4#5 { \bool_lazy_or:nnTF - { \int_compare_p:nNn {`#4} = { "0049 } } - { \int_compare_p:nNn {`#4} = { "0069 } } + { \int_compare_p:nNn {`#5} = { "0049 } } + { \int_compare_p:nNn {`#5} = { "0069 } } { \@@_change_case_store:e - { \char_generate:nn { "0049 } { \@@_char_catcode:N #4 } } - \@@_change_case_title_nl:nnw {#2} {#3} + { \char_generate:nn { "0049 } { \@@_char_catcode:N #5 } } + \@@_change_case_title_nl:nnnw {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } -\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_title_nl:nnnw #1#2#3#4 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#3} - { \@@_change_case_title_nl:nnN } - { \use:c { @@_change_case_next_ #1 :nn } } - {#1} {#2} #3 \q_@@_recursion_stop + \tl_if_head_is_N_type:nTF {#4} + { \@@_change_case_title_nl:nnnN } + { \use:c { @@_change_case_next_ #1 :nnn } } + {#1} {#2} {#3} #4 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_title_nl:nnN #1#2#3 +\cs_new:Npn \@@_change_case_title_nl:nnnN #1#2#3#4 { \bool_lazy_and:nnTF - { ! \token_if_cs_p:N #3 } + { ! \token_if_cs_p:N #4 } { \bool_lazy_or_p:nn - { \int_compare_p:nNn {`#3} = { "004A } } - { \int_compare_p:nNn {`#3} = { "006A } } + { \int_compare_p:nNn {`#4} = { "004A } } + { \int_compare_p:nNn {`#4} = { "006A } } } { \@@_change_case_store:e - { \char_generate:nn { "004A } { \@@_char_catcode:N #3 } } - \use:c { @@_change_case_next_ #1 :nn } {#1} {#2} + { \char_generate:nn { "004A } { \@@_char_catcode:N #4 } } + \use:c { @@_change_case_next_ #1 :nnn } {#1} {#2} {#3} } - { \use:c { @@_change_case_next_ #1 :nn } {#1} {#2} #3 } + { \use:c { @@_change_case_next_ #1 :nnn } {#1} {#2} {#3} #4 } } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % -% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnnn} -% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnNw} -% \begin{macro}[EXP]{\@@_change_case_lower_tr:NnnN} -% \begin{macro}[EXP]{\@@_change_case_lower_tr:Nnnn} +% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnnnn} +% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnnNw} +% \begin{macro}[EXP]{\@@_change_case_lower_tr:NnnnN} +% \begin{macro}[EXP]{\@@_change_case_lower_tr:Nnnnn} % The Turkic languages need special treatment for dotted-i and dotless-i. % The lower casing rule can be expressed in terms of searching first for % either a dotless-I or a dotted-I. In the latter case the mapping is % easy, but in the former there is a second stage search. % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_tr:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_tr:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0049 } - { \@@_change_case_lower_tr:nnNw {#1} {#3} #4 } + \@@_codepoint_compare:nNnTF {#5} = { "0049 } + { \@@_change_case_lower_tr:nnnNw {#1} {#3} {#4} #5 } { - \@@_codepoint_compare:nNnTF {#4} = { "0130 } + \@@_codepoint_compare:nNnTF {#5} = { "0130 } { \@@_change_case_store:e { \codepoint_generate:nn { "0069 } - { \@@_change_case_catcode:nn {#4} { "0069 } } + { \@@_change_case_catcode:nn {#5} { "0069 } } } - \@@_change_case_loop:nnw {#1} {#3} + \@@_change_case_loop:nnnw {#1} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } } % \end{macrocode} @@ -2130,41 +2160,41 @@ % combination is found both the dotless-I and the dot-above char have to % be removed from the input. % \begin{macrocode} -\cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_@@_recursion_stop +\cs_new:Npn \@@_change_case_lower_tr:nnnNw #1#2#3#4#5 \q_@@_recursion_stop { - \tl_if_head_is_N_type:nTF {#4} - { \@@_change_case_lower_tr:NnnN #3 {#1} {#2} } + \tl_if_head_is_N_type:nTF {#5} + { \@@_change_case_lower_tr:NnnnN #4 {#1} {#2} {#3} } { \@@_change_case_store:e { \codepoint_generate:nn { "0131 } - { \@@_change_case_catcode:nn {#3} { "0131 } } + { \@@_change_case_catcode:nn {#4} { "0131 } } } - \@@_change_case_loop:nnw {#1} {#2} + \@@_change_case_loop:nnnw {#1} {#2} {#3} } - #4 \q_@@_recursion_stop + #5 \q_@@_recursion_stop } -\cs_new:Npn \@@_change_case_lower_tr:NnnN #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_tr:NnnnN #1#2#3#4#5 { \@@_codepoint_process:nN - { \@@_change_case_lower_tr:Nnnn #1 {#2} {#3} } #4 + { \@@_change_case_lower_tr:Nnnnn #1 {#2} {#3} {#4} } #5 } -\cs_new:Npn \@@_change_case_lower_tr:Nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_lower_tr:Nnnnn #1#2#3#4#5 { \bool_lazy_or:nnTF { \bool_lazy_and_p:nn - { \tl_if_single_p:n {#4} } - { \token_if_cs_p:N #4 } + { \tl_if_single_p:n {#5} } + { \token_if_cs_p:N #5 } } - { ! \@@_codepoint_compare_p:nNn {#4} = { "0307 } } + { ! \@@_codepoint_compare_p:nNn {#5} = { "0307 } } { \@@_change_case_store:e { \codepoint_generate:nn { "0131 } { \@@_change_case_catcode:nn {#1} { "0131 } } } - \@@_change_case_loop:nnw {#2} {#3} #4 + \@@_change_case_loop:nnnw {#2} {#3} {#4} #5 } { \@@_change_case_store:e @@ -2172,7 +2202,7 @@ \codepoint_generate:nn { "0069 } { \@@_change_case_catcode:nn {#1} { "0069 } } } - \@@_change_case_loop:nnw {#2} {#3} + \@@_change_case_loop:nnnw {#2} {#3} {#4} } } % \end{macrocode} @@ -2180,33 +2210,33 @@ % \end{macro} % \end{macro} % \end{macro} -% \begin{macro}[EXP]{\@@_change_case_upper_tr:nnnn} +% \begin{macro}[EXP]{\@@_change_case_upper_tr:nnnnn} % Uppercasing is easier: just one exception with no context. % \begin{macrocode} -\cs_new:Npn \@@_change_case_upper_tr:nnnn #1#2#3#4 +\cs_new:Npn \@@_change_case_upper_tr:nnnnn #1#2#3#4#5 { - \@@_codepoint_compare:nNnTF {#4} = { "0069 } + \@@_codepoint_compare:nNnTF {#5} = { "0069 } { \@@_change_case_store:e { \codepoint_generate:nn { "0130 } - { \@@_change_case_catcode:nn {#4} { "0130 } } + { \@@_change_case_catcode:nn {#5} { "0130 } } } - \use:c { @@_change_case_next_ #2 :nn } {#2} {#3} + \use:c { @@_change_case_next_ #2 :nnn } {#2} {#3} {#4} } - { \@@_change_case_codepoint:nnnn {#1} {#2} {#3} {#4} } + { \@@_change_case_codepoint:nnnnn {#1} {#2} {#3} {#4} {#5} } } % \end{macrocode} % \end{macro} % % \begin{macro}[EXP] -% {\@@_change_case_lower_az:nnnn, \@@_change_case_upper_az:nnnn} +% {\@@_change_case_lower_az:nnnnn, \@@_change_case_upper_az:nnnnn} % Straight copies. % \begin{macrocode} -\cs_new_eq:NN \@@_change_case_lower_az:nnnn - \@@_change_case_lower_tr:nnnn -\cs_new_eq:NN \@@_change_case_upper_az:nnnn - \@@_change_case_upper_tr:nnnn +\cs_new_eq:NN \@@_change_case_lower_az:nnnnn + \@@_change_case_lower_tr:nnnnn +\cs_new_eq:NN \@@_change_case_upper_az:nnnnn + \@@_change_case_upper_tr:nnnnn % \end{macrocode} % \end{macro} % |