summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-07-28 21:53:53 +0000
committerKarl Berry <karl@freefriends.org>2013-07-28 21:53:53 +0000
commit476ef285597d50560f829ffd64532d75d937d06a (patch)
tree5c652f3fb3c6e7458bb762f660a005e2f77c3f80 /Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
parent9cad0f5f2f5f3df83a79cca1d848bf3a5feef241 (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.dtx348
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}