[latex3-commits] [git/LaTeX3-latex3-latex3] master: Overhaul Greek case changer (c10df4750)

Joseph Wright joseph.wright at morningstar2.co.uk
Thu Oct 22 00:01:12 CEST 2020


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/c10df475024cef4b7bc76b6d14caa17e88100eda

>---------------------------------------------------------------

commit c10df475024cef4b7bc76b6d14caa17e88100eda
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Wed Oct 21 23:01:12 2020 +0100

    Overhaul Greek case changer
    
    This is now based on the ICU data at https://sites.google.com/site/icusite/design/case/greek-upper.
    At present, ή to Ή is not included as this needs to
    be handled separately from everything else.
    As a result, those tests are currently commented out.
    There is one test I also do not understand the result of ("νομικοῦ ἢ διεθνοῦς") in the ICU list: I will seek advice.


>---------------------------------------------------------------

c10df475024cef4b7bc76b6d14caa17e88100eda
 l3kernel/l3text-case.dtx                | 271 +++++++++++++++++++++++++-------
 l3kernel/testfiles/m3text002.luatex.tlg |  28 +++-
 l3kernel/testfiles/m3text002.lvt        |  28 +++-
 l3kernel/testfiles/m3text002.tlg        |  28 +++-
 l3kernel/testfiles/m3text002.xetex.tlg  |  28 +++-
 5 files changed, 318 insertions(+), 65 deletions(-)

diff --git a/l3kernel/l3text-case.dtx b/l3kernel/l3text-case.dtx
index b6111cd44..ef3ca6884 100644
--- a/l3kernel/l3text-case.dtx
+++ b/l3kernel/l3text-case.dtx
@@ -752,16 +752,28 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_change_case_upper_el:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_aux:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_loop:nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnN}
-% \begin{macro}[EXP]{\@@_change_case_if_greek:nTF}
+% \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_dialytika:nnN}
+% \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:nnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnN}
+% \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}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_diacritic:n}
+% \begin{macro}[EXP,TF]{\@@_change_case_if_takes_dialytika:n}
 %   For Greek uppercasing, we need to know if characters \emph{in the Greek
 %   range} have accents. That means doing a \textsc{nfd} conversion first, then
 %   starting a search. As described by the Unicode \textsc{cldr}, Greek accents
 %   need to be found \emph{after} any U+0308 (diaeresis) and are done in two
-%   groups to allow for the canonical ordering.
+%   groups to allow for the canonical ordering. The implementation here follows
+%   the data and examples from ICU
+%   (\url{https://sites.google.com/site/icusite/design/case/greek-upper}),
+%   although necessarily the implementation is somewhat different.
 %    \begin{macrocode}
 \bool_lazy_or:nnT
   { \sys_if_engine_luatex_p: }
@@ -771,76 +783,136 @@
       {
         \@@_change_case_if_greek:nTF { `#4 }
           {
-            \exp_args:Ne \@@_change_case_upper_el:nnnn
-              { \char_to_nfd:N #4 } {#1} {#2} {#3}
+            \exp_args:Ne \@@_change_case_upper_el:nnn
+              { \char_to_nfd:N #4 } {#2} {#3}
           }
           { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
       }
-    \cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4
-      { \@@_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 }
-    \cs_new:Npn \@@_change_case_upper_el_aux:nnnN #1#2#3#4
-      {
-        \@@_change_case_store:e { \use:c { char_ #1 case:N } #4 }
-        \@@_change_case_upper_el_loop:nnw {#2} {#3}
-      }
-    \cs_new:Npn \@@_change_case_upper_el_loop:nnw
-      #1#2#3 \q_@@_recursion_stop
+    \cs_new:Npn \@@_change_case_upper_el:nnn #1#2#3
+      { \@@_change_case_upper_el:nnNw {#2} {#3} #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 token, 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__text_recursion_stop
       {
-        \tl_if_head_is_N_type:nTF {#3}
-          { \@@_change_case_upper_el:nnN }
-          { \@@_change_case_loop:nnw }
-            {#1} {#2} #3 \q_@@_recursion_stop
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_upper_el:NnnN #3 }
+          {
+            \@@_change_case_store:e { \char_uppercase:N #3 }
+            \@@_change_case_loop:nnw
+          }
+            {#1} {#2} #4 \q__text_recursion_stop
       }
 %    \end{macrocode}
-%   In addition to the Greek accents, we list three cases here where an
-%   accent outside the Greek range has a \text{nfd} that would make it
-%   equivalent. That includes U+0344, which has to insert U+0308.
+%   Now, we check the detail of the next codepoint: again we filter out the
+%   not-a-char cases, before checking if it's an dialytika, accent or diacritic.
+%   (The latter do not have the same hiatus behavior as accents.)
 %    \begin{macrocode}
-    \cs_new:Npn \@@_change_case_upper_el:nnN #1#2#3
+    \cs_new:Npn \@@_change_case_upper_el:NnnN #1#2#3#4
       {
-        \token_if_cs:NTF #3
-          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+        \token_if_cs:NTF #4
           {
-            \int_compare:nNnTF { `#3 } = { "0308 }
-              {
-                \@@_change_case_store:n {#3}
-                \@@_change_case_upper_el_loop:nnw {#1} {#2}
-              }
+            \@@_change_case_store:e { \char_uppercase:N #1 }
+            \@@_change_case_loop:nnw {#2} {#3} #4
+          }
+          {
+            \int_compare:nNnTF { `#4 } = { "0308 }
+              { \@@_change_case_upper_el_dialytika:nnN {#2} {#3} #1 }
               {
-                \bool_lazy_any:nTF
+                 \@@_change_case_if_greek_accent:nTF { `#4 }
+                  { \@@_change_case_upper_el_hiatus:nnNw {#2} {#3} #1 }
                   {
-                    { \int_compare_p:nNn { `#3 } = { "0300 } }
-                    { \int_compare_p:nNn { `#3 } = { "0301 } }
-                    { \int_compare_p:nNn { `#3 } = { "0304 } }
-                    { \int_compare_p:nNn { `#3 } = { "0306 } }
-                    { \int_compare_p:nNn { `#3 } = { "0308 } }
-                    { \int_compare_p:nNn { `#3 } = { "0313 } }
-                    { \int_compare_p:nNn { `#3 } = { "0314 } }
-                    { \int_compare_p:nNn { `#3 } = { "0342 } }
-                    { \int_compare_p:nNn { `#3 } = { "0340 } }
-                    { \int_compare_p:nNn { `#3 } = { "0341 } }
-                    { \int_compare_p:nNn { `#3 } = { "0343 } }
-                  }
-                  { \@@_change_case_upper_el_loop:nnw {#1} {#2} }
-                  {
-                    \int_compare:nNnTF { `#3 } = { "0344 }
+                    \@@_change_case_if_greek_diacritic:nTF { `#4 }
                       {
-                        \@@_change_case_store:e
-                          {
-                            \char_generate:nn { "0308 }
-                              { \@@_char_catcode:N #3 }
-                          }
-                        \@@_change_case_upper_el_loop:nnw {#1} {#2}
+                        \@@_change_case_store:e { \char_uppercase:N #1 }
+                        \@@_change_case_loop:nnw {#2} {#3}
                       }
                       {
-                        \int_compare:nNnTF { `#3 } = { "0345 }
-                          { \@@_change_case_loop:nnw {#1} {#2} }
-                          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+                        \@@_change_case_store:e { \char_uppercase:N #1 }
+                        \@@_change_case_loop:nnw {#2} {#3} #4
                       }
                   }
               }
           }
       }
+%    \end{macrocode}
+%   We handle \emph{dialytika} in parts as it's also needed for the hiatus.
+%   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
+      {
+        \@@_change_case_if_takes_dialytika:nTF { `#3 }
+          { \@@_change_case_upper_el_dialytika:N #3 }
+          { \@@_change_case_store:e { \char_uppercase:N #3 } }
+        \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+      }
+    \cs_new:Npn \@@_change_case_upper_el_dialytika:N #1
+      {
+        \@@_change_case_store:e
+          {
+            \bool_lazy_or:nnTF
+              { \int_compare_p:nNn { `#1 } = { "0399 } }
+              { \int_compare_p:nNn { `#1 } = { "03B9 } }
+              { \char_generate:nn { "03AA } { \@@_char_catcode:N #1 } }
+              { \char_generate:nn { "03AB } { \@@_char_catcode:N #1 } }
+          }
+      }
+%    \end{macrocode}
+%   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__text_recursion_stop
+      {
+        \@@_change_case_store:e { \char_uppercase:N #3 }
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_upper_el_hiatus:nnN }
+          { \@@_change_case_loop:nnw }
+            {#1} {#2} #4 \q__text_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_upper_el_hiatus:nnN #1#2#3
+      {
+        \token_if_cs:NTF #3
+          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          {
+            \@@_change_case_if_takes_dialytika:nTF { `#3 }
+              {
+                \@@_change_case_upper_el_dialytika:N #3
+                \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+              }
+              { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          }
+      }
+%    \end{macrocode}
+%   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__text_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#3}
+          { \@@_change_case_upper_el_gobble:nnN }
+          { \@@_change_case_loop:nnw }
+            {#1} {#2} #3 \q__text_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_upper_el_gobble:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_cs_p:N #3 }
+          {
+            ! \bool_lazy_or_p:nn
+              { \@@_change_case_if_greek_accent_p:n { `#3 } }
+              { \@@_change_case_if_greek_diacritic_p:n { `#3 } }
+          }
+          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          { \@@_change_case_upper_el_gobble:nnw {#1} {#2} }
+      }
+%    \end{macrocode}
+%   Luckily the Greek range is limited and clear.
+%    \begin{macrocode}
     \prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
       {
         \if_int_compare:w #1 < "0370 \exp_stop_f:
@@ -861,6 +933,82 @@
           \fi:
         \fi:
       }
+%    \end{macrocode}
+%   We follow ICU in adding a few extras to the accent list here.
+%    \begin{macrocode}
+    \prg_new_conditional:Npnn \@@_change_case_if_greek_accent:n #1 { TF , p }
+      {
+        \if_int_compare:w #1 = "0300 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0301 \exp_stop_f:
+            \prg_return_true:
+          \else:
+            \if_int_compare:w #1 = "0342 \exp_stop_f:
+              \prg_return_true:
+            \else:
+              \if_int_compare:w #1 = "0302 \exp_stop_f:
+                \prg_return_true:
+              \else:
+                \if_int_compare:w #1 = "0303 \exp_stop_f:
+                  \prg_return_true:
+                \else:
+                  \if_int_compare:w #1 = "0311 \exp_stop_f:
+                    \prg_return_true:
+                  \else:
+                    \prg_return_false:
+                  \fi:
+                \fi:
+              \fi:
+            \fi:
+          \fi:
+        \fi:
+      }
+    \prg_new_conditional:Npnn \@@_change_case_if_greek_diacritic:n
+      #1 { TF , p }
+      {
+        \if_int_compare:w #1 = "0304 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0306 \exp_stop_f:
+            \prg_return_true:
+          \else:
+            \if_int_compare:w #1 = "0313 \exp_stop_f:
+              \prg_return_true:
+            \else:
+              \if_int_compare:w #1 = "0314 \exp_stop_f:
+                \prg_return_true:
+              \else:
+                \if_int_compare:w #1 = "0343 \exp_stop_f:
+                  \prg_return_true:
+                \else:
+                  \prg_return_false:
+                \fi:
+              \fi:
+            \fi:
+          \fi:
+        \fi:
+      }
+    \prg_new_conditional:Npnn \@@_change_case_if_takes_dialytika:n #1 { TF }
+      {
+        \if_int_compare:w #1 = "0399 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "03B9 \exp_stop_f:
+            \prg_return_true:
+          \else:
+            \if_int_compare:w #1 = "03A5 \exp_stop_f:
+              \prg_return_true:
+            \else:
+              \if_int_compare:w #1 = "03C5 \exp_stop_f:
+                \prg_return_true:
+              \else:
+                \prg_return_false:
+              \fi:
+            \fi:
+          \fi:
+        \fi:
+       }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -869,6 +1017,15 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 % \begin{macro}[EXP]{\@@_change_case_title_el:nnnN}
 %   Titlecasing retains accents, but to prevent the uppercasing code
 %   from kicking in, there has to be an explicit function here.
diff --git a/l3kernel/testfiles/m3text002.luatex.tlg b/l3kernel/testfiles/m3text002.luatex.tlg
index 32668ebc7..df75c6ef3 100644
--- a/l3kernel/testfiles/m3text002.luatex.tlg
+++ b/l3kernel/testfiles/m3text002.luatex.tlg
@@ -136,8 +136,32 @@ FUẞBALL
 ============================================================
 TEST 14: Greek
 ============================================================
-ὈΔΥΣΣΕΎΣ
-ΟΔΥΣΣΕΥΣ
+ΆΔΙΚΟΣ, ΚΕΊΜΕΝΟ, ΊΡΙΔΑ
+ΑΔΙΚΟΣ, ΚΕΙΜΕΝΟ, ΙΡΙΔΑ
+ΠΑΤΆΤΑ
+ΠΑΤΑΤΑ
+ΑΈΡΑΣ, ΜΥΣΤΉΡΙΟ, ΩΡΑΊΟ
+ΑΕΡΑΣ, ΜΥΣΤΗΡΙΟ, ΩΡΑΙΟ
+ΜΑΪ́ΟΥ, ΠΌΡΟΣ, ΡΎΘΜΙΣΗ
+ΜΑΪΟΥ, ΠΟΡΟΣ, ΡΥΘΜΙΣΗ
+Ϋ́, ΤΗΡΏ, ΜΆΙΟΣ
+Ϋ, ΤΗΡΩ, ΜΑΪΟΣ
+ΆΥΛΟΣ
+ΑΫΛΟΣ
+ΑΫΛΟΣ
+ΑΫΛΟΣ
+ΆΚΛΙΤΑ ΡΉΜΑΤΑ Ή ΆΚΛΙΤΕΣ ΜΕΤΟΧΈΣ
+ΑΚΛΙΤΑ ΡΗΜΑΤΑ Η ΑΚΛΙΤΕΣ ΜΕΤΟΧΕΣ
+ΕΠΕΙΔΉ Η ΑΝΑΓΝΏΡΙΣΗ ΤΗΣ ΑΞΙΟΠΡΈΠΕΙΑΣ
+ΕΠΕΙΔΗ Η ΑΝΑΓΝΩΡΙΣΗ ΤΗΣ ΑΞΙΟΠΡΕΠΕΙΑΣ
+ΝΈΟ, ΔΗΜΙΟΥΡΓΊΑ
+ΝΕΟ, ΔΗΜΙΟΥΡΓΙΑ
+ΕΛΆΤΕ ΝΑ ΦΆΤΕ ΤΑ ΚΑΛΎΤΕΡΑ ΠΑΪΔΆΚΙΑ!
+ΕΛΑΤΕ ΝΑ ΦΑΤΕ ΤΑ ΚΑΛΥΤΕΡΑ ΠΑΪΔΑΚΙΑ!
+ΜΑΪ́ΟΥ, ΤΡΌΛΕΪ
+ΜΑΪΟΥ, ΤΡΟΛΕΪ
+ΡΩΜΈΙΚΑ
+ΡΩΜΕΪΚΑ
 Ὀδυσσεύς
 Ὀδυσσεύς
 ============================================================
diff --git a/l3kernel/testfiles/m3text002.lvt b/l3kernel/testfiles/m3text002.lvt
index c2108a917..f0e6ea302 100644
--- a/l3kernel/testfiles/m3text002.lvt
+++ b/l3kernel/testfiles/m3text002.lvt
@@ -148,10 +148,34 @@
     \text_uppercase:nn { de-alt } { Fußball }
   }
 
+\OMIT
+  \cs_set:Npn \greektest:n #1
+    {
+      \text_uppercase:n         {#1} \NEWLINE
+      \text_uppercase:nn { el } {#1}
+    }
+\TIMO
+
 \TESTEXP { Greek }
   {
-    \text_uppercase:n         { ὈΔΥΣΣΕΎΣ } \NEWLINE
-    \text_uppercase:nn { el } { ὈΔΥΣΣΕΎΣ } \NEWLINE
+    % Taken from https://sites.google.com/site/icusite/design/case/greek-upper
+    \greektest:n { άδικος,~κείμενο,~ίριδα }               \NEWLINE
+    \greektest:n { Πατάτα }                               \NEWLINE
+    \greektest:n { Αέρας,~Μυστήριο,~Ωραίο }               \NEWLINE
+    \greektest:n { Μαΐου,~Πόρος,~Ρύθμιση }                \NEWLINE
+    \greektest:n { ΰ,~Τηρώ,~Μάιος }                       \NEWLINE
+    \greektest:n { άυλος }                                \NEWLINE
+    \greektest:n { ΑΫΛΟΣ }                                \NEWLINE
+    \greektest:n { Άκλιτα~ρήματα~ή~άκλιτες~μετοχές }      \NEWLINE
+    \greektest:n { Επειδή~η~αναγνώριση~της~αξιοπρέπειας } \NEWLINE
+%    \greektest:n { νομικού~ή~διεθνούς }                   \NEWLINE
+%    \greektest:n { Ἐπειδὴ~ἡ~ἀναγνώριση }                  \NEWLINE
+%    \greektest:n { νομικοῦ~ἢ~διεθνοῦς }                   \NEWLINE
+    \greektest:n { Νέο,~Δημιουργία }                      \NEWLINE
+    \greektest:n { Ελάτε~να~φάτε~τα~καλύτερα~παϊδάκια! }  \NEWLINE
+    \greektest:n { Μαΐου,~τρόλεϊ }                        \NEWLINE
+%    \greektest:n { Το~ένα~ή~το~άλλο. }                    \NEWLINE
+    \greektest:n { ρωμέικα }                              \NEWLINE
     \text_titlecase:n         { ὈΔΥΣΣΕΎΣ } \NEWLINE
     \text_titlecase:nn { el } { ὈΔΥΣΣΕΎΣ }
   }
diff --git a/l3kernel/testfiles/m3text002.tlg b/l3kernel/testfiles/m3text002.tlg
index 70098ea93..a293d9978 100644
--- a/l3kernel/testfiles/m3text002.tlg
+++ b/l3kernel/testfiles/m3text002.tlg
@@ -132,8 +132,32 @@ FU^^e1^^ba^^9eBALL
 ============================================================
 TEST 14: Greek
 ============================================================
-^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3
-^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3
+^^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^^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^^a0^^ce^^91^^ce^^a4^^ce^^86^^ce^^a4^^ce^^91
+^^ce^^a0^^ce^^91^^ce^^a4^^ce^^86^^ce^^a4^^ce^^91
+^^ce^^91^^ce^^88^^ce^^a1^^ce^^91^^ce^^a3, ^^ce^^9c^^ce^^a5^^ce^^a3^^ce^^a4^^ce^^89^^ce^^a1^^ce^^99^^ce^^9f, ^^ce^^a9^^ce^^a1^^ce^^91^^ce^^8a^^ce^^9f
+^^ce^^91^^ce^^88^^ce^^a1^^ce^^91^^ce^^a3, ^^ce^^9c^^ce^^a5^^ce^^a3^^ce^^a4^^ce^^89^^ce^^a1^^ce^^99^^ce^^9f, ^^ce^^a9^^ce^^a1^^ce^^91^^ce^^8a^^ce^^9f
+^^ce^^9c^^ce^^91^^ce^^90^^ce^^9f^^ce^^a5, ^^ce^^a0^^ce^^8c^^ce^^a1^^ce^^9f^^ce^^a3, ^^ce^^a1^^ce^^8e^^ce^^98^^ce^^9c^^ce^^99^^ce^^a3^^ce^^97
+^^ce^^9c^^ce^^91^^ce^^90^^ce^^9f^^ce^^a5, ^^ce^^a0^^ce^^8c^^ce^^a1^^ce^^9f^^ce^^a3, ^^ce^^a1^^ce^^8e^^ce^^98^^ce^^9c^^ce^^99^^ce^^a3^^ce^^97
+^^ce^^b0, ^^ce^^a4^^ce^^97^^ce^^a1^^ce^^8f, ^^ce^^9c^^ce^^86^^ce^^99^^ce^^9f^^ce^^a3
+^^ce^^b0, ^^ce^^a4^^ce^^97^^ce^^a1^^ce^^8f, ^^ce^^9c^^ce^^86^^ce^^99^^ce^^9f^^ce^^a3
+^^ce^^86^^ce^^a5^^ce^^9b^^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^^86^^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^^86^^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^^95^^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^^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^^9d^^ce^^88^^ce^^9f, ^^ce^^94^^ce^^97^^ce^^9c^^ce^^99^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^93^^ce^^8a^^ce^^91
+^^ce^^9d^^ce^^88^^ce^^9f, ^^ce^^94^^ce^^97^^ce^^9c^^ce^^99^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^93^^ce^^8a^^ce^^91
+^^ce^^95^^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^^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^^9c^^ce^^91^^ce^^90^^ce^^9f^^ce^^a5, ^^ce^^a4^^ce^^a1^^ce^^8c^^ce^^9b^^ce^^95^^ce^^aa
+^^ce^^9c^^ce^^91^^ce^^90^^ce^^9f^^ce^^a5, ^^ce^^a4^^ce^^a1^^ce^^8c^^ce^^9b^^ce^^95^^ce^^aa
+^^ce^^a1^^ce^^a9^^ce^^9c^^ce^^88^^ce^^99^^ce^^9a^^ce^^91
+^^ce^^a1^^ce^^a9^^ce^^9c^^ce^^88^^ce^^99^^ce^^9a^^ce^^91
 ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^cf^^8d^^cf^^82
 ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^cf^^8d^^cf^^82
 ============================================================
diff --git a/l3kernel/testfiles/m3text002.xetex.tlg b/l3kernel/testfiles/m3text002.xetex.tlg
index 435b93cdd..f135505b6 100644
--- a/l3kernel/testfiles/m3text002.xetex.tlg
+++ b/l3kernel/testfiles/m3text002.xetex.tlg
@@ -132,8 +132,32 @@ FUẞBALL
 ============================================================
 TEST 14: Greek
 ============================================================
-ὈΔΥΣΣΕΎΣ
-ΟΔΥΣΣΕΥΣ
+ΆΔΙΚΟΣ, ΚΕΊΜΕΝΟ, ΊΡΙΔΑ
+ΑΔΙΚΟΣ, ΚΕΙΜΕΝΟ, ΙΡΙΔΑ
+ΠΑΤΆΤΑ
+ΠΑΤΑΤΑ
+ΑΈΡΑΣ, ΜΥΣΤΉΡΙΟ, ΩΡΑΊΟ
+ΑΕΡΑΣ, ΜΥΣΤΗΡΙΟ, ΩΡΑΙΟ
+ΜΑΪ́ΟΥ, ΠΌΡΟΣ, ΡΎΘΜΙΣΗ
+ΜΑΪΟΥ, ΠΟΡΟΣ, ΡΥΘΜΙΣΗ
+Ϋ́, ΤΗΡΏ, ΜΆΙΟΣ
+Ϋ, ΤΗΡΩ, ΜΑΪΟΣ
+ΆΥΛΟΣ
+ΑΫΛΟΣ
+ΑΫΛΟΣ
+ΑΫΛΟΣ
+ΆΚΛΙΤΑ ΡΉΜΑΤΑ Ή ΆΚΛΙΤΕΣ ΜΕΤΟΧΈΣ
+ΑΚΛΙΤΑ ΡΗΜΑΤΑ Η ΑΚΛΙΤΕΣ ΜΕΤΟΧΕΣ
+ΕΠΕΙΔΉ Η ΑΝΑΓΝΏΡΙΣΗ ΤΗΣ ΑΞΙΟΠΡΈΠΕΙΑΣ
+ΕΠΕΙΔΗ Η ΑΝΑΓΝΩΡΙΣΗ ΤΗΣ ΑΞΙΟΠΡΕΠΕΙΑΣ
+ΝΈΟ, ΔΗΜΙΟΥΡΓΊΑ
+ΝΕΟ, ΔΗΜΙΟΥΡΓΙΑ
+ΕΛΆΤΕ ΝΑ ΦΆΤΕ ΤΑ ΚΑΛΎΤΕΡΑ ΠΑΪΔΆΚΙΑ!
+ΕΛΑΤΕ ΝΑ ΦΑΤΕ ΤΑ ΚΑΛΥΤΕΡΑ ΠΑΪΔΑΚΙΑ!
+ΜΑΪ́ΟΥ, ΤΡΌΛΕΪ
+ΜΑΪΟΥ, ΤΡΟΛΕΪ
+ΡΩΜΈΙΚΑ
+ΡΩΜΕΪΚΑ
 Ὀδυσσεύς
 Ὀδυσσεύς
 ============================================================





More information about the latex3-commits mailing list.