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