From a027168691aac77630f240e963a60ed2a5f2c495 Mon Sep 17 00:00:00 2001 From: Joseph Wright Date: Mon, 13 Feb 2023 13:08:15 +0000 Subject: [PATCH] Enable CJK token handling for (u)pTeX (fixes #1171) --- l3kernel/CHANGELOG.md | 4 + l3kernel/l3str.dtx | 32 +- l3kernel/l3text.dtx | 138 +++--- l3kernel/testfiles/m3str-convert005.lvt | 2 +- l3kernel/testfiles/m3str-convert005.uptex.tlg | 16 + l3kernel/testfiles/m3str002.lvt | 4 +- l3kernel/testfiles/m3str002.ptex.tlg | 15 + l3kernel/testfiles/m3str002.uptex.tlg | 6 +- l3kernel/testfiles/m3text002.lvt | 4 +- l3kernel/testfiles/m3text002.ptex.tlg | 296 +++++++++++++ l3kernel/testfiles/m3text002.uptex.tlg | 393 ++++++++++++++++++ l3kernel/testfiles/m3text005.lvt | 2 +- l3kernel/testfiles/m3text005.uptex.tlg | 8 +- 13 files changed, 822 insertions(+), 98 deletions(-) create mode 100644 l3kernel/testfiles/m3str-convert005.uptex.tlg create mode 100644 l3kernel/testfiles/m3text002.uptex.tlg diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md index 82278061e3..a58c9a7df1 100644 --- a/l3kernel/CHANGELOG.md +++ b/l3kernel/CHANGELOG.md @@ -7,6 +7,10 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +### Fixed +- CJK character handling for (u)pTeX (issue + [\#1171](https://github.com/latex3/latex3/issues/1171)) + ## [2023-02-07] ### Changed diff --git a/l3kernel/l3str.dtx b/l3kernel/l3str.dtx index 55f9bd7f6c..2c89eb3713 100644 --- a/l3kernel/l3str.dtx +++ b/l3kernel/l3str.dtx @@ -1917,7 +1917,8 @@ % \begin{macro}[EXP]{\@@_change_case_end:nw} % \begin{macro}[EXP]{\@@_change_case_loop:nw} % \begin{macro}[EXP]{\@@_change_case_space:n} -% \begin{macro}[EXP]{\@@_change_case_char:nN, \@@_change_case_char_aux:nN} +% \begin{macro}[EXP] +% {\@@_change_case_char:nN, \@@_change_case_char_auxi:nN, \@@_change_case_char_auxii:nN} % \begin{macro}[EXP]{\@@_change_case_codepoint:nN} % \begin{macro}[EXP]{\@@_change_case_codepoint:nNN} % \begin{macro}[EXP]{\@@_change_case_codepoint:nNNN} @@ -1977,22 +1978,33 @@ \cs_new:Npn \@@_change_case_codepoint:nN #1#2 { \@@_change_case_char:fnn { \int_eval:n {`#2} } {#1} {#2} } \else: - \cs_new:Npn \@@_change_case_codepoint:nN #1#2 + \cs_new:Npx \@@_change_case_codepoint:nN #1#2 { - \int_compare:nNnTF {`#2} > { "80 } + \exp_not:N \int_compare:nNnTF {`#2} > { "80 } { - \int_compare:nNnTF {`#2} < { "E0 } - { \@@_change_case_codepoint:nNN } + \cs_if_exist:NTF \tex_pdftexversion:D + { \exp_not:N \@@_change_case_char_auxi:nN } { - \int_compare:nNnTF {`#2} < { "F0 } - { \@@_change_case_codepoint:nNNN } - { \@@_change_case_codepoint:nNNNNN } + \exp_not:N \int_compare:nNnTF {`#2} > { "FF } + { \exp_not:N \@@_change_case_char_auxii:nN } + { \exp_not:N \@@_change_case_char_auxi:nN } } } - { \@@_change_case_char_aux:nN } + { \exp_not:N \@@_change_case_char_auxii:nN } + {#1} #2 + } + \cs_new:Npn \@@_change_case_char_auxi:nN #1#2 + { + \int_compare:nNnTF {`#2} < { "E0 } + { \@@_change_case_codepoint:nNN } + { + \int_compare:nNnTF {`#2} < { "F0 } + { \@@_change_case_codepoint:nNNN } + { \@@_change_case_codepoint:nNNNNN } + } {#1} #2 } - \cs_new:Npn \@@_change_case_char_aux:nN #1#2 + \cs_new:Npn \@@_change_case_char_auxii:nN #1#2 { \@@_change_case_char:fnn { \int_eval:n {`#2} } {#1} {#2} } \cs_new:Npn \@@_change_case_codepoint:nNN #1#2#3 { diff --git a/l3kernel/l3text.dtx b/l3kernel/l3text.dtx index c9121e6750..8367b23132 100644 --- a/l3kernel/l3text.dtx +++ b/l3kernel/l3text.dtx @@ -633,7 +633,7 @@ % % For working with codepoints in an engine-neutral way. % -% \begin{macro}[EXP]{\@@_codepoint_process:nN} +% \begin{macro}[EXP]{\@@_codepoint_process:nN, \@@_codepoint_process_aux:nN} % \begin{macro}[EXP]{\@@_codepoint_process:nNN} % \begin{macro}[EXP]{\@@_codepoint_process:nNNN} % \begin{macro}[EXP]{\@@_codepoint_process:nNNNN} @@ -647,43 +647,38 @@ \cs_new:Npn \@@_codepoint_process:nN #1#2 { #1 {#2} } } { - \cs_new:Npn \@@_codepoint_process:nN #1#2 + \cs_new:Npx \@@_codepoint_process:nN #1#2 { - \int_compare:nNnTF { `#2 } > { "80 } + \exp_not:N \int_compare:nNnTF {`#2} > { "80 } { - \int_compare:nNnTF { `#2 } < { "E0 } - { \@@_codepoint_process:nNN } + \sys_if_engine_pdftex:TF + { \exp_not:N \@@_codepoint_process_aux:nN } { - \int_compare:nNnTF { `#2 } < { "F0 } - { \@@_codepoint_process:nNNN } - { \@@_codepoint_process:nNNNN } + \exp_not:N \int_compare:nNnTF {`#2} > { "FF } + { \exp_not:N \use:n } + { \exp_not:N \@@_codepoint_process_aux:nN } } } - { \use:n } + { \exp_not:N \use:n } {#1} #2 } - \cs_new:Npn \@@_codepoint_process:nNN #1#2#3 - { #1 {#2#3} } - \sys_if_engine_ptex:TF + \cs_new:Npn \@@_codepoint_process_aux:nN #1#2 { - \cs_gset:Npn \@@_codepoint_process:nN #1#2 + \int_compare:nNnTF { `#2 } < { "E0 } + { \@@_codepoint_process:nNN } { - \int_compare:nNnTF { `#2 } > { "80 } - { - \int_compare:nNnTF { `#2 } < { "E0 } - { \@@_codepoint_process:nNN } - { \use:n } - } - { \use:n } + \int_compare:nNnTF { `#2 } < { "F0 } + { \@@_codepoint_process:nNNN } + { \@@_codepoint_process:nNNNN } + } {#1} #2 } - } - { - \cs_new:Npn \@@_codepoint_process:nNNN #1#2#3#4 - { #1 {#2#3#4} } - \cs_new:Npn \@@_codepoint_process:nNNNN #1#2#3#4#5 - { #1 {#2#3#4#5} } - } + \cs_new:Npn \@@_codepoint_process:nNN #1#2#3 + { #1 {#2#3} } + \cs_new:Npn \@@_codepoint_process:nNNN #1#2#3#4 + { #1 {#2#3#4} } + \cs_new:Npn \@@_codepoint_process:nNNNN #1#2#3#4#5 + { #1 {#2#3#4#5} } } % \end{macrocode} % \end{macro} @@ -692,7 +687,8 @@ % \end{macro} % % \begin{macro}[EXP, pTF]{\@@_codepoint_compare:nNn} -% \begin{macro}[EXP]{\@@_codepoint_from_chars:Nw} +% \begin{macro}[EXP] +% {\@@_codepoint_from_chars:Nw, \@@_codepoint_from_chars_aux:Nw} % \begin{macro}[EXP]{\@@_codepoint_from_chars:N} % \begin{macro}[EXP]{\@@_codepoint_from_chars:NN} % \begin{macro}[EXP]{\@@_codepoint_from_chars:NNN} @@ -720,62 +716,56 @@ #2 {#3} \prg_return_true: \prg_return_false: } - \cs_new:Npn \@@_codepoint_from_chars:Nw #1 + \cs_new:Npx \@@_codepoint_from_chars:Nw #1 + { + \exp_not:N \if_int_compare:w `#1 > "80 \exp_not:N \exp_stop_f: + \sys_if_engine_pdftex:TF + { + \exp_not:N \exp_after:wN + \exp_not:N \@@_codepoint_from_chars_aux:Nw + } + { + \exp_not:N \if_int_compare:w `#1 > "FF \exp_not:N \exp_stop_f: + \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN + \exp_not:N \exp_after:wN + \exp_not:N \@@_codepoint_from_chars:N + \exp_not:N \else: + \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN + \exp_not:N \exp_after:wN + \exp_not:N \@@_codepoint_from_chars_aux:Nw + \exp_not:N \fi: + } + \exp_not:N \else: + \exp_not:N \exp_after:wN \exp_not:N \@@_codepoint_from_chars:N + \exp_not:N \fi: + #1 + } + \cs_new:Npn \@@_codepoint_from_chars_aux:Nw #1 { - \if_int_compare:w `#1 > "80 \exp_stop_f: - \if_int_compare:w `#1 < "E0 \exp_stop_f: + \if_int_compare:w `#1 < "E0 \exp_stop_f: + \exp_after:wN \@@_codepoint_from_chars:NN + \else: + \if_int_compare:w `#1 < "F0 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN - \@@_codepoint_from_chars:NN + \@@_codepoint_from_chars:NNN \else: - \if_int_compare:w `#1 < "F0 \exp_stop_f: - \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \@@_codepoint_from_chars:NNN - \else: - \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \@@_codepoint_from_chars:NNNN - \fi: + \exp_after:wN \exp_after:wN \exp_after:wN + \@@_codepoint_from_chars:NNNN \fi: - \else: - \exp_after:wN \@@_codepoint_from_chars:N \fi: #1 } - \cs_new:Npn \@@_codepoint_from_chars:N #1 { `#1 } + \cs_new:Npn \@@_codepoint_from_chars:N #1 {`#1} \cs_new:Npn \@@_codepoint_from_chars:NN #1#2 { (`#1 - "C0) * "40 + `#2 - "80 } - % \end{macrocode} - % Avoid high chars with p\TeX{}. - % \begin{macrocode} - \sys_if_engine_ptex:TF + \cs_new:Npn \@@_codepoint_from_chars:NNN #1#2#3 + { (`#1 - "E0) * "1000 + (`#2 - "80) * "40 + `#3 - "80 } + \cs_new:Npn \@@_codepoint_from_chars:NNNN #1#2#3#4 { - \cs_gset:Npn \@@_codepoint_from_chars:Nw #1 - { - \if_int_compare:w `#1 > "80 \exp_stop_f: - \if_int_compare:w `#1 < "E0 \exp_stop_f: - \exp_after:wN \exp_after:wN \exp_after:wN - \@@_codepoint_from_chars:NN - \else: - \exp_after:wN \exp_after:wN \exp_after:wN - \@@_codepoint_from_chars:N - \fi: - \else: - \exp_after:wN \@@_codepoint_from_chars:N - \fi: - #1 - } - } - { - \cs_new:Npn \@@_codepoint_from_chars:NNN #1#2#3 - { (`#1 - "E0) * "1000 + (`#2 - "80) * "40 + `#3 - "80 } - \cs_new:Npn \@@_codepoint_from_chars:NNNN #1#2#3#4 - { - (`#1 - "F0) * "40000 - + (`#2 - "80) * "1000 - + (`#3 - "80) * "40 - + `#4 - "80 - } + (`#1 - "F0) * "40000 + + (`#2 - "80) * "1000 + + (`#3 - "80) * "40 + + `#4 - "80 } } % \end{macrocode} diff --git a/l3kernel/testfiles/m3str-convert005.lvt b/l3kernel/testfiles/m3str-convert005.lvt index cb718a17da..4ec3a7d18e 100644 --- a/l3kernel/testfiles/m3str-convert005.lvt +++ b/l3kernel/testfiles/m3str-convert005.lvt @@ -11,7 +11,7 @@ \ExplSyntaxOff \begin{document} -\ifdefined\disablecjktoken\disablecjktoken\fi + \START \AUTHOR{Joseph Wright} \ExplSyntaxOn diff --git a/l3kernel/testfiles/m3str-convert005.uptex.tlg b/l3kernel/testfiles/m3str-convert005.uptex.tlg new file mode 100644 index 0000000000..c694152047 --- /dev/null +++ b/l3kernel/testfiles/m3str-convert005.uptex.tlg @@ -0,0 +1,16 @@ +This is a generated file for the LaTeX (2e + expl3) validation system. +Don't change this file in any respect. +Author: Joseph Wright +============================================================ +TEST 1: PDF names +============================================================ +abczz +brackets#28#29#5B#5D#7B#7D#3C#3Exxx +gr#C3#BC#C3#9Fe## +============================================================ +============================================================ +TEST 2: PDF names with spaces +============================================================ +abc#20cde +abc#20cde +============================================================ diff --git a/l3kernel/testfiles/m3str002.lvt b/l3kernel/testfiles/m3str002.lvt index 2a2dd4ca1d..596f37181b 100644 --- a/l3kernel/testfiles/m3str002.lvt +++ b/l3kernel/testfiles/m3str002.lvt @@ -6,7 +6,7 @@ \ExplSyntaxOn \debug_on:n { check-declarations , deprecation , log-functions } \ExplSyntaxOff -\ifdefined\disablecjktoken\disablecjktoken\fi + \START \AUTHOR{Joseph Wright} \ExplSyntaxOn @@ -33,7 +33,7 @@ \tl_set:Nx \l_tmpb_tl{ \str_casefold:n { ABC~123 } } \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl \TRUE \ERROR } -\sys_if_engine_ptex:T { \END } + \TESTEXP { Accented~characters,~etc. } { " \str_uppercase:n { Café } " diff --git a/l3kernel/testfiles/m3str002.ptex.tlg b/l3kernel/testfiles/m3str002.ptex.tlg index fccc5ed842..aebe657efa 100644 --- a/l3kernel/testfiles/m3str002.ptex.tlg +++ b/l3kernel/testfiles/m3str002.ptex.tlg @@ -14,3 +14,18 @@ TEST 2: Checking category codes FALSE TRUE ============================================================ +============================================================ +TEST 3: Accented characters, etc. +============================================================ +"CAF^^c3^^89" +"^^c4^^87^^c4^^97^^c9^^97^^e1^^b9^^91^^e1^^b9^^91" +"^^e1^^bd^^a2^^ce^^b9ωΝ" +"^^cf^^85^^cc^^88^^cc^^81^^cf^^85^^cc^^88^^cc^^80st" +"^^ea^^9a^^89^^ea^^9a^^87" +"Z^^ea^^9d^^8f^^e2^^93^^a7" +============================================================ +============================================================ +TEST 4: Characters with context-sensitive Unicode behaviour +============================================================ +FALSE +============================================================ diff --git a/l3kernel/testfiles/m3str002.uptex.tlg b/l3kernel/testfiles/m3str002.uptex.tlg index 51fe292604..574de6c96a 100644 --- a/l3kernel/testfiles/m3str002.uptex.tlg +++ b/l3kernel/testfiles/m3str002.uptex.tlg @@ -19,13 +19,13 @@ TEST 3: Accented characters, etc. ============================================================ "CAF^^c3^^89" "^^c4^^87^^c4^^97^^c9^^97^^e1^^b9^^91^^e1^^b9^^91" -"^^e1^^bd^^a2^^ce^^b9^^cf^^89^^ce^^bd" +"^^e1^^bd^^a2^^ce^^b9ω^^ce^^bd" "^^cf^^85^^cc^^88^^cc^^81^^cf^^85^^cc^^88^^cc^^80st" -"^^ea^^9a^^89^^ea^^9a^^87" +"^^ea^^9a^^89ꚇ" "^^ef^^bd^^9a^^ea^^9d^^8f^^e2^^93^^a7" ============================================================ ============================================================ TEST 4: Characters with context-sensitive Unicode behaviour ============================================================ -TRUE +FALSE ============================================================ diff --git a/l3kernel/testfiles/m3text002.lvt b/l3kernel/testfiles/m3text002.lvt index 9cb8269199..b0a7966619 100644 --- a/l3kernel/testfiles/m3text002.lvt +++ b/l3kernel/testfiles/m3text002.lvt @@ -7,7 +7,7 @@ \ExplSyntaxOn \debug_on:n { check-declarations , deprecation , log-functions } \ExplSyntaxOff -\ifdefined\disablecjktoken\disablecjktoken\fi + \START \AUTHOR{Joseph Wright} \ExplSyntaxOn @@ -125,8 +125,6 @@ \test:n { ABCÈ日本語} } -\sys_if_engine_ptex:T { \END } - \TESTEXP { Unicode~case~changing } { \test:n { åéîøὭдαƐ } diff --git a/l3kernel/testfiles/m3text002.ptex.tlg b/l3kernel/testfiles/m3text002.ptex.tlg index 570c4cfbcf..4cde494e01 100644 --- a/l3kernel/testfiles/m3text002.ptex.tlg +++ b/l3kernel/testfiles/m3text002.ptex.tlg @@ -95,3 +95,299 @@ ABC^^c3^^88日本語 Abc^^c3^^a8日本語 ABC^^c3^^88日本語 ============================================================ +============================================================ +TEST 10: Unicode case changing +============================================================ +^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^a5дα^^c9^^9b +^^c3^^85^^c3^^89^^c3^^8e^^c3^^98^^e1^^bd^^adдα^^c6^^90 +^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^a5дα^^c9^^9b +^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^adдα^^c6^^90 +============================================================ +============================================================ +TEST 11: Unicode case changing exceptions +============================================================ +fu^^c3^^9fball +FUSSBALL +Fu^^c3^^9fball +Fu^^c3^^9fball +============================================================ +============================================================ +TEST 12: The final sigma rule +============================================================ +^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ (^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ) ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ, ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ{} ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ\noop +^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ (^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ) ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ, ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ{} ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ\noop +^^e1^^bd^^88ΔΥΣΣΕ^^cf^^8dΣ (^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ) ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ, ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ{} ^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ\noop +^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ (^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ) ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ, ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ{} ^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ\noop +^^e1^^bd^^80ΔΥΣΣΕ^^cf^^8dΣ +^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ +^^e1^^bd^^88ΔΥΣΣΕ^^cf^^8dΣ +^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ +============================================================ +============================================================ +TEST 13: Cyrillic +============================================================ +Доклады Акад^^ea^^9f^^97мии наук +^^ea^^9e^^a4окл^^ea^^9f^^90ды ^^ea^^9e^^a0к^^ea^^9f^^90демии н^^ea^^9f^^90ук +^^ea^^9e^^a4окл^^ea^^9f^^90ды ^^ea^^9e^^a0к^^ea^^9f^^90демии н^^ea^^9f^^90ук +^^ea^^9e^^a4окл^^ea^^9f^^90ды ^^ea^^9e^^a0к^^ea^^9f^^90демии н^^ea^^9f^^90ук +============================================================ +============================================================ +TEST 14: BCP47 parts +============================================================ +^^ce^^91δικο^^ce^^a3, κε^^ce^^99μενο, ^^ce^^99ριδα +============================================================ +============================================================ +TEST 15: Armenian +============================================================ +^^d4^^b5^^d5^^90^^d4^^b5^^d5^^92^^d4^^b1^^d5^^86 +^^d4^^b5^^d5^^90^^d4^^b5^^d5^^8e^^d4^^b1^^d5^^86 +^^d4^^b5^^d5^^90^^d4^^b5^^d5^^92^^d4^^b1^^d5^^86 +^^d4^^b5^^d6^^80^^d6^^87^^d5^^a1^^d5^^b6 +^^d4^^b5^^d5^^be^^d5^^a1^^d5^^b6 +^^d4^^b5^^d6^^82^^d5^^a1^^d5^^b6 +============================================================ +============================================================ +TEST 16: German-alternative +============================================================ +FUSSBALL +FU^^e1^^ba^^9eBALL +============================================================ +============================================================ +TEST 17: Greek +============================================================ +^^ce^^86δικο^^ce^^a3, κε^^ce^^8aμενο, ^^ce^^8aριδα +^^ce^^91δικο^^ce^^a3, κε^^ce^^99μενο, ^^ce^^99ριδα +Πατ^^ce^^86τα +Πατ^^ce^^91τα +Α^^ce^^88ρα^^ce^^a3, Μυστ^^ce^^89ριο, Ωρα^^ce^^8aο +Α^^ce^^95ρα^^ce^^a3, Μυστ^^ce^^97ριο, Ωρα^^ce^^99ο +Μα^^ce^^99^^cc^^88^^cc^^81ου, Π^^ce^^8cρο^^ce^^a3, Ρ^^ce^^8eθμιση +Μα^^ce^^aaου, Π^^ce^^9fρο^^ce^^a3, Ρ^^ce^^a5θμιση +^^ce^^a5^^cc^^88^^cc^^81, Τηρ^^ce^^8f, Μ^^ce^^86ιο^^ce^^a3 +^^ce^^ab, Τηρ^^ce^^a9, Μ^^ce^^91ιο^^ce^^a3 +^^ce^^86υλο^^ce^^a3 +^^ce^^91υλο^^ce^^a3 +Α^^ce^^abΛΟΣ +Α^^ce^^abΛΟΣ +^^ce^^86κλιτα ρ^^ce^^89ματα ^^ce^^89 ^^ce^^86κλιτε^^ce^^a3 μετοχ^^ce^^88^^ce^^a3 +^^ce^^91κλιτα ρ^^ce^^97ματα ^^ce^^89 ^^ce^^91κλιτε^^ce^^a3 μετοχ^^ce^^95^^ce^^a3 +Επειδ^^ce^^89 η αναγν^^ce^^8fριση τη^^ce^^a3 αξιοπρ^^ce^^88πεια^^ce^^a3 +Επειδ^^ce^^97 η αναγν^^ce^^a9ριση τη^^ce^^a3 αξιοπρ^^ce^^95πεια^^ce^^a3 +νομικο^^ce^^8e ^^ce^^89 διεθνο^^ce^^8e^^ce^^a3 +νομικο^^ce^^a5 ^^ce^^89 διεθνο^^ce^^a5^^ce^^a3 +^^e1^^bc^^98πειδ^^e1^^bf^^8a ^^e1^^bc^^a9 ^^e1^^bc^^88ναγν^^ce^^8fριση +^^ce^^95πειδ^^ce^^97 ^^ce^^97 ^^ce^^91ναγν^^ce^^a9ριση +νομικο^^ce^^a5^^cd^^82 ^^e1^^bc^^aa διεθνο^^ce^^a5^^cd^^82^^ce^^a3 +νομικο^^ce^^a5 ^^ce^^89 διεθνο^^ce^^a5^^ce^^a3 +Ν^^ce^^88ο, Δημιουργ^^ce^^8aα +Ν^^ce^^95ο, Δημιουργ^^ce^^99α +Ελ^^ce^^86τε να φ^^ce^^86τε τα καλ^^ce^^8eτερα πα^^ce^^aaδ^^ce^^86κια! +Ελ^^ce^^91τε να φ^^ce^^91τε τα καλ^^ce^^a5τερα πα^^ce^^aaδ^^ce^^91κια! +Μα^^ce^^99^^cc^^88^^cc^^81ου, τρ^^ce^^8cλε^^ce^^aa +Μα^^ce^^aaου, τρ^^ce^^9fλε^^ce^^aa +Το ^^ce^^88να ^^ce^^89 το ^^ce^^86λλο. +Το ^^ce^^95να ^^ce^^89 το ^^ce^^91λλο. +ρωμ^^ce^^88ικα +ρωμ^^ce^^95ικα +^^e1^^bd^^88ΔΥΣΣΕ^^cf^^8dΣ +^^e1^^bd^^88ΔΥΣΣΕ^^cf^^8dΣ +^^ce^^89^^ce^^99 +^^e1^^bf^^8c +^^ce^^97^^ce^^99 +^^ce^^97^^ce^^99^^cc^^81 +^^e1^^bf^^8c +^^ce^^97^^ce^^99 +^^e1^^bc^^88^^e1^^bc^^89^^e1^^bc^^8a^^e1^^bc^^8b^^e1^^bc^^8c^^e1^^bc^^8d^^e1^^bc^^8e^^e1^^bc^^8f +^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91 +^^e1^^bc^^98^^e1^^bc^^99^^e1^^bc^^9a^^e1^^bc^^9b^^e1^^bc^^9c^^e1^^bc^^9d +^^ce^^95^^ce^^95^^ce^^95^^ce^^95^^ce^^95^^ce^^95 +^^e1^^bc^^a8^^e1^^bc^^a9^^e1^^bc^^aa^^e1^^bc^^ab^^e1^^bc^^ac^^e1^^bc^^ad^^e1^^bc^^ae^^e1^^bc^^af +^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97 +^^e1^^bc^^b8^^e1^^bc^^b9^^e1^^bc^^ba^^e1^^bc^^bb^^e1^^bc^^bc^^e1^^bc^^bd^^e1^^bc^^be^^e1^^bc^^bf +^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99 +^^e1^^bd^^88^^e1^^bd^^89^^e1^^bd^^8a^^e1^^bd^^8b^^e1^^bd^^8c^^e1^^bd^^8d +^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f +^^ce^^a5^^cc^^93^^e1^^bd^^99^^ce^^a5^^cc^^93^^cc^^80^^e1^^bd^^9b^^ce^^a5^^cc^^93^^cc^^81^^e1^^bd^^9d^^ce^^a5^^cc^^93^^cd^^82^^e1^^bd^^9f +^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5 +^^e1^^bd^^a8^^e1^^bd^^a9^^e1^^bd^^aa^^e1^^bd^^ab^^e1^^bd^^ac^^e1^^bd^^ad^^e1^^bd^^ae^^e1^^bd^^af +^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9 +^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc +^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99 +^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c +^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99 +^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc +^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99 +============================================================ +============================================================ +TEST 18: Turkish/Azeri +============================================================ +rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +ragip hul^^c3^^bbsi^^cc^^87 ^^c3^^b6zdem +RAGIP HUL^^c3^^9bS^^c4^^b0 ^^c3^^96ZDEM +RAGIP HUL^^c3^^9bSI ^^c3^^96ZDEM +Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +Ip hul^^c3^^bbsi ^^c3^^b6zdem +Ip hul^^c3^^bbsi ^^c3^^b6zdem +============================================================ +============================================================ +TEST 19: Lithuanian +============================================================ +i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83 +^^c3^^ac^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83 +I^^cc^^80I^^cc^^80I^^cc^^83I^^cc^^80I^^cc^^81I^^cc^^83J^^cc^^80J^^cc^^81J^^cc^^83^^c4^^ae^^cc^^80^^c4^^ae^^cc^^81^^c4^^ae^^cc^^83 +I^^cc^^87^^cc^^80I^^cc^^87^^cc^^80I^^cc^^87^^cc^^83I^^cc^^87^^cc^^80I^^cc^^87^^cc^^81I^^cc^^87^^cc^^83J^^cc^^87^^cc^^80J^^cc^^87^^cc^^81J^^cc^^87^^cc^^83^^c4^^ae^^cc^^87^^cc^^80^^c4^^ae^^cc^^87^^cc^^81^^c4^^ae^^cc^^87^^cc^^83 +^^c3^^8ci^^cc^^87^^cc^^81i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83 +I^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83 +^^c3^^8c^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83 +I^^cc^^87^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83 +============================================================ +============================================================ +TEST 20: Medieval Latin +============================================================ +lupus +lvpvs +LVPVS +LUPUS +============================================================ +============================================================ +TEST 21: Dutch +============================================================ +ijsselmeer +ijsselmeer +IJSSELMEER +IJSSELMEER +IJsselmeer +Ijsselmeer +IJsselmeer +Ijsselmeer +IJsselmeer +Ijsselmeer +Im +Im +============================================================ +============================================================ +TEST 22: Titlecase exceptions +============================================================ +Ssoo +^^c7^^85! +============================================================ +============================================================ +TEST 23: Case changing braced arguments +============================================================ +foo \emph {BAR} {baz} +FOO \emph {BAR} {BAZ} +Foo \emph {BAR} {baz} +FOO \emph {BAR} {BAZ} +\emph {BAR} {baz} +\emph {BAR} {BAZ} +\emph {BAR} {Baz} +\emph {BAR} {BAZ} +============================================================ +============================================================ +TEST 24: Expanding content +============================================================ +some text hello +SOME TEXT HELLO +Some text hello +Some text Hello +hello sometext +HELLO SOMETEXT +Hello sometext +Hello sometext +some text hello +SOME TEXT HELLO +Some text hello +Some text Hello +hello sometext +HELLO SOMETEXT +Hello sometext +Hello sometext +some text \cs_tmp:w +SOME TEXT \cs_tmp:w +Some text \cs_tmp:w +Some text \cs_tmp:w +\cs_tmp:w sometext +\cs_tmp:w SOMETEXT +\cs_tmp:w Sometext +\cs_tmp:w Sometext +============================================================ +============================================================ +TEST 25: Math-mode escape +============================================================ +some text $y = mx + c$ +SOME TEXT $y = mx + c$ +Some text $y = mx + c$ +Some text $y = mx + c$ +$y = mx + c$ text +$y = mx + c$ TEXT +$y = mx + c$ Text +$y = mx + c$ Text +opps not close token in $y = mx + c +OPPS NOT CLOSE TOKEN IN $y = mx + c +Opps not close token in $y = mx + c +Opps not close token in $y = mx + c +============================================================ +============================================================ +TEST 26: Nesting +============================================================ +HELLO +hello +FUSSBALL +^^e1^^bd^^88ΔΥΣΣΕ^^ce^^8eΣ +============================================================ +============================================================ +TEST 27: Letter-like commands +============================================================ +\aa \aa \ae \dh \ss \l \o +\AA \AA \AE \DH \SS \L \O +\AA \aa \ae \dh \ss \l \o +\AA \aa \ae \dh \ss \l \O +============================================================ +============================================================ +TEST 28: Accents +============================================================ +\"{a}\u {e}\H {i}\v {o}\.{u} +\"{A}\u {E}\H {I}\v {O}\.{U} +\"{A}\u {e}\H {i}\v {o}\.{u} +\"{A}\u {e}\H {i}\v {o}\.{u} +============================================================ +============================================================ +TEST 29: Active chars +============================================================ +"`lo"=rem"' +"`LO"=REM"' +"`Lo"=rem"' +"`Lo"=rem"' +============================================================ +============================================================ +TEST 30: Case changing exclusions +============================================================ +Variant \tl_show:x already defined; not changing it on line ... +> foo\NoCaseChange {BAR}. + } +l. ... } +> \use:n {foo}\NoCaseChange {BAR}. + } +l. ... } +============================================================ +============================================================ +TEST 31: Case change switching +============================================================ +lower +UPPER +Title +Title +WORDS lower +words UPPER +Words UPPER +Words \text_case_switch:nnnn {normal}{lower}{UPPER}{Title} +============================================================ +============================================================ +TEST 32: Case change replacements +============================================================ +Defining \l__text_case_\foo_tl on line ... +> fooreplaced. + } +l. ... } +============================================================ diff --git a/l3kernel/testfiles/m3text002.uptex.tlg b/l3kernel/testfiles/m3text002.uptex.tlg new file mode 100644 index 0000000000..d7a7292f2c --- /dev/null +++ b/l3kernel/testfiles/m3text002.uptex.tlg @@ -0,0 +1,393 @@ +This is a generated file for the LaTeX (2e + expl3) validation system. +Don't change this file in any respect. +Author: Joseph Wright +============================================================ +TEST 1: Basic case changing +============================================================ +hello world \par with \ERROR &## +HELLO WORLD \par WITH \ERROR &## +Hello world \par with \ERROR &## +Hello world \par with \ERROR &## +============================================================ +============================================================ +TEST 2: Case changes in braces +============================================================ +{hello} world \par with \ERROR &## +{HELLO} WORLD \par WITH \ERROR &## +{Hello} world \par with \ERROR &## +{Hello} world \par with \ERROR &## +============================================================ +============================================================ +TEST 3: Case change exclusions +============================================================ +some text \cite {WithFun} +SOME TEXT \cite {WithFun} +Some text \cite {WithFun} +Some text \cite {WithFun} +============================================================ +============================================================ +TEST 4: Titlecase basics +============================================================ +Hello world +Hello world +Hello world +HELLO WORLD +" Hello world" +" Hello world" +" Hello world" +" HELLO WORLD" +{H}ello world +{H}ello world +{H}ello world +{H}ELLO WORLD +{}helloworld +{}helloworld +{}helloworld +{}helloworld +============================================================ +============================================================ +TEST 5: Titlecase skipping chars +============================================================ +`Hic sunt leones' +`Hic sunt leones' +``Hic sunt leones'' +``Hic sunt leones'' +([Hic sunt leones]) +([Hic sunt leones]) +============================================================ +============================================================ +TEST 6: Titlecase first +============================================================ +`Hic sunt leones' +`Hic SUNT leones' +`Hic sunt leones' +`HIC SUNT leones' +E pluribus unum +E PLURIBUS UNUM +============================================================ +============================================================ +TEST 7: Titlecase control +============================================================ +`hic sunt leones' +`hic SUNT leones' +`hic sunt leones' +`HIC SUNT leones' +E pluribus unum +E PLURIBUS UNUM +============================================================ +============================================================ +TEST 8: Language based case changing but nothing +============================================================ +no problems +NO PROBLEMS +No problems +No problems +no problems +NO PROBLEMS +No problems +No problems +============================================================ +============================================================ +TEST 9: (u)pTeX-based tests +============================================================ +abc^^c3^^a8日本語 +ABC^^c3^^88日本語 +Abc^^c3^^a8日本語 +ABC^^c3^^88日本語 +============================================================ +============================================================ +TEST 10: Unicode case changing +============================================================ +^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^a5дα^^c9^^9b +^^c3^^85^^c3^^89^^c3^^8e^^c3^^98Ὥ^^d0^^94^^ce^^91^^c6^^90 +^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^a5дα^^c9^^9b +^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8Ὥдα^^c6^^90 +============================================================ +============================================================ +TEST 11: Unicode case changing exceptions +============================================================ +fu^^c3^^9fball +FUSSBALL +Fu^^c3^^9fball +Fu^^c3^^9fball +============================================================ +============================================================ +TEST 12: The final sigma rule +============================================================ +^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82 (^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82) ^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82, ^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82{} ^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82\noop +ὈΔΥΣΣΕΎΣ (ὈΔΥΣΣΕΎΣ) ὈΔΥΣΣΕΎΣ, ὈΔΥΣΣΕΎΣ{} ὈΔΥΣΣΕΎΣ\noop +ὈΔΥΣΣΕΎΣ (ὈΔΥΣΣΕΎΣ) ὈΔΥΣΣΕΎΣ, ὈΔΥΣΣΕΎΣ{} ^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82\noop +ὈΔΥΣΣΕΎΣ (ὈΔΥΣΣΕΎΣ) ὈΔΥΣΣΕΎΣ, ὈΔΥΣΣΕΎΣ{} ὈΔΥΣΣΕΎΣ\noop +^^e1^^bd^^80^^ce^^b4^^cf^^85^^cf^^82^^cf^^82^^ce^^b5^^cf^^8d^^cf^^82 +ὈΔΥΣΣΕΎΣ +ὈΔΥΣΣΕΎΣ +ὈΔΥΣΣΕΎΣ +============================================================ +============================================================ +TEST 13: Cyrillic +============================================================ +^^d0^^b4оклады ^^d0^^b0кадемии наук +Д^^d0^^9e^^d0^^9a^^d0^^9b^^d0^^90^^d0^^94^^d0^^ab А^^d0^^9a^^d0^^90^^d0^^94^^d0^^95^^d0^^9c^^d0^^98^^d0^^98 ^^d0^^9d^^d0^^90^^d0^^a3^^d0^^9a +Д^^d0^^9e^^d0^^9a^^d0^^9b^^d0^^90^^d0^^94^^d0^^ab А^^d0^^9a^^d0^^90^^d0^^94^^d0^^95^^d0^^9c^^d0^^98^^d0^^98 ^^d0^^9d^^d0^^90^^d0^^a3^^d0^^9a +Д^^d0^^9e^^d0^^9a^^d0^^9b^^d0^^90^^d0^^94^^d0^^ab А^^d0^^9a^^d0^^90^^d0^^94^^d0^^95^^d0^^9c^^d0^^98^^d0^^98 ^^d0^^9d^^d0^^90^^d0^^a3^^d0^^9a +============================================================ +============================================================ +TEST 14: BCP47 parts +============================================================ +^^ce^^91^^ce^^94^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a3, ^^ce^^9a^^ce^^95^^ce^^99^^ce^^9c^^ce^^95^^ce^^9d^^ce^^9f, ^^ce^^99^^ce^^a1^^ce^^99^^ce^^94^^ce^^91 +============================================================ +============================================================ +TEST 15: Armenian +============================================================ +Ե^^d5^^90^^d4^^b5^^d5^^92^^d4^^b1^^d5^^86 +Ե^^d5^^90^^d4^^b5^^d5^^8e^^d4^^b1^^d5^^86 +Ե^^d5^^90^^d4^^b5^^d5^^92^^d4^^b1^^d5^^86 +Ե^^d5^^90^^d4^^b5^^d6^^82^^d4^^b1^^d5^^86 +^^d4^^b5^^d5^^be^^d4^^b1^^d5^^86 +^^d4^^b5^^d6^^82^^d4^^b1^^d5^^86 +============================================================ +============================================================ +TEST 16: German-alternative +============================================================ +FUSSBALL +FU^^e1^^ba^^9eBALL +============================================================ +============================================================ +TEST 17: Greek +============================================================ +^^ce^^86^^ce^^94^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a3, ^^ce^^9a^^ce^^95^^ce^^8a^^ce^^9c^^ce^^95^^ce^^9d^^ce^^9f, ^^ce^^8a^^ce^^a1^^ce^^99^^ce^^94^^ce^^91 +^^ce^^91^^ce^^94^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a3, ^^ce^^9a^^ce^^95^^ce^^99^^ce^^9c^^ce^^95^^ce^^9d^^ce^^9f, ^^ce^^99^^ce^^a1^^ce^^99^^ce^^94^^ce^^91 +Π^^ce^^91^^ce^^a4^^ce^^86^^ce^^a4^^ce^^91 +^^ce^^a0^^ce^^91^^ce^^a4^^ce^^91^^ce^^a4^^ce^^91 +Α^^ce^^88^^ce^^a1^^ce^^91^^ce^^a3, Μ^^ce^^a5^^ce^^a3^^ce^^a4^^ce^^89^^ce^^a1^^ce^^99^^ce^^9f, Ω^^ce^^a1^^ce^^91^^ce^^8a^^ce^^9f +^^ce^^91^^ce^^95^^ce^^a1^^ce^^91^^ce^^a3, ^^ce^^9c^^ce^^a5^^ce^^a3^^ce^^a4^^ce^^97^^ce^^a1^^ce^^99^^ce^^9f, ^^ce^^a9^^ce^^a1^^ce^^91^^ce^^99^^ce^^9f +Μ^^ce^^91^^ce^^99^^cc^^88^^cc^^81^^ce^^9f^^ce^^a5, Π^^ce^^8c^^ce^^a1^^ce^^9f^^ce^^a3, Ρ^^ce^^8e^^ce^^98^^ce^^9c^^ce^^99^^ce^^a3^^ce^^97 +^^ce^^9c^^ce^^91^^ce^^aa^^ce^^9f^^ce^^a5, ^^ce^^a0^^ce^^9f^^ce^^a1^^ce^^9f^^ce^^a3, ^^ce^^a1^^ce^^a5^^ce^^98^^ce^^9c^^ce^^99^^ce^^a3^^ce^^97 +^^ce^^a5^^cc^^88^^cc^^81, Τ^^ce^^97^^ce^^a1^^ce^^8f, Μ^^ce^^86^^ce^^99^^ce^^9f^^ce^^a3 +^^ce^^ab, ^^ce^^a4^^ce^^97^^ce^^a1^^ce^^a9, ^^ce^^9c^^ce^^91^^ce^^aa^^ce^^9f^^ce^^a3 +^^ce^^86^^ce^^a5^^ce^^9b^^ce^^9f^^ce^^a3 +^^ce^^91^^ce^^ab^^ce^^9b^^ce^^9f^^ce^^a3 +ΑΫΛΟΣ +^^ce^^91^^ce^^ab^^ce^^9b^^ce^^9f^^ce^^a3 +Ά^^ce^^9a^^ce^^9b^^ce^^99^^ce^^a4^^ce^^91 ^^ce^^a1^^ce^^89^^ce^^9c^^ce^^91^^ce^^a4^^ce^^91 ^^ce^^89 ^^ce^^86^^ce^^9a^^ce^^9b^^ce^^99^^ce^^a4^^ce^^95^^ce^^a3 ^^ce^^9c^^ce^^95^^ce^^a4^^ce^^9f^^ce^^a7^^ce^^88^^ce^^a3 +^^ce^^91^^ce^^9a^^ce^^9b^^ce^^99^^ce^^a4^^ce^^91 ^^ce^^a1^^ce^^97^^ce^^9c^^ce^^91^^ce^^a4^^ce^^91 ^^ce^^89 ^^ce^^91^^ce^^9a^^ce^^9b^^ce^^99^^ce^^a4^^ce^^95^^ce^^a3 ^^ce^^9c^^ce^^95^^ce^^a4^^ce^^9f^^ce^^a7^^ce^^95^^ce^^a3 +Ε^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^ce^^89 ^^ce^^97 ^^ce^^91^^ce^^9d^^ce^^91^^ce^^93^^ce^^9d^^ce^^8f^^ce^^a1^^ce^^99^^ce^^a3^^ce^^97 ^^ce^^a4^^ce^^97^^ce^^a3 ^^ce^^91^^ce^^9e^^ce^^99^^ce^^9f^^ce^^a0^^ce^^a1^^ce^^88^^ce^^a0^^ce^^95^^ce^^99^^ce^^91^^ce^^a3 +^^ce^^95^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^ce^^97 ^^ce^^97 ^^ce^^91^^ce^^9d^^ce^^91^^ce^^93^^ce^^9d^^ce^^a9^^ce^^a1^^ce^^99^^ce^^a3^^ce^^97 ^^ce^^a4^^ce^^97^^ce^^a3 ^^ce^^91^^ce^^9e^^ce^^99^^ce^^9f^^ce^^a0^^ce^^a1^^ce^^95^^ce^^a0^^ce^^95^^ce^^99^^ce^^91^^ce^^a3 +^^ce^^9d^^ce^^9f^^ce^^9c^^ce^^99^^ce^^9a^^ce^^9f^^ce^^8e ^^ce^^89 ^^ce^^94^^ce^^99^^ce^^95^^ce^^98^^ce^^9d^^ce^^9f^^ce^^8e^^ce^^a3 +^^ce^^9d^^ce^^9f^^ce^^9c^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a5 ^^ce^^89 ^^ce^^94^^ce^^99^^ce^^95^^ce^^98^^ce^^9d^^ce^^9f^^ce^^a5^^ce^^a3 +Ἐ^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^e1^^bf^^8a ^^e1^^bc^^a9 ^^e1^^bc^^88^^ce^^9d^^ce^^91^^ce^^93^^ce^^9d^^ce^^8f^^ce^^a1^^ce^^99^^ce^^a3^^ce^^97 +^^ce^^95^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^ce^^97 ^^ce^^97 ^^ce^^91^^ce^^9d^^ce^^91^^ce^^93^^ce^^9d^^ce^^a9^^ce^^a1^^ce^^99^^ce^^a3^^ce^^97 +^^ce^^9d^^ce^^9f^^ce^^9c^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a5^^cd^^82 ^^e1^^bc^^aa ^^ce^^94^^ce^^99^^ce^^95^^ce^^98^^ce^^9d^^ce^^9f^^ce^^a5^^cd^^82^^ce^^a3 +^^ce^^9d^^ce^^9f^^ce^^9c^^ce^^99^^ce^^9a^^ce^^9f^^ce^^a5 ^^ce^^89 ^^ce^^94^^ce^^99^^ce^^95^^ce^^98^^ce^^9d^^ce^^9f^^ce^^a5^^ce^^a3 +Ν^^ce^^88^^ce^^9f, Δ^^ce^^97^^ce^^9c^^ce^^99^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^93^^ce^^8a^^ce^^91 +^^ce^^9d^^ce^^95^^ce^^9f, ^^ce^^94^^ce^^97^^ce^^9c^^ce^^99^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^93^^ce^^99^^ce^^91 +Ε^^ce^^9b^^ce^^86^^ce^^a4^^ce^^95 ^^ce^^9d^^ce^^91 ^^ce^^a6^^ce^^86^^ce^^a4^^ce^^95 ^^ce^^a4^^ce^^91 ^^ce^^9a^^ce^^91^^ce^^9b^^ce^^8e^^ce^^a4^^ce^^95^^ce^^a1^^ce^^91 ^^ce^^a0^^ce^^91^^ce^^aa^^ce^^94^^ce^^86^^ce^^9a^^ce^^99^^ce^^91! +^^ce^^95^^ce^^9b^^ce^^91^^ce^^a4^^ce^^95 ^^ce^^9d^^ce^^91 ^^ce^^a6^^ce^^91^^ce^^a4^^ce^^95 ^^ce^^a4^^ce^^91 ^^ce^^9a^^ce^^91^^ce^^9b^^ce^^a5^^ce^^a4^^ce^^95^^ce^^a1^^ce^^91 ^^ce^^a0^^ce^^91^^ce^^aa^^ce^^94^^ce^^91^^ce^^9a^^ce^^99^^ce^^91! +Μ^^ce^^91^^ce^^99^^cc^^88^^cc^^81^^ce^^9f^^ce^^a5, ^^ce^^a4^^ce^^a1^^ce^^8c^^ce^^9b^^ce^^95^^ce^^aa +^^ce^^9c^^ce^^91^^ce^^aa^^ce^^9f^^ce^^a5, ^^ce^^a4^^ce^^a1^^ce^^9f^^ce^^9b^^ce^^95^^ce^^aa +Τ^^ce^^9f ^^ce^^88^^ce^^9d^^ce^^91 ^^ce^^89 ^^ce^^a4^^ce^^9f ^^ce^^86^^ce^^9b^^ce^^9b^^ce^^9f. +^^ce^^a4^^ce^^9f ^^ce^^95^^ce^^9d^^ce^^91 ^^ce^^89 ^^ce^^a4^^ce^^9f ^^ce^^91^^ce^^9b^^ce^^9b^^ce^^9f. +^^ce^^a1^^ce^^a9^^ce^^9c^^ce^^88^^ce^^99^^ce^^9a^^ce^^91 +^^ce^^a1^^ce^^a9^^ce^^9c^^ce^^95^^ce^^aa^^ce^^9a^^ce^^91 +ὈΔΥΣΣΕΎΣ +ὈΔΥΣΣΕΎΣ +^^ce^^89^^ce^^99 +^^e1^^bf^^8c +^^ce^^97^^ce^^99 +^^ce^^97^^ce^^99́ +^^e1^^bf^^8c +^^ce^^97^^ce^^99 +^^e1^^bc^^88^^e1^^bc^^89^^e1^^bc^^8a^^e1^^bc^^8b^^e1^^bc^^8c^^e1^^bc^^8d^^e1^^bc^^8e^^e1^^bc^^8f +^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91^^ce^^91 +^^e1^^bc^^98^^e1^^bc^^99^^e1^^bc^^9a^^e1^^bc^^9b^^e1^^bc^^9c^^e1^^bc^^9d +^^ce^^95^^ce^^95^^ce^^95^^ce^^95^^ce^^95^^ce^^95 +^^e1^^bc^^a8^^e1^^bc^^a9^^e1^^bc^^aa^^e1^^bc^^ab^^e1^^bc^^ac^^e1^^bc^^ad^^e1^^bc^^ae^^e1^^bc^^af +^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97^^ce^^97 +^^e1^^bc^^b8^^e1^^bc^^b9^^e1^^bc^^ba^^e1^^bc^^bb^^e1^^bc^^bc^^e1^^bc^^bd^^e1^^bc^^be^^e1^^bc^^bf +^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99^^ce^^99 +^^e1^^bd^^88^^e1^^bd^^89^^e1^^bd^^8a^^e1^^bd^^8b^^e1^^bd^^8c^^e1^^bd^^8d +^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f^^ce^^9f +^^ce^^a5^^cc^^93^^e1^^bd^^99^^ce^^a5^^cc^^93^^cc^^80^^e1^^bd^^9b^^ce^^a5^^cc^^93^^cc^^81^^e1^^bd^^9d^^ce^^a5^^cc^^93^^cd^^82^^e1^^bd^^9f +^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5^^ce^^a5 +^^e1^^bd^^a8^^e1^^bd^^a9^^e1^^bd^^aa^^e1^^bd^^ab^^e1^^bd^^ac^^e1^^bd^^ad^^e1^^bd^^ae^^e1^^bd^^af +^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9^^ce^^a9 +^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc^^e1^^be^^bc +^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99^^ce^^91^^ce^^99 +^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c^^e1^^bf^^8c +^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99^^ce^^97^^ce^^99 +^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc^^e1^^bf^^bc +^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99^^ce^^a9^^ce^^99 +============================================================ +============================================================ +TEST 18: Turkish/Azeri +============================================================ +rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +ragip hul^^c3^^bbsi^^cc^^87 ^^c3^^b6zdem +RAGIP HUL^^c3^^9bS^^c4^^b0 ^^c3^^96ZDEM +RAGIP HUL^^c3^^9bSI ^^c3^^96ZDEM +Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem +Ip hul^^c3^^bbsi ^^c3^^b6zdem +Ip hul^^c3^^bbsi ^^c3^^b6zdem +============================================================ +============================================================ +TEST 19: Lithuanian +============================================================ +i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83i^^cc^^87̀i^^cc^^87́i^^cc^^87̃j^^cc^^87̀j^^cc^^87́j^^cc^^87̃^^c4^^af^^cc^^87̀^^c4^^af^^cc^^87́^^c4^^af^^cc^^87̃ +^^c3^^ac^^c3^^ad^^c4^^a9ìíĩj̀j́j̃^^c4^^af̀^^c4^^af́^^c4^^af̃ +ÌÌĨÌÍĨJ̀J́J̃^^c4^^aè^^c4^^aé^^c4^^aẽ +İ̀İ̀İ̃İ̀İ́İ̃J̇̀J̇́J̇̃^^c4^^aė̀^^c4^^aė́^^c4^^aė̃ +^^c3^^8ci^^cc^^87^^cc^^81i^^cc^^87^^cc^^83i^^cc^^87̀i^^cc^^87́i^^cc^^87̃j^^cc^^87̀j^^cc^^87́j^^cc^^87̃^^c4^^af^^cc^^87̀^^c4^^af^^cc^^87́^^c4^^af^^cc^^87̃ +Ìi̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃^^c4^^aḟ̀^^c4^^aḟ́^^c4^^aḟ̃ +^^c3^^8c^^c3^^ad^^c4^^a9ìíĩj̀j́j̃^^c4^^af̀^^c4^^af́^^c4^^af̃ +İ̀i̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃^^c4^^aḟ̀^^c4^^aḟ́^^c4^^aḟ̃ +============================================================ +============================================================ +TEST 20: Medieval Latin +============================================================ +lupus +lvpvs +LVPVS +LUPUS +============================================================ +============================================================ +TEST 21: Dutch +============================================================ +ijsselmeer +ijsselmeer +IJSSELMEER +IJSSELMEER +IJsselmeer +Ijsselmeer +IJsselmeer +Ijsselmeer +IJsselmeer +Ijsselmeer +Im +Im +============================================================ +============================================================ +TEST 22: Titlecase exceptions +============================================================ +Ssoo +^^c7^^85! +============================================================ +============================================================ +TEST 23: Case changing braced arguments +============================================================ +foo \emph {BAR} {baz} +FOO \emph {BAR} {BAZ} +Foo \emph {BAR} {baz} +FOO \emph {BAR} {BAZ} +\emph {BAR} {baz} +\emph {BAR} {BAZ} +\emph {BAR} {Baz} +\emph {BAR} {BAZ} +============================================================ +============================================================ +TEST 24: Expanding content +============================================================ +some text hello +SOME TEXT HELLO +Some text hello +Some text Hello +hello sometext +HELLO SOMETEXT +Hello sometext +Hello sometext +some text hello +SOME TEXT HELLO +Some text hello +Some text Hello +hello sometext +HELLO SOMETEXT +Hello sometext +Hello sometext +some text \cs_tmp:w +SOME TEXT \cs_tmp:w +Some text \cs_tmp:w +Some text \cs_tmp:w +\cs_tmp:w sometext +\cs_tmp:w SOMETEXT +\cs_tmp:w Sometext +\cs_tmp:w Sometext +============================================================ +============================================================ +TEST 25: Math-mode escape +============================================================ +some text $y = mx + c$ +SOME TEXT $y = mx + c$ +Some text $y = mx + c$ +Some text $y = mx + c$ +$y = mx + c$ text +$y = mx + c$ TEXT +$y = mx + c$ Text +$y = mx + c$ Text +opps not close token in $y = mx + c +OPPS NOT CLOSE TOKEN IN $y = mx + c +Opps not close token in $y = mx + c +Opps not close token in $y = mx + c +============================================================ +============================================================ +TEST 26: Nesting +============================================================ +HELLO +hello +FUSSBALL +^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3 +============================================================ +============================================================ +TEST 27: Letter-like commands +============================================================ +\aa \aa \ae \dh \ss \l \o +\AA \AA \AE \DH \SS \L \O +\AA \aa \ae \dh \ss \l \o +\AA \aa \ae \dh \ss \l \O +============================================================ +============================================================ +TEST 28: Accents +============================================================ +\"{a}\u {e}\H {i}\v {o}\.{u} +\"{A}\u {E}\H {I}\v {O}\.{U} +\"{A}\u {e}\H {i}\v {o}\.{u} +\"{A}\u {e}\H {i}\v {o}\.{u} +============================================================ +============================================================ +TEST 29: Active chars +============================================================ +"`lo"=rem"' +"`LO"=REM"' +"`Lo"=rem"' +"`Lo"=rem"' +============================================================ +============================================================ +TEST 30: Case changing exclusions +============================================================ +Variant \tl_show:x already defined; not changing it on line ... +> foo\NoCaseChange {BAR}. + } +l. ... } +> \use:n {foo}\NoCaseChange {BAR}. + } +l. ... } +============================================================ +============================================================ +TEST 31: Case change switching +============================================================ +lower +UPPER +Title +Title +WORDS lower +words UPPER +Words UPPER +Words \text_case_switch:nnnn {normal}{lower}{UPPER}{Title} +============================================================ +============================================================ +TEST 32: Case change replacements +============================================================ +Defining \l__text_case_\foo_tl on line ... +> fooreplaced. + } +l. ... } +============================================================ diff --git a/l3kernel/testfiles/m3text005.lvt b/l3kernel/testfiles/m3text005.lvt index 61520e9a3b..eaf566f46b 100644 --- a/l3kernel/testfiles/m3text005.lvt +++ b/l3kernel/testfiles/m3text005.lvt @@ -7,7 +7,7 @@ \ExplSyntaxOn \debug_on:n { check-declarations , deprecation , log-functions } \ExplSyntaxOff -\ifdefined\disablecjktoken\disablecjktoken\fi + \documentclass{minimal} \usepackage[T2A]{fontenc} diff --git a/l3kernel/testfiles/m3text005.uptex.tlg b/l3kernel/testfiles/m3text005.uptex.tlg index 685373bfc2..427380824e 100644 --- a/l3kernel/testfiles/m3text005.uptex.tlg +++ b/l3kernel/testfiles/m3text005.uptex.tlg @@ -5,11 +5,11 @@ Author: Joseph Wright TEST 1: \@uclclist\ entries ============================================================ ^^d1^^91\cyryo +Ё\CYRYO +Ё\CYRYO +Ё\CYRYO +ё\cyryo ^^d0^^81\CYRYO -^^d0^^81\cyryo ^^d0^^81\CYRYO -^^d1^^91\cyryo ^^d0^^81\CYRYO -^^d0^^81\cyryo -^^d0^^81\cyryo ============================================================