diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/l3kernel/l3clist.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/l3kernel/l3clist.dtx | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index 7d2f3716d69..98ee9a84abd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2018-11-19} +% \date{Released 2018-12-06} % % \maketitle % @@ -692,6 +692,22 @@ % \end{texnote} % \end{function} % +% \begin{function}[EXP, added = 2016-12-06] +% {\clist_rand_item:N, \clist_rand_item:n, \clist_rand_item:c} +% \begin{syntax} +% \cs{clist_rand_item:N} \meta{clist~var} +% \cs{clist_rand_item:n} \Arg{comma list} +% \end{syntax} +% Selects a pseudo-random item of the \meta{comma list}. If the +% \meta{comma list} has no item, the result is empty. +% \begin{texnote} +% The result is returned within the \tn{unexpanded} +% primitive (\cs{exp_not:n}), which means that the \meta{item} +% does not expand further when appearing in an \texttt{x}-type +% argument expansion. +% \end{texnote} +% \end{function} +% % \section{Viewing comma lists} % % \begin{function}[updated = 2015-08-03]{\clist_show:N, \clist_show:c} @@ -1932,6 +1948,33 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\clist_rand_item:n, \clist_rand_item:N, \clist_rand_item:c} +% \begin{macro}{\@@_rand_item:nn} +% The |N|-type function is not implemented through the |n|-type +% function for efficiency: for instance comma-list variables do not +% require space-trimming of their items. Even testing for emptyness +% of an |n|-type comma-list is slow, so we count items first and use +% that both for the emptyness test and the pseudo-random integer. +% Importantly, \cs{clist_item:Nn} and \cs{clist_item:nn} only evaluate +% their argument once. +% \begin{macrocode} +\cs_new:Npn \clist_rand_item:n #1 + { \exp_args:Nf \@@_rand_item:nn { \clist_count:n {#1} } {#1} } +\cs_new:Npn \@@_rand_item:nn #1#2 + { + \int_compare:nNnF {#1} = 0 + { \clist_item:nn {#2} { \int_rand:nn { 1 } {#1} } } + } +\cs_new:Npn \clist_rand_item:N #1 + { + \clist_if_empty:NF #1 + { \clist_item:Nn #1 { \int_rand:nn { 1 } { \clist_count:N #1 } } } + } +\cs_generate_variant:Nn \clist_rand_item:N { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \subsection{Viewing comma lists} % % \begin{macro}{\clist_show:N, \clist_show:c, \clist_log:N, \clist_log:c, \@@_show:NN} |