[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.