summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/expl3/l3prop.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3prop.dtx')
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3prop.dtx865
1 files changed, 0 insertions, 865 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3prop.dtx b/Master/texmf-dist/source/latex/expl3/l3prop.dtx
deleted file mode 100644
index bd287f2e569..00000000000
--- a/Master/texmf-dist/source/latex/expl3/l3prop.dtx
+++ /dev/null
@@ -1,865 +0,0 @@
-% \iffalse
-%% File: l3prop.dtx Copyright (C) 1990-2009 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
-%% license or (at your option) any later version. The latest version
-%% of this license is in the file
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
-%% and all files in that bundle must be distributed together.
-%%
-%% The released version of this bundle is available from CTAN.
-%%
-%% -----------------------------------------------------------------------
-%%
-%% The development version of the bundle can be found at
-%%
-%% http://www.latex-project.org/svnroot/experimental/trunk/
-%%
-%% for those people who are interested.
-%%
-%%%%%%%%%%%
-%% NOTE: %%
-%%%%%%%%%%%
-%%
-%% Snapshots taken from the repository represent work in progress and may
-%% not work or may contain conflicting material! We therefore ask
-%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
-%%
-%% -----------------------------------------------------------------------
-%
-%<*driver|package>
-\RequirePackage{l3names}
-%</driver|package>
-%\fi
-\GetIdInfo$Id: l3prop.dtx 2223 2011-04-09 12:57:14Z will $
- {L3 Experimental Property Lists}
-%\iffalse
-%<*driver>
-%\fi
-\ProvidesFile{\filename.\filenameext}
- [\filedate\space v\fileversion\space\filedescription]
-%\iffalse
-\documentclass[full]{l3doc}
-\begin{document}
-\DocInput{\filename.\filenameext}
-\end{document}
-%</driver>
-% \fi
-%
-%
-% \title{The \textsf{l3prop} package\thanks{This file
-% has version number \fileversion, last
-% revised \filedate.}\\
-% Property Lists}
-% \author{\Team}
-% \date{\filedate}
-% \maketitle
-%
-% \def\propkey{key}
-% \def\propval{info}
-% \def\proplist{prop}
-%
-% \begin{documentation}
-%
-% \LaTeX3 implements a data structure called a `property list' which allows
-% arbitrary information to be stored and accessed using keywords rather than
-% numerical indexing.
-%
-% A property list might contain a set of keys such as "name", "age", and "ID",
-% which each have individual values that can be saved and retrieved.
-%
-% \section{Functions}
-%
-% \begin{function}{%
-% \prop_new:N |
-% \prop_new:c |
-% }
-% \begin{syntax}
-% "\prop_new:N" <\proplist>
-% \end{syntax}
-% Defines <\proplist> to be a variable of type \meta{\proplist}.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_clear:N |
-% \prop_clear:c |
-% \prop_gclear:N |
-% \prop_gclear:c |
-% }
-% \begin{syntax}
-% "\prop_clear:N" <\proplist>
-% \end{syntax}
-% These functions locally or globally clear <\proplist>.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_put:Nnn |
-% \prop_put:Nno |
-% \prop_put:NnV |
-% \prop_put:NVn |
-% \prop_put:NVV |
-% \prop_put:Nnx |
-% \prop_put:cnn |
-% \prop_put:cnx |
-% \prop_gput:Nnn |
-% \prop_gput:NVn |
-% \prop_gput:Nno |
-% \prop_gput:NnV |
-% \prop_gput:Nnx |
-% \prop_gput:cnn |
-% \prop_gput:ccx |
-% }
-% \begin{syntax}
-% "\prop_put:Nnn" <\proplist> \Arg{\propkey} \Arg{token list}
-% \end{syntax}
-% Locally or globally associates <token list> with <\propkey> in the <\proplist>
-% <\proplist>. If <\propkey> has already a meaning within <\proplist> this value is
-% overwritten.
-%
-% The <\propkey> must not contain unescaped "#" tokens but the <token list> may.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_gput_if_new:Nnn |
-% }
-% \begin{syntax}
-% "\prop_gput_if_new:Nnn" <\proplist> \Arg{\propkey} \Arg{token list}
-% \end{syntax}
-% Globally associates <token list> with <\propkey> in the <\proplist>
-% <\proplist> but only if <\propkey> has so far no meaning within <\proplist>.
-% Silently ignored if <\propkey> is already set in the <\proplist>.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_get:NnN |
-% \prop_get:NVN |
-% \prop_get:cnN |
-% \prop_get:cVN |
-% \prop_gget:NnN |
-% \prop_gget:NVN |
-% \prop_gget:cnN |
-% \prop_gget:cVN |
-% }
-% \begin{syntax}
-% "\prop_get:NnN" <\proplist> \Arg{\propkey} <tl var.>
-% \end{syntax}
-% If <\propval> is the information associated with <\propkey> in the <\proplist>
-% <\proplist> then the token list variable <tl var.> gets <\propval> assigned.
-% Otherwise its value is the special quark "\q_no_value".
-%^^A See section \ref{sec:quarks} to test this.
-% The assignment is done either locally or globally.
-% \end{function}
-%
-% \begin{function}{ \prop_set_eq:NN |
-% \prop_set_eq:cN |
-% \prop_set_eq:Nc |
-% \prop_set_eq:cc |
-% \prop_gset_eq:NN |
-% \prop_gset_eq:cN |
-% \prop_gset_eq:Nc |
-% \prop_gset_eq:cc }
-% \begin{syntax}
-% "\prop_set_eq:NN" <\proplist 1> <\proplist 2>
-% \end{syntax}
-% A fast assignment of <\proplist>s.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_get_gdel:NnN |
-% }
-% \begin{syntax}
-% "\prop_get_gdel:NnN" <\proplist> \Arg{\propkey} <tl var.>
-% \end{syntax}
-% Like "\prop_get:NnN" but additionally removes <\propkey> (and its <\propval>)
-% from <\proplist>.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_del:Nn |
-% \prop_del:NV |
-% \prop_gdel:Nn |
-% \prop_gdel:NV |
-% }
-% \begin{syntax}
-% "\prop_del:Nn" <\proplist> \Arg{\propkey}
-% \end{syntax}
-% Locally or globally deletes <\propkey> and its <\propval> from <\proplist> if
-% found. Otherwise does nothing.
-% \end{function}
-%
-%
-% \begin{function}{ \prop_map_function:NN / (EXP) |
-% \prop_map_function:cN / (EXP) |
-% \prop_map_function:Nc / (EXP) |
-% \prop_map_function:cc / (EXP) }
-% \begin{syntax}
-% "\prop_map_function:NN" <\proplist> <function>
-% \end{syntax}
-% Maps <function> which should be a function with two arguments (<\propkey>
-% and <\propval>) over every <\propkey> <\propval> pair of <\proplist>.
-% Property lists do not have any intrinsic ``order'' when stored. As a
-% result, you should not expect any particular order to apply when using
-% these mapping functions, even with newly-created properly lists.
-% \end{function}
-%
-% \begin{function}{\prop_map_inline:Nn |
-% \prop_map_inline:cn
-% }
-% \begin{syntax}
-% "\prop_map_inline:Nn" <\proplist> \Arg{inline function}
-% \end{syntax}
-% Just like "\prop_map_function:NN" but with the function of two arguments
-% supplied as inline code. Within <inline function> refer to the
-% arguments via "#1" (<\propkey>) and "#2" (<\propval>). Nestable.
-% Property lists do not have any intrinsic ``order'' when stored. As a
-% result, you should not expect any particular order to apply when using
-% these mapping functions, even with newly-created properly lists.
-% \end{function}
-%
-%
-% \begin{function}{%
-% \prop_map_break: |
-% }
-% \begin{syntax}
-% "\prop_map_inline:Nn" \meta{\proplist} "{"\\
-% " ... \"\meta{break test}":T {\prop_map_break:} }"
-% \end{syntax}
-% For breaking out of a loop. To be used inside "TF"-type functions as shown
-% in the example above.
-% \end{function}
-%
-% \begin{function}{ \prop_show:N |
-% \prop_show:c }
-% \begin{syntax}
-% "\prop_show:N" <\proplist>
-% \end{syntax}
-% Pauses the compilation and shows <\proplist> on the terminal output and
-% in the log file.
-% \end{function}
-%
-% \begin{function}{ \prop_display:N |
-% \prop_display:c }
-% \begin{syntax}
-% "\prop_display:N" <prop>
-% \end{syntax}
-% As with "\prop_show:N" but pretty prints the output one line per property pair.
-% \end{function}
-%
-%
-% \section{Predicates and conditionals}
-%
-% \begin{function}{ \prop_if_empty_p:N |
-% \prop_if_empty_p:c }
-% \begin{syntax}
-% "\prop_if_empty_p:N" <\proplist> \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Predicates to test whether or not a particular <\proplist> is empty.
-% \end{function}
-%
-% \begin{function}{ \prop_if_empty:N / (TF)(EXP) |
-% \prop_if_empty:c / (TF)(EXP) }
-% \begin{syntax}
-% "\prop_if_empty:NTF" <\proplist> \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Set of conditionals that test whether or not a particular <\proplist>
-% is empty.
-% \end{function}
-%
-% \begin{function}{
-% \prop_if_eq_p:NN / (EXP) |
-% \prop_if_eq_p:cN / (EXP) |
-% \prop_if_eq_p:Nc / (EXP) |
-% \prop_if_eq_p:cc / (EXP) |
-% \prop_if_eq:NN / (EXP)(TF) |
-% \prop_if_eq:cN / (EXP)(TF) |
-% \prop_if_eq:Nc / (EXP)(TF) |
-% \prop_if_eq:cc / (EXP)(TF) |
-% }
-% \begin{syntax}
-% "\prop_if_eq:NNF" <\proplist 1> <\proplist 2> \Arg{false code}
-% \end{syntax}
-% Execute <false code> if <\proplist 1> doesn't hold the same token list as
-% <\proplist 2>. Only expandable for new versions of pdf\TeX.
-% \end{function}
-%
-%
-% \begin{function}{%
-% \prop_if_in:Nn / (TF) |
-% \prop_if_in:NV / (TF) |
-% \prop_if_in:No / (TF) |
-% \prop_if_in:cn / (TF) |
-% \prop_if_in:cc / (TF) |
-% }
-% \begin{syntax}
-% "\prop_if_in:NnTF" <\proplist> \Arg{\propkey} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if <\propkey> is used in <\proplist> and then either executes <true code>
-% or <false code>.
-% \end{function}
-%
-% \section{Internal functions}
-%
-% \begin{function}{\q_prop}
-% Quark used to delimit property lists internally.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_put_aux:w |
-% \prop_put_if_new_aux:w |
-% }
-% Internal functions implementing the put operations.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_get_aux:w |
-% \prop_gget_aux:w |
-% \prop_get_del_aux:w |
-% \prop_del_aux:w |
-% }
-% Internal functions implementing the get and delete operations.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_if_in_aux:w |
-% }
-% Internal function implementing the key test operation.
-% \end{function}
-%
-% \begin{function}{%
-% \prop_map_function_aux:w |
-% }
-% Internal function implementing the map operations.
-% \end{function}
-%
-% \begin{function}{%
-% \g_prop_inline_level_int |
-% }
-% Integer used in internal name for function used inside
-% "\prop_map_inline:NN".
-% \end{function}
-%
-% \begin{function}{\prop_split_aux:Nnn}
-% \begin{syntax}
-% "\prop_split_aux:Nnn" <\proplist> <\propkey> <cmd>
-% \end{syntax}
-% Internal function that invokes <cmd> with 3 arguments: 1st is the
-% beginning of <\proplist> before <\propkey>, 2nd is the value associated with
-% <\propkey>, 3rd is the rest of <\proplist> after <\propkey>. If there is no key
-% <\propkey> in <\proplist>, then the 2 arg is "\q_no_value" and the 3rd arg is
-% empty; otherwise the 3rd argument has the two extra tokens <\propkey>
-% "\q_no_value" at the end.
-%
-% This function is used to implement various get operations.
-% \end{function}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3prop} implementation}
-%
-% A property list is a token register whose contents is
-% of the form\par
-% {\centering|\q_prop| \meta{\propkey$\sb1$} |\q_prop| \marg{\propval$\sb1$} \ldots{}
-% |\q_prop| \meta{\propkey$\sb n$} |\q_prop| \marg{\propval$\sb n$}\par}
-%
-% The property \m{\propkey}s and \m{\propval}s might be arbitrary token lists; each
-% \m{\propval} is surrounded by braces.
-%
-% We start by ensuring that the required packages are loaded.
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage
- {\filename}{\filedate}{\fileversion}{\filedescription}
-\package_check_loaded_expl:
-%</package>
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macro}{\q_prop}
-% The separator between \m{\propkey}s and \m{\propval}s and \m{\propkey}s.
-% \begin{macrocode}
-\quark_new:N\q_prop
-% \end{macrocode}
-% \end{macro}
-%
-% To get values from property-lists, token lists should be passed to
-% the appropriate functions.
-%
-% \subsection{Functions}
-%
-% \begin{macro}{\prop_new:N}
-% \begin{macro}{\prop_new:c}
-% Property lists are implemented as token registers.
-% \begin{macrocode}
-\cs_new_eq:NN \prop_new:N \toks_new:N
-\cs_new_eq:NN \prop_new:c \toks_new:c
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_clear:N}
-% \begin{macro}{\prop_clear:c}
-% \begin{macro}{\prop_gclear:N}
-% \begin{macro}{\prop_gclear:c}
-% The same goes for clearing a property list, either
-% locally or globally.
-% \begin{macrocode}
-\cs_new_eq:NN \prop_clear:N \toks_clear:N
-\cs_new_eq:NN \prop_clear:c \toks_clear:c
-\cs_new_eq:NN \prop_gclear:N \toks_gclear:N
-\cs_new_eq:NN \prop_gclear:c \toks_gclear:c
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_set_eq:NN}
-% \begin{macro}{\prop_set_eq:Nc}
-% \begin{macro}{\prop_set_eq:cN}
-% \begin{macro}{\prop_set_eq:cc}
-% \begin{macro}{\prop_gset_eq:NN}
-% \begin{macro}{\prop_gset_eq:Nc}
-% \begin{macro}{\prop_gset_eq:cN}
-% \begin{macro}{\prop_gset_eq:cc}
-% This makes two \m{\proplist}s have the same contents.
-% \begin{macrocode}
-\cs_new_eq:NN \prop_set_eq:NN \toks_set_eq:NN
-\cs_new_eq:NN \prop_set_eq:Nc \toks_set_eq:Nc
-\cs_new_eq:NN \prop_set_eq:cN \toks_set_eq:cN
-\cs_new_eq:NN \prop_set_eq:cc \toks_set_eq:cc
-\cs_new_eq:NN \prop_gset_eq:NN \toks_gset_eq:NN
-\cs_new_eq:NN \prop_gset_eq:Nc \toks_gset_eq:Nc
-\cs_new_eq:NN \prop_gset_eq:cN \toks_gset_eq:cN
-\cs_new_eq:NN \prop_gset_eq:cc \toks_gset_eq:cc
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_show:N}
-% \begin{macro}{\prop_show:c}
-% Show on the console the raw contents of a property list's token register.
-% \begin{macrocode}
-\cs_new_eq:NN \prop_show:N \toks_show:N
-\cs_new_eq:NN \prop_show:c \toks_show:c
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_display:N}
-% \begin{macro}{\prop_display:c}
-% Pretty print the contents of a property list on the console.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \prop_display:N #1 {
- \iow_term:x { Property-list~\token_to_str:N #1~contains~
- the~pairs~(without~outer~braces): }
- \toks_clear:N \l_tmpa_toks
- \prop_map_inline:Nn #1 {
- \toks_if_empty:NF \l_tmpa_toks {
- \toks_put_right:Nx \l_tmpa_toks {^^J>~}
- }
- \toks_put_right:Nx \l_tmpa_toks {
- \c_space_tl \iow_char:N \{ \exp_not:n {##1} \iow_char:N \} \c_space_tl
- \c_space_tl => \c_space_tl
- \c_space_tl \iow_char:N \{ \exp_not:n {##2} \iow_char:N \}
- }
- }
- \toks_show:N \l_tmpa_toks
-}
-\cs_generate_variant:Nn \prop_display:N {c}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\prop_split_aux:Nnn}
-% |\prop_split_aux:Nnn|\meta{\proplist}\meta{\propkey}\meta{cmd} invokes \meta{cmd}
-% with 3 arguments: 1st is the beginning of \meta{\proplist} before
-% \meta{\propkey}, 2nd is the value associated with \meta{\propkey}, 3rd is the
-% rest of \meta{\proplist} after \meta{\propkey}. If there is no property
-% \meta{\propkey} in \meta{\proplist}, then the 2nd argument will be |\q_no_value|
-% and the 3rd argument is empty; otherwise the 3rd argument has the
-% extra tokens |\q_prop| \meta{\propkey} |\q_prop| |\q_no_value| at the end.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_split_aux:Nnn #1#2#3{
- \cs_set:Npn \prop_tmp:w ##1 \q_prop #2 \q_prop ##2##3 \q_stop {
- #3 {##1}{##2}{##3}
- }
- \exp_after:wN \prop_tmp:w \toks_use:N #1 \q_prop #2 \q_prop \q_no_value \q_stop
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\prop_get:NnN}
-% \begin{macro}{\prop_get:NVN}
-% \begin{macro}{\prop_get:cnN}
-% \begin{macro}{\prop_get:cVN}
-% \begin{macro}{\prop_get_aux:w}
-% |\prop_get:NnN |\meta{\proplist}\meta{\propkey}\meta{tl var.}~defines
-% \meta{tl var.}~to be the value associated with \meta{\propkey} in \meta{\proplist},
-% |\q_no_value| if not found.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_get:NnN #1#2 {
- \prop_split_aux:Nnn #1{#2}\prop_get_aux:w
-}
-\cs_new_protected:Npn \prop_get_aux:w #1#2#3#4 { \tl_set:Nn #4 {#2} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_get:NnN { NVN, cnN, cVN }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_gget:NnN}
-% \begin{macro}{\prop_gget:NVN}
-% \begin{macro}{\prop_gget:NnN}
-% \begin{macro}{\prop_gget:NVN}
-% \begin{macro}{\prop_gget_aux:w}
-% The global version of the previous function.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_gget:NnN #1#2{
- \prop_split_aux:Nnn #1{#2}\prop_gget_aux:w}
-\cs_new_protected:Npn \prop_gget_aux:w #1#2#3#4{\tl_gset:Nx#4{\exp_not:n{#2}}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_gget:NnN { NVN, cnN, cVN }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_get_gdel:NnN}
-% \begin{macro}{\prop_get_del_aux:w}
-% |\prop_get_gdel:NnN| is the same as |\prop_get:NnN| but the
-% \m{\propkey} and its value are afterwards globally removed
-% from \m{property_list}. One probably also needs the local
-% variants or only the local one, or\ldots\ We decide this later.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_get_gdel:NnN #1#2#3{
- \prop_split_aux:Nnn #1{#2}{\prop_get_del_aux:w #3{\toks_gset:Nn #1}{#2}}}
-\cs_new_protected:Npn \prop_get_del_aux:w #1#2#3#4#5#6{
- \tl_set:Nn #1 {#5}
- \quark_if_no_value:NF #1 {
- \cs_set_nopar:Npn \prop_tmp:w ##1\q_prop#3\q_prop\q_no_value {#2{#4##1}}
- \prop_tmp:w #6}
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_put:Nnn}
-% \begin{macro}{\prop_put:Nno}
-% \begin{macro}{\prop_put:NnV}
-% \begin{macro}{\prop_put:Nnx}
-% \begin{macro}{\prop_put:NVn}
-% \begin{macro}{\prop_put:NVV}
-% \begin{macro}{\prop_put:cnn}
-% \begin{macro}{\prop_put:cnx}
-% \begin{macro}{\prop_gput:Nnn}
-% \begin{macro}{\prop_gput:NVn}
-% \begin{macro}{\prop_gput:NnV}
-% \begin{macro}{\prop_gput:Nno}
-% \begin{macro}{\prop_gput:Nnx}
-% \begin{macro}{\prop_gput:cnn}
-% \begin{macro}{\prop_gput:ccx}
-% \begin{macro}{\prop_put_aux:w}
-% |\prop_put:Nnn| \marg{\proplist} \marg{\propkey} \marg{\propval} adds/changes the
-% value associated with \meta{\propkey} in \meta{\proplist} to \meta{\propval}.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_put:Nnn #1#2{
- \prop_split_aux:Nnn #1{#2}{
- \prop_clear:N #1
- \prop_put_aux:w {\toks_put_right:Nn #1}{#2}
- }
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_gput:Nnn #1#2{
- \prop_split_aux:Nnn #1{#2}{
- \prop_gclear:N #1
- \prop_put_aux:w {\toks_gput_right:Nn #1}{#2}
- }
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_put_aux:w #1#2#3#4#5#6{
- #1{\q_prop#2\q_prop{#6}#3}
- \tl_if_empty:nF{#5}
- {
- \cs_set_nopar:Npn \prop_tmp:w ##1\q_prop#2\q_prop\q_no_value {#1{##1}}
- \prop_tmp:w #5
- }
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_put:Nnn { Nno , NnV, Nnx, NVn, NVV, cnn , cnx }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_gput:Nnn {NVn,NnV,Nno,Nnx,Nox,cnn,ccx}
-% \end{macrocode}
-% \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}{\prop_del:Nn}
-% \begin{macro}{\prop_del:NV}
-% \begin{macro}{\prop_gdel:NV}
-% \begin{macro}{\prop_gdel:Nn}
-% \begin{macro}{\prop_del_aux:w}
-% |\prop_del:Nn |\meta{\proplist}\meta{\propkey} deletes the entry for
-% \meta{\propkey} in \meta{\proplist}, if any.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_del:Nn #1#2{
- \prop_split_aux:Nnn #1{#2}{\prop_del_aux:w {\toks_set:Nn #1}{#2}}}
-\cs_new_protected:Npn \prop_gdel:Nn #1#2{
- \prop_split_aux:Nnn #1{#2}{\prop_del_aux:w {\toks_gset:Nn #1}{#2}}}
-\cs_new_protected:Npn \prop_del_aux:w #1#2#3#4#5{
- \cs_set_nopar:Npn \prop_tmp:w {#4}
- \quark_if_no_value:NF \prop_tmp:w {
- \cs_set_nopar:Npn \prop_tmp:w ##1\q_prop#2\q_prop\q_no_value {#1{#3##1}}
- \prop_tmp:w #5
- }
-}
-\cs_generate_variant:Nn \prop_del:Nn { NV }
-\cs_generate_variant:Nn \prop_gdel:Nn { NV }
-%
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\prop_gput_if_new:Nnn}
-% \begin{macro}{\prop_put_if_new_aux:w}
-% |\prop_gput_if_new:Nnn| \m{\proplist} \m{\propkey}
-% \m{\propval} is equivalent to
-% \begin{tabbing}
-% xxxxx\=xxxxx\= \kill
-% |\prop_if_in:NnTF |\m{\proplist}\m{\propkey} \\
-% \> |{}%| \\
-% \> |{\prop_gput:Nnn| \\
-% \>\> \m{property_list} \\
-% \>\> \m{\propkey} \\
-% \>\> \m{\propval}|}|
-% \end{tabbing}
-% Here we go (listening to Porgy \& Bess in a recording with Ella
-% F. and Louis A. which makes writing macros sometimes difficult; I
-% find myself humming instead of working):
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_gput_if_new:Nnn #1#2{
- \prop_split_aux:Nnn #1{#2}{\prop_put_if_new_aux:w #1{#2}}}
-\cs_new_protected:Npn \prop_put_if_new_aux:w #1#2#3#4#5#6{
- \tl_if_empty:nT {#5}{#1{\q_prop#2\q_prop{#6}#3}}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Predicates and conditionals}
-%
-% \begin{macro}{\prop_if_empty_p:N,\prop_if_empty_p:c}
-% \begin{macro}[TF]{\prop_if_empty:N,\prop_if_empty:c}
-% This conditional takes a \m{\proplist} as its argument and evaluates
-% either the true or the false case, depending on whether or not
-% \m{\proplist} contains any properties.
-% \begin{macrocode}
-\prg_new_eq_conditional:NNn \prop_if_empty:N \toks_if_empty:N {p,TF,T,F}
-\prg_new_eq_conditional:NNn \prop_if_empty:c \toks_if_empty:c {p,TF,T,F}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\prop_if_eq_p:NN,\prop_if_eq_p:cN,
-% \prop_if_eq_p:Nc,\prop_if_eq_p:cc}
-% \begin{macro}[TF]{\prop_if_eq:NN,\prop_if_eq:Nc,
-% \prop_if_eq:cN,\prop_if_eq:cc}
-% These functions test whether two property lists are equal.
-% \begin{macrocode}
-\prg_new_eq_conditional:NNn \prop_if_eq:NN \toks_if_eq:NN {p,TF,T,F}
-\prg_new_eq_conditional:NNn \prop_if_eq:cN \toks_if_eq:cN {p,TF,T,F}
-\prg_new_eq_conditional:NNn \prop_if_eq:Nc \toks_if_eq:Nc {p,TF,T,F}
-\prg_new_eq_conditional:NNn \prop_if_eq:cc \toks_if_eq:cc {p,TF,T,F}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[TF]{\prop_if_in:Nn}
-% \begin{macro}[TF]{\prop_if_in:NV}
-% \begin{macro}[TF]{\prop_if_in:No}
-% \begin{macro}[TF]{\prop_if_in:cn}
-% \begin{macro}[TF]{\prop_if_in:cc}
-% \begin{macro}{\prop_if_in_aux:w}
-% |\prop_if_in:NnTF| \m{property_list} \m{\propkey}
-% \m{true_case} \m{false_case} will check whether or not
-% \m{\propkey} is on the \m{property_list} and then select
-% either the true or false case.
-% \begin{macrocode}
-\prg_new_protected_conditional:Nnn \prop_if_in:Nn {TF,T,F} {
- \prop_split_aux:Nnn #1 {#2} {\prop_if_in_aux:w}
-}
-\cs_new_nopar:Npn \prop_if_in_aux:w #1#2#3 {
- \quark_if_no_value:nTF {#2} {\prg_return_false:} {\prg_return_true:}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_if_in:NnTF {NV,No,cn,cc}
-\cs_generate_variant:Nn \prop_if_in:NnT {NV,No,cn,cc}
-\cs_generate_variant:Nn \prop_if_in:NnF {NV,No,cn,cc}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Mapping functions}
-%
-% \begin{macro}{\prop_map_function:NN}
-% \begin{macro}{\prop_map_function:cN}
-% \begin{macro}{\prop_map_function:Nc}
-% \begin{macro}{\prop_map_function:cc}
-% \begin{macro}{\prop_map_function_aux:w}
-% Maps a function on every entry in the property list. The
-% function must take 2 arguments: a key and a value.
-%
-% First, some failed attempts:
-% \begin{verbatim}
-% \cs_new_nopar:Npn \prop_map_function:NN #1#2{
-% \exp_after:wN \prop_map_function_aux:w
-% \exp_after:wN #2 \toks_use:N #1 \q_prop{}\q_prop \q_no_value \q_stop
-% }
-% \cs_new_nopar:Npn \prop_map_function_aux:w #1\q_prop#2\q_prop#3{
-% \if_predicate:w \tl_if_empty_p:n{#2}
-% \exp_after:wN \prop_map_break:
-% \fi:
-% #1{#2}{#3}
-% \prop_map_function_aux:w #1
-% }
-% \end{verbatim}
-% problem with the above implementation is that an empty key stops the mapping but all
-% other functions in the module allow the use of empty keys (as one value)
-% \begin{verbatim}
-% \cs_set_nopar:Npn \prop_map_function:NN #1#2{
-% \exp_after:wN \prop_map_function_aux:w
-% \exp_after:wN #2 \toks_use:N #1 \q_prop \q_no_value \q_prop \q_no_value
-% }
-% \cs_set_nopar:Npn \prop_map_function_aux:w #1\q_prop#2\q_prop#3{
-% \quark_if_no_value:nF{#2}
-% {
-% #1{#2}{#3}
-% \prop_map_function_aux:w #1
-% }
-% }
-% \end{verbatim}
-% problem with the above implementation is that |\quark_if_no_value:nF| is fairly slow and
-% if |\quark_if_no_value:NF| is used instead we have to do an assignment thus
-% making the mapping not expandable (is that important?)
-%
-% Here's the current version of the code:
-% \begin{macrocode}
-\cs_set_nopar:Npn \prop_map_function:NN #1#2 {
- \exp_after:wN \prop_map_function_aux:w
- \exp_after:wN #2 \toks_use:N #1 \q_prop \q_nil \q_prop \q_no_value \q_stop
-}
-\cs_set:Npn \prop_map_function_aux:w #1 \q_prop #2 \q_prop #3 {
- \if_meaning:w \q_nil #2
- \exp_after:wN \prop_map_break:
- \fi:
- #1{#2}{#3}
- \prop_map_function_aux:w #1
-}
-% \end{macrocode}
-% (potential) problem with the above implementation is that it will
-% return true if |#2| contains more than just |\q_nil| thus executing
-% whatever follows. Claim: this can't happen |:-)| so we should be ok
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_map_function:NN {c,Nc,cc}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_map_inline:Nn}
-% \begin{macro}{\prop_map_inline:cn}
-% \begin{macro}{\g_prop_inline_level_int}
-% The inline functions are straight forward. It takes longer
-% to test if the list is empty than to run it on an empty list so
-% we don't waste time doing that.
-% \begin{macrocode}
-\int_new:N \g_prop_inline_level_int
-\cs_new_protected_nopar:Npn \prop_map_inline:Nn #1#2 {
- \int_gincr:N \g_prop_inline_level_int
- \cs_gset:cpn {prop_map_inline_ \int_use:N \g_prop_inline_level_int :n}
- ##1##2{#2}
- \prop_map_function:Nc #1
- {prop_map_inline_ \int_use:N \g_prop_inline_level_int :n}
- \int_gdecr:N \g_prop_inline_level_int
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn\prop_map_inline:Nn {cn}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\prop_map_break:}
-% The break statement.
-% \begin{macrocode}
-\cs_new_eq:NN \prop_map_break: \use_none_delimit_by_q_stop:w
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-%
-% \end{implementation}
-% \PrintIndex
-%
-% \endinput