summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-03-15 22:06:50 +0000
committerKarl Berry <karl@freefriends.org>2018-03-15 22:06:50 +0000
commit097c112c554e8f27feadd8c546c4cf0de0489644 (patch)
tree493eea33d1e2c04dd19a7debba8dafcbbb3f8d34
parent0ee0025f07d63b22f3b16b17f8942c29c30188e9 (diff)
duckuments (15mar18)
git-svn-id: svn://tug.org/texlive/trunk@46973 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/duckuments/README.md5
-rw-r--r--Master/texmf-dist/doc/latex/duckuments/duckuments.hd0
-rw-r--r--Master/texmf-dist/doc/latex/duckuments/duckuments.pdfbin467406 -> 473595 bytes
-rw-r--r--Master/texmf-dist/source/latex/duckuments/duckuments.dtx192
-rw-r--r--Master/texmf-dist/tex/latex/duckuments/duckuments.sty150
-rw-r--r--Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdfbin217654 -> 478693 bytes
-rwxr-xr-xMaster/tlpkg/libexec/ctan2tds2
7 files changed, 320 insertions, 29 deletions
diff --git a/Master/texmf-dist/doc/latex/duckuments/README.md b/Master/texmf-dist/doc/latex/duckuments/README.md
index 5dce990d1da..4a26d605e46 100644
--- a/Master/texmf-dist/doc/latex/duckuments/README.md
+++ b/Master/texmf-dist/doc/latex/duckuments/README.md
@@ -21,7 +21,7 @@ macros are available:
- `\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 @@ It also provides `example-image-duck.pdf` which contains several pages of random
`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.**
diff --git a/Master/texmf-dist/doc/latex/duckuments/duckuments.hd b/Master/texmf-dist/doc/latex/duckuments/duckuments.hd
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/Master/texmf-dist/doc/latex/duckuments/duckuments.hd
+++ /dev/null
diff --git a/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf b/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf
index 35fb8c3836e..1647d1ce190 100644
--- a/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf
+++ b/Master/texmf-dist/doc/latex/duckuments/duckuments.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/duckuments/duckuments.dtx b/Master/texmf-dist/source/latex/duckuments/duckuments.dtx
index 484cba20771..2dc63666343 100644
--- a/Master/texmf-dist/source/latex/duckuments/duckuments.dtx
+++ b/Master/texmf-dist/source/latex/duckuments/duckuments.dtx
@@ -63,6 +63,7 @@ and the derived files duckuments.pdf,
%<*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 @@ and the derived files duckuments.pdf,
%</eid>
%
%<*pkg>
-\def\duckuments@version{v0.1}
-\def\duckuments@date{2018/03/13}
+\def\duckuments@version{v0.2}
+\def\duckuments@date{2018/03/14}
\ProvidesExplPackage
{duckuments} {\duckuments@date}
{\duckuments@version} {minimal working duckuments}
@@ -94,7 +95,9 @@ and the derived files duckuments.pdf,
%
% \title{The \pkg{duckuments} package}
% \author{Jonathan P. Spratte\thanks{E-mail: jspratte@yahoo.de}}
-% \date{Released 2018/03/13}
+% \makeatletter
+% \date{version \duckuments@version, released \duckuments@date}
+% \makeatother
% \maketitle
% \tableofcontents
%
@@ -118,7 +121,7 @@ and the derived files duckuments.pdf,
% 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 @@ and the derived files duckuments.pdf,
% \end{function}
%
% \begin{function}{\duckumentsDrawRandomDucks}
-% Draws \cs{duckuments@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@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 @@ and the derived files duckuments.pdf,
% 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 @@ and the derived files duckuments.pdf,
%
% 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 @@ and the derived files duckuments.pdf,
\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 @@ and the derived files duckuments.pdf,
% \begin{variable}{\duckuments@randoms}
% Stores the number of random ducks in \file{example-image-duck.pdf}.
% \begin{macrocode}
-\newcommand*\duckuments@randoms{100}
+\newcommand*\duckuments@randoms{128}
% \end{macrocode}
% \end{variable}
%
@@ -327,6 +343,146 @@ and the derived files duckuments.pdf,
% \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 @@ and the derived files duckuments.pdf,
%
% \begin{macro}{\duckumentsDrawRandomDucks}
% \begin{macrocode}
-\newcommand*\duckumentsDrawRandomDucks
+\newcommand*\duckumentsDrawRandomDucks[1][\duckuments@randoms]
{%>>>
- \foreach\x in {1,2,...,\duckuments@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 @@ and the derived files duckuments.pdf,
{
\regex_match:NnTF \c_duckuments_regex { ##3 }
{
+ \duckuments_get_random_page:
\duckuments@includegraphicsBAK##1
- [page=\int_rand:nn{1}{\duckuments@randoms},##2] { ##3 }
+ [page=\duckuments_random_page:,##2]
+ { ##3 }
}
{
\duckuments@includegraphicsBAK##1[##2]{##3}
diff --git a/Master/texmf-dist/tex/latex/duckuments/duckuments.sty b/Master/texmf-dist/tex/latex/duckuments/duckuments.sty
index a18d45c81a1..52ad43ad908 100644
--- a/Master/texmf-dist/tex/latex/duckuments/duckuments.sty
+++ b/Master/texmf-dist/tex/latex/duckuments/duckuments.sty
@@ -31,17 +31,22 @@
%% example-image-duck.tex
%%
\RequirePackage{xparse,letltxmacro,l3keys2e}
-\def\duckuments@version{v0.1}
-\def\duckuments@date{2018/03/13}
+\def\duckuments@version{v0.2}
+\def\duckuments@date{2018/03/14}
\ProvidesExplPackage
{duckuments} {\duckuments@date}
{\duckuments@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,13 +76,136 @@
}
}
}%<<<
-\newcommand*\duckuments@randoms{100}
+\newcommand*\duckuments@randoms{128}
\bool_new:N \l_duckuments_immediate_bool
\bool_new:N \l_duckuments_toc_bool
\bool_new:N \l_duckuments_math_inline_bool
\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@randoms]
{%>>>
- \foreach\x in {1,2,...,\duckuments@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@includegraphicsBAK##1
- [page=\int_rand:nn{1}{\duckuments@randoms},##2] { ##3 }
+ [page=\duckuments_random_page:,##2]
+ { ##3 }
}
{
\duckuments@includegraphicsBAK##1[##2]{##3}
diff --git a/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf b/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf
index 8e7e2e2bb1f..d602328399f 100644
--- a/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf
+++ b/Master/texmf-dist/tex/latex/duckuments/example-image-duck.pdf
Binary files differ
diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds
index ef43b9d6089..4afb9f7c716 100755
--- a/Master/tlpkg/libexec/ctan2tds
+++ b/Master/tlpkg/libexec/ctan2tds
@@ -1607,6 +1607,7 @@ $standardtex
'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 @@ my $core_latex = "$Master/texmf-dist/tex/latex";
'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