diff options
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3text-case.dtx')
-rw-r--r-- | macros/latex/contrib/l3kernel/l3text-case.dtx | 441 |
1 files changed, 435 insertions, 6 deletions
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx index a2ed47843b..ef6751ac93 100644 --- a/macros/latex/contrib/l3kernel/l3text-case.dtx +++ b/macros/latex/contrib/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-07-15} +% \date{Released 2022-08-05} % % \maketitle % @@ -357,7 +357,7 @@ % \begin{macrocode} \cs_new:Npn \@@_change_case_N_type:nnN #1#2#3 { - \@@_if_recursion_tail_stop_do:Nn #3 + \@@_if_q_recursion_tail_stop_do:Nn #3 { \@@_change_case_end:w } \@@_change_case_N_type_aux:nnN {#1} {#2} #3 } @@ -374,7 +374,7 @@ } \cs_new:Npn \@@_change_case_math_search:nnNNN #1#2#3#4#5 { - \@@_if_recursion_tail_stop_do:Nn #4 + \@@_if_q_recursion_tail_stop_do:Nn #4 { \@@_change_case_cs_check:nnN {#1} {#2} #3 } \token_if_eq_meaning:NNTF #3 #4 { @@ -399,7 +399,7 @@ } \cs_new:Npn \@@_change_case_math_N_type:nnNN #1#2#3#4 { - \@@_if_recursion_tail_stop_do:Nn #4 + \@@_if_q_recursion_tail_stop_do:Nn #4 { \@@_change_case_end:w } \@@_change_case_store:n {#4} \token_if_eq_meaning:NNTF #4 #3 @@ -454,7 +454,7 @@ } \cs_new:Npn \@@_change_case_exclude:nnNN #1#2#3#4 { - \@@_if_recursion_tail_stop_do:Nn #4 + \@@_if_q_recursion_tail_stop_do:Nn #4 { \@@_change_case_replace:nnN {#1} {#2} #3 } \str_if_eq:nnTF {#3} {#4} { @@ -910,6 +910,9 @@ % \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnN} % \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:nnnNN} +% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnNNN} +% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn} % \begin{macro}[EXP,TF]{\@@_change_case_if_greek:n} % \begin{macro}[EXP,pTF]{\@@_change_case_if_greek:n} % \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_accent:n} @@ -927,7 +930,7 @@ % \emph{ypogegrammeni} is filtered out here as it is not actually in the % Greek range, so gets lost if we leave until later. % \begin{macrocode} -\bool_lazy_or:nnT +\bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { @@ -1130,6 +1133,43 @@ } } % \end{macrocode} +% For $8$-bit engines we use a simplified approach: covers the common +% requirements. This is basically how \pkg{xgreek} works but done by +% expansion: use fixed mappings from accented to accent-free letters. +% Only the two- and three-byte ranges can be involved. +% \begin{macrocode} + { + \cs_new:Npn \@@_change_case_upper_el:nnnN #1#2#3#4 + { + \int_compare:nNnTF { `#4 } > { "80 } + { + \int_compare:nNnTF { `#4 } < { "E0 } + { \@@_change_case_upper_el:nnnNN } + { + \int_compare:nNnTF { `#4 } < { "F0 } + { \@@_change_case_upper_el:nnnNNN } + { \@@_change_case_char:nnnN } + } + } + { \@@_change_case_char:nnnN } + {#1} {#2} {#3} #4 + } + \cs_new:Npn \@@_change_case_upper_el:nnnNN #1#2#3#4#5 + { \@@_change_case_upper_el:nnnn {#1} {#2} {#3} {#4#5} } + \cs_new:Npn \@@_change_case_upper_el:nnnNNN #1#2#3#4#5#6 + { \@@_change_case_upper_el:nnnn {#1} {#2} {#3} {#4#5#6} } + \cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4 + { + \cs_if_exist:cTF { c_@@_uppercase_el_ \tl_to_str:n {#4} _tl } + { + \@@_change_case_store:v + { c_@@_uppercase_el_ \tl_to_str:n {#4} _tl } + \@@_change_case_loop:nnw {#1} {#3} + } + { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 } + } + } +% \end{macrocode} % Luckily the Greek range is limited and clear. % \begin{macrocode} \prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF } @@ -1268,6 +1308,9 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:Nnnw} % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnN} % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnNw} @@ -2114,6 +2157,27 @@ \@@_tmp:w { 03F4 } { 03B8 } { lower } \@@_tmp:w { 03F5 } { 0395 } { upper } % \end{macrocode} +% Croatian digraph letters: these have a titlecase variant. +% \begin{macrocode} + \@@_tmp:w { 01C4 } { 01C5 } { title } + \@@_tmp:w { 01C4 } { 01C6 } { lower } + \@@_tmp:w { 01C5 } { 01C4 } { upper } + \@@_tmp:w { 01C5 } { 01C6 } { lower } + \@@_tmp:w { 01C6 } { 01C4 } { upper } + \@@_tmp:w { 01C6 } { 01C5 } { title } + \@@_tmp:w { 01C7 } { 01C8 } { title } + \@@_tmp:w { 01C7 } { 01C9 } { lower } + \@@_tmp:w { 01C8 } { 01C7 } { upper } + \@@_tmp:w { 01C8 } { 01C9 } { lower } + \@@_tmp:w { 01C9 } { 01C7 } { upper } + \@@_tmp:w { 01C9 } { 01C8 } { title } + \@@_tmp:w { 01CA } { 01CB } { title } + \@@_tmp:w { 01CA } { 01CC } { lower } + \@@_tmp:w { 01CB } { 01CA } { upper } + \@@_tmp:w { 01CB } { 01CC } { lower } + \@@_tmp:w { 01CC } { 01CA } { upper } + \@@_tmp:w { 01CC } { 01CB } { title } +% \end{macrocode} % Odds and ends that are not simple one-to-one mappings. These % are still two-octet code points. % \begin{macrocode} @@ -2312,6 +2376,371 @@ \group_end: } \@@_tmp:w { 1FBE } { 0399 } { upper } +% \end{macrocode} +% Greek accent suppression for uppercasing. +% \begin{macrocode} + \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8 + { + \tl_const:cx + { + c_@@_uppercase_el_ + \char_generate:nn {#1} { 12 } + \char_generate:nn {#2} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#6} { 13 } + } + } + \@@_loop:nn + { 0370 } { 0370 } + { 0371 } { 0370 } + { 0372 } { 0372 } + { 0373 } { 0372 } + { 0376 } { 0376 } + { 0377 } { 0376 } + { 03FD } { 03FD } + { 037B } { 03FD } + { 03FE } { 03FE } + { 037C } { 03FE } + { 03FF } { 03FF } + { 037D } { 03FF } + { 0386 } { 0391 } + { 0388 } { 0395 } + { 0389 } { 0397 } + { 038A } { 0399 } + { 038C } { 039F } + { 038E } { 03A5 } + { 038F } { 03A9 } + { 0390 } { 03AA } + { 0391 } { 0391 } + { 0392 } { 0392 } + { 0393 } { 0393 } + { 0394 } { 0394 } + { 0395 } { 0395 } + { 0396 } { 0396 } + { 0397 } { 0397 } + { 0398 } { 0398 } + { 0399 } { 0399 } + { 039A } { 039A } + { 039B } { 039B } + { 039C } { 039C } + { 039D } { 039D } + { 039E } { 039E } + { 039F } { 039F } + { 03A0 } { 03A0 } + { 03A1 } { 03A1 } + { 03A3 } { 03A3 } + { 03A4 } { 03A4 } + { 03A5 } { 03A5 } + { 03A6 } { 03A6 } + { 03A7 } { 03A7 } + { 03A8 } { 03A8 } + { 03A9 } { 03A9 } + { 03AA } { 03AA } + { 03AB } { 03AB } + { 03AC } { 0391 } + { 03AD } { 0395 } + { 03AE } { 0397 } + { 03AF } { 0399 } + { 03B0 } { 03AB } + { 03B1 } { 0391 } + { 03B2 } { 0392 } + { 03B3 } { 0393 } + { 03B4 } { 0394 } + { 03B5 } { 0395 } + { 03B6 } { 0396 } + { 03B7 } { 0397 } + { 03B8 } { 0398 } + { 03B9 } { 0399 } + { 03BA } { 039A } + { 03BB } { 039B } + { 03BC } { 039C } + { 03BD } { 039D } + { 03BE } { 039E } + { 03BF } { 039F } + { 03C0 } { 03A0 } + { 03C1 } { 03A1 } + { 03C2 } { 03A3 } + { 03C3 } { 03A3 } + { 03C4 } { 03A4 } + { 03C5 } { 03A5 } + { 03C6 } { 03A6 } + { 03C7 } { 03A7 } + { 03C8 } { 03A8 } + { 03C9 } { 03A9 } + { 03CA } { 03AA } + { 03CB } { 03AB } + { 03CC } { 039F } + { 03CD } { 03A5 } + { 03CE } { 03A9 } + { 03D0 } { 0392 } + { 03D1 } { 0398 } + { 03D2 } { 03A5 } + { 03D3 } { 03A5 } + { 03D4 } { 03AB } + { 03D5 } { 03A6 } + { 03D6 } { 03A0 } + { 03DA } { 03DA } + { 03DB } { 03DA } + { 03DC } { 03DC } + { 03DD } { 03DC } + { 03DE } { 03DE } + { 03DF } { 03DE } + { 03E0 } { 03E0 } + { 03E1 } { 03E0 } + { 03F0 } { 039A } + { 03F1 } { 03A1 } + { 03F2 } { 03F9 } + { 03F9 } { 03F9 } + \q_recursion_tail ? + \q_recursion_stop + \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8 + { + \tl_const:cx + { + c_@@_uppercase_el_ + \char_generate:nn {#1} { 12 } + \char_generate:nn {#2} { 12 } + \char_generate:nn {#3} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#6} { 13 } + \tl_if_blank:nF {#7} + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#7} { 13 } + } + } + } + \@@_loop:nn + { 1F00 } { 0391 } + { 1F01 } { 0391 } + { 1F02 } { 0391 } + { 1F03 } { 0391 } + { 1F04 } { 0391 } + { 1F05 } { 0391 } + { 1F06 } { 0391 } + { 1F07 } { 0391 } + { 1F08 } { 0391 } + { 1F09 } { 0391 } + { 1F0A } { 0391 } + { 1F0B } { 0391 } + { 1F0C } { 0391 } + { 1F0D } { 0391 } + { 1F0E } { 0391 } + { 1F0F } { 0391 } + { 1F10 } { 0395 } + { 1F11 } { 0395 } + { 1F12 } { 0395 } + { 1F13 } { 0395 } + { 1F14 } { 0395 } + { 1F15 } { 0395 } + { 1F18 } { 0395 } + { 1F19 } { 0395 } + { 1F1A } { 0395 } + { 1F1B } { 0395 } + { 1F1C } { 0395 } + { 1F1D } { 0395 } + { 1F20 } { 0397 } + { 1F21 } { 0397 } + { 1F22 } { 0397 } + { 1F23 } { 0397 } + { 1F24 } { 0397 } + { 1F25 } { 0397 } + { 1F26 } { 0397 } + { 1F27 } { 0397 } + { 1F28 } { 0397 } + { 1F29 } { 0397 } + { 1F2A } { 0397 } + { 1F2B } { 0397 } + { 1F2C } { 0397 } + { 1F2D } { 0397 } + { 1F2E } { 0397 } + { 1F2F } { 0397 } + { 1F30 } { 0399 } + { 1F31 } { 0399 } + { 1F32 } { 0399 } + { 1F33 } { 0399 } + { 1F34 } { 0399 } + { 1F35 } { 0399 } + { 1F36 } { 0399 } + { 1F37 } { 0399 } + { 1F38 } { 0399 } + { 1F39 } { 0399 } + { 1F3A } { 0399 } + { 1F3B } { 0399 } + { 1F3C } { 0399 } + { 1F3D } { 0399 } + { 1F3E } { 0399 } + { 1F3F } { 0399 } + { 1F40 } { 039F } + { 1F41 } { 039F } + { 1F42 } { 039F } + { 1F43 } { 039F } + { 1F44 } { 039F } + { 1F45 } { 039F } + { 1F48 } { 039F } + { 1F49 } { 039F } + { 1F4A } { 039F } + { 1F4B } { 039F } + { 1F4C } { 039F } + { 1F4D } { 039F } + { 1F50 } { 03A5 } + { 1F51 } { 03A5 } + { 1F52 } { 03A5 } + { 1F53 } { 03A5 } + { 1F54 } { 03A5 } + { 1F55 } { 03A5 } + { 1F56 } { 03A5 } + { 1F57 } { 03A5 } + { 1F59 } { 03A5 } + { 1F5B } { 03A5 } + { 1F5D } { 03A5 } + { 1F5F } { 03A5 } + { 1F60 } { 03A9 } + { 1F61 } { 03A9 } + { 1F62 } { 03A9 } + { 1F63 } { 03A9 } + { 1F64 } { 03A9 } + { 1F65 } { 03A9 } + { 1F66 } { 03A9 } + { 1F67 } { 03A9 } + { 1F68 } { 03A9 } + { 1F69 } { 03A9 } + { 1F6A } { 03A9 } + { 1F6B } { 03A9 } + { 1F6C } { 03A9 } + { 1F6D } { 03A9 } + { 1F6E } { 03A9 } + { 1F6F } { 03A9 } + { 1F70 } { 0391 } + { 1F71 } { 0391 } + { 1F72 } { 0395 } + { 1F73 } { 0395 } + { 1F74 } { 0397 } + { 1F75 } { 0397 } + { 1F76 } { 0399 } + { 1F77 } { 0399 } + { 1F78 } { 039F } + { 1F79 } { 039F } + { 1F7A } { 03A5 } + { 1F7B } { 03A5 } + { 1F7C } { 03A9 } + { 1F7D } { 03A9 } + { 1F80 } { 1FBC } + { 1F81 } { 1FBC } + { 1F82 } { 1FBC } + { 1F83 } { 1FBC } + { 1F84 } { 1FBC } + { 1F85 } { 1FBC } + { 1F86 } { 1FBC } + { 1F87 } { 1FBC } + { 1F88 } { 1FBC } + { 1F89 } { 1FBC } + { 1F8A } { 1FBC } + { 1F8B } { 1FBC } + { 1F8C } { 1FBC } + { 1F8D } { 1FBC } + { 1F8E } { 1FBC } + { 1F8F } { 1FBC } + { 1F90 } { 1FCC } + { 1F91 } { 1FCC } + { 1F92 } { 1FCC } + { 1F93 } { 1FCC } + { 1F94 } { 1FCC } + { 1F95 } { 1FCC } + { 1F96 } { 1FCC } + { 1F97 } { 1FCC } + { 1F98 } { 1FCC } + { 1F99 } { 1FCC } + { 1F9A } { 1FCC } + { 1F9B } { 1FCC } + { 1F9C } { 1FCC } + { 1F9D } { 1FCC } + { 1F9E } { 1FCC } + { 1F9F } { 1FCC } + { 1FA0 } { 1FFC } + { 1FA1 } { 1FFC } + { 1FA2 } { 1FFC } + { 1FA3 } { 1FFC } + { 1FA4 } { 1FFC } + { 1FA5 } { 1FFC } + { 1FA6 } { 1FFC } + { 1FA7 } { 1FFC } + { 1FA8 } { 1FFC } + { 1FA9 } { 1FFC } + { 1FAA } { 1FFC } + { 1FAB } { 1FFC } + { 1FAC } { 1FFC } + { 1FAD } { 1FFC } + { 1FAE } { 1FFC } + { 1FAF } { 1FFC } + { 1FB0 } { 1FB8 } + { 1FB1 } { 1FB9 } + { 1FB2 } { 1FBC } + { 1FB3 } { 1FBC } + { 1FB4 } { 1FBC } + { 1FB6 } { 0391 } + { 1FB7 } { 1FBC } + { 1FB8 } { 1FB8 } + { 1FB9 } { 1FB9 } + { 1FBA } { 0391 } + { 1FBB } { 0391 } + { 1FBC } { 1FBC } + { 1FBD } { 1FBD } + { 1FC2 } { 1FCC } + { 1FC3 } { 1FCC } + { 1FC4 } { 1FCC } + { 1FC6 } { 0397 } + { 1FC7 } { 1FCC } + { 1FC8 } { 0395 } + { 1FC9 } { 0395 } + { 1FCA } { 0397 } + { 1FCB } { 0397 } + { 1FCC } { 1FCC } + { 1FD0 } { 1FD8 } + { 1FD1 } { 1FD9 } + { 1FD2 } { 03AA } + { 1FD3 } { 03AA } + { 1FD6 } { 0399 } + { 1FD7 } { 03AA } + { 1FD8 } { 1FD8 } + { 1FD9 } { 1FD9 } + { 1FDA } { 0399 } + { 1FDB } { 0399 } + { 1FE0 } { 1FE8 } + { 1FE1 } { 1FE9 } + { 1FE2 } { 03AB } + { 1FE3 } { 03AB } + { 1FE4 } { 03A1 } + { 1FE5 } { 03A1 } + { 1FE6 } { 03A5 } + { 1FE7 } { 03AB } + { 1FE8 } { 1FE8 } + { 1FE9 } { 1FE9 } + { 1FEA } { 03A5 } + { 1FEB } { 03A5 } + { 1FEC } { 1FEC } + { 1FF2 } { 1FFC } + { 1FF3 } { 1FFC } + { 1FF4 } { 1FFC } + { 1FF6 } { 03A9 } + { 1FF7 } { 1FFC } + { 1FF8 } { 039F } + { 1FF9 } { 039F } + { 1FFA } { 03A9 } + { 1FFB } { 03A9 } + { 1FFC } { 1FFC } + \q_recursion_tail ? + \q_recursion_stop } \group_end: % \end{macrocode} |