A lualatex
solution:
\documentclass{article}
\usepackage{luatextra}
\usepackage{filecontents}
\begin{filecontents*}{book.tex}
\documentclass{book}
\usepackage{blindtext}
\begin{document}
\Blinddocument
\end{document}
\end{filecontents*}
\begin{luacode}
function get_random_pages(randPages,totalPages, randSeed)
--[[--
Constructs a sorted list of randPages random page numbers within a range 1..totalPages
@Parameter: randPages
The number of random pages to extract
@Parameter: totalPages
Total number of pages in a pdf file
@Parameter: randSeed
Random seed
--]]--
local pagesLeft= {}
local pageList = {}
for pageNo=1, totalPages, 1 do
table.insert(pagesLeft,pageNo)
end
math.randomseed (randSeed)
local r
for i=1, randPages do
r=math.random(#pagesLeft)
table.insert(pageList,pagesLeft[r])
table.remove(pagesLeft,r)
end
table.sort(pageList)
local s="\\includepdf[pages={"
s=s..pageList[1]
for i=2, randPages do
s=s..","..pageList[i]
end
s=s.."}]{book}"
tex.print(s)
end
\end{luacode}
\immediate\write18{pdflatex book.tex}
\immediate\write18{pdflatex book.tex}
\usepackage{pdfpages}
\def\NumberOfPagesOfExcerpt{9}
\def\NumberOfPagesInPdf{17}
\def\randomSeed{27449}
\begin{document}
% do randomization, sorting and bundling here!
\directlua{get_random_pages(\NumberOfPagesOfExcerpt,\NumberOfPagesInPdf,\randomSeed)}
\end{document}
Process with lualatex -shell-escape random_pages.tex
.
Edit:
a standard table.concat
function used as suggested by @Aditya
,
a command \randomPages
defined with an optional random seed parameter,
the number of pages in pdf is defined by means of pdftex primitives as in
here.
random_pages.tex
:
\documentclass{article}
\usepackage{luatextra}
\usepackage{filecontents}
\begin{filecontents*}{book.tex}
\documentclass{article}
\usepackage{geometry}
\geometry{
paperwidth=74mm,
paperheight=105mm,
margin=2em,
bottom=9ex,
nohead
}
\usepackage{blindtext}
\begin{document}
\Blinddocument
\end{document}
\end{filecontents*}
\begin{luacode}
function get_random_pages(randPages,totalPages, randSeed)
--[[--
Constructs a sorted list of randPages random page numbers within a range 1..totalPages
@Parameter: randPages
The number of random pages to extract
@Parameter: totalPages
Total number of pages in a pdf file
@Parameter: randSeed
Random seed: used only if >0
--]]--
local pagesLeft= {}
local pageList = {}
for pageNo=1, totalPages, 1 do
table.insert(pagesLeft,pageNo)
end
if randSeed>0 then math.randomseed(randSeed) end
local r
for i=1, math.min(randPages,totalPages) do
r=math.random(#pagesLeft)
table.insert(pageList,pagesLeft[r])
table.remove(pagesLeft,r)
end
table.sort(pageList)
local s="\\includepdf[pages={"
s=s..table.concat(pageList,",")
s=s.."}]{book}"
tex.print(s)
end
\end{luacode}
\immediate\write18{pdflatex book.tex}
\immediate\write18{pdflatex book.tex}
\usepackage{pdfpages}
\def\NumberOfPagesOfExcerpt{42}
\def\randomSeed{27449}
\makeatletter
\newcommand\@randomPages[3]{%
\pdfximage{#2}%
\def\NumberOfPagesInPdf{\the\pdflastximagepages}%
\directlua{get_random_pages(#1,\NumberOfPagesInPdf,#3)}%
}
\def\randomPages{%
\@ifnextchar[{\@with}{\@without}}%
\def\@with[#1]#2#3{%
\@randomPages{#2}{#3}{#1}%
}%
\def\@without#1#2{%
\@randomPages{#1}{#2}{0}%
}%
\makeatother
\begin{document}
% do randomization, sorting and bundling here!
% \randomPages[\randomSeed]{10}{book.pdf} % supposed to produce a fixed set of pages every time
\randomPages{10}{book.pdf} % supposed to produce a different set of pages every time
\end{document}
pdfpages
would be the way to go here.pdfpages
package you can use something like\includepdf[pages={3,12,19,33,5}]{filename.pdf}
etc to insert the desired pages fromfilename.pdf
. So all you need is to randomly generate the page numbers and there are several solution on this site for generating random numbers.