[latex3-commits] [git/LaTeX3-latex3-latex3] master: Allow control of start-of-titlecase outcomes (109b1ed00)

Joseph Wright joseph.wright at morningstar2.co.uk
Mon Mar 16 10:04:14 CET 2020


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

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

commit 109b1ed00b2033f492215e5871372dcf33615d34
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Mon Mar 16 09:04:14 2020 +0000

    Allow control of start-of-titlecase outcomes


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

109b1ed00b2033f492215e5871372dcf33615d34
 l3kernel/CHANGELOG.md            |  3 +++
 l3kernel/l3text-case.dtx         | 28 +++++++++++++++++--------
 l3kernel/l3text.dtx              | 15 ++++++++++++--
 l3kernel/testfiles/m3text002.lvt | 13 ++++++++++++
 l3kernel/testfiles/m3text002.tlg | 44 ++++++++++++++++++++++++----------------
 5 files changed, 76 insertions(+), 27 deletions(-)

diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index 5e2a5f06b..39bd31ed0 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -7,6 +7,9 @@ this project uses date-based 'snapshot' version identifiers.
 
 ## [Unreleased]
 
+### Added
+- Control for start-of-titecasing: see `\l_text_titlecase_check_letter_bool`
+
 ### Fixed
 - Nesting of `\seq_shuffle:N` in another sequence mapping (issue #687)
 
diff --git a/l3kernel/l3text-case.dtx b/l3kernel/l3text-case.dtx
index 44b06224b..e7e7a17bc 100644
--- a/l3kernel/l3text-case.dtx
+++ b/l3kernel/l3text-case.dtx
@@ -65,6 +65,14 @@
 %
 % \subsection{Case changing}
 %
+% \begin{variable}{\l_text_titlecase_check_letter_bool}
+%   Needed to determine the route used in titlecasing.
+%    \begin{macrocode}
+\bool_new:N \l_text_titlecase_check_letter_bool
+\bool_set_true:N \l_text_titlecase_check_letter_bool
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}[EXP]
 %   {
 %     \text_lowercase:n,
@@ -519,17 +527,21 @@
 %    \begin{macrocode}
 \cs_new:Npx \@@_change_case_char_title:nnN #1#2#3
   {
-    \bool_lazy_or:nnTF
-      { \sys_if_engine_luatex_p: }
-      { \sys_if_engine_xetex_p: }
-      { \exp_not:N \token_if_letter:NTF #3 }
+    \exp_not:N \bool_if:NTF \l_text_titlecase_check_letter_bool
       {
-        \exp_not:N \bool_lazy_or:nnTF
-          { \exp_not:N \token_if_letter_p:N #3 }
-          { \exp_not:N \token_if_active_p:N #3 }
+        \bool_lazy_or:nnTF
+          { \sys_if_engine_luatex_p: }
+          { \sys_if_engine_xetex_p: }
+          { \exp_not:N \token_if_letter:NTF #3 }
+          {
+            \exp_not:N \bool_lazy_or:nnTF
+              { \exp_not:N \token_if_letter_p:N #3 }
+              { \exp_not:N \token_if_active_p:N #3 }
+          }
+          { \exp_not:N \use:c { @@_change_case_char_ #1 :nN } }
+          { \exp_not:N \@@_change_case_char_title:nnnN { title } {#1} }
       }
       { \exp_not:N \use:c { @@_change_case_char_ #1 :nN } }
-      { \exp_not:N \@@_change_case_char_title:nnnN { title } {#1} }
         {#2} #3
   }
 \cs_new_eq:NN \@@_change_case_char_titleonly:nnN
diff --git a/l3kernel/l3text.dtx b/l3kernel/l3text.dtx
index 06bedb163..49eb55092 100644
--- a/l3kernel/l3text.dtx
+++ b/l3kernel/l3text.dtx
@@ -183,7 +183,16 @@
 %  function \cs{text_titlecase:n} applies (broadly) uppercasing to the first
 %  letter of the input, then lowercasing to the remainder. In contrast,
 %  \cs{text_titlecase_first:n} \emph{only} carries out the uppercasing operation,
-%  and leaves the balance of the input unchanged.
+%  and leaves the balance of the input unchanged. Determining whether
+%  non-letter characters at the start of text should switch from upper- to
+%  lowercasing is controllable. When \cs{l_text_titlecase_check_letter_bool} is
+%  \texttt{true}, characters which are not letters (category code~$11$) are
+%  left unchanged and \enquote{skipped}: the first \emph{letter} is uppercased.
+%  (With $8$-bit engines, this is extended to active characters which form
+%  part of a multi-byte letter codepoint.) When
+%  \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
+%  character is uppercased, and the rest lowercased, irrespective of the nature
+%  of the character.
 % \end{function}
 %
 % \subsection{Removing formatting from text}
@@ -249,7 +258,9 @@
 % \end{variable}
 %
 % \begin{variable}{\l_text_titlecase_check_letter_bool}
-%   
+%   Controls how the start of titlecasing is handled: when \texttt{true}, the
+%   first \emph{letter} in text is considered. The standard setting is
+%   \texttt{true}.
 % \end{variable}
 %
 % \end{documentation}
diff --git a/l3kernel/testfiles/m3text002.lvt b/l3kernel/testfiles/m3text002.lvt
index 6fc2f8551..3bd7cbff5 100644
--- a/l3kernel/testfiles/m3text002.lvt
+++ b/l3kernel/testfiles/m3text002.lvt
@@ -100,6 +100,19 @@
     \testii:n { E~PLURIBUS~UNUM }
   }
 
+\bool_set_false:N \l_text_titlecase_check_letter_bool
+
+\TESTEXP { Titlecase~control }
+  {
+    \testii:n { `hic~SUNT~leones' }
+    \NEWLINE
+    \testii:n { `HIC~SUNT~leones' }
+    \NEWLINE
+    \testii:n { E~PLURIBUS~UNUM }
+  }
+
+\bool_set_true:N \l_text_titlecase_check_letter_bool
+
 \TESTEXP { Language~based~case~changing~but~nothing }
   {
     \test:nn { lt } { No~problems }
diff --git a/l3kernel/testfiles/m3text002.tlg b/l3kernel/testfiles/m3text002.tlg
index d5889d3c7..411e2bbb5 100644
--- a/l3kernel/testfiles/m3text002.tlg
+++ b/l3kernel/testfiles/m3text002.tlg
@@ -66,7 +66,17 @@ E pluribus unum
 E PLURIBUS UNUM
 ============================================================
 ============================================================
-TEST 7: Language based case changing but nothing
+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
@@ -78,7 +88,7 @@ No problems
 No problems
 ============================================================
 ============================================================
-TEST 8: Unicode case changing
+TEST 9: Unicode case changing
 ============================================================
 ^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
 ^^c3^^85^^c3^^89^^c3^^8e^^c3^^98^^e1^^bd^^ad^^d0^^94^^ce^^91^^c6^^90
@@ -86,7 +96,7 @@ TEST 8: Unicode case changing
 ^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
 ============================================================
 ============================================================
-TEST 9: Unicode case changing exceptions
+TEST 10: Unicode case changing exceptions
 ============================================================
 fu^^c3^^9fball
 FUSSBALL
@@ -94,7 +104,7 @@ Fu^^c3^^9fball
 Fu^^c3^^9fball
 ============================================================
 ============================================================
-TEST 10: The final sigma rule
+TEST 11: The final sigma rule
 ============================================================
 ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83 (^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83) ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83, ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83{} ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83\noop 
 ^^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) ^^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{} ^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3\noop 
@@ -106,7 +116,7 @@ TEST 10: The final sigma rule
 ^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3
 ============================================================
 ============================================================
-TEST 11: Cyrillic
+TEST 12: Cyrillic
 ============================================================
 ^^d0^^b4^^d0^^be^^d0^^ba^^d0^^bb^^d0^^b0^^d0^^b4^^d1^^8b ^^d0^^b0^^d0^^ba^^d0^^b0^^d0^^b4^^d0^^b5^^d0^^bc^^d0^^b8^^d0^^b8 ^^d0^^bd^^d0^^b0^^d1^^83^^d0^^ba
 ^^d0^^94^^d0^^9e^^d0^^9a^^d0^^9b^^d0^^90^^d0^^94^^d0^^ab ^^d0^^90^^d0^^9a^^d0^^90^^d0^^94^^d0^^95^^d0^^9c^^d0^^98^^d0^^98 ^^d0^^9d^^d0^^90^^d0^^a3^^d0^^9a
@@ -114,13 +124,13 @@ TEST 11: Cyrillic
 ^^d0^^94^^d0^^be^^d0^^ba^^d0^^bb^^d0^^b0^^d0^^b4^^d1^^8b ^^d0^^90^^d0^^ba^^d0^^b0^^d0^^b4^^d0^^b5^^d0^^bc^^d0^^b8^^d0^^b8 ^^d0^^bd^^d0^^b0^^d1^^83^^d0^^ba
 ============================================================
 ============================================================
-TEST 12: German-alternative
+TEST 13: German-alternative
 ============================================================
 FUSSBALL
 FU^^e1^^ba^^9eBALL
 ============================================================
 ============================================================
-TEST 13: Greek
+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
@@ -128,7 +138,7 @@ TEST 13: Greek
 ^^e1^^bd^^88^^ce^^b4^^cf^^85^^cf^^83^^cf^^83^^ce^^b5^^ce^^8e^^cf^^83
 ============================================================
 ============================================================
-TEST 14: Turkish/Azeri
+TEST 15: Turkish/Azeri
 ============================================================
 rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
 ragip hul^^c3^^bbs^^c4^^b0 ^^c3^^b6zdem
@@ -140,7 +150,7 @@ Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
 ^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
 ============================================================
 ============================================================
-TEST 15: Lithuanian
+TEST 16: Lithuanian
 ============================================================
 ^^c3^^ac^^c3^^ad^^c4^^a9
 ^^c3^^ac^^c3^^ad^^c4^^a9
@@ -148,7 +158,7 @@ TEST 15: Lithuanian
 ^^c3^^8c^^c3^^ad^^c4^^a9
 ============================================================
 ============================================================
-TEST 16: Dutch
+TEST 17: Dutch
 ============================================================
 ijsselmeer
 ijsselmeer
@@ -164,13 +174,13 @@ Im
 Im
 ============================================================
 ============================================================
-TEST 17: Titlecase exceptions
+TEST 18: Titlecase exceptions
 ============================================================
 Ssoo
 ^^c7^^85!
 ============================================================
 ============================================================
-TEST 18: Case changing braced arguments
+TEST 19: Case changing braced arguments
 ============================================================
 foo \emph {BAR} {baz}
 FOO \emph {BAR} {BAZ}
@@ -182,7 +192,7 @@ FOO \emph {BAR} {BAZ}
 \emph {BAR} {BAZ}
 ============================================================
 ============================================================
-TEST 19: Expanding content
+TEST 20: Expanding content
 ============================================================
 some text hello
 SOME TEXT HELLO
@@ -210,7 +220,7 @@ Some text \cs_tmp:w
 \cs_tmp:w  Sometext
 ============================================================
 ============================================================
-TEST 20: Math-mode escape
+TEST 21: Math-mode escape
 ============================================================
 some text $y = mx + c$
 SOME TEXT $y = mx + c$
@@ -226,7 +236,7 @@ Opps not close token in $y = mx + c
 Opps not close token in $y = mx + c
 ============================================================
 ============================================================
-TEST 21: Nesting
+TEST 22: Nesting
 ============================================================
 HELLO
 hello
@@ -234,7 +244,7 @@ FUSSBALL
 ^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3
 ============================================================
 ============================================================
-TEST 22: Letter-like commands
+TEST 23: Letter-like commands
 ============================================================
 \aa \aa \J \ae \dh \ss \l \o 
 \AA \AA \J \AE \DH \SS \L \O 
@@ -242,7 +252,7 @@ TEST 22: Letter-like commands
 \AA \aa \J \ae \dh \ss \l \O 
 ============================================================
 ============================================================
-TEST 23: Accents
+TEST 24: Accents
 ============================================================
 \"{a}\u {e}\H {i}\v {o}\.{u}
 \"{A}\u {E}\H {I}\v {O}\.{U}





More information about the latex3-commits mailing list.