summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-02-14 00:00:07 +0000
committerKarl Berry <karl@freefriends.org>2015-02-14 00:00:07 +0000
commitf771ad279813f9da9d3c76a8236e7ca94207ba28 (patch)
tree4f85df2affad6a2e75cc0c1f09fed7ea7f0f3d6e /Master
parent798876c6f2e5e0bce28929bb6fc2a1c3497df469 (diff)
l3kernel (13feb15)
git-svn-id: svn://tug.org/texlive/trunk@36271 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/expl3.pdfbin584763 -> 584552 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/interface3.pdfbin1481908 -> 1486692 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdfbin268222 -> 268228 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdfbin273228 -> 273234 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdfbin220209 -> 220216 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3.pdfbin4609591 -> 4676659 bytes
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx11
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx904
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx17
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/ltunicode.dtx669
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex528
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex5
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3.sty4
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def8
14 files changed, 1328 insertions, 818 deletions
diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
index 05fb314f35f..ca63d71e84d 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
index f01e988b0d2..893e1bc352e 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
index 9a1309b372c..f72192c5866 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
index 487e77fd991..6126d306656 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
index 691eac2c5b3..5b530941082 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
index 60e0a38fa02..20f845e710d 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index 4b000250b5b..985350cee69 100644
--- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
@@ -36,8 +36,8 @@
%<*driver|generic|package>
\def\ExplFileName{expl3}
\def\ExplFileDescription{L3 programming layer}
-\def\ExplFileDate{2015/01/29}
-\def\ExplFileVersion{5502}
+\def\ExplFileDate{2015/02/13}
+\def\ExplFileVersion{5524}
%</driver|generic|package>
%<*driver>
\documentclass[full]{l3doc}
@@ -1606,13 +1606,6 @@
{\ExplFileDate\space v\ExplFileVersion\space \ExplFileDescription}
% \end{macrocode}
%
-% As for the package loader, the \cs{ifpdf} package is loaded, again
-% early so there is no issue with category codes. Notice that here we do
-% not load \cs{etex} as the appropriate stuff is built into the formats.
-% \begin{macrocode}
-\input ifpdf.sty %
-% \end{macrocode}
-%
% \begin{variable}[aux]{\l@expl@tidy@tl}
% Save the category code of |@| and then set it to \enquote{letter}.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
index 440ceb898bb..5e6956729dc 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
@@ -38,7 +38,7 @@
\documentclass[full]{l3doc}
%</driver>
%<*driver|package>
-\GetIdInfo$Id: l3candidates.dtx 5499 2015-01-27 14:33:48Z joseph $
+\GetIdInfo$Id: l3candidates.dtx 5523 2015-02-12 22:10:34Z joseph $
{L3 Experimental additions to l3kernel}
%</driver|package>
%<*driver>
@@ -806,7 +806,7 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[rEXP, added = 2014-06-30]^^A
+% \begin{function}[rEXP, added = 2014-06-30, updated = 2015-02-12]^^A
% {
% \tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n,
% \tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn
@@ -819,42 +819,103 @@
% regarded broadly as \enquote{text}. They traverse the \meta{tokens} and
% change the case of characters as discussed below. The character code of
% the characters replaced may be arbitrary: the replacement characters will
-% have stand document-level category codes ($11$ for letters, $12$ for
+% have standard document-level category codes ($11$ for letters, $12$ for
% letter-like characters which can also be case-changed).
% \end{function}
%
-% The functions are \texttt{x}-type expandable: tokens are returned protected
-% from further expansion where appropriate. Begin-group and end-group
-% characters in the \meta{tokens} are normalized and become |{| and |}|,
-% respectively. Any tokens within such a group will \emph{not} be
-% case-changed, and thus for example
+% The functions are \texttt{x}-type expandable and will expand input in an
+% analogous way (though they are themselves expandable). In particular, input
+% in the form of token lists or expandable functions will be expanded
+% \emph{unless} it falls within one of the special handling classes described
+% below. As such, in package mode \LaTeXe{} \enquote{robust} commands should
+% be converted to engine-protected versions using for example the
+% \tn{robustify} command from the \pkg{etoolbox} package. Begin-group and
+% end-group characters in the \meta{tokens} are normalized and become |{| and
+% |}|, respectively. Case changing will take place inside groups but not in
+% math mode material so for example
+% \begin{verbatim}
+% \tl_upper_case:n { Some~text~$y = mx + c$~with~{Braces} }
+% \end{verbatim}
+% will become
+% \begin{verbatim}
+% SOME~TEXT~$y = mx + c$~WITH~{BRACES}
+% \end{verbatim}
+%
+% \begin{variable}{\l_tl_case_change_exclude_tl}
+% Case changing can be prevented by using any command on the list
+% \cs{l_tl_case_change_exclude_tl}. Each entry should be a function
+% to be followed by one argument: the latter will be preserved as-is.
+% Thus for example following
% \begin{verbatim}
-% \tl_upper_case:n { Some~text~{$y = mx + c$}~with~{Protection} }
+% \tl_put_right:Nn \l_tl_case_change_exclude_tl { \NoChangeCase }
% \end{verbatim}
-% will become
+% the input
% \begin{verbatim}
-% SOME~TEXT~{$y = mx + c$}~WITH~{Protection}
+% \tl_upper_case:n
+% { Some~text~$y = mx + c$~with~\NoChangeCase {Protection} }
% \end{verbatim}
+% will result in
+% \begin{verbatim}
+% SOME~TEXT~$y = mx + c$~WITH~\NoChangeCase {Protection}
+% \end{verbatim}
+% Notice that the case changing mapping preserves the inclusion of
+% the escape functions: it is left to other code to provide suitable
+% definitions (typically equivalent to \cs{use:n}). In particular, these
+% functions are protected from further expansion (returned using
+% \cs{exp_not:n}) as so will not be lost inside an \texttt{x}-type expansion.
+%
+% When used with \LaTeXe{} the commands |\cite|, |\ensuremath|, |\label|
+% and |\ref| are automatically included in the list for exclusion from
+% case changing.
+% \end{variable}
+%
+% \begin{variable}{\l_tl_case_change_math_tl}
+% Case changing is automatically skipped in math mode, as shown in the
+% demonstrations above. This is controlled by the list of tokens in
+% \cs{l_tl_case_change_math_tl}, which should be in open--close pairs. In
+% package mode the standard settings is
+% \begin{verbatim}
+% $ $ \( \)
+% \end{verbatim}
+% \end{variable}
%
-% `Mixed' case conversion may be regarded informally as converting the first
-% character of the \meta{tokens} to upper case and the rest to lower case.
-% However, the process is more complex than this as there are some cases
-% where a single lower case character maps to a special form,
-% for example \texttt{ij} in Dutch which becomes \texttt{IJ}. As such,
-% \cs{tl_mixed_case:n(n)} implement a more sophisticated mapping which
-% accounts for this and for modifying accents on the first letter.
-% Spaces at the start of the \meta{tokens} are ignored when finding the
-% first \enquote{letter} for conversion, while a brace group will terminate
-% this search. For example
+% In addition to this functionality, the case change system will also
+% convert text stored using the \LaTeXe{} \enquote{LICR} approach. This
+% will upper/lower case tokens as implemented for the font encodings
+% \texttt{T1}, \texttt{T2}, \texttt{T5} and \texttt{LGR} (see the behaviour of
+% the \LaTeXe{} command \tn{MakeUppercase}).
+%
+% \enquote{Mixed} case conversion may be regarded informally as converting the
+% first character of the \meta{tokens} to upper case and the rest to lower
+% case. However, the process is more complex than this as there are some
+% situations where a single lower case character maps to a special form, for
+% example \texttt{ij} in Dutch which becomes \texttt{IJ}. As such,
+% \cs{tl_mixed_case:n(n)} implement a more sophisticated mapping which accounts
+% for this and for modifying accents on the first letter. Spaces at the start
+% of the \meta{tokens} are ignored when finding the first \enquote{letter} for
+% conversion.
+% \begin{verbatim}
+% \tl_mixed_case:n { hello~WORLD } % => "Hello world"
+% \tl_mixed_case:n { ~hello~WORLD } % => " Hello world"
+% \tl_mixed_case:n { {hello}~WORLD } % => "{Hello} world"
+% \end{verbatim}
+% When finding the first \enquote{letter} for this process, any content in
+% math mode or covered by \cs{l_tl_case_change_exclude_tl} is ignored.
+%
+% (Note that the Unicode Consortium describe this as \enquote{title case}, but
+% that in English title case applies on a word-by-word basis. The
+% \enquote{mixed} case implemented here is a lower level concept needed for
+% both \enquote{title} and \enquote{sentence} casing of text.)
+%
+% \begin{variable}{\l_tl_mixed_case_ignore_tl}
+% The list of characters to ignore when searching for the first
+% \enquote{letter} in mixed-casing is determined by
+% \cs{l_tl_mixed_change_ignore_tl}. This has the standard setting
% \begin{verbatim}
-% \tl_mixed_case:n { hello~WORLD } % => "Hello world"
-% \tl_mixed_case:n { ~hello~WORLD } % => " Hello world"
-% \tl_mixed_case:n { {hello}~WORLD } % => "{hello} world"
+% ( [ { ` -
% \end{verbatim}
-% where the brace group is retained. (Note that the Unicode Consortium
-% describe this as `title case', but that in English title case applies
-% on a word-by-word basis. The `mixed' case implemented here is a lower
-% level concept needed for both `title' and `sentence' casing of text.)
+% where comparisons are made on a character basis.
+% \end{variable}
%
% As is generally true for \pkg{expl3}, these functions are designed to
% work with Unicode input only. As such, when used with \pdfTeX{}
@@ -869,12 +930,20 @@
% input is left unchanged.
%
% Context-sensitive mappings are enabled: language-dependent cases are
-% discussed below. The \enquote{final sigma} rule for Greek letters is
-% enabled and active for all inputs. It is implemented here in a modified
-% form which takes account of the requirements of the likely real use cases,
-% performance and expandability. Thus a capital sigma will map to a
-% final-sigma if it is followed by a space or one of the characters: ^^A{[(
-% |!'),.:;?]}|. (Feedback on this area is very welcome.)
+% discussed below.
+%
+% \begin{variable}{\l_tl_change_case_after_final_sigma_tl}
+% The \enquote{final sigma} rule for Greek letters is enabled and active for
+% all inputs. It is implemented here in a modified form which takes account
+% of the requirements of the likely real use cases, performance and
+% expandability. A capital sigma will map to a final-sigma if it is followed
+% by a space, the end of the input or one of the characters listed in
+% \cs{l_tl_change_case_after_final_sigma_tl}, which has standard setting
+% \begin{verbatim}
+% ) ] } . : ; , ! ? ' "
+% \end{verbatim}
+% with comparisons are made on a character basis.
+% \end{variable}
%
% Language-sensitive conversions are enabled using the \meta{language}
% argument, and follow Unicode Consortium guidelines. Currently, the
@@ -2990,6 +3059,20 @@
% to allow for all of the special cases. These functions also require the
% appropriate data extracted from the Unicode documentation (either manually
% or automatically), which is covered by \pkg{l3unicode-data}.
+%
+% \begin{macro}[EXP]{\str_case:nVF, \str_case:nvF, \str_case:nvTF}
+% \begin{macro}[EXP]{\tl_if_blank:fTF}
+% \begin{macro}[EXP]{\tl_if_head_eq_catcode:oNTF}
+% Required variants.
+% \begin{macrocode}
+\cs_generate_variant:Nn \str_case:nnF { nV , nv }
+\cs_generate_variant:Nn \str_case:nnTF { nv }
+\cs_generate_variant:Nn \tl_if_blank:nTF { f }
+\cs_generate_variant:Nn \tl_if_head_eq_catcode:nNTF { o }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[rEXP]{\tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n}
% \begin{macro}[rEXP]{\tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn}
@@ -3008,20 +3091,38 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[aux]{\@@_change_case:nnn}
-% \begin{macro}[aux]{\@@_change_case_loop:wnn}
-% \begin{macro}[aux]{\@@_change_case_N_type:Nwnn}
-% \begin{macro}[aux]{\@@_change_case_group:nwnn}
-% \begin{macro}[aux]{\@@_change_case_space:wnn}
-% \begin{macro}[aux]{\@@_change_case_char:NNNNNNNNn}
-% \begin{macro}[aux]^^A
+% \begin{macro}[aux, EXP]{\@@_change_case:nnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_loop:wnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nwnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_N_type:NNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nnnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_group:nwnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_space:wnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_char:NNNNNNNNn}
+% \begin{macro}[aux, EXP]{\@@_change_case_math:NNNn}
+% \begin{macro}[aux, EXP]{\@@_change_case_math_loop:wNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_math:NwNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_math_group:nwNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_math_space:wNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:Nnnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:nNnnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_three:w}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_four:w}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:Nnnnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_cyr:NnNNNNw}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:N}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:NN}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs:NNn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:N}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:NN}
+% \begin{macro}[aux, EXP]^^A
% {
% \@@_change_case_lower_sigma:Nnn ,
% \@@_change_case_upper_sigma:Nnn ,
% \@@_change_case_mixed_sigma:Nnn
% }
% \begin{macro}[aux]{\@@_change_case_lower_sigma:Nw}
-% \begin{macro}[aux]{\@@_change_case_lower_sigma_loop:Nw}
+% \begin{macro}[aux]{\@@_change_case_lower_sigma_loop:NN}
% The mechanism for the core conversion of case is based on the approach used
% in \cs{@@_act:NNNnn}. Thus the idea is to use a loop which is will grab
% the entire token list plus a quark: the latter is used as an end marker and
@@ -3031,9 +3132,11 @@
% treatment). In contrast to \cs{@@_act:NNNnn}, there is no need for this
% process to be \texttt{f}-type expandable: things are done using only
% \texttt{x}-type requirements. Also, for \enquote{normal} tokens there is
-% a bit more work to do here: to allow selection of case matches using
-% character code, it's important that control sequences are filtered out
-% before doing the lookup.
+% a bit more work to do here. To allow math mode escape for paired tokens,
+% there is first a search to see if we've picked up on of the possible
+% openers. If we have, there is a separate route to follow. Otherwise
+% we need to choose between control sequences and characters: only the
+% latter allow character code to be used for the conversion lookup.
% \begin{macrocode}
\cs_new:Npn \@@_change_case:nnn #1#2#3
{
@@ -3051,11 +3154,40 @@
}
#1 \q_recursion_stop
}
-\cs_new:Npn \@@_change_case_N_type:Nwnn #1#2 \q_recursion_stop #3#4
+\cs_new:Npn \@@_change_case_N_type:Nwnn #1#2 \q_recursion_stop
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nnn }
+ \exp_after:wN \@@_change_case_N_type:NNN
+ \exp_after:wN #1 \l_tl_case_change_math_tl
+ \q_recursion_tail ? \q_recursion_stop {#2}
+ }
+\cs_new:Npn \@@_change_case_N_type:NNN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_change_case_N_type:Nnnn #1 }
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \@@_change_case_math:NNNn #1 #3
+ \@@_change_case_loop:wnn
+ }
+ }
+ { \@@_change_case_N_type:NNN #1 }
+ }
+\cs_new:Npn \@@_change_case_N_type:Nnnn #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nn }
\token_if_cs:NTF #1
- { \exp_not:N #1 }
+%<*initex>
+ { \@@_change_case_cs:N #1 }
+%</initex>
+%<*package>
+ {
+ \@@_change_case_cs:Nnnn #1 {#3}
+ { }
+ { \@@_change_case_cs:N #1 }
+ }
+%</package>
{
\cs_if_exist_use:cF { @@_change_case_ #3 _ #4 :Nnn }
{ \use_iii:nnn }
@@ -3071,10 +3203,13 @@
}
\@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
}
-\cs_new:Npn \@@_change_case_group:nwnn #1#2 \q_recursion_stop
+\cs_new:Npn \@@_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
{
- { \exp_not:n {#1} }
- \@@_change_case_loop:wnn #2 \q_recursion_stop
+ {
+ \@@_change_case_loop:wnn #1
+ \q_recursion_tail \q_recursion_stop {#3} {#4}
+ }
+ \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
}
\exp_last_unbraced:NNo \cs_new:Npn \@@_change_case_space:wnn \c_space_tl
{
@@ -3082,14 +3217,201 @@
\@@_change_case_loop:wnn
}
% \end{macrocode}
-% Actually look for the char in the appropriate table.
+% Actually look for the char in the appropriate table. This code is a
+% compromise between performance and hash name use. The fastest approach
+% would be to create one token list for each char (and could cover special
+% case control sequences too) and use a hash table lookup. That is
+% quite \enquote{expensive}, so instead a \cs{str_case:nvF}
+% approach is used. One big list would be most efficient in name usage
+% but then gets slow for entries later in the list. Doing a split into
+% $100$ bins falls somewhere between the two extremes.
% \begin{macrocode}
-\cs_new:Npn \__tl_change_case_char:NNNNNNNNn #1#2#3#4#5#6#7#8#9
+\cs_new:Npn \@@_change_case_char:NNNNNNNNn #1#2#3#4#5#6#7#8#9
{
- \exp_args:NNv \str_case:nnF #8
+ \str_case:nvF #8
{ c_@@_ #9 _ #6 _X_ #7 _tl }
- { \exp_not:N #8 }
+ { \exp_not:n {#8} }
+ }
+% \end{macrocode}
+% When dealing with a token that can open math mode, the idea is to
+% loop to find the closing token and to preserve everything as-is.
+% The loop therefore looks much the same as the normal one, but with
+% a check to look for end-of-math mode. Once that is found or once we
+% hit the end of the input, the \enquote{normal} loop is restarted. That
+% is done so that the code here works for both standard case changing and
+% for the mixed case version: the clean up needed is different but the
+% loop functions passes (as |#4| to \cs{@@_change_case_math:NNNn}) deal
+% with that.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_math:NNNn #1#2#3#4
+ {
+ \exp_not:n {#1}
+ \@@_change_case_math_loop:wNN #4 \q_recursion_stop #2 #3
+ }
+\cs_new:Npn \@@_change_case_math_loop:wNN #1 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#1}
+ { \@@_change_case_math:NwNN }
+ {
+ \tl_if_head_is_group:nTF {#1}
+ { \@@_change_case_math_group:nwNN }
+ { \@@_change_case_math_space:wNN }
+ }
+ #1 \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_math:NwNN #1#2 \q_recursion_stop #3#4
+ {
+ \token_if_eq_meaning:NNTF \q_recursion_tail #1
+ { #4 \q_recursion_tail \q_recursion_stop }
+ {
+ \exp_not:n {#1}
+ \token_if_eq_meaning:NNTF #1 #3
+ { #4 #2 \q_recursion_stop }
+ { \@@_change_case_math_loop:wNN #2 \q_recursion_stop #3#4 }
+ }
+ }
+\cs_new:Npn \@@_change_case_math_group:nwNN #1#2 \q_recursion_stop
+ {
+ { \exp_not:n {#1} }
+ \@@_change_case_math_loop:wNN #2 \q_recursion_stop
+ }
+\exp_last_unbraced:NNo \cs_new:Npn \@@_change_case_math_space:wNN \c_space_tl
+ {
+ \c_space_tl
+ \@@_change_case_math_loop:wNN
+ }
+% \end{macrocode}
+% If a control sequence has been given as the argument and it is not on
+% the list of those with an argument to examine, the other possibility
+% is that it is a character represented as a command such as |\aa|. To
+% deal with that there is a need again to balance performance against
+% name use. For \LaTeXe{} the list of possible special cases is quite
+% long (there are around $100$ for Cyrillic alone) so a single long
+% \cs{str_case:nvF} is inefficient. On the other hand, using one
+% tl per special case would use a lot of names. The balance here is
+% to split up the special cases by type and for Cyrillic to further
+% subdivide. This works as there are various cases:
+% \begin{itemize}
+% \item Short (one or two letter) names for special Latin characters
+% \item Cyrillic names, all starting |cyr|
+% \item Greek names, all starting |text|
+% \item Greek accents, all starting |acc| and only applicable
+% for upper casing
+% \item Other cases (\enquote{bits and pieces})
+% \end{itemize}
+% Thus a split can be carried out by converting the control sequence to
+% a string then examining the first four characters. For Cyrillic, the
+% fourth character can be used for a second split based on the character
+% code.
+%
+% Note that as this is dependent on \LaTeXe{}, in format mode the code
+% goes straight to the final phase of handling control sequences.
+% \begin{macrocode}
+%<*package>
+\cs_new:Npn \@@_change_case_cs:Nnnn #1#2
+ {
+ \exp_args:Nf \@@_change_case_cs:nNnnn
+ { \cs_to_str:N #1 } #1 {#2}
+ }
+\cs_new:Npn \@@_change_case_cs:nNnnn #1#2#3
+ {
+ \tl_if_head_eq_catcode:oNTF { \use_none:nnn #1 a a a a } a
+ { \@@_change_case_cs_type:Nnnnn #2 { latin } {#3} }
+ {
+ \str_if_eq_x:nnTF
+ { \@@_change_case_cs_three:w #1 \q_nil }
+ { \str_if_eq:nnTF {#3} { lower } { CYR } { cyr } }
+ { \@@_change_case_cs_cyr:NnNNNNw #2 {#3} #1 \q_stop }
+ {
+ \str_if_eq_x:nnTF
+ { \@@_change_case_cs_three:w #1 \q_nil }
+ { acc }
+ { \@@_change_case_cs_type:Nnnnn #2 { acc } {#3} }
+ {
+ \str_if_eq_x:nnTF
+ { \@@_change_case_cs_four:w #1 \q_nil }
+ { text }
+ { \@@_change_case_cs_type:Nnnnn #2 { greek } {#3} }
+ { \@@_change_case_cs_type:Nnnnn #2 { misc } {#3} }
+ }
+ }
+ }
+ }
+\cs_new:Npn \@@_change_case_cs_three:w #1#2#3#4 \q_nil { #1#2#3 }
+\cs_new:Npn \@@_change_case_cs_four:w #1#2#3#4#5 \q_nil { #1#2#3#4 }
+\cs_new:Npn \@@_change_case_cs_type:Nnnnn #1#2#3
+ {
+ \str_case:nvTF #1
+ { c_@@_change_case_ #2 _ #3 _ tl }
+ }
+\cs_new:Npn \@@_change_case_cs_cyr:NnNNNNw #1#2#3#4#5#6#7 \q_stop
+ {
+ \@@_change_case_cs_type:Nnnnn #1
+ { cyrillic }
+ {
+ #2 _
+ \int_to_roman:n
+ {
+ 1 +
+ \int_div_truncate:nn
+ {
+ `#6 - \str_if_eq:nnTF {#2} { lower } { `A } { `a }
+ }
+ { 7 }
+ }
+ }
}
+%</package>
+% \end{macrocode}
+% To deal with a control sequence there is first a need to test if it is
+% on the list which indicate that case changing should be skipped. That's
+% done using a loop as we do \cs{tl_if_in:N(TF)} expandably. If a hit is
+% found then the argument is grabbed: that comes \emph{after} the loop
+% function which is therefore also picked up and rearranged. This means
+% that the same code can be used for mixed case, where an escaped part
+% is ignored for the purposes of identifying a leading letter.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_cs:N #1
+ {
+ \exp_after:wN \@@_change_case_cs:NN
+ \exp_after:wN #1 \l_tl_case_change_exclude_tl
+ \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_cs:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_change_case_cs_expand:N #1 }
+ \str_if_eq:nnTF {#1} {#2}
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ { \@@_change_case_cs:NNn #1 }
+ }
+ { \@@_change_case_cs:NN #1 }
+ }
+\cs_new:Npn \@@_change_case_cs:NNn #1#2#3
+ {
+ \exp_not:n { #1 {#3} }
+ #2
+ }
+% \end{macrocode}
+% When a control sequence is not on the exclude list the other test if
+% to see if it is expandable. Once again, if there is a hit then the loop
+% function is grabbed as part of the clean-up and reinserted before the
+% now expanded material.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_cs_expand:N #1
+ {
+ \bool_if:nTF
+ {
+ \token_if_expandable_p:N #1
+ && ! \token_if_protected_macro_p:N #1
+ && ! \token_if_protected_long_macro_p:N #1
+ }
+ { \@@_change_case_cs_expand:NN #1 }
+ { \exp_not:n {#1} }
+ }
+\cs_new:Npn \@@_change_case_cs_expand:NN #1#2
+ { \exp_after:wN #2 #1 }
% \end{macrocode}
% If the current char is an upper case sigma, the a check is made on the next
% item in the input. If it is another \texttt{N}-type token then further tests
@@ -3128,18 +3450,18 @@
{ \c_@@_std_sigma_tl }
}
{
- \exp_after:wN \@@_change_case_lower_sigma_loop:Nw
- \exp_after:wN #1 \c_@@_after_final_sigma_clist
- , \q_recursion_tail , \q_recursion_stop
+ \exp_after:wN \@@_change_case_lower_sigma_loop:NN
+ \exp_after:wN #1 \l_tl_case_change_after_final_sigma_tl
+ \q_recursion_tail \q_recursion_stop
}
}
-\cs_new:Npn \@@_change_case_lower_sigma_loop:Nw #1#2 ,
+\cs_new:Npn \@@_change_case_lower_sigma_loop:NN #1#2
{
\quark_if_recursion_tail_stop_do:nn {#2}
{ \c_@@_std_sigma_tl }
- \int_compare:nNnT { `#1 } = { "#2 }
+ \int_compare:nNnT { `#1 } = { `#2 }
{ \use_i_delimit_by_q_recursion_stop:nw { \c_@@_final_sigma_tl } }
- \@@_change_case_lower_sigma_loop:Nw #1
+ \@@_change_case_lower_sigma_loop:NN #1
}
\cs_new_eq:NN \@@_change_case_upper_sigma:Nnn \use_iii:nnn
\cs_new_eq:NN \@@_change_case_mixed_sigma:Nnn \use_iii:nnn
@@ -3153,14 +3475,34 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \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}[aux]{\@@_mixed_case:nn}
-% \begin{macro}[aux]{\@@_mixed_case_loop:wn}
-% \begin{macro}[aux]{\@@_mixed_case_N_type:Nwn}
-% \begin{macro}[aux]{\@@_mixed_case_skip:Nwn}
-% \begin{macro}[aux]{\@@_mixed_case_skip_tidy:nNwn}
-% \begin{macro}[aux]{\@@_mixed_case_group:nwn}
-% \begin{macro}[aux]{\@@_mixed_case_space:wn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case:nn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_loop:wn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nwn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:NNN}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nnn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_skip:Nwn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_skip_tidy:nNwn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_group:nwn}
+% \begin{macro}[aux, EXP]{\@@_mixed_case_space:wn}
% Mixed (title) casing needs an entire set of functions to itself. These are
% more or less the same as those for general case changes but the
% requirements here are subtly different. What is needed is a loop which
@@ -3191,11 +3533,49 @@
}
#1 \q_recursion_stop
}
-\cs_new:Npn \@@_mixed_case_N_type:Nwn #1#2 \q_recursion_stop #3
+\cs_new:Npn \@@_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
{
\quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nn }
+ \exp_after:wN \@@_mixed_case_N_type:NNN
+ \exp_after:wN #1 \l_tl_case_change_math_tl
+ \q_recursion_tail ? \q_recursion_stop {#2}
+ }
+\cs_new:Npn \@@_mixed_case_N_type:NNN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_mixed_case_N_type:Nnn #1 }
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \@@_change_case_math:NNNn #1 #3
+ \@@_mixed_case_loop:wn
+ }
+ }
+ { \@@_mixed_case_N_type:NNN #1 }
+ }
+\cs_new:Npn \@@_mixed_case_N_type:Nnn #1#2#3
+ {
\token_if_cs:NTF #1
- { \exp_not:N #1 }
+%<*initex>
+ {
+ \@@_change_case_cs:N #1
+ \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3}
+ }
+%</initex>
+%<*package>
+ {
+ \@@_change_case_cs:Nnnn #1 { upper }
+ {
+ \@@_change_case_loop:wnn
+ #2 \q_recursion_stop { lower } {#3}
+ }
+ {
+ \@@_change_case_cs:N #1
+ \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3}
+ }
+ }
+%</package>
{
\cs_if_exist_use:cF { @@_change_case_mixed_ #3 :Nnn }
{
@@ -3204,11 +3584,11 @@
}
#1 {#2}
{
- \exp_after:wN \@@_mixed_case_skip:Nwn \exp_after:wN #1
- \c__tl_mixed_skip_clist , \q_recursion_tail ,
- \q_recursion_stop
+ \exp_after:wN \@@_mixed_case_skip:NNn
+ \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
+ \q_recursion_tail \q_recursion_stop
{
- \exp_args:NNV \str_case:nnF #1 \c_@@_mixed_exceptions_tl
+ \str_case:nVF #1 \c_@@_mixed_exceptions_tl
{
\exp_after:wN \@@_change_case_char:NNNNNNNNn
\int_use:N
@@ -3217,8 +3597,8 @@
}
}
}
+ \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
}
- \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
}
% \end{macrocode}
% Looking for chars to skip when title casing uses the standard \enquote{loop
@@ -3226,12 +3606,16 @@
% to do: retain the char and switch the looping system to stick with the
% title loop rather than the lower case one. That means swapping an
% auxiliary and removing a trailing |{ lower }|, which is easiest to do
-% with a dedicated function.
+% with a dedicated function. When dealing with a brace group there is a
+% need to test if there is any content in it: that affects whether to keep
+% looking for the first character or not after the group. If there is
+% anything non-expandable at all in it then that will be treated as the
+% first \enquote{character}.
% \begin{macrocode}
-\cs_new:Npn \@@_mixed_case_skip:Nwn #1#2 ,
+\cs_new:Npn \@@_mixed_case_skip:NNn #1#2
{
\quark_if_recursion_tail_stop_do:nn {#2} { \use:n }
- \int_compare:nNnT { `#1 } = { "#2 }
+ \int_compare:nNnT { `#1 } = { `#2 }
{
\use_i_delimit_by_q_recursion_stop:nw
{
@@ -3239,16 +3623,23 @@
\@@_mixed_case_skip_tidy:nNwn
}
}
- \@@_mixed_case_skip:Nwn #1
+ \@@_mixed_case_skip:NNn #1
}
\cs_new:Npn \@@_mixed_case_skip_tidy:nNwn #1#2#3 \q_recursion_stop #4
{
\@@_mixed_case_loop:wn #3 \q_recursion_stop
}
-\cs_new:Npn \@@_mixed_case_group:nwn #1#2 \q_recursion_stop
+\cs_new:Npn \@@_mixed_case_group:nwn #1#2 \q_recursion_stop #3
{
- { \exp_not:n {#1} }
- \@@_change_case_loop:wnn #2 \q_recursion_stop { lower }
+ \tl_if_blank:fTF {#1}
+ { { } \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3} }
+ {
+ {
+ \@@_mixed_case_loop:wn #1
+ \q_recursion_tail \q_recursion_stop {#3}
+ }
+ \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
+ }
}
\exp_last_unbraced:NNo \cs_new:Npn \@@_mixed_case_space:wn \c_space_tl
{
@@ -3263,6 +3654,8 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[aux]^^A
% {
@@ -3348,7 +3741,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_change_case_lower_lt:Nnn #1#2#3
{
- \exp_args:NNV \str_case:nnF #1 \c_@@_accents_lt_tl
+ \str_case:nVF #1 \c_@@_accents_lt_tl
{
#3
\bool_if:nT
@@ -3449,6 +3842,351 @@
% \end{macro}
% \end{macro}
%
+% \begin{variable}{\l_tl_case_change_math_tl}
+% The list of token pairs which are treated as math mode and so
+% not case changed.
+% \begin{macrocode}
+\tl_new:N \l_tl_case_change_math_tl
+%<*package>
+\tl_set:Nn \l_tl_case_change_math_tl
+ { $ $ \( \) }
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_tl_case_change_exclude_tl}
+% The list of commands for which an argument is not case changed.
+% \begin{macrocode}
+\tl_new:N \l_tl_case_change_exclude_tl
+%<*package>
+\tl_set:Nn \l_tl_case_change_exclude_tl
+ { \cite \ensuremath \label \ref }
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_tl_case_change_after_final_sigma_tl}
+% Characters coming after a final sigma.
+% \begin{macrocode}
+\tl_new:N \l_tl_case_change_after_final_sigma_tl
+\tl_set:Nx \l_tl_case_change_after_final_sigma_tl
+ { % (
+ ) % [
+ ] % \{
+ \cs_to_str:N \}
+ . : ; ,
+ ! ? ' "
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_tl_mixed_case_ignore_tl}
+% Characters to skip over when finding the first letter in a word to be
+% mixed cased.
+% \begin{macrocode}
+\tl_new:N \l_tl_mixed_case_ignore_tl
+\tl_set:Nx \l_tl_mixed_case_ignore_tl
+ {
+ ( % )
+ [ % ]
+ \cs_to_str:N \{ % \}
+ `
+ -
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \c_@@_change_case_latin_upper_tl ,
+% \c_@@_change_case_latin_lower_tl ,
+% \c_@@_change_case_cyrillic_upper_i_tl ,
+% \c_@@_change_case_cyrillic_upper_ii_tl ,
+% \c_@@_change_case_cyrillic_upper_iii_tl ,
+% \c_@@_change_case_cyrillic_upper_iv_tl ,
+% \c_@@_change_case_cyrillic_lower_i_tl ,
+% \c_@@_change_case_cyrillic_lower_ii_tl ,
+% \c_@@_change_case_cyrillic_lower_iii_tl ,
+% \c_@@_change_case_cyrillic_lower_iv_tl ,
+% \c_@@_change_case_greek_upper_tl ,
+% \c_@@_change_case_greek_lower_tl ,
+% \c_@@_change_case_acc_upper_tl ,
+% \c_@@_change_case_acc_upper_tl ,
+% \c_@@_change_case_misc_upper_tl ,
+% \c_@@_change_case_misc_lower_tl
+% }
+% The data for case changing control sequences representing characters
+% is stored such that further expansion is inhibited. This is required
+% as many of the \LaTeXe{} commands are fragile and so will fail inside
+% an \texttt{x}-type expansion without this precaution. As such, there is
+% a bit of set up to deal with the various requirements here: upper and
+% lower case mappings are not identical so special end cases are needed
+% to get everything set up correctly with minimal repetition.
+% \begin{macrocode}
+\group_begin:
+ \cs_set_protected:Npn \@@_change_case_setup:nnnn #1#2#3#4
+ {
+ \tl_const:cx { c_@@_change_case_ #1 _upper #2 _tl }
+ {
+ \@@_change_case_map:NN
+ #3 \q_recursion_tail ? \q_recursion_stop
+ }
+ \tl_const:cx { c_@@_change_case_ #1 _lower #2 _tl }
+ {
+ \@@_change_case_map:NNN #4
+ #3 \q_recursion_tail ? \q_recursion_stop
+ }
+ }
+ \cs_set:Npn \@@_change_case_map:NN #1#2
+ {
+ \quark_if_recursion_tail_stop:N #1
+%<*initex>
+ \exp_not:N #1 \exp_not:N #2
+%</initex>
+%<*package>
+ \exp_not:N #1 \exp_not:n { { \exp_not:n {#2} } }
+%</package>
+ \@@_change_case_map:NN
+ }
+ \cs_set:Npn \@@_change_case_map:NNN #1#2#3
+ {
+ \str_if_eq:nnT {#1} {#2}
+ { \use_none_delimit_by_q_recursion_stop:w }
+%<*initex>
+ \exp_not:N #3 \exp_not:N #2
+%</initex>
+%<*package>
+ \exp_not:N #3 \exp_not:n { { \exp_not:n {#2} } }
+%</package>
+ \@@_change_case_map:NNN #1
+ }
+ \@@_change_case_setup:nnnn
+ { latin }
+ { }
+ {
+ \aa \AA
+ \ae \AE
+ \dh \DH
+ \dj \DJ
+ \l \L
+ \ng \NG
+ \o \O
+ \oe \OE
+ \ss \SS
+ \th \TH
+ \i I
+ \j J
+ }
+ { \i }
+%<*package>
+ \@@_change_case_setup:nnnn
+ { cyrillic }
+ { _i }
+ {
+ \cyra \CYRA
+ \cyrabhch \CYRABHCH
+ \cyrabhchdsc \CYRABHCHDSC
+ \cyrabhdze \CYRABHDZE
+ \cyrabhha \CYRABHHA
+ \cyrae \CYRAE
+ \cyrb \CYRB
+ \cyrbyus \CYRBYUS
+ \cyrc \CYRC
+ \cyrch \CYRCH
+ \cyrchldsc \CYRCHLDSC
+ \cyrchrdsc \CYRCHRDSC
+ \cyrchvcrs \CYRCHVCRS
+ \cyrd \CYRD
+ \cyrdelta \CYRDELTA
+ \cyrdje \CYRDJE
+ \cyrdze \CYRDZE
+ \cyrdzhe \CYRDZHE
+ \cyre \CYRE
+ \cyreps \CYREPS
+ \cyrerev \CYREREV
+ \cyrery \CYRERY
+ \cyrf \CYRF
+ \cyrfita \CYRFITA
+ \cyrg \CYRG
+ \cyrgdsc \CYRGDSC
+ \cyrgdschcrs \CYRGDSCHCRS
+ \cyrghcrs \CYRGHCRS
+ \cyrghk \CYRGHK
+ \cyrgup \CYRGUP
+ }
+ { \q_recursion_tail }
+ \@@_change_case_setup:nnnn
+ { cyrillic }
+ { _ii }
+ {
+ \cyrh \CYRH
+ \cyrhdsc \CYRHDSC
+ \cyrhhcrs \CYRHHCRS
+ \cyrhhk \CYRHHK
+ \cyrhrdsn \CYRHRDSN
+ \cyri \CYRI
+ \cyrie \CYRIE
+ \cyrii \CYRII
+ \cyrishrt \CYRISHRT
+ \cyrishrtdsc \CYRISHRTDSC
+ \cyrizh \CYRIZH
+ \cyrje \CYRJE
+ \cyrk \CYRK
+ \cyrkbeak \CYRKBEAK
+ \cyrkdsc \CYRKDSC
+ \cyrkhcrs \CYRKHCRS
+ \cyrkhk \CYRKHK
+ \cyrkvcrs \CYRKVCRS
+ \cyrl \CYRL
+ \cyrldsc \CYRLDSC
+ \cyrlhk \CYRLHK
+ \cyrlje \CYRLJE
+ \cyrm \CYRM
+ \cyrmdsc \CYRMDSC
+ \cyrmhk \CYRMHK
+ \cyrn \CYRN
+ \cyrndsc \CYRNDSC
+ \cyrng \CYRNG
+ \cyrnhk \CYRNHK
+ \cyrnje \CYRNJE
+ \cyrnlhk \CYRNLHK
+ }
+ { \q_recursion_tail }
+ \@@_change_case_setup:nnnn
+ { cyrillic }
+ { _iii }
+ {
+ \cyro \CYRO
+ \cyrotld \CYROTLD
+ \cyrp \CYRP
+ \cyrphk \CYRPHK
+ \cyrq \CYRQ
+ \cyrr \CYRR
+ \cyrrdsc \CYRRDSC
+ \cyrrhk \CYRRHK
+ \cyrrtick \CYRRTICK
+ \cyrs \CYRS
+ \cyrsacrs \CYRSACRS
+ \cyrschwa \CYRSCHWA
+ \cyrsdsc \CYRSDSC
+ \cyrsemisftsn \CYRSEMISFTSN
+ \cyrsftsn \CYRSFTSN
+ \cyrsh \CYRSH
+ \cyrshch \CYRSHCH
+ \cyrshha \CYRSHHA
+ \cyrt \CYRT
+ \cyrtdsc \CYRTDSC
+ \cyrtetse \CYRTETSE
+ \cyrtshe \CYRTSHE
+ \cyru \CYRU
+ \cyrushrt \CYRUSHRT
+ }
+ { \q_recursion_tail }
+ \@@_change_case_setup:nnnn
+ { cyrillic }
+ { _iv }
+ {
+ \cyrv \CYRV
+ \cyrw \CYRW
+ \cyry \CYRY
+ \cyrya \CYRYA
+ \cyryat \CYRYAT
+ \cyryhcrs \CYRYHCRS
+ \cyryi \CYRYI
+ \cyryo \CYRYO
+ \cyryu \CYRYU
+ \cyrz \CYRZ
+ \cyrzdsc \CYRZDSC
+ \cyrzh \CYRZH
+ \cyrzhdsc \CYRZHDSC
+ }
+ { \q_recursion_tail }
+ \@@_change_case_setup:nnnn
+ { greek }
+ { }
+ {
+ \textalpha \textAlpha
+ \textbeta \textBeta
+ \textchi \textChi
+ \textdelta \textDelta
+ \textdigamma \textDigamma
+ \texteta \textEta
+ \textepsilon \textEpsilon
+ \textgamma \textGamma
+ \textiota \textIota
+ \textkappa \textKappa
+ \textlambda \textLambda
+ \textmu \textMu
+ \textnu \textNu
+ \textomega \textOmega
+ \textomicron \textOmicron
+ \textphi \textPhi
+ \textpi \textPi
+ \textpsi \textPsi
+ \textqoppa \textQoppa
+ \textrho \textRho
+ \textsampi \textSampi
+ \textautosigma \textSigma
+ \textstigma \textStigma
+ \texttheta \textTheta
+ \texttau \textTau
+ \textupsilon \textUpsilon
+ \textxi \textXi
+ \textzeta \textZeta
+ \textsigma \textSigma
+ \textvarsigma \textSigma
+ \textvarstigma \textStigma
+ }
+ { \textsigma }
+ \tl_const:Nn \c_@@_change_case_acc_upper_tl
+ {
+ \accdasia { \exp_not:n { \LGR@accdropped } }
+ \accdasiaoxia { \exp_not:n { \LGR@hiatus } }
+ \accdasiavaria { \exp_not:n { \LGR@accdropped } }
+ \accdasiaperispomeni { \exp_not:n { \LGR@accdropped } }
+ \accpsili { \exp_not:n { \LGR@hiatus } }
+ \accpsilioxia { \exp_not:n { \LGR@hiatus } }
+ \accpsilivaria { \exp_not:n { \LGR@hiatus } }
+ \accpsiliperispomeni { \exp_not:n { \LGR@accdropped } }
+ \acctonos { \exp_not:n { \LGR@hiatus } }
+ \accvaria { \exp_not:n { \LGR@accdropped } }
+ \accdialytikatonos { \exp_not:n { \LGR@accDialytika } }
+ \accdialytikavaria { \exp_not:n { \LGR@accDialytika } }
+ \accdialytikaperispomeni { \exp_not:n { \LGR@accDialytika } }
+ \accperispomeni { \exp_not:n { \LGR@accdropped } }
+ }
+ \tl_const:Nn \c_@@_change_case_acc_lower_tl { }
+ \tl_const:Nn \c_@@_change_case_misc_upper_tl
+ {
+ \ypogegrammeni { \exp_not:n { \prosgegrammeni } }
+ \abreve { \exp_not:n { \Abreve } }
+ \acircumflex { \exp_not:n { \Acircumflex } }
+ \ecircumflex { \exp_not:n { \Ecircumflex } }
+ \ocircumflex { \exp_not:n { \Ocircumflex } }
+ \ohorn { \exp_not:n { \Ohorn } }
+ \uhorn { \exp_not:n { \Uhorn } }
+ }
+ \tl_const:Nn \c_@@_change_case_misc_lower_tl
+ {
+ \prosgegrammeni { \exp_not:n { \ypogegrammeni } }
+ \Abreve { \exp_not:n { \abreve } }
+ \Acircumflex { \exp_not:n { \acircumflex } }
+ \Ecircumflex { \exp_not:n { \ecircumflex } }
+ \Ocircumflex { \exp_not:n { \ocircumflex } }
+ \Ohorn { \exp_not:n { \ohorn } }
+ \Uhorn { \exp_not:n { \uhorn } }
+ \ABREVE { \exp_not:n { \abreve } }
+ \ACIRCUMFLEX { \exp_not:n { \acircumflex } }
+ \ECIRCUMFLEX { \exp_not:n { \ecircumflex } }
+ \OCIRCUMFLEX { \exp_not:n { \ocircumflex } }
+ \OHORN { \exp_not:n { \ohorn } }
+ \UHORN { \exp_not:n { \uhorn } }
+ }
+%</package>
+\group_end:
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\tl_log:N, \tl_log:c}
% Showing token list variables in the log file is done after checking
% that the variable is defined.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx
index 7bd9025cd1c..b50904b7ee6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3unicode-data.dtx Copyright(C) 2014 The LaTeX3 Project
+%% File: l3unicode-data.dtx Copyright(C) 2014-2015 The LaTeX3 Project
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
% plain \TeX{}, set up in generic mode.
%<*driver|script>
\input expl3-generic\relax
-\GetIdInfo$Id: l3unicode-data.dtx 5465 2014-11-23 11:42:34Z joseph $
+\GetIdInfo$Id: l3unicode-data.dtx 5523 2015-02-12 22:10:34Z joseph $
{L3 Case data script}
%</driver|script>
%
@@ -292,19 +292,6 @@
}
% \end{macrocode}
%
-% There are some data items which can be stored as numbers rather than as
-% literal Unicode chars. These could go into the main source files, but as they
-% conceptually go with everything else here this makes more sense. They are
-% safe for use with \pdfTeX{} so are given first.
-% \begin{macrocode}
-\__unicode_verb:
-\clist_const:Nn \c__tl_after_final_sigma_clist
- { 0021 , 0022 , 0029 , 002C , 002E , 003A , 003B , 003F , 005D , 007D }
-\clist_const:Nn \c__tl_mixed_skip_clist
- { 0028 , 005B , 0060 , 007B }
-\__unicode_verb_end:
-% \end{macrocode}
-%
% \subsection{\pdfTeX{} support}
%
% As \pdfTeX{} does not support Unicode input natively, most of the data
diff --git a/Master/texmf-dist/source/latex/l3kernel/ltunicode.dtx b/Master/texmf-dist/source/latex/l3kernel/ltunicode.dtx
deleted file mode 100644
index 7dd0591d4b6..00000000000
--- a/Master/texmf-dist/source/latex/l3kernel/ltunicode.dtx
+++ /dev/null
@@ -1,669 +0,0 @@
-% \iffalse meta-comment
-%
-% Copyright 2014-2015
-% The LaTeX3 Project and any individual authors listed elsewhere
-% in this file.
-%
-% This file is part of the LaTeX base system.
-% -------------------------------------------
-%
-% It may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3c
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This file has the LPPL maintenance status "maintained".
-%
-% The list of all files belonging to the LaTeX base distribution is
-% given in the file `manifest.txt'. See also `legal.txt' for additional
-% information.
-%
-% The list of derived (unpacked) files belonging to the distribution
-% and covered by LPPL is defined by the unpacking scripts (with
-% extension .ins) which are part of the distribution.
-%
-% -----------------------------------------------------------------------------
-%
-% The same approach as used in \pkg{DocStrip}: if \cs{documentclass}
-% is undefined then skip the driver, allowing the file to be used directly.
-% This works as the \cs{fi} is only seen if \LaTeX{} is not in use. The odd
-% \cs{jobname} business allows the extraction to work with \LaTeX{} provided
-% an appropriate \texttt{.ins} file is set up.
-%<*gobble>
-\ifx\jobname\relax
- \let\documentclass\undefined
-\fi
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname documentclass\endcsname\relax
-\else
- \csname fi\endcsname
-%</gobble>
-%
-%<*driver>
-\ProvidesFile{ltunicode.dtx}
- [2015/01/01 v1.0 LaTeX Kernel (Unicode data)]
-\documentclass{ltxdoc}
-\begin{document}
-\DocInput{\jobname.dtx}
-\end{document}
-%<*gobble>
-\fi
-%</gobble>
-%</driver>
-% \fi
-%
-% \GetFileInfo{ltunicode.dtx}
-% \title{The \texttt{ltunicode.dtx} file\thanks
-% {This file has version number \fileversion, dated \filedate.}\\
-% for use with \LaTeXe}
-% \author{The \LaTeX3 Project}
-%
-% \maketitle
-%
-% This script extracts data from the Unicode Consortium files
-% \texttt{UnicodeData.txt}, \texttt{EastAsianWidth.txt} and
-% \texttt{LineBreak.txt} to be used for setting up \LaTeXe{} with sane
-% default settings when using the Xe\TeX{} and Lua\TeX{} engines. Details
-% of the process are included in the code comments.
-%
-% To create the extracted file, run this file in a location containing
-% the three input data files using a plain \TeX{} system with the e-\TeX{}
-% extensions enabled (\texttt{pdftex}, \texttt{xetex} or \texttt{luatex}
-% in any modern \TeX{} distribution).
-%
-% \StopEventually{}
-%
-% \begin{macrocode}
-%<*script>
-% \end{macrocode}
-%
-% \section{General set up}
-%
-% The script is designed to work with plain \TeX{} and so |@| is made into
-% a `letter' using the primitive approach.
-% \begin{macrocode}
-\catcode`\@=11 %
-% \end{macrocode}
-%
-% \begin{macro}{\gobble}
-% \begin{macro}{\firsttoken}
-% Standard utilities.
-% \begin{macrocode}
-\long\def\gobble#1{}
-\long\def\firsttoken#1#2\relax{#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\storedpar}
-% A simple piece of test set up: the final line of the read file will be
-% tokenized by \TeX{} as \cs{par} which can be tested by \cs{ifx} provided
-% we have an equivalent available.
-% \begin{macrocode}
-\def\storedpar{\par}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\return}
-% A stored |^^M| for string comparisons.
-% \begin{macrocode}
-\begingroup
- \catcode`\^^M=12 %
- \gdef\return{^^M}%
-\endgroup%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\sourceforhex}
-% \begin{macro}{\sethex}
-% \begin{macro}{\dohex}
-% \begin{macro}{\hexdigit}
-% Some parts of the code here will need to be able to convert integers
-% to their hexadecimal equivalent. That is easiest to do for the requirements
-% here using a modified version of some code from Appendix~D of \emph{The
-% \TeX{}book}.
-% \begin{macrocode}
-\newcount\sourceforhex
-\def\sethex#1#2{%
- \def#1{}%
- \sourceforhex=#2\relax
- \ifnum\sourceforhex=0 %
- \def#1{0}%
- \else
- \dohex#1%
- \fi
-}
-\def\dohex#1{%
- \begingroup
- \count0=\sourceforhex
- \divide\sourceforhex by 16 %
- \ifnum\sourceforhex>0 %
- \dohex#1%
- \fi
- \count2=\sourceforhex
- \multiply\count2 by -16 %
- \advance\count0 by\count2
- \hexdigit#1%
- \expandafter\endgroup
- \expandafter\def\expandafter#1\expandafter{#1}%
-}
-\def\hexdigit#1{%
- \ifnum\count0<10 %
- \edef#1{#1\number\count0}%
- \else
- \advance\count0 by -10 %
- \edef#1{#1\ifcase\count0 A\or B\or C\or D\or E\or F\fi}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\unicoderead, \unicodewrite}
-% Set up the streams for data.
-% \begin{macrocode}
-\newread\unicoderead
-\newwrite\unicodewrite
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Verbatim copying}
-%
-% \begin{macro}{\verbatimcopy}
-% \begin{macro}{\endverbatimcopy}
-% \begin{macro}{\verbatimcopy@auxii}
-% \begin{macro}{\verbatimcopy@auxii}
-% \begin{macro}{\verbatim@endmarker}
-% Set up to read some material verbatim and write it to the output stream.
-% There needs to be a dedicated `clean up first line' macro, but other than
-% that life is simple enough.
-% \begin{macrocode}
-\begingroup
- \catcode`\^^M=12 %
- \gdef\verbatimcopy{%
- \begingroup%
- \catcode`\^^M=12 %
- \catcode`\\=12 %
- \catcode`\{=12 %
- \catcode`\}=12 %
- \catcode`\#=12 %
- \catcode`\%=12 %
- \catcode`\ =12 %
- \endlinechar=`\^^M %
- \verbatimcopy@auxi
- }%
- \gdef\verbatimcopy@auxi#1^^M{%
- \expandafter\verbatimcopy@auxii\gobble#1^^M%
- }%
- \gdef\verbatimcopy@auxii#1^^M{%
- \def\temp{#1}%
- \ifx\temp\verbatim@endmarker%
- \expandafter\endgroup%
- \else%
- \ifx\temp\empty\else%
- \immediate\write\unicodewrite{#1}%
- \fi%
- \expandafter\verbatimcopy@auxii%
- \fi%
- }%
-\endgroup%
-\edef\verbatim@endmarker{\expandafter\gobble\string\\}
-\edef\verbatim@endmarker{\verbatim@endmarker endverbatimcopy}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \section{File header section}
-%
-% With the mechanisms set up, open the data file for writing.
-% \begin{macrocode}
-\immediate\openout\unicodewrite=ltunicode.ltx %
-% \end{macrocode}
-% There are various lines that now need to go at the start of the file.
-% First, there is some header information.
-% \begin{macrocode}
-\verbatimcopy
-%% This is the file `ltunicode.ltx',
-%% generated using the script ltunicode.dtx.
-%%
-%% The data here are derived from the files
-%% - UnicodeData.txt
-%% which are maintained by the Unicode Consortium.
-%%
-%% Copyright 2014
-%% The LaTeX3 Project and any individual authors listed elsewhere
-%% in this file.
-%%
-%% This file is part of the LaTeX base system.
-%% -------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This file has the LPPL maintenance status "maintained".
-%%
-%% The list of all files belonging to the LaTeX base distribution is
-%% given in the file `manifest.txt'. See also `legal.txt' for additional
-%% information.
-\endverbatimcopy
-% \end{macrocode}
-% Automatically include the current date.
-% \begin{macrocode}
-\immediate\write\unicodewrite{%
- \expandafter\gobble\string\%\expandafter\gobble\string\%
- Generated on \the\year-\the\month-\the\day.
-}
-\immediate\write\unicodewrite{%
- \expandafter\gobble\string\%\expandafter\gobble\string\%
-}
-% \end{macrocode}
-%
-% \section{Unicode character data}
-%
-% \begin{macro}{\parseunicodedata}
-% \begin{macro}{\parseunicodedata@auxi}
-% \begin{macro}{\parseunicodedata@auxii}
-% \begin{macro}{\parseunicodedata@auxiii}
-% The first step of parsing a line of data is to check that it's not come
-% from a blank in the source, which will have been tokenized as \cs{par}.
-% Assuming that is not the case, there are lots of data items separated by
-% |;|. Of those, only a few are needed so they are picked out and everything
-% else is dropped.
-% \begin{macrocode}
-\def\parseunicodedata#1{%
- \ifx#1\storedpar
- \else
- \expandafter\parseunicodedata@auxi#1\relax
- \fi
-}
-\def\parseunicodedata@auxi#1;#2;#3;#4;#5;#6;#7;#8;#9;{%
- \parseunicodedata@auxii#1;#3;
-}
-\def\parseunicodedata@auxii#1;#2;#3;#4;#5;#6;#7;#8\relax{%
- \parseunicodedata@auxiii{#1}{#2}{#6}{#7}%
-}
-% \end{macrocode}
-% At this stage we have only four pieces of data
-% \begin{enumerate}
-% \item The code value
-% \item The general class
-% \item The uppercase mapping
-% \item The lowercase mapping
-% \end{enumerate}
-% where both one or both of the last two may be empty. Everything here could
-% be done in a single conditional within a \cs{write}, but that would be
-% tricky to follow. Instead, a series of defined auxiliaries are used to
-% show the flow. Notice that combining marks are treated as letters here
-% (the second `letter' test).
-% \begin{macrocode}
-\def\parseunicodedata@auxiii#1#2#3#4{%
- \if L\firsttoken#2?\relax
- \expandafter\unicodeletter
- \else
- \if M\firsttoken#2?\relax
- \expandafter\expandafter\expandafter\unicodeletter
- \else
- \expandafter\expandafter\expandafter\unicodenonletter
- \fi
- \fi
- {#1}{#3}{#4}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\unicodeletter, \unicodenonletter}
-% \begin{macro}{\writeunicodedata}
-% For `letters', we always want to write the data to file, and the only
-% question here is if the character has case mappings or these point back
-% to the character itself.
-% \begin{macrocode}
-\def\unicodeletter#1#2#3{%
- \writeunicodedata\L{#1}{#2}{#3}%
-}
-% \end{macrocode}
-% Cased non-letters can also exist: they can be detected as they have at
-% least one case mapping. Write these in much the same way as letters.
-% \begin{macrocode}
-\def\unicodenonletter#1#2#3{%
- \ifx\relax#2#3\relax
- \else
- \writeunicodedata\C{#1}{#2}{#3}%
- \fi
-}
-% \end{macrocode}
-% Actually write the data. In all cases both upper- and lower-case mappings
-% are given, so there is a need to test that both were actually available and
-% if not set up to do nothing.
-% \begin{macrocode}
-\def\writeunicodedata#1#2#3#4{%
- \immediate\write\unicodewrite{%
- \space\space
- \string#1\space
- #2 %
- \ifx\relax#3\relax
- #2 %
- \else
- #3 %
- \fi
- \ifx\relax#4\relax
- #2 %
- \else
- #4 %
- \fi
- \expandafter\gobble\string\%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% There is now a lead-in section which creates the macros which take the
-% processed data and do the code assignments. Everything is done within a
-% group so that there is no need to worry about names.
-% \begin{macrocode}
-\verbatimcopy
-\begingroup
-\endverbatimcopy
-% \end{macrocode}
-% Cased non-letters simply need to have the case mappings set.
-% For letters, there are a few things to sort out. First, the case mappings are
-% defined as for non-letters. Category code is then set to $11$ before a check
-% to see if this is an upper case letter. If it is then the \cs{sfcode} is set
-% to $999$. Finally there is a need to deal with Unicode math codes, where base
-% plane letters are class $7$ but supplementary plane letters are class~$1$.
-% Older versions of Xe\TeX{} used a different name here: easy to pick up as
-% we know that this primitive must be defined in some way. There is also an issue
-% with the supplementary plane and older Xe\TeX{} versions, which is dealt with
-% using a check at run time.
-% \begin{macrocode}
-\verbatimcopy
- \def\C#1 #2 #3 {%
- \XeTeXcheck{#1}%
- \global\uccode"#1="#2 %
- \global\lccode"#1="#3 %
- }
- \def\L#1 #2 #3 {%
- \C #1 #2 #3 %
- \catcode"#1=11 %
- \ifnum"#1="#3 %
- \else
- \global\sfcode"#1=999 %
- \fi
- \ifnum"#1<"10000 %
- \global\Umathcode"#1="7"01"#1 %
- \else
- \global\Umathcode"#1="0"01"#1 %
- \fi
- }
- \ifx\Umathcode\undefined
- \let\Umathcode\XeTeXmathcode
- \fi
- \def\XeTeXcheck#1{}
- \ifx\XeTeXversion\undefined
- \else
- \def\XeTeXcheck.#1.#2-#3\relax{#1}
- \ifnum\expandafter\XeTeXcheck\XeTeXrevision.-\relax>996 %
- \def\XeTeXcheck#1{}
- \else
- \def\XeTeXcheck#1{%
- \ifnum"#1>"FFFF %
- \long\def\XeTeXcheck##1\endgroup{\endgroup}
- \expandafter\XeTeXcheck
- \fi
- }
- \fi
- \fi
-\endverbatimcopy
-% \end{macrocode}
-% Read the data and write the resulting code assignments to the file.
-% \begin{macrocode}
-\openin\unicoderead=UnicodeData.txt %
-\ifeof\unicoderead
- \errmessage{Data file missing: UnicodeData.txt}%
-\fi
-\loop\unless\ifeof\unicoderead
- \read\unicoderead to \unicodedataline
- \parseunicodedata\unicodedataline
-\repeat
-% \end{macrocode}
-% End the group for setting character codes and assign a couple of special
-% cases.
-% \begin{macrocode}
-\verbatimcopy
-\endgroup
-\global\sfcode"2019=0 %
-\global\sfcode"201D=0 %
-\endverbatimcopy
-% \end{macrocode}
-% Lua\TeX{} and older versions of Xe\TeX{} stop here: character classes are a
-% Xe\TeX{}-only concept.
-% \begin{macrocode}
-\verbatimcopy
-\ifx\XeTeXcharclass\@undefined
- \expandafter\endinput
-\fi
-\endverbatimcopy
-% \end{macrocode}
-%
-% \section{Xe\TeX{} Character classes}
-%
-% The Xe\TeX{} engine includes the concept of character classes, which allow
-% insertion of tokens into the input stream at defined boundaries. Setting
-% up this data requires a two-part process as the information is split over
-% two input files.
-%
-% \begin{macro}{\parseunicodedata}
-% \begin{macro}{\parseunicodedata@auxi}
-% \begin{macro}{\parseunicodedata@auxii}
-% The parsing system is redefined to parse a detokenized input line which
-% may be a comment starting with |#|. Assuming that is not the case, the
-% data line with start with a code point potentially forming part of a range.
-% The range is extracted and the width stored for each code point.
-% \begin{macrocode}
-\def\parseunicodedata#1{%
- \ifx#1\return
- \else
- \wlog{#1}%
- \if\expandafter\gobble\string\#\expandafter\firsttoken#1?\relax
- \else
- \expandafter\parseunicodedata@auxi#1\relax
- \fi
- \fi
-}
-\def\parseunicodedata@auxi#1;#2 #3\relax{%
- \parseunicodedata@auxii#1....\relax{#2}%
-}
-\def\parseunicodedata@auxii#1..#2..#3\relax#4{%
- \expandafter\gdef\csname EAW@#1\endcsname{#4}%
- \ifx\relax#2\relax
- \else
- \count@="#1 %
- \begingroup
- \loop
- \ifnum\count@<"#2 %
- \advance\count@\@ne
- \sethex\temp{\count@}%
- \expandafter\gdef\csname EAW@\temp\endcsname{#4}%
- \repeat
- \endgroup
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% With the right parser in place, read the data file.
-% \begin{macrocode}
-\openin\unicoderead=EastAsianWidth.txt %
-\ifeof\unicoderead
- \errmessage{Data file missing: EastAsianWidth.txt}%
-\fi
-\loop\unless\ifeof\unicoderead
- \readline\unicoderead to \unicodedataline
- \parseunicodedata\unicodedataline
-\repeat
-% \end{macrocode}
-%
-% \begin{macro}{\parseunicodedata@auxii}
-% \begin{macro}{\parseunicodedata@auxiii}
-% \begin{macro}{\parseunicodedata@auxiv}
-% \begin{macro}{\ID}
-% \begin{macro}{\OP}
-% \begin{macro}{\CL}
-% \begin{macro}{\EX}
-% \begin{macro}{\IS}
-% \begin{macro}{\NS}
-% \begin{macro}{\CM}
-% The final file to read, |LineBreaking.txt|, uses the same format as
-% |EastAsianWidth.txt|. As such, only the final parts of the parser have to be
-% redefined.
-% \begin{macrocode}
-\def\parseunicodedata@auxii#1..#2..#3\relax#4{%
- \parseunicodedata@auxiii{#1}{#4}%
- \ifx\relax#2\relax
- \else
- \count@="#1 %
- \begingroup
- \loop
- \ifnum\count@<"#2 %
- \advance\count@\@ne
- \sethex\temp{\count@}%
- \expandafter\parseunicodedata@auxiii\expandafter{\temp}{#4}%
- \repeat
- \endgroup
- \fi
-}
-% \end{macrocode}
-% Adding data to the processed file depends on two factors: the
-% classification in the line-breaking file and (possibly) the width data
-% too. Any characters of class \texttt{ID} (ideograph) are stored: they
-% always need special treatment. For characters of classes \texttt{OP}
-% (opener), \texttt{CL} (closer), \texttt{EX} (exclamation), \texttt{IS}
-% (infix sep) and \texttt{NS} (non-starter) the data is stored if the
-% character is full, half or wide width. The same is true for
-% \texttt{CM} (combining marks) characters, which need to be transparent
-% to the mechanism.
-% \begin{macrocode}
-\def\parseunicodedata@auxiii#1#2{%
- \ifcsname #2\endcsname
- \ifnum\csname #2\endcsname=1 %
- \parseunicodedata@auxiv{#1}{#2}%
- \else
- \ifnum 0%
- \if F\csname EAW@#1\endcsname 1\fi
- \if H\csname EAW@#1\endcsname 1\fi
- \if W\csname EAW@#1\endcsname 1\fi
- >0 %
- \parseunicodedata@auxiv{#1}{#2}%
- \fi
- \fi
- \fi
-}
-\def\parseunicodedata@auxiv#1#2{%
- \immediate\write\unicodewrite{%
- \space\space
- \expandafter\string\csname #2\endcsname
- \space
- #1 %
- \expandafter\gobble\string\%
- }%
-}
-\def\ID{1}
-\def\OP{2}
-\def\CL{3}
-\let\EX\CL
-\let\IS\CL
-\let\NS\CL
-\def\CM{256}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% Before actually reading the line breaking data file, the appropriate
-% temporary code is added to the output. As described above, only a limited
-% number of classes need to be covered: they are hard-coded as classes
-% $1$, $2$ and $3$ following the convention adopted by plain Xe\TeX{}.
-% \begin{macrocode}
-\verbatimcopy
-\begingroup
- \def\ID#1 {\global\XeTeXcharclass"#1=1 \global\catcode"#1=11 }
- \def\OP#1 {\global\XeTeXcharclass"#1=2 }
- \def\CL#1 {\global\XeTeXcharclass"#1=3 }
- \def\EX#1 {\global\XeTeXcharclass"#1=3 }
- \def\IS#1 {\global\XeTeXcharclass"#1=3 }
- \def\NS#1 {\global\XeTeXcharclass"#1=3 }
- \def\CM#1 {\global\XeTeXcharclass"#1=256 }
-\endverbatimcopy
-% \end{macrocode}
-%
-% Read the line breaking data and save to the output.
-% \begin{macrocode}
-\openin\unicoderead=LineBreak.txt %
-\ifeof\unicoderead
- \errmessage{Data file missing: LineBreak.txt}%
-\fi
-\loop\unless\ifeof\unicoderead
- \readline\unicoderead to \unicodedataline
- \parseunicodedata\unicodedataline
-\repeat
-% \end{macrocode}
-%
-% Set up material to be inserted between character classes. Other than
-% using \cs{hspace} here in place of \cs{hskip} this code is identical to
-% that provided by plain Xe\TeX{}.
-% \begin{macrocode}
-\verbatimcopy
-\endgroup
-\gdef\xtxHanGlue{\hspace{0pt plus 0.1em}}
-\gdef\xtxHanSpace{\hspace{0.2em plus 0.2em minus 0.1em}}
-\global\XeTeXinterchartoks 0 1 = {\xtxHanSpace}
-\global\XeTeXinterchartoks 0 2 = {\xtxHanSpace}
-\global\XeTeXinterchartoks 0 3 = {\nobreak\xtxHanSpace}
-\global\XeTeXinterchartoks 1 0 = {\xtxHanSpace}
-\global\XeTeXinterchartoks 2 0 = {\nobreak\xtxHanSpace}
-\global\XeTeXinterchartoks 3 0 = {\xtxHanSpace}
-\global\XeTeXinterchartoks 1 1 = {\xtxHanGlue}
-\global\XeTeXinterchartoks 1 2 = {\xtxHanGlue}
-\global\XeTeXinterchartoks 1 3 = {\nobreak\xtxHanGlue}
-\global\XeTeXinterchartoks 2 1 = {\nobreak\xtxHanGlue}
-\global\XeTeXinterchartoks 2 2 = {\nobreak\xtxHanGlue}
-\global\XeTeXinterchartoks 2 3 = {\xtxHanGlue}
-\global\XeTeXinterchartoks 3 1 = {\xtxHanGlue}
-\global\XeTeXinterchartoks 3 2 = {\xtxHanGlue}
-\global\XeTeXinterchartoks 3 3 = {\nobreak\xtxHanGlue}
-\endverbatimcopy
-% \end{macrocode}
-%
-% Done: end the script.
-% \begin{macrocode}
-\bye
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</script>
-% \end{macrocode} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
index 4f63da38cfb..a5dccfde3e7 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
@@ -80,8 +80,8 @@
%% -----------------------------------------------------------------------
\def\ExplFileName{expl3}
\def\ExplFileDescription{L3 programming layer}
-\def\ExplFileDate{2015/01/29}
-\def\ExplFileVersion{5502}
+\def\ExplFileDate{2015/02/13}
+\def\ExplFileVersion{5524}
\begingroup
\def\next{\endgroup}
\expandafter\ifx\csname PackageError\endcsname\relax
@@ -15974,7 +15974,7 @@
%%
%% -----------------------------------------------------------------------
%%
-\GetIdInfo$Id: l3candidates.dtx 5499 2015-01-27 14:33:48Z joseph $
+\GetIdInfo$Id: l3candidates.dtx 5523 2015-02-12 22:10:34Z joseph $
{L3 Experimental additions to l3kernel}
\group_begin:
\tex_lccode:D `? = `: \scan_stop:
@@ -17018,6 +17018,10 @@
#1 #2 \l__tl_internal_a_tl
}
}
+\cs_generate_variant:Nn \str_case:nnF { nV , nv }
+\cs_generate_variant:Nn \str_case:nnTF { nv }
+\cs_generate_variant:Nn \tl_if_blank:nTF { f }
+\cs_generate_variant:Nn \tl_if_head_eq_catcode:nNTF { o }
\cs_new_nopar:Npn \tl_lower_case:n { \__tl_change_case:nnn { lower } { } }
\cs_new_nopar:Npn \tl_upper_case:n { \__tl_change_case:nnn { upper } { } }
\cs_new_nopar:Npn \tl_mixed_case:n { \__tl_mixed_case:nn { } }
@@ -17040,11 +17044,35 @@
}
#1 \q_recursion_stop
}
-\cs_new:Npn \__tl_change_case_N_type:Nwnn #1#2 \q_recursion_stop #3#4
+\cs_new:Npn \__tl_change_case_N_type:Nwnn #1#2 \q_recursion_stop
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nnn }
+ \exp_after:wN \__tl_change_case_N_type:NNN
+ \exp_after:wN #1 \l_tl_case_change_math_tl
+ \q_recursion_tail ? \q_recursion_stop {#2}
+ }
+\cs_new:Npn \__tl_change_case_N_type:NNN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \__tl_change_case_N_type:Nnnn #1 }
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \__tl_change_case_math:NNNn #1 #3
+ \__tl_change_case_loop:wnn
+ }
+ }
+ { \__tl_change_case_N_type:NNN #1 }
+ }
+\cs_new:Npn \__tl_change_case_N_type:Nnnn #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nn }
\token_if_cs:NTF #1
- { \exp_not:N #1 }
+ {
+ \__tl_change_case_cs:Nnnn #1 {#3}
+ { }
+ { \__tl_change_case_cs:N #1 }
+ }
{
\cs_if_exist_use:cF { __tl_change_case_ #3 _ #4 :Nnn }
{ \use_iii:nnn }
@@ -17060,10 +17088,13 @@
}
\__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
}
-\cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop
+\cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
{
- { \exp_not:n {#1} }
- \__tl_change_case_loop:wnn #2 \q_recursion_stop
+ {
+ \__tl_change_case_loop:wnn #1
+ \q_recursion_tail \q_recursion_stop {#3} {#4}
+ }
+ \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
}
\exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_space:wnn \c_space_tl
{
@@ -17072,10 +17103,135 @@
}
\cs_new:Npn \__tl_change_case_char:NNNNNNNNn #1#2#3#4#5#6#7#8#9
{
- \exp_args:NNv \str_case:nnF #8
+ \str_case:nvF #8
{ c__tl_ #9 _ #6 _X_ #7 _tl }
- { \exp_not:N #8 }
+ { \exp_not:n {#8} }
+ }
+\cs_new:Npn \__tl_change_case_math:NNNn #1#2#3#4
+ {
+ \exp_not:n {#1}
+ \__tl_change_case_math_loop:wNN #4 \q_recursion_stop #2 #3
+ }
+\cs_new:Npn \__tl_change_case_math_loop:wNN #1 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#1}
+ { \__tl_change_case_math:NwNN }
+ {
+ \tl_if_head_is_group:nTF {#1}
+ { \__tl_change_case_math_group:nwNN }
+ { \__tl_change_case_math_space:wNN }
+ }
+ #1 \q_recursion_stop
+ }
+\cs_new:Npn \__tl_change_case_math:NwNN #1#2 \q_recursion_stop #3#4
+ {
+ \token_if_eq_meaning:NNTF \q_recursion_tail #1
+ { #4 \q_recursion_tail \q_recursion_stop }
+ {
+ \exp_not:n {#1}
+ \token_if_eq_meaning:NNTF #1 #3
+ { #4 #2 \q_recursion_stop }
+ { \__tl_change_case_math_loop:wNN #2 \q_recursion_stop #3#4 }
+ }
}
+\cs_new:Npn \__tl_change_case_math_group:nwNN #1#2 \q_recursion_stop
+ {
+ { \exp_not:n {#1} }
+ \__tl_change_case_math_loop:wNN #2 \q_recursion_stop
+ }
+\exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_math_space:wNN \c_space_tl
+ {
+ \c_space_tl
+ \__tl_change_case_math_loop:wNN
+ }
+\cs_new:Npn \__tl_change_case_cs:Nnnn #1#2
+ {
+ \exp_args:Nf \__tl_change_case_cs:nNnnn
+ { \cs_to_str:N #1 } #1 {#2}
+ }
+\cs_new:Npn \__tl_change_case_cs:nNnnn #1#2#3
+ {
+ \tl_if_head_eq_catcode:oNTF { \use_none:nnn #1 a a a a } a
+ { \__tl_change_case_cs_type:Nnnnn #2 { latin } {#3} }
+ {
+ \str_if_eq_x:nnTF
+ { \__tl_change_case_cs_three:w #1 \q_nil }
+ { \str_if_eq:nnTF {#3} { lower } { CYR } { cyr } }
+ { \__tl_change_case_cs_cyr:NnNNNNw #2 {#3} #1 \q_stop }
+ {
+ \str_if_eq_x:nnTF
+ { \__tl_change_case_cs_three:w #1 \q_nil }
+ { acc }
+ { \__tl_change_case_cs_type:Nnnnn #2 { acc } {#3} }
+ {
+ \str_if_eq_x:nnTF
+ { \__tl_change_case_cs_four:w #1 \q_nil }
+ { text }
+ { \__tl_change_case_cs_type:Nnnnn #2 { greek } {#3} }
+ { \__tl_change_case_cs_type:Nnnnn #2 { misc } {#3} }
+ }
+ }
+ }
+ }
+\cs_new:Npn \__tl_change_case_cs_three:w #1#2#3#4 \q_nil { #1#2#3 }
+\cs_new:Npn \__tl_change_case_cs_four:w #1#2#3#4#5 \q_nil { #1#2#3#4 }
+\cs_new:Npn \__tl_change_case_cs_type:Nnnnn #1#2#3
+ {
+ \str_case:nvTF #1
+ { c__tl_change_case_ #2 _ #3 _ tl }
+ }
+\cs_new:Npn \__tl_change_case_cs_cyr:NnNNNNw #1#2#3#4#5#6#7 \q_stop
+ {
+ \__tl_change_case_cs_type:Nnnnn #1
+ { cyrillic }
+ {
+ #2 _
+ \int_to_roman:n
+ {
+ 1 +
+ \int_div_truncate:nn
+ {
+ `#6 - \str_if_eq:nnTF {#2} { lower } { `A } { `a }
+ }
+ { 7 }
+ }
+ }
+ }
+\cs_new:Npn \__tl_change_case_cs:N #1
+ {
+ \exp_after:wN \__tl_change_case_cs:NN
+ \exp_after:wN #1 \l_tl_case_change_exclude_tl
+ \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \__tl_change_case_cs:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \__tl_change_case_cs_expand:N #1 }
+ \str_if_eq:nnTF {#1} {#2}
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ { \__tl_change_case_cs:NNn #1 }
+ }
+ { \__tl_change_case_cs:NN #1 }
+ }
+\cs_new:Npn \__tl_change_case_cs:NNn #1#2#3
+ {
+ \exp_not:n { #1 {#3} }
+ #2
+ }
+\cs_new:Npn \__tl_change_case_cs_expand:N #1
+ {
+ \bool_if:nTF
+ {
+ \token_if_expandable_p:N #1
+ && ! \token_if_protected_macro_p:N #1
+ && ! \token_if_protected_long_macro_p:N #1
+ }
+ { \__tl_change_case_cs_expand:NN #1 }
+ { \exp_not:n {#1} }
+ }
+\cs_new:Npn \__tl_change_case_cs_expand:NN #1#2
+ { \exp_after:wN #2 #1 }
\cs_new:Npn \__tl_change_case_lower_sigma:Nnn #1#2
{
\int_compare:nNnTF { `#1 } = { "03A3 }
@@ -17098,18 +17254,18 @@
{ \c__tl_std_sigma_tl }
}
{
- \exp_after:wN \__tl_change_case_lower_sigma_loop:Nw
- \exp_after:wN #1 \c__tl_after_final_sigma_clist
- , \q_recursion_tail , \q_recursion_stop
+ \exp_after:wN \__tl_change_case_lower_sigma_loop:NN
+ \exp_after:wN #1 \l_tl_case_change_after_final_sigma_tl
+ \q_recursion_tail \q_recursion_stop
}
}
-\cs_new:Npn \__tl_change_case_lower_sigma_loop:Nw #1#2 ,
+\cs_new:Npn \__tl_change_case_lower_sigma_loop:NN #1#2
{
\quark_if_recursion_tail_stop_do:nn {#2}
{ \c__tl_std_sigma_tl }
- \int_compare:nNnT { `#1 } = { "#2 }
+ \int_compare:nNnT { `#1 } = { `#2 }
{ \use_i_delimit_by_q_recursion_stop:nw { \c__tl_final_sigma_tl } }
- \__tl_change_case_lower_sigma_loop:Nw #1
+ \__tl_change_case_lower_sigma_loop:NN #1
}
\cs_new_eq:NN \__tl_change_case_upper_sigma:Nnn \use_iii:nnn
\cs_new_eq:NN \__tl_change_case_mixed_sigma:Nnn \use_iii:nnn
@@ -17129,11 +17285,41 @@
}
#1 \q_recursion_stop
}
-\cs_new:Npn \__tl_mixed_case_N_type:Nwn #1#2 \q_recursion_stop #3
+\cs_new:Npn \__tl_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
{
\quark_if_recursion_tail_stop_do:Nn #1 { \use_none:nn }
+ \exp_after:wN \__tl_mixed_case_N_type:NNN
+ \exp_after:wN #1 \l_tl_case_change_math_tl
+ \q_recursion_tail ? \q_recursion_stop {#2}
+ }
+\cs_new:Npn \__tl_mixed_case_N_type:NNN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \__tl_mixed_case_N_type:Nnn #1 }
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \__tl_change_case_math:NNNn #1 #3
+ \__tl_mixed_case_loop:wn
+ }
+ }
+ { \__tl_mixed_case_N_type:NNN #1 }
+ }
+\cs_new:Npn \__tl_mixed_case_N_type:Nnn #1#2#3
+ {
\token_if_cs:NTF #1
- { \exp_not:N #1 }
+ {
+ \__tl_change_case_cs:Nnnn #1 { upper }
+ {
+ \__tl_change_case_loop:wnn
+ #2 \q_recursion_stop { lower } {#3}
+ }
+ {
+ \__tl_change_case_cs:N #1
+ \__tl_mixed_case_loop:wn #2 \q_recursion_stop {#3}
+ }
+ }
{
\cs_if_exist_use:cF { __tl_change_case_mixed_ #3 :Nnn }
{
@@ -17142,11 +17328,11 @@
}
#1 {#2}
{
- \exp_after:wN \__tl_mixed_case_skip:Nwn \exp_after:wN #1
- \c__tl_mixed_skip_clist , \q_recursion_tail ,
- \q_recursion_stop
+ \exp_after:wN \__tl_mixed_case_skip:NNn
+ \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
+ \q_recursion_tail \q_recursion_stop
{
- \exp_args:NNV \str_case:nnF #1 \c__tl_mixed_exceptions_tl
+ \str_case:nVF #1 \c__tl_mixed_exceptions_tl
{
\exp_after:wN \__tl_change_case_char:NNNNNNNNn
\int_use:N
@@ -17155,13 +17341,13 @@
}
}
}
+ \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
}
- \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
}
-\cs_new:Npn \__tl_mixed_case_skip:Nwn #1#2 ,
+\cs_new:Npn \__tl_mixed_case_skip:NNn #1#2
{
\quark_if_recursion_tail_stop_do:nn {#2} { \use:n }
- \int_compare:nNnT { `#1 } = { "#2 }
+ \int_compare:nNnT { `#1 } = { `#2 }
{
\use_i_delimit_by_q_recursion_stop:nw
{
@@ -17169,16 +17355,23 @@
\__tl_mixed_case_skip_tidy:nNwn
}
}
- \__tl_mixed_case_skip:Nwn #1
+ \__tl_mixed_case_skip:NNn #1
}
\cs_new:Npn \__tl_mixed_case_skip_tidy:nNwn #1#2#3 \q_recursion_stop #4
{
\__tl_mixed_case_loop:wn #3 \q_recursion_stop
}
-\cs_new:Npn \__tl_mixed_case_group:nwn #1#2 \q_recursion_stop
+\cs_new:Npn \__tl_mixed_case_group:nwn #1#2 \q_recursion_stop #3
{
- { \exp_not:n {#1} }
- \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower }
+ \tl_if_blank:fTF {#1}
+ { { } \__tl_mixed_case_loop:wn #2 \q_recursion_stop {#3} }
+ {
+ {
+ \__tl_mixed_case_loop:wn #1
+ \q_recursion_tail \q_recursion_stop {#3}
+ }
+ \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
+ }
}
\exp_last_unbraced:NNo \cs_new:Npn \__tl_mixed_case_space:wn \c_space_tl
{
@@ -17224,7 +17417,7 @@
{ \__tl_change_case_upper_tr:Nnn }
\cs_new:Npn \__tl_change_case_lower_lt:Nnn #1#2#3
{
- \exp_args:NNV \str_case:nnF #1 \c__tl_accents_lt_tl
+ \str_case:nVF #1 \c__tl_accents_lt_tl
{
#3
\bool_if:nT
@@ -17300,6 +17493,279 @@
\use_i:nn
}
}
+\tl_new:N \l_tl_case_change_math_tl
+\tl_set:Nn \l_tl_case_change_math_tl
+ { $ $ \( \) }
+\tl_new:N \l_tl_case_change_exclude_tl
+\tl_set:Nn \l_tl_case_change_exclude_tl
+ { \cite \ensuremath \label \ref }
+\tl_new:N \l_tl_case_change_after_final_sigma_tl
+\tl_set:Nx \l_tl_case_change_after_final_sigma_tl
+ { % (
+ ) % [
+ ] % \{
+ \cs_to_str:N \}
+ . : ; ,
+ ! ? ' "
+ }
+\tl_new:N \l_tl_mixed_case_ignore_tl
+\tl_set:Nx \l_tl_mixed_case_ignore_tl
+ {
+ ( % )
+ [ % ]
+ \cs_to_str:N \{ % \}
+ `
+ -
+ }
+\group_begin:
+ \cs_set_protected:Npn \__tl_change_case_setup:nnnn #1#2#3#4
+ {
+ \tl_const:cx { c__tl_change_case_ #1 _upper #2 _tl }
+ {
+ \__tl_change_case_map:NN
+ #3 \q_recursion_tail ? \q_recursion_stop
+ }
+ \tl_const:cx { c__tl_change_case_ #1 _lower #2 _tl }
+ {
+ \__tl_change_case_map:NNN #4
+ #3 \q_recursion_tail ? \q_recursion_stop
+ }
+ }
+ \cs_set:Npn \__tl_change_case_map:NN #1#2
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \exp_not:N #1 \exp_not:n { { \exp_not:n {#2} } }
+ \__tl_change_case_map:NN
+ }
+ \cs_set:Npn \__tl_change_case_map:NNN #1#2#3
+ {
+ \str_if_eq:nnT {#1} {#2}
+ { \use_none_delimit_by_q_recursion_stop:w }
+ \exp_not:N #3 \exp_not:n { { \exp_not:n {#2} } }
+ \__tl_change_case_map:NNN #1
+ }
+ \__tl_change_case_setup:nnnn
+ { latin }
+ { }
+ {
+ \aa \AA
+ \ae \AE
+ \dh \DH
+ \dj \DJ
+ \l \L
+ \ng \NG
+ \o \O
+ \oe \OE
+ \ss \SS
+ \th \TH
+ \i I
+ \j J
+ }
+ { \i }
+ \__tl_change_case_setup:nnnn
+ { cyrillic }
+ { _i }
+ {
+ \cyra \CYRA
+ \cyrabhch \CYRABHCH
+ \cyrabhchdsc \CYRABHCHDSC
+ \cyrabhdze \CYRABHDZE
+ \cyrabhha \CYRABHHA
+ \cyrae \CYRAE
+ \cyrb \CYRB
+ \cyrbyus \CYRBYUS
+ \cyrc \CYRC
+ \cyrch \CYRCH
+ \cyrchldsc \CYRCHLDSC
+ \cyrchrdsc \CYRCHRDSC
+ \cyrchvcrs \CYRCHVCRS
+ \cyrd \CYRD
+ \cyrdelta \CYRDELTA
+ \cyrdje \CYRDJE
+ \cyrdze \CYRDZE
+ \cyrdzhe \CYRDZHE
+ \cyre \CYRE
+ \cyreps \CYREPS
+ \cyrerev \CYREREV
+ \cyrery \CYRERY
+ \cyrf \CYRF
+ \cyrfita \CYRFITA
+ \cyrg \CYRG
+ \cyrgdsc \CYRGDSC
+ \cyrgdschcrs \CYRGDSCHCRS
+ \cyrghcrs \CYRGHCRS
+ \cyrghk \CYRGHK
+ \cyrgup \CYRGUP
+ }
+ { \q_recursion_tail }
+ \__tl_change_case_setup:nnnn
+ { cyrillic }
+ { _ii }
+ {
+ \cyrh \CYRH
+ \cyrhdsc \CYRHDSC
+ \cyrhhcrs \CYRHHCRS
+ \cyrhhk \CYRHHK
+ \cyrhrdsn \CYRHRDSN
+ \cyri \CYRI
+ \cyrie \CYRIE
+ \cyrii \CYRII
+ \cyrishrt \CYRISHRT
+ \cyrishrtdsc \CYRISHRTDSC
+ \cyrizh \CYRIZH
+ \cyrje \CYRJE
+ \cyrk \CYRK
+ \cyrkbeak \CYRKBEAK
+ \cyrkdsc \CYRKDSC
+ \cyrkhcrs \CYRKHCRS
+ \cyrkhk \CYRKHK
+ \cyrkvcrs \CYRKVCRS
+ \cyrl \CYRL
+ \cyrldsc \CYRLDSC
+ \cyrlhk \CYRLHK
+ \cyrlje \CYRLJE
+ \cyrm \CYRM
+ \cyrmdsc \CYRMDSC
+ \cyrmhk \CYRMHK
+ \cyrn \CYRN
+ \cyrndsc \CYRNDSC
+ \cyrng \CYRNG
+ \cyrnhk \CYRNHK
+ \cyrnje \CYRNJE
+ \cyrnlhk \CYRNLHK
+ }
+ { \q_recursion_tail }
+ \__tl_change_case_setup:nnnn
+ { cyrillic }
+ { _iii }
+ {
+ \cyro \CYRO
+ \cyrotld \CYROTLD
+ \cyrp \CYRP
+ \cyrphk \CYRPHK
+ \cyrq \CYRQ
+ \cyrr \CYRR
+ \cyrrdsc \CYRRDSC
+ \cyrrhk \CYRRHK
+ \cyrrtick \CYRRTICK
+ \cyrs \CYRS
+ \cyrsacrs \CYRSACRS
+ \cyrschwa \CYRSCHWA
+ \cyrsdsc \CYRSDSC
+ \cyrsemisftsn \CYRSEMISFTSN
+ \cyrsftsn \CYRSFTSN
+ \cyrsh \CYRSH
+ \cyrshch \CYRSHCH
+ \cyrshha \CYRSHHA
+ \cyrt \CYRT
+ \cyrtdsc \CYRTDSC
+ \cyrtetse \CYRTETSE
+ \cyrtshe \CYRTSHE
+ \cyru \CYRU
+ \cyrushrt \CYRUSHRT
+ }
+ { \q_recursion_tail }
+ \__tl_change_case_setup:nnnn
+ { cyrillic }
+ { _iv }
+ {
+ \cyrv \CYRV
+ \cyrw \CYRW
+ \cyry \CYRY
+ \cyrya \CYRYA
+ \cyryat \CYRYAT
+ \cyryhcrs \CYRYHCRS
+ \cyryi \CYRYI
+ \cyryo \CYRYO
+ \cyryu \CYRYU
+ \cyrz \CYRZ
+ \cyrzdsc \CYRZDSC
+ \cyrzh \CYRZH
+ \cyrzhdsc \CYRZHDSC
+ }
+ { \q_recursion_tail }
+ \__tl_change_case_setup:nnnn
+ { greek }
+ { }
+ {
+ \textalpha \textAlpha
+ \textbeta \textBeta
+ \textchi \textChi
+ \textdelta \textDelta
+ \textdigamma \textDigamma
+ \texteta \textEta
+ \textepsilon \textEpsilon
+ \textgamma \textGamma
+ \textiota \textIota
+ \textkappa \textKappa
+ \textlambda \textLambda
+ \textmu \textMu
+ \textnu \textNu
+ \textomega \textOmega
+ \textomicron \textOmicron
+ \textphi \textPhi
+ \textpi \textPi
+ \textpsi \textPsi
+ \textqoppa \textQoppa
+ \textrho \textRho
+ \textsampi \textSampi
+ \textautosigma \textSigma
+ \textstigma \textStigma
+ \texttheta \textTheta
+ \texttau \textTau
+ \textupsilon \textUpsilon
+ \textxi \textXi
+ \textzeta \textZeta
+ \textsigma \textSigma
+ \textvarsigma \textSigma
+ \textvarstigma \textStigma
+ }
+ { \textsigma }
+ \tl_const:Nn \c__tl_change_case_acc_upper_tl
+ {
+ \accdasia { \exp_not:n { \LGR@accdropped } }
+ \accdasiaoxia { \exp_not:n { \LGR@hiatus } }
+ \accdasiavaria { \exp_not:n { \LGR@accdropped } }
+ \accdasiaperispomeni { \exp_not:n { \LGR@accdropped } }
+ \accpsili { \exp_not:n { \LGR@hiatus } }
+ \accpsilioxia { \exp_not:n { \LGR@hiatus } }
+ \accpsilivaria { \exp_not:n { \LGR@hiatus } }
+ \accpsiliperispomeni { \exp_not:n { \LGR@accdropped } }
+ \acctonos { \exp_not:n { \LGR@hiatus } }
+ \accvaria { \exp_not:n { \LGR@accdropped } }
+ \accdialytikatonos { \exp_not:n { \LGR@accDialytika } }
+ \accdialytikavaria { \exp_not:n { \LGR@accDialytika } }
+ \accdialytikaperispomeni { \exp_not:n { \LGR@accDialytika } }
+ \accperispomeni { \exp_not:n { \LGR@accdropped } }
+ }
+ \tl_const:Nn \c__tl_change_case_acc_lower_tl { }
+ \tl_const:Nn \c__tl_change_case_misc_upper_tl
+ {
+ \ypogegrammeni { \exp_not:n { \prosgegrammeni } }
+ \abreve { \exp_not:n { \Abreve } }
+ \acircumflex { \exp_not:n { \Acircumflex } }
+ \ecircumflex { \exp_not:n { \Ecircumflex } }
+ \ocircumflex { \exp_not:n { \Ocircumflex } }
+ \ohorn { \exp_not:n { \Ohorn } }
+ \uhorn { \exp_not:n { \Uhorn } }
+ }
+ \tl_const:Nn \c__tl_change_case_misc_lower_tl
+ {
+ \prosgegrammeni { \exp_not:n { \ypogegrammeni } }
+ \Abreve { \exp_not:n { \abreve } }
+ \Acircumflex { \exp_not:n { \acircumflex } }
+ \Ecircumflex { \exp_not:n { \ecircumflex } }
+ \Ocircumflex { \exp_not:n { \ocircumflex } }
+ \Ohorn { \exp_not:n { \ohorn } }
+ \Uhorn { \exp_not:n { \uhorn } }
+ \ABREVE { \exp_not:n { \abreve } }
+ \ACIRCUMFLEX { \exp_not:n { \acircumflex } }
+ \ECIRCUMFLEX { \exp_not:n { \ecircumflex } }
+ \OCIRCUMFLEX { \exp_not:n { \ocircumflex } }
+ \OHORN { \exp_not:n { \ohorn } }
+ \UHORN { \exp_not:n { \uhorn } }
+ }
+\group_end:
\cs_new_protected:Npn \tl_log:N #1
{
\tl_if_exist:NTF #1
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
index e69fa25f307..28d8e2273fe 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
@@ -47,8 +47,8 @@
%% -----------------------------------------------------------------------
\def\ExplFileName{expl3}
\def\ExplFileDescription{L3 programming layer}
-\def\ExplFileDate{2015/01/29}
-\def\ExplFileVersion{5502}
+\def\ExplFileDate{2015/02/13}
+\def\ExplFileVersion{5524}
\let\ExplLoaderFileVersion\ExplFileVersion
\begingroup
\def\tempa{LaTeX2e}
@@ -79,7 +79,6 @@
}
\expandafter\edef\csname ver@\ExplFileName -generic.tex\endcsname
{\ExplFileDate\space v\ExplFileVersion\space \ExplFileDescription}
-\input ifpdf.sty %
\expandafter\edef\csname l@expl@tidy@tl\endcsname
{%
\catcode64=\the\catcode64\relax
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
index 19c332a11c9..97b1d19317d 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
@@ -47,8 +47,8 @@
%% -----------------------------------------------------------------------
\def\ExplFileName{expl3}
\def\ExplFileDescription{L3 programming layer}
-\def\ExplFileDate{2015/01/29}
-\def\ExplFileVersion{5502}
+\def\ExplFileDate{2015/02/13}
+\def\ExplFileVersion{5524}
\let\ExplLoaderFileVersion\ExplFileVersion
\ProvidesPackage{\ExplFileName}
[%
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def b/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def
index c2629626578..3a0688f5d45 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def
@@ -7,13 +7,9 @@
%% - CaseFolding.txt
%% which are maintained by the Unicode Consortium.
%%
-%% Generated on 2014-11-23.
+%% Generated on 2015-02-12.
%%
-\ProvidesExplFile {l3unicode-data.def} {2014/11/23} {5465} {L3 Unicode data}
-\clist_const:Nn \c__tl_after_final_sigma_clist
- { 0021 , 0022 , 0029 , 002C , 002E , 003A , 003B , 003F , 005D , 007D }
-\clist_const:Nn \c__tl_mixed_skip_clist
- { 0028 , 005B , 0060 , 007B }
+\ProvidesExplFile {l3unicode-data.def} {2015/02/12} {5523} {L3 Unicode data}
\pdftex_if_engine:T
{
\group_begin: