From db0facd61cf60ed3452c300b54f11c0524a50a53 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 29 Jul 2015 20:47:01 +0000 Subject: l3 (29jul15) git-svn-id: svn://tug.org/texlive/trunk@37997 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/latex/l3experimental/l3sort/l3sort.dtx | 6 +- .../source/latex/l3experimental/l3str/l3flag.dtx | 6 +- .../source/latex/l3experimental/l3str/l3regex.dtx | 6 +- .../latex/l3experimental/l3str/l3str-expl.dtx | 6 +- .../latex/l3experimental/l3str/l3tl-build.dtx | 6 +- .../latex/l3experimental/xgalley/l3galley.dtx | 68 ++++++++------- Master/texmf-dist/source/latex/l3kernel/expl3.dtx | 6 +- .../source/latex/l3kernel/l3candidates.dtx | 17 +++- Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 43 ++++++++-- .../source/latex/l3kernel/l3fp-logic.dtx | 6 +- Master/texmf-dist/source/latex/l3kernel/l3keys.dtx | 53 ++++++++---- .../texmf-dist/source/latex/l3kernel/l3names.dtx | 10 ++- Master/texmf-dist/source/latex/l3kernel/l3seq.dtx | 98 +++++++++++++++++++++- .../source/latex/l3kernel/l3unicode-data.dtx | 62 +++++++------- .../source/latex/l3packages/l3keys2e/l3keys2e.dtx | 6 +- .../source/latex/l3packages/xparse/xparse.dtx | 6 +- .../latex/l3packages/xtemplate/xtemplate.dtx | 6 +- 17 files changed, 290 insertions(+), 121 deletions(-) (limited to 'Master/texmf-dist/source') diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx index 87c63f0f95f..6d0cae589b0 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx @@ -37,8 +37,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3sort}{Support package l3kernel too old} @@ -50,7 +50,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3sort.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3sort.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental sorting functions} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx index 8ccddada68e..d48b641bb3b 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx @@ -36,8 +36,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3flag}{Support package l3kernel too old} @@ -49,7 +49,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3flag.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3flag.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental flags} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx index 5ba6268acbe..10bb159803f 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx @@ -36,8 +36,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3regex}{Support package l3kernel too old} @@ -49,7 +49,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3regex.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3regex.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental regular expressions} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx index f6e5f958c6f..58e6b1b7706 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx @@ -36,8 +36,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3str}{Support package l3kernel too old} @@ -49,7 +49,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3str-expl.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3str-expl.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental strings} \def\ExplFileName{l3str} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx index 7f98dd7eec4..0ef1f967d53 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx @@ -36,8 +36,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3tl-build}{Support package l3kernel too old} @@ -49,7 +49,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3tl-build.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3tl-build.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental token list construction} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index 16b7694578c..90441e87e97 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -38,8 +38,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3galley}{Support package l3kernel too old} @@ -51,7 +51,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3galley.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3galley.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental galley code} % %<*driver> @@ -1472,26 +1472,37 @@ % \end{verbatim} % and so anything applied here must be done globally. % -% \begin{macro}[int]{\@@_start_paragraph_std:} +% \begin{macro}[int]{\@@_start_paragraph_common:N} +% Share some code between all types of paragraph start. % The routine at the start of a paragraph starts by removing any % (empty) indent box from the vertical list. As there may be vertical -% mode items still to insert, a \cs{tex_par:D} primitive is used to +% mode items still to insert (|#1|), a \cs{tex_par:D} primitive is used to % get back into vertical mode before they are tidied up. To get back % again to horizontal mode, \cs{tex_noindent:D} can be used. To avoid % an infinite loop, \cs{tex_everypar:D} is locally cleared before doing -% that. Back in horizontal mode, the horizontal mode items can be -% tidied up before sorting out any items which have been set on a -% single-paragraph basis. +% that. % \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_start_paragraph_std: +\cs_new_protected:Npn \@@_start_paragraph_common:N #1 { \group_begin: \box_gset_to_last:N \g_@@_last_box \tex_par:D - \@@_insert_vertical_items: + #1 \tex_everypar:D { } \tex_noindent:D \group_end: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_start_paragraph_std:} +% After dealign with the common items, the horizontal mode items can be +% tidied up before sorting out any items which have been set on a +% single-paragraph basis. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_start_paragraph_std: + { + \@@_start_paragraph_common:N \@@_insert_vertical_items: \@@_insert_horizontal_items: \@@_restore_running_parameters: } @@ -1499,31 +1510,32 @@ % \end{macro} % % \begin{macro}[int]{\@@_start_paragraph_first:} +% \begin{macro}[aux]{\@@_insert_vspace_first:} % For the very first paragraph in a galley, the code needs to avoid % adding any unnecessary vertical items at the top as it will interfere with -% vertical positioning in \cs{tex_vtop:D}. +% vertical positioning in \cs{tex_vtop:D}. That requirement also means we +% must not add any vertical space as the start of the box unless there +% is a user space to insert. % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_start_paragraph_first: { \bool_gset_false:N \g_@@_begin_level_bool \mode_if_horizontal:TF - { - \group_begin: - \box_gset_to_last:N \g_@@_last_box - \tex_par:D - \@@_insert_vspace: - \tex_everypar:D { } - \tex_noindent:D - \group_end: - } - { \@@_insert_vspace: } + { \@@_start_paragraph_common:N \@@_insert_vspace_first: } + { \@@_insert_vspace_first: } \@@_insert_horizontal_items: \@@_restore_running_parameters: } +\cs_new_protected_nopar:Npn \@@_insert_vspace_first: + { + \tl_if_empty:NF \g_@@_interpar_vspace_user_tl + { \skip_vertical:n { \g_@@_interpar_vspace_user_tl } } + } % \end{macrocode} % \end{macro} +% \end{macro} % -% \begin{macro}[int]{\@@_insert_vertical_items, \@@_insert_vspace:} +% \begin{macro}[int]{\@@_insert_vertical_items} % The aim here is to insert the vertical items such that they attach to % the correct place. This function is used as part of the \cs{tex_everypar:D} % mechanism, meaning that the immediately-preceding item on the vertical @@ -1532,7 +1544,8 @@ % should stay glued on. After the whatsits, a penalty for % breaking will be inserted. This will be the user penalty if supplied, % or the running penalty unless the no-break flag is set. Finally, -% the inter-paragraph space is applied. +% the inter-paragraph space is applied: only one space is ever added +% there. % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_insert_vertical_items: { @@ -1550,15 +1563,6 @@ \tl_gclear:N \g_@@_interpar_penalty_user_tl } \bool_gset_false:N \g_galley_no_break_next_bool - \@@_insert_vspace: - } -% \end{macrocode} -% Inserting vertical space is set up as a separate function as it comes -% up in a few places. The idea here is that any user-set space will -% override the design value, and only one space is ever inserted. -% \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_insert_vspace: - { \tl_if_empty:NTF \g_@@_interpar_vspace_user_tl { \skip_vertical:N \l_galley_interpar_vspace_skip } { diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 096973bc23c..dc7a203660f 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/07/15} -\def\ExplFileVersion{5666} +\def\ExplFileDate{2015/07/28} +\def\ExplFileVersion{5700} % %<*driver> \documentclass[full]{l3doc} @@ -987,6 +987,7 @@ % \item Johannes Braams % \item David Carlisle % \item Robin Fairbairns +% \item Morten H{\o}gholm % \item Bruno Le Floch % \item Thomas Lotze % \item Frank Mittelbach @@ -999,7 +1000,6 @@ % \begin{itemize} % \item Michael Downes % \item Denys Duchier -% \item Morten H{\o}gholm % \item Alan Jeffrey % \item Martin Schr{\"o}der % \end{itemize} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index abc040a20d0..7f24c5b9e74 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|package> -\GetIdInfo$Id: l3candidates.dtx 5613 2015-05-21 11:59:04Z joseph $ +\GetIdInfo$Id: l3candidates.dtx 5677 2015-07-22 14:47:23Z joseph $ {L3 Experimental additions to l3kernel} % %<*driver> @@ -967,6 +967,9 @@ % The case pairs I/i-dotless and I-dot/i are activated for these % languages. The combining dot mark is removed when lower % casing I-dot and introduced when upper casing i-dotless. +% \item German (\texttt{de-alt}). +% An alternative mapping for German in which the lower case +% \emph{Eszett} maps to a \emph{gro\ss{}es Eszett}. % \item Lithuanian (\texttt{lt}). % The lower case letters i and j should retain a dot above when the % accents grave, acute or tilde are present. This is implemented for @@ -3822,6 +3825,18 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\__tl_change_case_upper_de-alt:Nnw} +% A simple alternative version for German. +% \begin{macrocode} +\cs_new:cpn { @@_change_case_upper_de-alt:Nnw } #1#2 + { + \int_compare:nNnTF { `#1 } = { 223 } + { \__tl_change_case_output:Vwn \c__unicode_upper_Eszett_tl } + {#2} + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[aux, EXP]{\@@_mixed_case:nn} % \begin{macro}[aux, EXP]{\@@_mixed_case_aux:nn} % \begin{macro}[aux, EXP]{\@@_mixed_case_loop:wn} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index b057b04dc80..0b6a3b58842 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} % %<*driver|package> -\GetIdInfo$Id: l3file.dtx 5627 2015-06-07 09:26:26Z bruno $ +\GetIdInfo$Id: l3file.dtx 5688 2015-07-27 16:57:49Z bruno $ {L3 File and I/O operations} % %<*driver> @@ -593,7 +593,8 @@ % \begin{variable}{\g_file_current_name_tl} % The name of the current file should be available at all times. % For the format the file name needs to be picked up at the start of the -% file. In package mode the current file name is collected from \LaTeXe{}. +% file. In \LaTeXe{} package mode the current file name is collected from +% \tn{@currname}. % \begin{macrocode} \tl_new:N \g_file_current_name_tl %<*initex> @@ -604,7 +605,8 @@ } % %<*package> -\tl_gset_eq:NN \g_file_current_name_tl \@currname +\cs_if_exist:NT \@currname + { \tl_gset_eq:NN \g_file_current_name_tl \@currname } % % \end{macrocode} % \end{variable} @@ -1044,6 +1046,22 @@ % \end{macro} % \end{macro} % +% \begin{macro}[int]{\@@_new:N} +% In package mode, streams are reserved using \tn{newread} before they +% can be managed by \pkg{ior}. To prevent \pkg{ior} from being +% affected by redefinitions of \tn{newread} (such as done by the +% third-party package \pkg{morewrites}), this macro is saved here +% under a private name. The complicated code ensures that +% \cs{@@_new:N} is not \tn{outer} despite plain \TeX{}'s \tn{newread} +% being \tn{outer}. +% \begin{macrocode} +%<*package> +\exp_args:NNNo \exp_args:NNo \cs_new_protected_nopar:Npn \@@_new:N + { \cs:w newread \cs_end: } +% +% \end{macrocode} +% \end{macro} +% % \begin{macro}[int]{\@@_open:Nn, \@@_open:No} % \begin{macro}[aux]{\@@_open_stream:Nn} % The stream allocation itself uses the fact that there is a list of all of @@ -1051,8 +1069,8 @@ % the top of the list. In package mode, life gets more complex as it's % important to keep things in sync. That is done using a two-part approach: % any streams that have already been taken up by \pkg{ior} but are now free -% are tracked, so we first try those. If that fails, ask \LaTeXe{} for a new -% stream and use that number (after a bit of conversion). +% are tracked, so we first try those. If that fails, ask plain \TeX{} or \LaTeXe{} +% for a new stream and use that number (after a bit of conversion). % \begin{macrocode} \cs_new_protected:Npn \@@_open:Nn #1#2 { @@ -1064,7 +1082,7 @@ % %<*package> { - \cs:w newread \cs_end: #1 + \@@_new:N #1 \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} } \@@_open_stream:Nn #1 {#2} } @@ -1265,6 +1283,17 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[int]{\@@_new:N} +% As for read streams, copy \tn{newwrite} in package mode, making sure +% that it is not \tn{outer}. +% \begin{macrocode} +%<*package> +\exp_args:NNNo \exp_args:NNo \cs_new_protected_nopar:Npn \@@_new:N + { \cs:w newwrite \cs_end: } +% +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\iow_open:Nn, \iow_open:cn} % \begin{macro}[int]{\@@_open:Nn} % \begin{macro}[aux]{\@@_open_stream:Nn} @@ -1284,7 +1313,7 @@ % %<*package> { - \cs:w newwrite \cs_end: #1 + \@@_new:N #1 \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} } \@@_open_stream:Nn #1 {#2} } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index d870cb6e4e1..53986abf2c8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-logic.dtx 5354 2014-08-23 01:35:39Z bruno $ +\GetIdInfo$Id: l3fp-logic.dtx 5680 2015-07-24 02:54:00Z bruno $ {L3 Floating-point conditionals} \begin{document} \DocInput{\jobname.dtx} @@ -83,8 +83,8 @@ % \Arg{expo_2} \meta{body_2} |;| % \item \cs{@@_minmax_o:Nw} \meta{sign} \meta{floating point array} % \item \cs{@@_not_o:w} |?| \meta{floating point array} (with one floating point number only) -% \item \cs{@@_\string&_o:ww} \meta{floating point} \meta{floating point} -% \item \cs{@@_\string|_o:ww} \meta{floating point} \meta{floating point} +% \item \cs{@@_&_o:ww} \meta{floating point} \meta{floating point} +% \item \cs{@@_|_o:ww} \meta{floating point} \meta{floating point} % \item \cs{@@_ternary:NwwN}, \cs{@@_ternary_auxi:NwwN}, % \cs{@@_ternary_auxii:NwwN} have to be understood. % \end{itemize} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index e5770e48c2b..d8745a856f5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} % %<*driver|package> -\GetIdInfo$Id: l3keys.dtx 5665 2015-07-15 06:13:22Z joseph $ +\GetIdInfo$Id: l3keys.dtx 5684 2015-07-26 07:23:48Z joseph $ {L3 Key-value interfaces} % %<*driver> @@ -158,7 +158,7 @@ % \keys_define:nn { mymodule } % { % keyname .code:n = Some~code~using~#1, -% keyname .value_required: +% keyname .value_required:n = true % } % \end{verbatim} % where the properties of the key begin from the |.| after the key @@ -1314,7 +1314,9 @@ % |\cs_set_protected:cpn| not |\cs_new_protected:cpn| here. For the % same reason, to avoid issues if the key has been undefined in the % current scope but exists at a higher level, we do not use \cs{prop_new:c} -% but rather \cs{prop_set_eq:cN}. +% but rather \cs{prop_set_eq:cN}. The use of \cs{__chk_if_free_cs:c} +% ensures that when logging of all new functions is active, keys +% still show up (as we are not using \cs{..._new}). % \begin{macrocode} \cs_new_protected:Npn \@@_ensure_exist:n #1 { @@ -1324,6 +1326,7 @@ } \cs_if_exist:cF { \c_@@_code_root_tl #1 } { + \__chk_if_free_cs:c { \c_@@_code_root_tl #1 } \cs_set_protected:cpn { \c_@@_code_root_tl #1 } ##1 { } } } @@ -1485,7 +1488,7 @@ \cs_new_protected:Npn \@@_default_set:n #1 { \@@_ensure_exist:V \l_keys_path_tl - \tl_if_blank:nTF {#1} + \tl_if_empty:nTF {#1} { \prop_remove:cn { \c_@@_info_root_tl \l_keys_path_tl } { default } @@ -1875,7 +1878,7 @@ % \end{macro} % % \begin{macro}{.undefine:} -% TAnother simple wrapper. +% Another simple wrapper. % \begin{macrocode} \cs_new_protected_nopar:cpn { \c_@@_props_root_tl .undefine: } { \@@_undefine: } @@ -2010,8 +2013,8 @@ % \end{macro} % % \begin{macro}[int]{\@@_set_elt:n, \@@_set_elt:nn} -% \begin{macro}[aux]{\@@_set_elt_aux:nn} -% \begin{macro}[aux, EXP]{\@@_key_find:w} +% \begin{macro}[aux]{\@@_set_elt_aux:nnn, \@@_set_elt_aux:onn} +% \begin{macro}[aux]{\@@_find_key_module:w} % \begin{macro}[aux]{\@@_set_elt_aux:, \@@_set_elt_selective:} % A shared system once again. First, set the current path and add a % default if needed. There are then checks to see if the a value is @@ -2021,28 +2024,44 @@ \cs_new_protected:Npn \@@_set_elt:n #1 { \bool_set_true:N \l_@@_no_value_bool - \@@_set_elt_aux:nn {#1} { } + \@@_set_elt_aux:onn \l_@@_module_tl {#1} { } } \cs_new_protected:Npn \@@_set_elt:nn #1#2 { \bool_set_false:N \l_@@_no_value_bool - \@@_set_elt_aux:nn {#1} {#2} + \@@_set_elt_aux:onn \l_@@_module_tl {#1} {#2} } -\cs_new_protected:Npn \@@_set_elt_aux:nn #1#2 +% \end{macrocode} +% The key path here can be fully defined, after which there is a search +% for the key and module names: the user may have passed them with part +% of what is actually the module (for our purposes) in the key name. As +% that happens on a per-key basis, we use the stack approach to restore +% the module name without a group. +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_elt_aux:nnn #1#2#3 { - \tl_set:Nx \l_keys_path_tl { \l_@@_module_tl / \tl_to_str:n {#1} } - \tl_set:Nx \l_keys_key_tl - { \exp_after:wN \@@_key_find:w \l_keys_path_tl / \q_stop } - \@@_value_or_default:n {#2} + \tl_set:Nx \l_keys_path_tl { \l_@@_module_tl / \tl_to_str:n {#2} } + \tl_clear:N \l_@@_module_tl + \exp_after:wN \@@_find_key_module:w \l_keys_path_tl / \q_stop + \@@_value_or_default:n {#3} \bool_if:NTF \l_@@_selective_bool { \@@_set_elt_selective: } { \@@_set_elt_aux: } + \tl_set:Nn \l_@@_module_tl {#1} } -\cs_new:Npn \@@_key_find:w #1 / #2 \q_stop +\cs_generate_variant:Nn \@@_set_elt_aux:nnn { o } +\cs_new_protected:Npn \@@_find_key_module:w #1 / #2 \q_stop { \tl_if_blank:nTF {#2} - { #1 } - { \@@_key_find:w #2 \q_stop } + { \tl_set:Nn \l_keys_key_tl {#1} } + { + \tl_put_right:Nx \l_@@_module_tl + { + \tl_if_empty:NF \l_@@_module_tl { / } + #1 + } + \@@_find_key_module:w #2 \q_stop + } } \cs_new_protected_nopar:Npn \@@_set_elt_aux: { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index d7a3c19c3ae..f8ae4de880f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} % %<*driver|package> -\GetIdInfo$Id: l3names.dtx 5644 2015-06-30 07:59:24Z joseph $ +\GetIdInfo$Id: l3names.dtx 5691 2015-07-27 19:53:13Z joseph $ {L3 Namespace for primitives} % %<*driver> @@ -1062,7 +1062,13 @@ \tex_let:D \pdftex_primitive:D \primitive \tex_let:D \pdftex_shellescape:D \shellescape \tex_fi:D -\etex_unless:D \pdftex_ifprimitive:D \pdftex_mapfile:D +% \end{macrocode} +% Only \pdfTeX{} and \LuaTeX{} define \tn{pdfmapfile} and \tn{pdfmapline}. +% \begin{macrocode} +\tex_ifnum:D 0 + \etex_ifdefined:D \pdftex_pdftexversion:D 1 \tex_fi:D + \etex_ifdefined:D \luatex_luatexversion:D 1 \tex_fi:D + = 0 % \tex_let:D \pdftex_mapfile:D \tex_undefined:D \tex_let:D \pdftex_mapline:D \tex_undefined:D \tex_fi:D diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 8fc257e4d54..7b81df583c8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3seq.dtx Copyright (C) 1990-2014 The LaTeX3 Project +%% File: l3seq.dtx Copyright (C) 1990-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 @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} % %<*driver|package> -\GetIdInfo$Id: l3seq.dtx 5354 2014-08-23 01:35:39Z bruno $ +\GetIdInfo$Id: l3seq.dtx 5681 2015-07-24 03:01:31Z bruno $ {L3 Sequences and stacks} % %<*driver> @@ -737,6 +737,100 @@ % Adds the \Arg{item} to the top of the \meta{sequence}. % \end{function} % +% \section{Sequences as sets} +% +% Sequences can also be used as sets, such that all of their items are +% distinct. Usage of sequences as sets is not currently widespread, +% hence no specific set function is provided. Instead, it is explained +% here how common set operations can be performed by combining several +% functions described in earlier sections. When using sequences to +% implement sets, one should be careful not to rely on the order of +% items in the sequence representing the set. +% +% Sets should not contain several occurences of a given item. To make +% sure that a \meta{sequence variable} only has distinct items, use +% \cs{seq_remove_duplicates:N} \meta{sequence variable}. This function +% is relatively slow, and to avoid performance issues one should only +% use it when necessary. +% +% Some operations on a set \meta{seq~var} are straightforward. For +% instance, \cs{seq_count:N} \meta{seq~var} expands to the number of +% items, while \cs{seq_if_in:Nn(TF)} \meta{seq~var} \Arg{item} tests if +% the \meta{item} is in the set. +% +% Adding an \meta{item} to a set \meta{seq~var} can be done by appending +% it to the \meta{seq~var} if it is not already in the \meta{seq~var}: +% \begin{quote}\ttfamily +% \cs{seq_if_in:NnF} \meta{seq~var} \Arg{item} \\ +% \ \ \{ \cs{seq_put_right:Nn} \meta{seq~var} \Arg{item} \} +% \end{quote} +% Removing an \meta{item} from a set \meta{seq~var} can be done using +% \cs{seq_remove_all:Nn}, +% \begin{quote}\ttfamily +% \cs{seq_remove_all:Nn} \meta{seq~var} \Arg{item} +% \end{quote} +% +% The intersection of two sets \meta{seq~var_1} and \meta{seq~var_2} can +% be stored into \meta{seq~var_3} by collecting items of +% \meta{seq~var_1} which are in \meta{seq~var_2}. +% \begin{quote}\ttfamily +% \cs{seq_clear:N} \meta{seq~var_3} \\ +% \cs{seq_map_inline:Nn} \meta{seq~var_1} \\ +% \ \ \{ \\ +% \ \ \ \ \cs{seq_if_in:NnT} \meta{seq~var_2} \{\#1\} \\ +% \ \ \ \ \ \ \{ \cs{seq_put_right:Nn} \meta{seq~var_3} \{\#1\} \} \\ +% \ \ \} +% \end{quote} +% The code as written here only works if \meta{seq~var_3} is different +% from the other two sequence variables. To cover all cases, items +% should first be collected in a sequence +% |\l__|\meta{pkg}|_internal_seq|, then \meta{seq~var_3} should be set +% equal to this internal sequence. The same remark applies to other set +% functions. +% +% The union of two sets \meta{seq~var_1} and \meta{seq~var_2} can be +% stored into \meta{seq~var_3} through +% \begin{quote}\ttfamily +% \cs{seq_concat:NNN} \meta{seq~var_3} \meta{seq~var_1} \meta{seq~var_2} \\ +% \cs{seq_remove_duplicates:N} \meta{seq~var_3} +% \end{quote} +% or by adding items to (a copy of) \meta{seq~var_1} one by one +% \begin{quote}\ttfamily +% \cs{seq_set_eq:NN} \meta{seq~var_3} \meta{seq~var_1} \\ +% \cs{seq_map_inline:Nn} \meta{seq~var_2} \\ +% \ \ \{ \\ +% \ \ \ \ \cs{seq_if_in:NnF} \meta{seq~var_3} \{\#1\} \\ +% \ \ \ \ \ \ \{ \cs{seq_put_right:Nn} \meta{seq~var_3} \{\#1\} \} \\ +% \ \ \} +% \end{quote} +% The second approach is faster than the first when the \meta{seq~var_2} +% is short compared to \meta{seq~var_1}. +% +% The difference of two sets \meta{seq~var_1} and \meta{seq~var_2} can +% be stored into \meta{seq~var_3} by removing items of the +% \meta{seq~var_2} from (a copy of) the \meta{seq~var_1} one by one. +% \begin{quote}\ttfamily +% \cs{seq_set_eq:NN} \meta{seq~var_3} \meta{seq~var_1} \\ +% \cs{seq_map_inline:Nn} \meta{seq~var_2} \\ +% \ \ \{ \cs{seq_remove_all:Nn} \meta{seq~var_3} \{\#1\} \} +% \end{quote} +% +% The symmetric difference of two sets \meta{seq~var_1} and +% \meta{seq~var_2} can be stored into \meta{seq~var_3} by computing the +% difference between \meta{seq~var_1} and \meta{seq~var_2} and storing +% the result as |\l__|\meta{pkg}|_internal_seq|, then the difference +% between \meta{seq~var_2} and \meta{seq~var_1}, and finally +% concatenating the two differences to get the symmetric differences. +% \begin{quote}\ttfamily +% \cs{seq_set_eq:NN} |\l__|\meta{pkg}|_internal_seq| \meta{seq~var_1} \\ +% \cs{seq_map_inline:Nn} \meta{seq~var_2} \\ +% \ \ \{ \cs{seq_remove_all:Nn} |\l__|\meta{pkg}|_internal_seq| \{\#1\} \} \\ +% \cs{seq_set_eq:NN} \meta{seq~var_3} \meta{seq~var_2} \\ +% \cs{seq_map_inline:Nn} \meta{seq~var_1} \\ +% \ \ \{ \cs{seq_remove_all:Nn} \meta{seq~var_3} \{\#1\} \} \\ +% \cs{seq_concat:NNN} \meta{seq~var_3} \meta{seq~var_3} |\l__|\meta{pkg}|_internal_seq| +% \end{quote} +% % \section{Constant and scratch sequences} % % \begin{variable}[added = 2012-07-02]{\c_empty_seq} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx index 9f3e03cf38f..66c786a88e6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx @@ -38,7 +38,7 @@ % plain \TeX{}, set up in generic mode. %<*driver|script> \input expl3-generic\relax -\GetIdInfo$Id: l3unicode-data.dtx 5647 2015-07-01 12:44:26Z joseph $ +\GetIdInfo$Id: l3unicode-data.dtx 5676 2015-07-20 06:48:31Z joseph $ {L3 Case data script} % % @@ -446,14 +446,15 @@ \tl_const:Nn \c__unicode_lower_exceptions_tl { } \tl_const:Nn \c__unicode_mixed_exceptions_tl { } \tl_const:Nn \c__unicode_upper_exceptions_tl { } - \tl_const:Nn \c__unicode_std_sigma_tl { } - \tl_const:Nn \c__unicode_final_sigma_tl { } - \tl_const:Nn \c__unicode_accents_lt_tl { } - \tl_const:Nn \c__unicode_dot_above_tl { } - \tl_const:Nn \c__unicode_dotless_i_tl { I } - \tl_const:Nn \c__unicode_dotted_I_tl { i } - \tl_const:Nn \c__unicode_i_ogonek_tl { } - \tl_const:Nn \c__unicode_I_ogonek_tl { } + \tl_const:Nn \c__unicode_std_sigma_tl { } + \tl_const:Nn \c__unicode_final_sigma_tl { } + \tl_const:Nn \c__unicode_accents_lt_tl { } + \tl_const:Nn \c__unicode_dot_above_tl { } + \tl_const:Nn \c__unicode_dotless_i_tl { I } + \tl_const:Nn \c__unicode_dotted_I_tl { i } + \tl_const:Nn \c__unicode_i_ogonek_tl { } + \tl_const:Nn \c__unicode_I_ogonek_tl { } + \tl_const:Nn \c__unicode_upper_Eszett_tl { } \tex_endinput:D } \__unicode_verb_end: @@ -521,8 +522,8 @@ { \cs_set_eq:NN \__unicode_brace:n \use:n } \tl_put_right:Nx \l__unicode_title_exceptions_tl { - \__unicode_brace:n { \luatex_Uchar:D "#1 \c_space_tl } - \__unicode_brace:n { \luatex_Uchar:D "#8 \c_space_tl } + \__unicode_brace:n { \utex_char:D "#1 \c_space_tl } + \__unicode_brace:n { \utex_char:D "#8 \c_space_tl } } } } @@ -579,9 +580,9 @@ \tl_put_right:cx { l__unicode_ #5 _ #3 _X_ #4 _tl } { \__unicode_brace:n - { \luatex_Uchar:D "#1 \c_space_tl } + { \utex_char:D "#1 \c_space_tl } \__unicode_brace:n - { \luatex_Uchar:D "#2 \c_space_tl } + { \utex_char:D "#2 \c_space_tl } } } } @@ -657,12 +658,12 @@ { \tl_put_right:cx { l__unicode_ #5 _exceptions_tl } { - \__unicode_brace:n { \luatex_Uchar:D "#1 \c_space_tl } + \__unicode_brace:n { \utex_char:D "#1 \c_space_tl } { - \luatex_Uchar:D "#2 \c_space_tl - \luatex_Uchar:D "#3 \c_space_tl + \utex_char:D "#2 \c_space_tl + \utex_char:D "#3 \c_space_tl \tl_if_empty:nF {#4} - { \luatex_Uchar:D "#4 \c_space_tl } + { \utex_char:D "#4 \c_space_tl } } } } @@ -743,7 +744,7 @@ \iow_now:Nx \g__unicode_result_iow { \tl_const:Nn \exp_not:c { c__unicode_ #1 _tl } - { ~ \luatex_Uchar:D "#2 \c_space_tl \c_space_tl } + { ~ \utex_char:D "#2 \c_space_tl \c_space_tl } } \__unicode_special_case:nn } @@ -755,18 +756,19 @@ { dotted_I } { 0130 } { i_ogonek } { 012F } { I_ogonek } { 012E } + { upper_Eszett } { 1E9E } \q_recursion_tail { } \q_recursion_stop \iow_now:Nx \g__unicode_result_iow { \tl_const:Nn \exp_not:N \c__unicode_accents_lt_tl { - \luatex_Uchar:D "00CC - { \luatex_Uchar:D "0069 \luatex_Uchar:D "0307 \luatex_Uchar:D "0300 } - \luatex_Uchar:D "00CD - { \luatex_Uchar:D "0069 \luatex_Uchar:D "0307 \luatex_Uchar:D "0301 } - \luatex_Uchar:D "0128 - { \luatex_Uchar:D "0069 \luatex_Uchar:D "0307 \luatex_Uchar:D "0303 } + \utex_char:D "00CC + { \utex_char:D "0069 \utex_char:D "0307 \utex_char:D "0300 } + \utex_char:D "00CD + { \utex_char:D "0069 \utex_char:D "0307 \utex_char:D "0301 } + \utex_char:D "0128 + { \utex_char:D "0069 \utex_char:D "0307 \utex_char:D "0303 } } } % \end{macrocode} @@ -807,7 +809,7 @@ \str_if_eq:nnTF {#2} { C } { \__unicode_parse_line_auxiv:nn - {#1} { \luatex_Uchar:D "#3 \c_space_tl } + {#1} { \utex_char:D "#3 \c_space_tl } } { \str_if_eq:nnT {#2} { F } @@ -832,10 +834,10 @@ { \__unicode_brace:n { - \luatex_Uchar:D "#2 \c_space_tl - \luatex_Uchar:D "#3 \c_space_tl + \utex_char:D "#2 \c_space_tl + \utex_char:D "#3 \c_space_tl \tl_if_empty:nF {#4} - { \luatex_Uchar:D "#4 \c_space_tl } + { \utex_char:D "#4 \c_space_tl } } } } @@ -854,7 +856,7 @@ } % \end{macrocode} % As the input is read in string mode, there is a need for a rescan -% here since \tn{Uchar} requires letters for hexadecimal digits +% here since \tn{char} requires letters for hexadecimal digits % beyond~$9$. % \begin{macrocode} \cs_new_protected:Npn \__unicode_parse_line_auxv:wnn @@ -868,7 +870,7 @@ { \tl_put_right:cx { l__unicode_lower_ #6 _X_ #7 _tl } { - \__unicode_brace:n { \luatex_Uchar:D "#8 \c_space_tl } + \__unicode_brace:n { \utex_char:D "#8 \c_space_tl } \__unicode_brace:n { #9 } } } diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx index 1de701ee0ee..2924b08d1ba 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx @@ -37,8 +37,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{l3keys2e}{Support package l3kernel too old} @@ -50,7 +50,7 @@ % }% % \endinput % } -\GetIdInfo$Id: l3keys2e.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: l3keys2e.dtx 5700 2015-07-28 19:26:39Z joseph $ {LaTeX2e option processing using LaTeX3 keys} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx index f18e25b54ab..45d8088dbb7 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx @@ -41,8 +41,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{xparse}{Support package l3kernel too old} @@ -54,7 +54,7 @@ % }% % \endinput % } -\GetIdInfo$Id: xparse.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: xparse.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental document command parser} % %<*driver> diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx index 20c56b00706..09c46d3be52 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx @@ -41,8 +41,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2015/07/14] -%\@ifpackagelater{expl3}{2015/07/14} +\RequirePackage{expl3}[2015/07/28] +%\@ifpackagelater{expl3}{2015/07/28} % {} % {% % \PackageError{xtemplate}{Support package l3kernel too old} @@ -54,7 +54,7 @@ % }% % \endinput % } -\GetIdInfo$Id: xtemplate.dtx 5662 2015-07-14 21:32:38Z joseph $ +\GetIdInfo$Id: xtemplate.dtx 5700 2015-07-28 19:26:39Z joseph $ {L3 Experimental prototype document functions} % %<*driver> -- cgit v1.2.3