[latex3-commits] [latex3/latex3] main: Retain breathing marks on first char. in uppercase Greek (closes #1228) (5b6d93912)

github at latex-project.org github at latex-project.org
Mon Jun 12 10:17:01 CEST 2023


Repository : https://github.com/latex3/latex3
On branch  : main
Link       : https://github.com/latex3/latex3/commit/5b6d9391261afd3d69347e8a264c5f2eb072f5d5

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

commit 5b6d9391261afd3d69347e8a264c5f2eb072f5d5
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Mon Jun 12 09:16:05 2023 +0100

    Retain breathing marks on first char. in uppercase Greek (closes #1228)


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

5b6d9391261afd3d69347e8a264c5f2eb072f5d5
 l3kernel/CHANGELOG.md                   |   2 +
 l3kernel/l3text-case.dtx                | 194 +++++++++++++++++++++++++++++++-
 l3kernel/testfiles/m3text002.luatex.tlg |  22 ++--
 l3kernel/testfiles/m3text002.lvt        |   4 +
 l3kernel/testfiles/m3text002.ptex.tlg   |  22 ++--
 l3kernel/testfiles/m3text002.tlg        |  22 ++--
 l3kernel/testfiles/m3text002.uptex.tlg  |  22 ++--
 l3kernel/testfiles/m3text002.xetex.tlg  |  22 ++--
 8 files changed, 269 insertions(+), 41 deletions(-)

diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index d469598b6..a9887046e 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -10,6 +10,8 @@ this project uses date-based 'snapshot' version identifiers.
 ### Changed
 - Exclude entries in `\l_text_case_exclude_arg_tl` from expansion in `\text_expand:n`
   (latex3/latex2e\#904)
+- Retain breathing marks on first letter in a word when uppercasing Greek
+  (issue \#1228)
 
 ## [2023-06-05]
 
diff --git a/l3kernel/l3text-case.dtx b/l3kernel/l3text-case.dtx
index dd903f104..8012a7e5e 100644
--- a/l3kernel/l3text-case.dtx
+++ b/l3kernel/l3text-case.dtx
@@ -1587,7 +1587,7 @@
         { \@@_codepoint_compare_p:nNn {#3} = { "1F2A } }
       }
       { \@@_change_case_boundary_upper_el:nnnw {#1} {#2} {#3} }
-      { \@@_change_case_loop:nnw {#1} {#2} #3 }
+      { \@@_change_case_breather:nnn {#1} {#2} {#3} }
   }
 \cs_new:Npn \@@_change_case_boundary_upper_el:nnnw
   #1#2#3#4 \q_@@_recursion_stop
@@ -1609,6 +1609,198 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \begin{macro}[EXP]{\@@_change_case_breather:nnn}
+% \begin{macro}[EXP]{\@@_change_case_breather:nnnn}
+% \begin{macro}[EXP]{\@@_change_case_breather:nnnnw}
+% \begin{macro}[EXP]{\@@_change_case_breather:nnnnnw}
+% \begin{macro}[EXP]{\@@_change_case_breather_aux:nnnnn}
+% \begin{macro}[EXP]{\@@_change_case_breather_aux:nnnnw}
+% \begin{macro}[EXP]{\@@_change_case_breather_aux:nnnnN}
+% \begin{macro}[EXP]{\@@_change_case_breather_dialytika:nnnnn}
+% \begin{macro}[EXP]{\@@_change_case_breather_preserve:nnnn}
+% \begin{macro}[EXP]{\@@_change_case_breather_preserve:n}
+% \begin{macro}[EXP]
+%   {
+%     \@@_change_case_breather_psili: ,
+%     \@@_change_case_breather_dasia:
+%   }
+%   In Greek, breathing diacritics are normally dropped when uppercasing:
+%   see the code for the general case. However, for the first grapheme
+%   of a word, that's not the situation: see
+%   \url{https://unicode-org.atlassian.net/browse/ICU-12845#icft=ICU-12845}.
+%   Here, we retain the breather \emph{unless} the next codpoint takes
+%   a \emph{dialytika}. We start by checking if the current codepoint is
+%   in the Greek range, then decomposing.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_breather:nnn #1#2#3
+  {
+    \@@_change_case_if_greek:nTF {#3}
+      {
+        \exp_args:Ne \@@_change_case_breather:nnnn
+          {
+            \codepoint_to_nfd:n
+              { \@@_codepoint_from_chars:Nw #3 }
+          }
+            {#1} {#2} {#3}
+      }
+      { \@@_change_case_loop:nnw {#1} {#2} #3 }
+  }
+\cs_new:Npn \@@_change_case_breather:nnnn #1#2#3#4
+  {
+    \@@_codepoint_process:nN
+      { \@@_change_case_breather:nnnnw {#2} {#3} {#4} }
+        #1 \q_mark
+  }
+%    \end{macrocode}
+%   Normal form decomposition will always give between one and three
+%   codepoints. Luckily, the two breathing marks (\emph{psili} and
+%   \emph{dasia}) will be in a predictable position: last. So we can
+%   quickly establish first that there was a change on decomposition,
+%   and second if the final resulting codepoint is one of the two we
+%   care about.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_breather:nnnnw #1#2#3#4#5 \q_mark
+  {
+    \tl_if_blank:nTF {#5}
+      { \@@_change_case_loop:nnw {#1} {#2} #3 }
+      {
+        \@@_codepoint_process:nN
+          { \@@_change_case_breather:nnnnnw {#1} {#2} {#3} {#4} }
+            #5 \q_mark
+      }
+  }
+\cs_new:Npn \@@_change_case_breather:nnnnnw #1#2#3#4#5#6 \q_mark
+  {
+    \tl_if_blank:nTF {#6}
+     {
+       \@@_change_case_breather_aux:nnnnn
+         {#1} {#2} {#3} {#4} {#5}
+     }
+     {
+       \@@_change_case_breather_aux:nnnnn
+         {#1} {#2} {#3} {#4} {#6}
+     }
+  }
+\cs_new:Npn \@@_change_case_breather_aux:nnnnn #1#2#3#4#5
+  {
+    \bool_lazy_or:nnTF
+      { \@@_codepoint_compare_p:nNn {#5} = { "0313 } }
+      { \@@_codepoint_compare_p:nNn {#5} = { "0314 } }
+      { \@@_change_case_breather_aux:nnnnw {#1} {#2} {#4} {#5} }
+      { \@@_change_case_loop:nnw {#1} {#2} #3 }
+  }
+%    \end{macrocode}
+%   Now the lookahead can be fired: check the next codepoint and assess
+%   whether it takes a \emph{dialytika}. The code paths then split: either
+%   retain the breathing mark or generate the \emph{dialytika}: the
+%   latter is code shared with the general mechanism.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_breather_aux:nnnnw #1#2#3#4#5
+  \q_@@_recursion_stop
+  {
+    \tl_if_head_is_N_type:nTF {#5}
+      { \@@_change_case_breather_aux:nnnnN  }
+      { \@@_change_case_breather_preserve:nnnn }
+        {#1} {#2} {#3} {#4} #5 \q_@@_recursion_stop
+  }
+\cs_new:Npn \@@_change_case_breather_aux:nnnnN #1#2#3#4#5
+  {
+    \@@_codepoint_process:nN
+      { \@@_change_case_breather_dialytika:nnnnn {#1} {#2} {#3} {#4} } #5
+  }
+\cs_new:Npn \@@_change_case_breather_dialytika:nnnnn #1#2#3#4#5
+  {
+     \@@_change_case_if_takes_dialytika:nTF {#5}
+       {
+         \@@_change_case_store:e
+           { \@@_change_case_codepoint:nn { upper } {#3} }
+         \@@_change_case_upper_el_dialytika:n {#5}
+         \@@_change_case_loop:nnw {#1} {#2}
+       }
+       {
+         \@@_change_case_breather_preserve:nnnn {#1} {#2} {#3} {#4}
+         #5
+       }
+  }
+%    \end{macrocode}
+%   Finally, generate the correct output codepoint to retain the
+%   breather: there are two of those, and a limited number of
+%   codepoints they apply two, so we simply list out all of the
+%   cases by hand. There isn't a pre-composed uppercase upsilon with
+%   \emph{psili}: at present, we therefore still drop that particular
+%   diacritic (it's not clear why the codepoint is absent but suggests
+%   there is no reason to support it).
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_breather_preserve:nnnn #1#2#3#4
+  {
+    \@@_change_case_store:e
+      {
+        \exp_args:Ne \@@_change_case_breather_preserve:n
+          {
+            \@@_codepoint_compare:nNnTF {#4}  = { "0313 }
+              { \@@_change_case_breather_psili:n }
+              { \@@_change_case_breather_dasia:n }
+                {#3}
+          }
+       }
+    \@@_change_case_loop:nnw {#1} {#2}
+  }
+\cs_new:Npn \@@_change_case_breather_preserve:n #1
+  { \codepoint_generate:nn {#1} { \char_value_catcode:n {#1} } }
+\cs_new:Npn \@@_change_case_breather_psili:n #1
+  {
+    \int_case:nn { \@@_codepoint_from_chars:Nw #1 }
+      {
+        { "0391 } { "1F08 }
+        { "03B1 } { "1F08 }
+        { "0395 } { "1F18 }
+        { "03B5 } { "1F18 }
+        { "0397 } { "1F28 }
+        { "03B7 } { "1F28 }
+        { "0399 } { "1F38 }
+        { "03B9 } { "1F38 }
+        { "039F } { "1F48 }
+        { "03BF } { "1F48 }
+        { "03A5 } { "03A9 }
+        { "03C5 } { "03A9 }
+        { "03A9 } { "1F68 }
+        { "03C9 } { "1F68 }
+      }
+  }
+\cs_new:Npn \@@_change_case_breather_dasia:n #1
+  {
+    \int_case:nn { \@@_codepoint_from_chars:Nw #1 }
+      {
+        { "0391 } { "1F09 }
+        { "03B1 } { "1F09 }
+        { "0395 } { "1F19 }
+        { "03B5 } { "1F19 }
+        { "0397 } { "1F29 }
+        { "03B7 } { "1F29 }
+        { "0399 } { "1F39 }
+        { "03B9 } { "1F39 }
+        { "039F } { "1F49 }
+        { "03BF } { "1F49 }
+        { "03A5 } { "1F59 }
+        { "03C5 } { "1F59 }
+        { "03A9 } { "1F69 }
+        { "03C9 } { "1F69 }
+        { "03A1 } { "1FEC }
+        { "03C1 } { "1FEC }
+      }
+  }
+%    \end{macrocode}
+% \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 9a830d284..856b4e810 100644
--- a/l3kernel/testfiles/m3text002.luatex.tlg
+++ b/l3kernel/testfiles/m3text002.luatex.tlg
@@ -180,7 +180,7 @@ TEST 17: Greek
 ΝΟΜΙΚΟΎ Ή ΔΙΕΘΝΟΎΣ
 ΝΟΜΙΚΟΥ Ή ΔΙΕΘΝΟΥΣ
 ἘΠΕΙΔῊ Ἡ ἈΝΑΓΝΏΡΙΣΗ
-ΕΠΕΙΔΗ Η ΑΝΑΓΝΩΡΙΣΗ
+ἘΠΕΙΔΗ Ἡ ἈΝΑΓΝΩΡΙΣΗ
 ΝΟΜΙΚΟΥ͂ Ἢ ΔΙΕΘΝΟΥ͂Σ
 ΝΟΜΙΚΟΥ Ή ΔΙΕΘΝΟΥΣ
 ΝΈΟ, ΔΗΜΙΟΥΡΓΊΑ
@@ -202,19 +202,19 @@ TEST 17: Greek
 ῌ
 ΗΙ
 ἈἉἊἋἌἍἎἏ
-ΑΑΑΑΑΑΑΑ
+ἈΑΑΑΑΑΑΑ
 ἘἙἚἛἜἝ
-ΕΕΕΕΕΕ
+ἘΕΕΕΕΕ
 ἨἩἪἫἬἭἮἯ
-ΗΗΗΗΗΗΗΗ
+ἨΗΗΗΗΗΗΗ
 ἸἹἺἻἼἽἾἿ
-ΙΙΙΙΙΙΙΙ
+ἸΙΙΙΙΙΙΙ
 ὈὉὊὋὌὍ
-ΟΟΟΟΟΟ
+ὈΟΟΟΟΟ
 Υ̓ὙΥ̓̀ὛΥ̓́ὝΥ̓͂Ὗ
-ΥΥΥΥΥΥΥΥ
+ΩΥΥΥΥΥΥΥ
 ὨὩὪὫὬὭὮὯ
-ΩΩΩΩΩΩΩΩ
+ὨΩΩΩΩΩΩΩ
 ᾼᾼᾼᾼᾼᾼᾼᾼ
 ΑΙΑΙΑΙΑΙΑΙΑΙΑΙΑΙ
 ῌῌῌῌῌῌῌῌ
@@ -229,6 +229,12 @@ TEST 17: Greek
 ͺ῀`^^b4῾᾽᾿῍῎῝῞῟῏῭^^a8῁
 ;
 ;
+ΠΎΡ̓ῬΟΣ
+ΠΥΡΡΟΣ
+ῬΌΔΟΝ
+ῬΟΔΟΝ
+ΠΆΤΕΡ ἩΜΩ͂Ν Ὁ ἘΝ ΤΟΙ͂Σ ΟΥ̓ΡΑΝΟΙ͂Σ
+ΠΑΤΕΡ ἩΜΩΝ Ὁ ἘΝ ΤΟΙΣ ΟΥΡΑΝΟΙΣ
 ============================================================
 ============================================================
 TEST 18: Turkish/Azeri
diff --git a/l3kernel/testfiles/m3text002.lvt b/l3kernel/testfiles/m3text002.lvt
index 1d513d8b7..8304902ff 100644
--- a/l3kernel/testfiles/m3text002.lvt
+++ b/l3kernel/testfiles/m3text002.lvt
@@ -224,6 +224,10 @@
     \greektest:n { Το~ένα~Ή~το~άλλο }                     \NEWLINE
     \greektest:n { ͺ ῀ ` ´ ῾ ᾽ ᾿ ῍ ῎ ῝ ῞ ῟ ῏ ῭ ΅ ῁ }      \NEWLINE
     \greektest:n { ; }                                    \NEWLINE
+    % Taken from https://unicode-org.atlassian.net/browse/ICU-12845#icft=ICU-12845
+    \greektest:n { Πύῤῥος }                               \NEWLINE
+    \greektest:n { ῥόδον }                                \NEWLINE
+    \greektest:n { Πάτερ~ἡμῶν~ὁ~ἐν~τοῖς~οὐρανοῖς }        \NEWLINE
   }
 
 \TESTEXP { Turkish/Azeri }
diff --git a/l3kernel/testfiles/m3text002.ptex.tlg b/l3kernel/testfiles/m3text002.ptex.tlg
index b9bdd227d..b15553f98 100644
--- a/l3kernel/testfiles/m3text002.ptex.tlg
+++ b/l3kernel/testfiles/m3text002.ptex.tlg
@@ -180,7 +180,7 @@ TEST 17: Greek
 νομικο^^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ριση
+^^e1^^bc^^98πειδ^^ce^^97 ^^e1^^bc^^a9 ^^e1^^bc^^88ναγν^^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α
@@ -202,19 +202,19 @@ TEST 17: Greek
 ^^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^^88^^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^^98^^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^^a8^^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^^bc^^b8^^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
+^^e1^^bd^^88^^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
+^^ce^^a9^^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^^bd^^a8^^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
@@ -229,6 +229,12 @@ TEST 17: Greek
 ^^cd^^ba^^e1^^bf^^80`^^b4^^e1^^bf^^be^^e1^^be^^bd^^e1^^be^^bf^^e1^^bf^^8d^^e1^^bf^^8e^^e1^^bf^^9d^^e1^^bf^^9e^^e1^^bf^^9f^^e1^^bf^^8f^^e1^^bf^^ad^^c2^^a8^^e1^^bf^^81
 ^^cd^^be
 ^^cd^^be
+Π^^ce^^8e^^ce^^a1^^cc^^93^^e1^^bf^^acο^^ce^^a3
+Π^^ce^^a5^^ce^^a1^^ce^^a1ο^^ce^^a3
+^^e1^^bf^^ac^^ce^^8cδον
+^^e1^^bf^^ac^^ce^^9fδον
+Π^^ce^^86τερ ^^e1^^bc^^a9μ^^ce^^a9^^cd^^82ν ^^e1^^bd^^89 ^^e1^^bc^^98ν το^^ce^^99^^cd^^82^^ce^^a3 ο^^ce^^a5^^cc^^93ρανο^^ce^^99^^cd^^82^^ce^^a3
+Π^^ce^^91τερ ^^e1^^bc^^a9μ^^ce^^a9ν ^^e1^^bd^^89 ^^e1^^bc^^98ν το^^ce^^99^^ce^^a3 ο^^ce^^a5ρανο^^ce^^99^^ce^^a3
 ============================================================
 ============================================================
 TEST 18: Turkish/Azeri
diff --git a/l3kernel/testfiles/m3text002.tlg b/l3kernel/testfiles/m3text002.tlg
index 850df5226..801a02f40 100644
--- a/l3kernel/testfiles/m3text002.tlg
+++ b/l3kernel/testfiles/m3text002.tlg
@@ -180,7 +180,7 @@ TEST 17: Greek
 ^^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
 ^^e1^^bc^^98^^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
+^^e1^^bc^^98^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^ce^^97 ^^e1^^bc^^a9 ^^e1^^bc^^88^^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^^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
@@ -202,19 +202,19 @@ TEST 17: Greek
 ^^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^^88^^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^^98^^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^^a8^^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^^bc^^b8^^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
+^^e1^^bd^^88^^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
+^^ce^^a9^^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^^bd^^a8^^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
@@ -229,6 +229,12 @@ TEST 17: Greek
 ^^cd^^ba^^e1^^bf^^80`^^c2^^b4^^e1^^bf^^be^^e1^^be^^bd^^e1^^be^^bf^^e1^^bf^^8d^^e1^^bf^^8e^^e1^^bf^^9d^^e1^^bf^^9e^^e1^^bf^^9f^^e1^^bf^^8f^^e1^^bf^^ad^^c2^^a8^^e1^^bf^^81
 ^^cd^^be
 ^^cd^^be
+^^ce^^a0^^ce^^8e^^ce^^a1^^cc^^93^^e1^^bf^^ac^^ce^^9f^^ce^^a3
+^^ce^^a0^^ce^^a5^^ce^^a1^^ce^^a1^^ce^^9f^^ce^^a3
+^^e1^^bf^^ac^^ce^^8c^^ce^^94^^ce^^9f^^ce^^9d
+^^e1^^bf^^ac^^ce^^9f^^ce^^94^^ce^^9f^^ce^^9d
+^^ce^^a0^^ce^^86^^ce^^a4^^ce^^95^^ce^^a1 ^^e1^^bc^^a9^^ce^^9c^^ce^^a9^^cd^^82^^ce^^9d ^^e1^^bd^^89 ^^e1^^bc^^98^^ce^^9d ^^ce^^a4^^ce^^9f^^ce^^99^^cd^^82^^ce^^a3 ^^ce^^9f^^ce^^a5^^cc^^93^^ce^^a1^^ce^^91^^ce^^9d^^ce^^9f^^ce^^99^^cd^^82^^ce^^a3
+^^ce^^a0^^ce^^91^^ce^^a4^^ce^^95^^ce^^a1 ^^e1^^bc^^a9^^ce^^9c^^ce^^a9^^ce^^9d ^^e1^^bd^^89 ^^e1^^bc^^98^^ce^^9d ^^ce^^a4^^ce^^9f^^ce^^99^^ce^^a3 ^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^91^^ce^^9d^^ce^^9f^^ce^^99^^ce^^a3
 ============================================================
 ============================================================
 TEST 18: Turkish/Azeri
diff --git a/l3kernel/testfiles/m3text002.uptex.tlg b/l3kernel/testfiles/m3text002.uptex.tlg
index 25f0bb600..2e46c031d 100644
--- a/l3kernel/testfiles/m3text002.uptex.tlg
+++ b/l3kernel/testfiles/m3text002.uptex.tlg
@@ -180,7 +180,7 @@ TEST 17: Greek
 ^^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
+^^e1^^bc^^98^^ce^^a0^^ce^^95^^ce^^99^^ce^^94^^ce^^97 ^^e1^^bc^^a9 ^^e1^^bc^^88^^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
@@ -202,19 +202,19 @@ TEST 17: Greek
 ^^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^^88^^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^^98^^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^^a8^^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^^bc^^b8^^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
+^^e1^^bd^^88^^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
+^^ce^^a9^^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^^bd^^a8^^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
@@ -229,6 +229,12 @@ TEST 17: Greek
 ͺ῀`^^b4῾᾽᾿῍῎῝῞῟῏῭^^c2^^a8῁
 ;
 ;
+Π^^ce^^8e^^ce^^a1^^cc^^93^^e1^^bf^^ac^^ce^^9f^^ce^^a3
+^^ce^^a0^^ce^^a5^^ce^^a1^^ce^^a1^^ce^^9f^^ce^^a3
+^^e1^^bf^^ac^^ce^^8c^^ce^^94^^ce^^9f^^ce^^9d
+^^e1^^bf^^ac^^ce^^9f^^ce^^94^^ce^^9f^^ce^^9d
+Π^^ce^^86^^ce^^a4^^ce^^95^^ce^^a1 ^^e1^^bc^^a9^^ce^^9c^^ce^^a9^^cd^^82^^ce^^9d ^^e1^^bd^^89 ^^e1^^bc^^98^^ce^^9d ^^ce^^a4^^ce^^9f^^ce^^99^^cd^^82^^ce^^a3 ^^ce^^9f^^ce^^a5^^cc^^93^^ce^^a1^^ce^^91^^ce^^9d^^ce^^9f^^ce^^99^^cd^^82^^ce^^a3
+^^ce^^a0^^ce^^91^^ce^^a4^^ce^^95^^ce^^a1 ^^e1^^bc^^a9^^ce^^9c^^ce^^a9^^ce^^9d ^^e1^^bd^^89 ^^e1^^bc^^98^^ce^^9d ^^ce^^a4^^ce^^9f^^ce^^99^^ce^^a3 ^^ce^^9f^^ce^^a5^^ce^^a1^^ce^^91^^ce^^9d^^ce^^9f^^ce^^99^^ce^^a3
 ============================================================
 ============================================================
 TEST 18: Turkish/Azeri
diff --git a/l3kernel/testfiles/m3text002.xetex.tlg b/l3kernel/testfiles/m3text002.xetex.tlg
index 9a830d284..856b4e810 100644
--- a/l3kernel/testfiles/m3text002.xetex.tlg
+++ b/l3kernel/testfiles/m3text002.xetex.tlg
@@ -180,7 +180,7 @@ TEST 17: Greek
 ΝΟΜΙΚΟΎ Ή ΔΙΕΘΝΟΎΣ
 ΝΟΜΙΚΟΥ Ή ΔΙΕΘΝΟΥΣ
 ἘΠΕΙΔῊ Ἡ ἈΝΑΓΝΏΡΙΣΗ
-ΕΠΕΙΔΗ Η ΑΝΑΓΝΩΡΙΣΗ
+ἘΠΕΙΔΗ Ἡ ἈΝΑΓΝΩΡΙΣΗ
 ΝΟΜΙΚΟΥ͂ Ἢ ΔΙΕΘΝΟΥ͂Σ
 ΝΟΜΙΚΟΥ Ή ΔΙΕΘΝΟΥΣ
 ΝΈΟ, ΔΗΜΙΟΥΡΓΊΑ
@@ -202,19 +202,19 @@ TEST 17: Greek
 ῌ
 ΗΙ
 ἈἉἊἋἌἍἎἏ
-ΑΑΑΑΑΑΑΑ
+ἈΑΑΑΑΑΑΑ
 ἘἙἚἛἜἝ
-ΕΕΕΕΕΕ
+ἘΕΕΕΕΕ
 ἨἩἪἫἬἭἮἯ
-ΗΗΗΗΗΗΗΗ
+ἨΗΗΗΗΗΗΗ
 ἸἹἺἻἼἽἾἿ
-ΙΙΙΙΙΙΙΙ
+ἸΙΙΙΙΙΙΙ
 ὈὉὊὋὌὍ
-ΟΟΟΟΟΟ
+ὈΟΟΟΟΟ
 Υ̓ὙΥ̓̀ὛΥ̓́ὝΥ̓͂Ὗ
-ΥΥΥΥΥΥΥΥ
+ΩΥΥΥΥΥΥΥ
 ὨὩὪὫὬὭὮὯ
-ΩΩΩΩΩΩΩΩ
+ὨΩΩΩΩΩΩΩ
 ᾼᾼᾼᾼᾼᾼᾼᾼ
 ΑΙΑΙΑΙΑΙΑΙΑΙΑΙΑΙ
 ῌῌῌῌῌῌῌῌ
@@ -229,6 +229,12 @@ TEST 17: Greek
 ͺ῀`^^b4῾᾽᾿῍῎῝῞῟῏῭^^a8῁
 ;
 ;
+ΠΎΡ̓ῬΟΣ
+ΠΥΡΡΟΣ
+ῬΌΔΟΝ
+ῬΟΔΟΝ
+ΠΆΤΕΡ ἩΜΩ͂Ν Ὁ ἘΝ ΤΟΙ͂Σ ΟΥ̓ΡΑΝΟΙ͂Σ
+ΠΑΤΕΡ ἩΜΩΝ Ὁ ἘΝ ΤΟΙΣ ΟΥΡΑΝΟΙΣ
 ============================================================
 ============================================================
 TEST 18: Turkish/Azeri





More information about the latex3-commits mailing list.