diff options
author | Karl Berry <karl@freefriends.org> | 2013-07-28 21:53:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-07-28 21:53:53 +0000 |
commit | 476ef285597d50560f829ffd64532d75d937d06a (patch) | |
tree | 5c652f3fb3c6e7458bb762f660a005e2f77c3f80 /Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | |
parent | 9cad0f5f2f5f3df83a79cca1d848bf3a5feef241 (diff) |
latex3 (28jul13)
git-svn-id: svn://tug.org/texlive/trunk@31299 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3kernel/l3prop.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | 348 |
1 files changed, 163 insertions, 185 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 3046ae59e8b..50472ab8754 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3prop.dtx 4423 2013-01-09 00:05:30Z bruno $ +\GetIdInfo$Id: l3prop.dtx 4581 2013-07-28 08:38:50Z joseph $ {L3 Property lists} %</driver|package> %<*driver> @@ -433,8 +433,18 @@ % \section{Internal property list functions} % % \begin{variable}{\s__prop} -% The internal token used to separate out property list entries, -% surrounding each \meta{key}. +% The internal token used at the beginning of property lists. This is +% also used after each \meta{key} (see \cs{__prop_pair:wn}). +% \end{variable} +% +% \begin{variable}{\__prop_pair:wn} +% \begin{syntax} +% \cs{__prop_pair:wn} \meta{key} \cs{s__prop} \Arg{item} +% \end{syntax} +% The internal token used to begin each key--value pair in the +% property list. If expanded outside of a mapping or manipulation +% function, an error will be raised. The definition should always be +% set globally. % \end{variable} % % \begin{variable}{\l__prop_internal_tl} @@ -494,18 +504,33 @@ % % A property list is a macro whose top-level expansion is for the form % \begin{quote} -% \cs{s_@@} \meta{key_1} \cs{s_@@} \Arg{value_1} \\ +% \cs{s_@@} +% \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\ % \ldots{} \\ -% \cs{s_@@} \meta{key_n} \cs{s_@@} \Arg{value_n} \\ +% \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\ +% \cs{s_obj_end} % \end{quote} +% where the separators \cs{s_@@} and \cs{s_obj_end} are scan marks +% (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map +% through the property list. % % \begin{macro}[int]{\s_@@} -% A private scan mark is used as a marker surrounding each key. +% A private scan mark is used as a marker after each key, and at the +% very beginning of the property list. % \begin{macrocode} \__scan_new:N \s_@@ % \end{macrocode} % \end{macro} % +% \begin{macro}[int]{\@@_pair:wn} +% The delimiter is always defined, but when misused simply triggers an +% error and removes its argument. +% \begin{macrocode} +\cs_new:Npn \@@_pair:wn #1 \s_@@ #2 + { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } } +% \end{macrocode} +% \end{macro} +% % \begin{variable}{\l_@@_internal_tl} % Token list used to store the new key--value pair inserted by % \cs{prop_put:Nnn} and friends. @@ -515,19 +540,23 @@ % \end{variable} % % \begin{variable}[tested = m3prop004]{\c_empty_prop} -% An empty prop is an empty token list. +% An empty prop. % \begin{macrocode} -\cs_new_eq:NN \c_empty_prop \c_empty_tl +\tl_const:Nn \c_empty_prop { \s_@@ \s_obj_end } % \end{macrocode} % \end{variable} % % \subsection{Allocation and initialisation} % % \begin{macro}[tested = m3prop001]{\prop_new:N, \prop_new:c} -% Internally, property lists are just token lists. +% Property lists are initialized with the value \cs{c_empty_prop}. % \begin{macrocode} -\cs_new_eq:NN \prop_new:N \tl_new:N -\cs_new_eq:NN \prop_new:c \tl_new:c +\cs_new_protected:Npn \prop_new:N #1 + { + \__chk_if_free_cs:N #1 + \cs_gset_eq:NN #1 \c_empty_prop + } +\cs_generate_variant:Nn \prop_new:N { c } % \end{macrocode} % \end{macro} % @@ -535,22 +564,26 @@ % \begin{macro}[tested = m3prop001]{\prop_gclear:N, \prop_gclear:c} % The same idea for clearing. % \begin{macrocode} -\cs_new_eq:NN \prop_clear:N \tl_clear:N -\cs_new_eq:NN \prop_clear:c \tl_clear:c -\cs_new_eq:NN \prop_gclear:N \tl_gclear:N -\cs_new_eq:NN \prop_gclear:c \tl_gclear:c +\cs_new_protected:Npn \prop_clear:N #1 + { \prop_set_eq:NN #1 \c_empty_prop } +\cs_generate_variant:Nn \prop_clear:N { c } +\cs_new_protected:Npn \prop_gclear:N #1 + { \prop_gset_eq:NN #1 \c_empty_prop } +\cs_generate_variant:Nn \prop_gclear:N { c } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}[tested = m3prop001]{\prop_clear_new:N, \prop_clear_new:c} % \begin{macro}[tested = m3prop001]{\prop_gclear_new:N, \prop_gclear_new:c} -% Once again a simple copy from the token list functions. +% Once again a simple variation of the token list functions. % \begin{macrocode} -\cs_new_eq:NN \prop_clear_new:N \tl_clear_new:N -\cs_new_eq:NN \prop_clear_new:c \tl_clear_new:c -\cs_new_eq:NN \prop_gclear_new:N \tl_gclear_new:N -\cs_new_eq:NN \prop_gclear_new:c \tl_gclear_new:c +\cs_new_protected:Npn \prop_clear_new:N #1 + { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new:N #1 } } +\cs_generate_variant:Nn \prop_clear_new:N { c } +\cs_new_protected:Npn \prop_gclear_new:N #1 + { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new:N #1 } } +\cs_generate_variant:Nn \prop_gclear_new:N { c } % \end{macrocode} % \end{macro} % \end{macro} @@ -559,7 +592,7 @@ % {\prop_set_eq:NN, \prop_set_eq:cN, \prop_set_eq:Nc, \prop_set_eq:cc} % \begin{macro}[tested = m3prop001] % {\prop_gset_eq:NN, \prop_gset_eq:cN, \prop_gset_eq:Nc, \prop_gset_eq:cc} -% Once again, these are simply copies from the token list functions. +% These are simply copies from the token list functions. % \begin{macrocode} \cs_new_eq:NN \prop_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \prop_set_eq:Nc \tl_set_eq:Nc @@ -587,6 +620,14 @@ % % \subsection{Accessing data in property lists} % +% \begin{macro}[EXP]{\@@_strip_end:w} +% Strip the \cs{s_obj_end} marker from an expanded property list +% variable. +% \begin{macrocode} +\cs_new:Npn \@@_strip_end:w #1 \s_obj_end { \exp_not:n {#1} } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[int]{\@@_split:NnTF} % \begin{macro}[aux]{\@@_split_aux:NnTF} % \begin{macro}[aux, EXP]{\@@_split_aux:w} @@ -600,7 +641,7 @@ % \meta{key} is turned into a string. % \begin{quote} % \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \\ -% \quad \cs{s_@@} \meta{key} \cs{s_@@} |#2| \\ +% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#2| \\ % \quad |#3| \cs{q_mark} |#4| |#5| \cs{q_stop} \\ % \quad |{| |#4| \Arg{true code} \Arg{false code} |}| % \end{quote} @@ -611,7 +652,8 @@ % \cs{use_i:nn}, and |#5| is additional tokens that we do not care % about. The \meta{true code} is left in the input stream, and can % use the parameters |#1|, |#2|, |#3| for the three parts of the -% property list as desired. +% property list as desired. Namely, the original property list is in +% this case |#1| \cs{@@_pair:wn} \meta{key} \cs{s_@@} |{#2}| |#3|. % % If the \meta{key} is not there, then the \meta{function} is % \cs{use_ii:nn}, which keeps the \meta{false code}. @@ -621,10 +663,10 @@ \cs_new_protected:Npn \@@_split_aux:NnTF #1#2#3#4 { \cs_set:Npn \@@_split_aux:w ##1 - \s_@@ #2 \s_@@ ##2 ##3 \q_mark ##4 ##5 \q_stop + \@@_pair:wn #2 \s_@@ ##2 ##3 \q_mark ##4 ##5 \q_stop { ##4 {#3} {#4} } \exp_after:wN \@@_split_aux:w #1 \q_mark \use_i:nn - \s_@@ #2 \s_@@ { } \q_mark \use_ii:nn \q_stop + \@@_pair:wn #2 \s_@@ { } \q_mark \use_ii:nn \q_stop } \cs_new:Npn \@@_split_aux:w { } % \end{macrocode} @@ -766,7 +808,7 @@ % \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx, % \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo % } -% \begin{macro}[aux]{\@@_put:NNNnn} +% \begin{macro}[aux]{\@@_put:NNnn} % Since the branches of \cs{@@_split:NnTF} are used as the replacement % text of an internal macro, and since the \meta{key} and new % \meta{value} may contain arbitrary tokens, it is not safe to include @@ -774,23 +816,30 @@ % storing in \cs{l_@@_internal_tl} tokens which (after % \texttt{x}-expansion) encode the key--value pair. This variable can % safely be used in \cs{@@_split:NnTF}. If the \meta{key} was absent, -% append the new key--value to the list. Otherwise concatenate the -% extracts |##1| and |##3| with the new key--value pair -% \cs{l_@@_internal_tl}. The updated entry is placed at the same spot -% as the original \meta{key} in the property list, preserving the -% order of entries. +% append the new key--value to the list (\cs{@@_strip_end:w} moves the +% \cs{s_obj_end} marker). Otherwise concatenate the extracts |##1| +% and |##3| with the new key--value pair \cs{l_@@_internal_tl}. The +% updated entry is placed at the same spot as the original \meta{key} +% in the property list, preserving the order of entries. % \begin{macrocode} -\cs_new_protected_nopar:Npn \prop_put:Nnn - { \@@_put:NNNnn \tl_set:Nx \tl_put_right:Nx } -\cs_new_protected_nopar:Npn \prop_gput:Nnn - { \@@_put:NNNnn \tl_gset:Nx \tl_gput_right:Nx } -\cs_new_protected:Npn \@@_put:NNNnn #1#2#3#4#5 +\cs_new_protected_nopar:Npn \prop_put:Nnn { \@@_put:NNnn \tl_set:Nx } +\cs_new_protected_nopar:Npn \prop_gput:Nnn { \@@_put:NNnn \tl_gset:Nx } +\cs_new_protected:Npn \@@_put:NNnn #1#2#3#4 { \tl_set:Nn \l_@@_internal_tl - { \s_@@ \tl_to_str:n {#4} \s_@@ { \exp_not:n {#5} } } - \@@_split:NnTF #3 {#4} - { #1 #3 { \exp_not:n {##1} \l_@@_internal_tl \exp_not:n {##3} } } - { #2 #3 { \l_@@_internal_tl } } + { + \exp_not:N \@@_pair:wn \tl_to_str:n {#3} + \s_@@ { \exp_not:n {#4} } + } + \@@_split:NnTF #2 {#3} + { #1 #2 { \exp_not:n {##1} \l_@@_internal_tl \exp_not:n {##3} } } + { + #1 #2 + { + \exp_after:wN \@@_strip_end:w #2 + \l_@@_internal_tl \s_obj_end + } + } } \cs_generate_variant:Nn \prop_put:Nnn { NnV , Nno , Nnx , NV , NVV , No , Noo } @@ -816,16 +865,25 @@ % convert the key to a string using \cs{tl_to_str:n}. % \begin{macrocode} \cs_new_protected_nopar:Npn \prop_put_if_new:Nnn - { \@@_put_if_new:NNnn \tl_put_right:Nx } + { \@@_put_if_new:NNnn \tl_set:Nx } \cs_new_protected_nopar:Npn \prop_gput_if_new:Nnn - { \@@_put_if_new:NNnn \tl_gput_right:Nx } + { \@@_put_if_new:NNnn \tl_gset:Nx } \cs_new_protected:Npn \@@_put_if_new:NNnn #1#2#3#4 { \tl_set:Nn \l_@@_internal_tl - { \s_@@ \tl_to_str:n {#3} \s_@@ \exp_not:n { {#4} } } + { + \exp_not:N \@@_pair:wn \tl_to_str:n {#3} + \s_@@ \exp_not:n { {#4} } + } \@@_split:NnTF #2 {#3} { } - { #1 #2 { \l_@@_internal_tl } } + { + #1 #2 + { + \exp_after:wN \@@_strip_end:w #2 + \l_@@_internal_tl \s_obj_end + } + } } \cs_generate_variant:Nn \prop_put_if_new:Nnn { c } \cs_generate_variant:Nn \prop_gput_if_new:Nnn { c } @@ -847,10 +905,15 @@ % \begin{macro}[pTF, tested = m3prop003]{\prop_if_empty:N, \prop_if_empty:c} % Same test as for token lists. % \begin{macrocode} -\prg_new_eq_conditional:NNn \prop_if_empty:N \tl_if_empty:N - { p , T , F , TF } -\prg_new_eq_conditional:NNn \prop_if_empty:c \tl_if_empty:c - { p , T , F , TF } +\prg_new_conditional:Npnn \prop_if_empty:N #1 { p , T , F , TF } + { + \tl_if_eq:NNTF #1 \c_empty_prop + \prg_return_true: \prg_return_false: + } +\cs_generate_variant:Nn \prop_if_empty_p:N { c } +\cs_generate_variant:Nn \prop_if_empty:NT { c } +\cs_generate_variant:Nn \prop_if_empty:NF { c } +\cs_generate_variant:Nn \prop_if_empty:NTF { c } % \end{macrocode} % \end{macro} % @@ -859,7 +922,7 @@ % \prop_if_in:Nn, \prop_if_in:NV, \prop_if_in:No, % \prop_if_in:cn, \prop_if_in:cV, \prop_if_in:co % } -% \begin{macro}[aux]{\@@_if_in:nwn,\@@_if_in:N} +% \begin{macro}[aux,EXP]{\@@_if_in:nwwn,\@@_if_in:N} % Testing expandably if a key is in a property list % requires to go through the key--value pairs one by one. % This is rather slow, and a faster test would be @@ -867,47 +930,47 @@ % \prg_new_protected_conditional:Npnn \prop_if_in:Nn #1 #2 % { % \@@_split:NnTF #1 {#2} -% { -% \prg_return_true: -% \use_none:nnn -% } -% { \prg_return_false: } +% { \prg_return_true: } +% { \prg_return_false: } % } % \end{verbatim} % but \cs{@@_split:NnTF} is non-expandable. % -% Instead, the key is compared to each key in turn using \cs{str_if_eq_x:nn}, -% which is expandable. To terminate the mapping, we append to the property -% list the key that is searched for. This second -% \cs{tl_to_str:n} is not expanded at the start, but only when included -% in the \cs{str_if_eq_x:nn}. It cannot make the breaking mechanism choke, -% because the arbitrary token list material is enclosed in braces. -% When ending, we test the next token: it is either \cs{s_@@} -% or \cs{q_recursion_tail} in the case of a missing key. +% Instead, the key is compared to each key in turn using +% \cs{str_if_eq_x:nn}, which is expandable. To terminate the mapping, +% we append to the property list the key that is searched for. This +% second \cs{tl_to_str:n} is not expanded at the start, but only when +% included in the \cs{str_if_eq_x:nn}. It cannot make the breaking +% mechanism choke, because the arbitrary token list material is +% enclosed in braces. The second argument of \cs{@@_if_in:nwwn} is +% most often empty. When the \meta{key} is found in the list, +% \cs{@@_if_in:N} receives \cs{s_@@} or \cs{s_obj_end}, and if it is +% found as the extra item, the function receives +% \cs{q_recursion_tail}, easily recognizable. +% % Here, \cs{prop_map_function:NN} is not sufficient for the mapping, % since it can only map a single token, and cannot carry the key that % is searched for. % \begin{macrocode} \prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF } { - \exp_last_unbraced:Noo \@@_if_in:nwn - { \tl_to_str:n {#2} } #1 - \s_@@ \tl_to_str:n {#2} \s_@@ { } - \q_recursion_tail + \exp_last_unbraced:Noo \@@_if_in:nwwn { \tl_to_str:n {#2} } #1 + \@@_pair:wn \tl_to_str:n {#2} \s_@@ { } + \q_recursion_tail \__prg_break_point: } -\cs_new:Npn \@@_if_in:nwn #1 \s_@@ #2 \s_@@ #3 +\cs_new:Npn \@@_if_in:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4 { - \str_if_eq_x:nnTF {#1} {#2} + \str_if_eq_x:nnTF {#1} {#3} { \@@_if_in:N } - { \@@_if_in:nwn {#1} } + { \@@_if_in:nwwn {#1} } } \cs_new:Npn \@@_if_in:N #1 { - \if_meaning:w \s_@@ #1 - \prg_return_true: - \else: + \if_meaning:w \q_recursion_tail #1 \prg_return_false: + \else: + \prg_return_true: \fi: \__prg_break: } @@ -959,27 +1022,27 @@ % \prop_map_function:NN, \prop_map_function:Nc, % \prop_map_function:cN, \prop_map_function:cc % } -% \begin{macro}[aux]{\@@_map_function:Nwn} +% \begin{macro}[aux]{\@@_map_function:Nwwn} % The fastest way to do a recursion here is to use an -% \cs{if_meaning:w} test: the keys are strings, and thus -% cannot match the marker \cs{q_recursion_tail}. -% A special case to note is when the key |#2| is empty: -% then \cs{q_recursion_tail} is compared to \cs{exp_after:wN}, -% also different. +% \cs{if_meaning:w} test: the keys are strings, and thus cannot match +% the marker \cs{q_recursion_tail}. A special case to note is when +% the key |#3| is empty: then \cs{q_recursion_tail} is compared to +% \cs{exp_after:wN}, also different. Note that |#2| can only consist +% of \cs{s_@@} and/or \cs{s_obj_end}. % \begin{macrocode} \cs_new:Npn \prop_map_function:NN #1#2 { - \exp_last_unbraced:NNo \@@_map_function:Nwn #2 - #1 \s_@@ \q_recursion_tail \s_@@ { } + \exp_last_unbraced:NNo \@@_map_function:Nwwn #2 #1 + \@@_pair:wn \q_recursion_tail \s_@@ { } \__prg_break_point:Nn \prop_map_break: { } } -\cs_new:Npn \@@_map_function:Nwn #1 \s_@@ #2 \s_@@ #3 +\cs_new:Npn \@@_map_function:Nwwn #1#2 \@@_pair:wn #3 \s_@@ #4 { - \if_meaning:w \q_recursion_tail #2 + \if_meaning:w \q_recursion_tail #3 \exp_after:wN \prop_map_break: \fi: - #1 {#2} {#3} - \@@_map_function:Nwn #1 + #1 {#3} {#4} + \@@_map_function:Nwwn #1 } \cs_generate_variant:Nn \prop_map_function:NN { Nc } \cs_generate_variant:Nn \prop_map_function:NN { c , cc } @@ -988,17 +1051,26 @@ % \end{macro} % % \begin{macro}[tested = m3prop003]{\prop_map_inline:Nn, \prop_map_inline:cn} -% Mapping in line requires a nesting level counter. +% Mapping in line requires a nesting level counter. Store the current +% definition of \cs{@@_pair:wn}, and define it anew. At the end of +% the loop, revert to the earlier definition. Note that besides pairs +% of the form \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{value}, there +% are a leading and a trailing tokens, but both are equal to +% \cs{scan_stop:}, hence have no effect in such inline mapping. % \begin{macrocode} \cs_new_protected:Npn \prop_map_inline:Nn #1#2 { + \cs_gset_eq:cN + { __prg_map_ \int_use:N \g__prg_map_int :wn } \@@_pair:wn \int_gincr:N \g__prg_map_int - \cs_gset:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1##2 {#2} - \exp_last_unbraced:Nco \@@_map_function:Nwn - { __prg_map_ \int_use:N \g__prg_map_int :w } - #1 - \s_@@ \q_recursion_tail \s_@@ { } - \__prg_break_point:Nn \prop_map_break: { \int_gdecr:N \g__prg_map_int } + \cs_gset:Npn \@@_pair:wn ##1 \s_@@ ##2 {#2} + #1 + \__prg_break_point:Nn \prop_map_break: + { + \int_gdecr:N \g__prg_map_int + \cs_gset_eq:Nc \@@_pair:wn + { __prg_map_ \int_use:N \g__prg_map_int :wn } + } } \cs_generate_variant:Nn \prop_map_inline:Nn { c } % \end{macrocode} @@ -1032,100 +1104,6 @@ % \end{macrocode} % \end{macro} % -% \subsection{Deprecated interfaces} -% -% Deprecated on 2011-05-27, for removal by 2011-08-31. -% -% \begin{macro}{\prop_display:N, \prop_display:c} -% An older name for \cs{prop_show:N}. -% \begin{macrocode} -%<*deprecated> -\cs_new_eq:NN \prop_display:N \prop_show:N -\cs_new_eq:NN \prop_display:c \prop_show:c -%</deprecated> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\prop_gget:NnN, \prop_gget:NVN, \prop_gget:cnN, \prop_gget:cVN} -% \begin{macro}[aux]{\prop_gget_aux:Nnnn} -% Getting globally is no longer supported: this is a conceptual change, so -% the necessary code for the transition is provided directly. -% \begin{macrocode} -%<*deprecated> -\tl_new:N \l_@@_internal_tl -\cs_new_protected:Npn \prop_gget:NnN #1#2#3 - { - \prop_get:NnN #1 {#2} \l_@@_internal_tl - \tl_gset_eq:NN #3 \l_@@_internal_tl - } -\cs_generate_variant:Nn \prop_gget:NnN { NV } -\cs_generate_variant:Nn \prop_gget:NnN { c , cV } -%</deprecated> -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\prop_get_gdel:NnN} -% This name seems very odd. -% \begin{macrocode} -%<*deprecated> -\cs_new_eq:NN \prop_get_gdel:NnN \prop_gpop:NnN -%</deprecated> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[TF]{\prop_if_in:cc} -% A hang-over from an ancient implementation -% \begin{macrocode} -%<*deprecated> -\cs_generate_variant:Nn \prop_if_in:NnT { cc } -\cs_generate_variant:Nn \prop_if_in:NnF { cc } -\cs_generate_variant:Nn \prop_if_in:NnTF { cc } -%</deprecated> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\prop_gput:ccx} -% Another one. -% \begin{macrocode} -%<*deprecated> -\cs_generate_variant:Nn \prop_gput:Nnn { ccx } -%</deprecated> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[pTF] -% {\prop_if_eq:NN, \prop_if_eq:Nc, \prop_if_eq:cN, \prop_if_eq:cc} -% These ones do no even make sense! -% \begin{macrocode} -%<*deprecated> -\prg_new_eq_conditional:NNn \prop_if_eq:NN \tl_if_eq:NN { p , T , F , TF } -\prg_new_eq_conditional:NNn \prop_if_eq:cN \tl_if_eq:cN { p , T , F , TF } -\prg_new_eq_conditional:NNn \prop_if_eq:Nc \tl_if_eq:Nc { p , T , F , TF } -\prg_new_eq_conditional:NNn \prop_if_eq:cc \tl_if_eq:cc { p , T , F , TF } -%</deprecated> -% \end{macrocode} -% \end{macro} -% -% Deprecated on 2012-05-12, for removal by 2012-11-30. -% -% \begin{macro}{\prop_del:Nn, \prop_del:NV, \prop_del:cn, \prop_del:cV} -% \begin{macro}{\prop_gdel:Nn, \prop_gdel:NV, \prop_gdel:cn, \prop_gdel:cV} -% \begin{macrocode} -%<*deprecated> -\cs_new_eq:NN \prop_del:Nn \prop_remove:Nn -\cs_new_eq:NN \prop_del:NV \prop_remove:NV -\cs_new_eq:NN \prop_del:cn \prop_remove:cn -\cs_new_eq:NN \prop_del:cV \prop_remove:cV -\cs_new_eq:NN \prop_gdel:Nn \prop_gremove:Nn -\cs_new_eq:NN \prop_gdel:NV \prop_gremove:NV -\cs_new_eq:NN \prop_gdel:cn \prop_gremove:cn -\cs_new_eq:NN \prop_gdel:cV \prop_gremove:cV -%</deprecated> -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \begin{macrocode} %</initex|package> % \end{macrocode} |