texlive[46973] Master: duckuments (15mar18)

commits+karl at tug.org commits+karl at tug.org
Thu Mar 15 23:06:50 CET 2018


Revision: 46973
          http://tug.org/svn/texlive?view=revision&revision=46973
Author:   karl
Date:     2018-03-15 23:06:50 +0100 (Thu, 15 Mar 2018)
Log Message:
-----------
duckuments (15mar18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/duckuments/README.md
    trunk/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf
    trunk/Master/texmf-dist/source/latex/duckuments/duckuments.dtx
    trunk/Master/texmf-dist/tex/latex/duckuments/duckuments.sty
    trunk/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf
    trunk/Master/tlpkg/libexec/ctan2tds

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/duckuments/duckuments.hd

Modified: trunk/Master/texmf-dist/doc/latex/duckuments/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/duckuments/README.md	2018-03-15 22:03:42 UTC (rev 46972)
+++ trunk/Master/texmf-dist/doc/latex/duckuments/README.md	2018-03-15 22:06:50 UTC (rev 46973)
@@ -21,7 +21,7 @@
  - `\duckenumerate` - `\ducklist{enumerate}`
  - `\duckdescription` - `\ducklist{description}`
  - `\duckumentsCreateExampleFile`
- - `\duckumentsDrawRandomDucks`
+ - `\duckumentsDrawRandomDucks[count]`
 
 It also provides `example-image-duck.pdf` which contains several pages of random
 `tikzduck`s. Also `\includegraphics` is patched so one can use
@@ -29,4 +29,5 @@
 `example-image-duck.pdf`. The behaviour of `\includegraphics` shouldn't be
 altered for other files.
 
-**Attention:  At the moment, the package only works with pdfTeX and LuaTeX.**
+**Attention:
+   At the moment, the package only works with pdfTeX, LuaTeX, and XeTeX.**

Deleted: trunk/Master/texmf-dist/doc/latex/duckuments/duckuments.hd
===================================================================
Modified: trunk/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/duckuments/duckuments.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/duckuments/duckuments.dtx	2018-03-15 22:03:42 UTC (rev 46972)
+++ trunk/Master/texmf-dist/source/latex/duckuments/duckuments.dtx	2018-03-15 22:06:50 UTC (rev 46973)
@@ -63,6 +63,7 @@
 %<*driver>
 \ProvidesFile{duckuments.dtx}[2018/03/13 minimal working duckuments]
 \documentclass{l3doc}
+\usepackage{duckuments}
 \usepackage{enumitem}
 \newenvironment{options}
   {\begin{description}[style=nextline,font=\normalfont\ttfamily]}
@@ -84,8 +85,8 @@
 %</eid>
 %
 %<*pkg>
-\def\duckuments at version{v0.1}
-\def\duckuments at date{2018/03/13}
+\def\duckuments at version{v0.2}
+\def\duckuments at date{2018/03/14}
 \ProvidesExplPackage
   {duckuments}          {\duckuments at date}
   {\duckuments at version} {minimal working duckuments}
@@ -94,7 +95,9 @@
 %
 % \title{The \pkg{duckuments} package}
 % \author{Jonathan P. Spratte\thanks{E-mail: jspratte at yahoo.de}}
-% \date{Released 2018/03/13}
+% \makeatletter
+% \date{version \duckuments at version, released \duckuments at date}
+% \makeatother
 % \maketitle
 % \tableofcontents
 %
@@ -118,7 +121,7 @@
 % once. The sources are hosted on
 % \href{https://github.com/Skillmon/ltx_duckuments}{github}.
 %
-% \textbf{The package does currently only work on \pdfTeX\ and \LuaTeX}.
+% \textbf{The package does currently only work on \pdfTeX, \LuaTeX, and \XeTeX}.
 %
 % \section{Duckumentation}
 %
@@ -181,10 +184,13 @@
 % \end{function}
 %
 % \begin{function}{\duckumentsDrawRandomDucks}
-%   Draws \cs{duckuments at randoms} random \pkg{tikzducks} using
-%   \pkg{Ti\textit{k}Z}. Note that \pkg{duckuments} doesn't load
-%   \pkg{Ti\textit{k}Z}, this macro is for the use in
-%   \file{example-image-duck.tex}.
+%   \begin{syntax}
+%     \cs{duckumentsDrawRandomDucks}\oarg{count}
+%   \end{syntax}
+%   Draws \meta{count} random \pkg{tikzducks} using
+%   \pkg{Ti\textit{k}Z}. \meta{count} defaults to \cs{duckuments at randoms}.
+%   Note that \pkg{duckuments} doesn't load \pkg{Ti\textit{k}Z}, this macro is
+%   for the use in \file{example-image-duck.tex}.
 % \end{function}
 %
 % \subsection{Patches}
@@ -195,6 +201,12 @@
 % of that document is used. There shouldn't be any change in behaviour if other
 % files are used.
 %
+% The random page is chosen with |\int_random:nn| in \pdfTeX\ and \LuaTeX. If
+% \XeTeX\ is used, the package implements a RC4 pseudo-random generating
+% algorithm which is seeded using the current time and jobname. The generator
+% can produce only numbers between $1$ and $256$ and is biased if $256$ is not a
+% multiple of the page count of \file{example-image-duck.pdf}.
+%
 % The patch is done so that one can use \pkg{tikzducks} ducks without the need
 % of loading \pkg{tikz} in a minimal working duckument as example images.
 %
@@ -234,12 +246,17 @@
 %
 % Check which engine is used.
 %    \begin{macrocode}
-\bool_if:nF { \sys_if_engine_luatex_p: || \sys_if_engine_pdftex_p: }
-  { %>>>
+\bool_if:nF
+  {
+    \sys_if_engine_luatex_p:
+    || \sys_if_engine_pdftex_p:
+    || \sys_if_engine_xetex_p:
+  }
+  {%>>>
     \msg_new:nnnn { duckuments } { incompatible } 
       {
-        The~duckuments~package~is~currently~only~compatible~with~pdfTeX~and~
-        LuaTeX!
+        The~duckuments~package~is~currently~only~compatible~with~pdfTeX,~
+        LuaTeX,~and~XeTeX!
       }
       {
         Sorry~for~that.
@@ -248,7 +265,6 @@
     \endinput
   }%<<<
 %    \end{macrocode}
-%
 % Check whether \file{example-image-duck.pdf} exists.
 %    \begin{macrocode}
 \file_if_exist:nF { example-image-duck.pdf }
@@ -284,7 +300,7 @@
 % \begin{variable}{\duckuments at randoms}
 %   Stores the number of random ducks in \file{example-image-duck.pdf}.
 %    \begin{macrocode}
-\newcommand*\duckuments at randoms{100}
+\newcommand*\duckuments at randoms{128}
 %    \end{macrocode}
 % \end{variable}
 %
@@ -327,6 +343,146 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\c_duckuments_example_pages_int}
+%    \begin{macrocode}
+\str_if_eq:VnF \c_sys_jobname_str { example-image-duck }
+{\file_if_exist:nTF { example-image-duck.pdf }
+  {
+    \sys_if_engine_pdftex:T
+      {
+        \pdfximage{example-image-duck.pdf}
+        \int_const:Nn \c_duckuments_example_pages_int
+          { \the\pdflastximagepages }
+      }
+    \sys_if_engine_luatex:T
+      {
+        \saveimageresource{example-image-duck.pdf}
+        \int_const:Nn \c_duckuments_example_pages_int 
+          { \lastsavedimageresourcepages }
+      }
+    \sys_if_engine_xetex:TF
+      {
+        \int_set:Nn \l_tmpa_int { \XeTeXpdfpagecount "example-image-duck.pdf" }
+        \int_const:Nn \c_duckuments_example_pages_int { \l_tmpa_int }
+%    \end{macrocode}
+% For \XeTeX\ we need a bit more code in order to get random numbers. The
+% following is an implementation of RC4. First declare some variables:
+%    \begin{macrocode}
+        \int_new:N \g_duckuments_RCiv_i_int
+        \int_new:N \g_duckuments_RCiv_j_int
+        \int_new:N \g_duckuments_RCiv_keylength_int
+        \int_new:N \g_duckuments_tmpa_int
+        \int_const:Nn \c_duckuments_RCiv_Slength_int { 256 }
+        \tl_new:N \l_duckuments_tmpa_tl
+        \tl_new:N \l_duckuments_tmpb_tl
+        \cs_generate_variant:Nn \prop_gput:Nnn { Nxx }
+        \cs_generate_variant:Nn \prop_get:NnN { NxN }
+%    \end{macrocode}
+% Initialize the S array:
+%    \begin{macrocode}
+        \prop_new:N \g_duckuments_RCiv_S_prop
+        \int_step_inline:nnnn { 0 } { 1 } { 255 }
+          {
+            \prop_gput:Nnn \g_duckuments_RCiv_S_prop { #1 } { #1 }
+          }
+        \prop_new:N \g_duckuments_RCiv_key_prop
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 0 } { \int_use:N \c_sys_minute_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 1 } { \c_sys_hour_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 2 } { \c_sys_day_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 3 } { \c_sys_month_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 4 } { \int_eval:n {  \int_mod:nn { \c_sys_year_int } { 256 } } }
+        \int_gset:Nn \g_duckuments_RCiv_keylength_int { 5 }
+        \str_map_inline:Nn \c_sys_jobname_str
+          {
+            \prop_gput:Nxx \g_duckuments_RCiv_key_prop 
+              { \int_use:N \g_duckuments_RCiv_keylength_int }
+              { \int_from_alph:n { #1 } }
+            \int_gadd:Nn \g_duckuments_RCiv_keylength_int { 1 }
+          }
+        \cs_new:Nn \duckuments_swap_prop_entries:Nnn
+          {
+            \prop_get:NnN #1 { #2 } \l_duckuments_tmpa_tl
+            \prop_get:NnN #1 { #3 } \l_duckuments_tmpb_tl
+            \prop_gput:Nnx #1 { #2 } { \l_duckuments_tmpb_tl }
+            \prop_gput:Nnx #1 { #3 } { \l_duckuments_tmpa_tl }
+          }
+        \cs_generate_variant:Nn \duckuments_swap_prop_entries:Nnn { Nxx }
+        \cs_new:Nn \duckuments_gadd_mod:Nnn
+          {
+            \int_gset:Nn #1 { \int_mod:nn { #1 + #2 } { #3 } }
+          }
+        \cs_generate_variant:Nn \duckuments_gadd_mod:Nnn { Nxn }
+        \cs_new:Nn \duckuments_gadd_mod_Slength:Nn
+          {
+            \duckuments_gadd_mod:Nnn #1
+              { #2 } { \c_duckuments_RCiv_Slength_int }
+          }
+        \int_step_inline:nnnn { 0 } { 1 } { 255 }
+          {
+            \prop_get:NnN \g_duckuments_RCiv_S_prop { #1 } \l_duckuments_tmpa_tl
+            \int_gset:Nn \g_duckuments_tmpa_int
+              {
+                \int_mod:nn
+                  { #1 }
+                  { \g_duckuments_RCiv_keylength_int }
+              }
+            \prop_get:NxN \g_duckuments_RCiv_key_prop
+              { \int_use:N \g_duckuments_tmpa_int } \l_duckuments_tmpb_tl
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_j_int
+              { \l_duckuments_tmpa_tl + \l_duckuments_tmpb_tl }
+            \duckuments_swap_prop_entries:Nxx \g_duckuments_RCiv_S_prop
+              { #1 } { \int_use:N \g_duckuments_RCiv_j_int }
+          }
+        \int_gzero:N \g_duckuments_RCiv_i_int
+        \int_gzero:N \g_duckuments_RCiv_j_int
+%    \end{macrocode}
+% Provide a function which gets the next random number and sets
+% |\duckuments_random_page:| to it.
+%    \begin{macrocode}
+        \cs_new:Nn \duckuments_get_random_page:
+          {
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_i_int { \c_one } 
+            \prop_get:NxN \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_RCiv_i_int } \l_duckuments_tmpa_tl
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_j_int
+              { \l_duckuments_tmpa_tl }
+            \duckuments_swap_prop_entries:Nxx \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_RCiv_i_int }
+              { \int_use:N \g_duckuments_RCiv_j_int }
+            \int_gset:Nn \g_duckuments_tmpa_int { \l_duckuments_tmpa_tl }
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_tmpa_int
+              { \l_duckuments_tmpb_tl }
+            \prop_get:NxN \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_tmpa_int } \l_duckuments_tmpa_tl
+            \int_gset:Nn \g_duckuments_tmpa_int
+              {
+                \int_mod:nn
+                  { \l_duckuments_tmpa_tl } { \c_duckuments_example_pages_int }
+                + \c_one
+              }
+            \cs_set:Nx \duckuments_random_page:
+              { \int_use:N \g_duckuments_tmpa_int }
+          }
+        \cs_new:Nn \duckuments_random_page: { 1 }
+      }
+      {
+        \cs_new:Nn \duckuments_get_random_page: {}
+        \cs_new:Nn \duckuments_random_page:
+          { \int_rand:nn { 1 } { \c_duckuments_example_pages_int } }
+      }
+  }}
+  {
+    \int_const:Nn \c_duckuments_example_pages_int { 1 }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+%
 % \subsection{Options and Configurations}
 %    \begin{macrocode}
 \keys_define:nn { duckuments }
@@ -468,9 +624,9 @@
 %
 % \begin{macro}{\duckumentsDrawRandomDucks}
 %    \begin{macrocode}
-\newcommand*\duckumentsDrawRandomDucks
+\newcommand*\duckumentsDrawRandomDucks[1][\duckuments at randoms]
   {%>>>
-    \foreach\x in {1,2,...,\duckuments at randoms}
+    \foreach\x in {1,2,...,#1}
       {\begin{tikzpicture}
         \draw[black,fill=gray!50] (0,0) rectangle (6,4);
           \draw[gray,thin] (0,0) -- (6,4);
@@ -567,8 +723,10 @@
           {
             \regex_match:NnTF \c_duckuments_regex { ##3 }
               {
+                \duckuments_get_random_page:
                 \duckuments at includegraphicsBAK##1
-                  [page=\int_rand:nn{1}{\duckuments at randoms},##2] { ##3 }
+                  [page=\duckuments_random_page:,##2]
+                  { ##3 }
               }
               {
                 \duckuments at includegraphicsBAK##1[##2]{##3}

Modified: trunk/Master/texmf-dist/tex/latex/duckuments/duckuments.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/duckuments/duckuments.sty	2018-03-15 22:03:42 UTC (rev 46972)
+++ trunk/Master/texmf-dist/tex/latex/duckuments/duckuments.sty	2018-03-15 22:06:50 UTC (rev 46973)
@@ -31,17 +31,22 @@
 %%                                 example-image-duck.tex
 %% 
 \RequirePackage{xparse,letltxmacro,l3keys2e}
-\def\duckuments at version{v0.1}
-\def\duckuments at date{2018/03/13}
+\def\duckuments at version{v0.2}
+\def\duckuments at date{2018/03/14}
 \ProvidesExplPackage
   {duckuments}          {\duckuments at date}
   {\duckuments at version} {minimal working duckuments}
-\bool_if:nF { \sys_if_engine_luatex_p: || \sys_if_engine_pdftex_p: }
-  { %>>>
+\bool_if:nF
+  {
+    \sys_if_engine_luatex_p:
+    || \sys_if_engine_pdftex_p:
+    || \sys_if_engine_xetex_p:
+  }
+  {%>>>
     \msg_new:nnnn { duckuments } { incompatible }
       {
-        The~duckuments~package~is~currently~only~compatible~with~pdfTeX~and~
-        LuaTeX!
+        The~duckuments~package~is~currently~only~compatible~with~pdfTeX,~
+        LuaTeX,~and~XeTeX!
       }
       {
         Sorry~for~that.
@@ -71,7 +76,7 @@
           }
       }
   }%<<<
-\newcommand*\duckuments at randoms{100}
+\newcommand*\duckuments at randoms{128}
 \bool_new:N \l_duckuments_immediate_bool
 \bool_new:N \l_duckuments_toc_bool
 \bool_new:N \l_duckuments_math_inline_bool
@@ -78,6 +83,129 @@
 \bool_new:N \l_duckuments_math_display_bool
 \regex_const:Nn \c_duckuments_regex
   { example-image-duck|example-image-duck.pdf }
+\str_if_eq:VnF \c_sys_jobname_str { example-image-duck }
+{\file_if_exist:nTF { example-image-duck.pdf }
+  {
+    \sys_if_engine_pdftex:T
+      {
+        \pdfximage{example-image-duck.pdf}
+        \int_const:Nn \c_duckuments_example_pages_int
+          { \the\pdflastximagepages }
+      }
+    \sys_if_engine_luatex:T
+      {
+        \saveimageresource{example-image-duck.pdf}
+        \int_const:Nn \c_duckuments_example_pages_int
+          { \lastsavedimageresourcepages }
+      }
+    \sys_if_engine_xetex:TF
+      {
+        \int_set:Nn \l_tmpa_int { \XeTeXpdfpagecount "example-image-duck.pdf" }
+        \int_const:Nn \c_duckuments_example_pages_int { \l_tmpa_int }
+        \int_new:N \g_duckuments_RCiv_i_int
+        \int_new:N \g_duckuments_RCiv_j_int
+        \int_new:N \g_duckuments_RCiv_keylength_int
+        \int_new:N \g_duckuments_tmpa_int
+        \int_const:Nn \c_duckuments_RCiv_Slength_int { 256 }
+        \tl_new:N \l_duckuments_tmpa_tl
+        \tl_new:N \l_duckuments_tmpb_tl
+        \cs_generate_variant:Nn \prop_gput:Nnn { Nxx }
+        \cs_generate_variant:Nn \prop_get:NnN { NxN }
+        \prop_new:N \g_duckuments_RCiv_S_prop
+        \int_step_inline:nnnn { 0 } { 1 } { 255 }
+          {
+            \prop_gput:Nnn \g_duckuments_RCiv_S_prop { #1 } { #1 }
+          }
+        \prop_new:N \g_duckuments_RCiv_key_prop
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 0 } { \int_use:N \c_sys_minute_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 1 } { \c_sys_hour_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 2 } { \c_sys_day_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 3 } { \c_sys_month_int }
+        \prop_gput:Nnx \g_duckuments_RCiv_key_prop
+          { 4 } { \int_eval:n {  \int_mod:nn { \c_sys_year_int } { 256 } } }
+        \int_gset:Nn \g_duckuments_RCiv_keylength_int { 5 }
+        \str_map_inline:Nn \c_sys_jobname_str
+          {
+            \prop_gput:Nxx \g_duckuments_RCiv_key_prop
+              { \int_use:N \g_duckuments_RCiv_keylength_int }
+              { \int_from_alph:n { #1 } }
+            \int_gadd:Nn \g_duckuments_RCiv_keylength_int { 1 }
+          }
+        \cs_new:Nn \duckuments_swap_prop_entries:Nnn
+          {
+            \prop_get:NnN #1 { #2 } \l_duckuments_tmpa_tl
+            \prop_get:NnN #1 { #3 } \l_duckuments_tmpb_tl
+            \prop_gput:Nnx #1 { #2 } { \l_duckuments_tmpb_tl }
+            \prop_gput:Nnx #1 { #3 } { \l_duckuments_tmpa_tl }
+          }
+        \cs_generate_variant:Nn \duckuments_swap_prop_entries:Nnn { Nxx }
+        \cs_new:Nn \duckuments_gadd_mod:Nnn
+          {
+            \int_gset:Nn #1 { \int_mod:nn { #1 + #2 } { #3 } }
+          }
+        \cs_generate_variant:Nn \duckuments_gadd_mod:Nnn { Nxn }
+        \cs_new:Nn \duckuments_gadd_mod_Slength:Nn
+          {
+            \duckuments_gadd_mod:Nnn #1
+              { #2 } { \c_duckuments_RCiv_Slength_int }
+          }
+        \int_step_inline:nnnn { 0 } { 1 } { 255 }
+          {
+            \prop_get:NnN \g_duckuments_RCiv_S_prop { #1 } \l_duckuments_tmpa_tl
+            \int_gset:Nn \g_duckuments_tmpa_int
+              {
+                \int_mod:nn
+                  { #1 }
+                  { \g_duckuments_RCiv_keylength_int }
+              }
+            \prop_get:NxN \g_duckuments_RCiv_key_prop
+              { \int_use:N \g_duckuments_tmpa_int } \l_duckuments_tmpb_tl
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_j_int
+              { \l_duckuments_tmpa_tl + \l_duckuments_tmpb_tl }
+            \duckuments_swap_prop_entries:Nxx \g_duckuments_RCiv_S_prop
+              { #1 } { \int_use:N \g_duckuments_RCiv_j_int }
+          }
+        \int_gzero:N \g_duckuments_RCiv_i_int
+        \int_gzero:N \g_duckuments_RCiv_j_int
+        \cs_new:Nn \duckuments_get_random_page:
+          {
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_i_int { \c_one }
+            \prop_get:NxN \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_RCiv_i_int } \l_duckuments_tmpa_tl
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_RCiv_j_int
+              { \l_duckuments_tmpa_tl }
+            \duckuments_swap_prop_entries:Nxx \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_RCiv_i_int }
+              { \int_use:N \g_duckuments_RCiv_j_int }
+            \int_gset:Nn \g_duckuments_tmpa_int { \l_duckuments_tmpa_tl }
+            \duckuments_gadd_mod_Slength:Nn \g_duckuments_tmpa_int
+              { \l_duckuments_tmpb_tl }
+            \prop_get:NxN \g_duckuments_RCiv_S_prop
+              { \int_use:N \g_duckuments_tmpa_int } \l_duckuments_tmpa_tl
+            \int_gset:Nn \g_duckuments_tmpa_int
+              {
+                \int_mod:nn
+                  { \l_duckuments_tmpa_tl } { \c_duckuments_example_pages_int }
+                + \c_one
+              }
+            \cs_set:Nx \duckuments_random_page:
+              { \int_use:N \g_duckuments_tmpa_int }
+          }
+        \cs_new:Nn \duckuments_random_page: { 1 }
+      }
+      {
+        \cs_new:Nn \duckuments_get_random_page: {}
+        \cs_new:Nn \duckuments_random_page:
+          { \int_rand:nn { 1 } { \c_duckuments_example_pages_int } }
+      }
+  }}
+  {
+    \int_const:Nn \c_duckuments_example_pages_int { 1 }
+  }
 \keys_define:nn { duckuments }
   {%>>>
     ,toc   .bool_set:N = \l_duckuments_toc_bool
@@ -170,9 +298,9 @@
       { \end{document} }
     \iow_close:N \duckuments_example_file_iow
   }%<<<
-\newcommand*\duckumentsDrawRandomDucks
+\newcommand*\duckumentsDrawRandomDucks[1][\duckuments at randoms]
   {%>>>
-    \foreach\x in {1,2,...,\duckuments at randoms}
+    \foreach\x in {1,2,...,#1}
       {\begin{tikzpicture}
         \draw[black,fill=gray!50] (0,0) rectangle (6,4);
           \draw[gray,thin] (0,0) -- (6,4);
@@ -233,8 +361,10 @@
           {
             \regex_match:NnTF \c_duckuments_regex { ##3 }
               {
+                \duckuments_get_random_page:
                 \duckuments at includegraphicsBAK##1
-                  [page=\int_rand:nn{1}{\duckuments at randoms},##2] { ##3 }
+                  [page=\duckuments_random_page:,##2]
+                  { ##3 }
               }
               {
                 \duckuments at includegraphicsBAK##1[##2]{##3}

Modified: trunk/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2018-03-15 22:03:42 UTC (rev 46972)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2018-03-15 22:06:50 UTC (rev 46973)
@@ -1607,6 +1607,7 @@
  'dlfltxb',     '\.sty', # no sample.cfg
  'docbytex',	'docby\.tex',
  'doclicense',  'images|license-texts|' . $standardtex,
+ 'duckuments',	'example-image.*pdf|' . $standardtex,
  'ean',         'ean[0-9]*\.tex',
  'easy',        'easy.*\.sty',          # no mydoc.sty
  'ecv',         '\.sty|\.cls|\.ldf',    # no docstrip.cfg, else system-wide
@@ -2480,6 +2481,7 @@
  'download'     => 'pdflatex', # fancy fonts, doc and subfiles combined
  'dramatist'	=> 'latex',  # requires interaction
  'drm'          => 'latex',  # requires interaction
+ 'duckuments'	=> 'tex',
  'ejpecp'       => 'latex',  # requires interaction
  'ekaia'        => 'latex',  # requires interaction
  'elteikthesis' => 'latex',  # requires interaction



More information about the tex-live-commits mailing list