summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel/l3text-case.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-10-24 03:01:00 +0000
committerNorbert Preining <norbert@preining.info>2023-10-24 03:01:00 +0000
commit7fc03b60d145610ff8e62c3d3a0d5fe037f6597d (patch)
tree5a571652d167dc38829a038550b6a7fbb8b57b2c /macros/latex/contrib/l3kernel/l3text-case.dtx
parent6864ad38da5412fd65e655da307e368cea282091 (diff)
CTAN sync 202310240300
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3text-case.dtx')
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx1366
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}
%