Random compile-time document style

I am trying to create a document class with random style attributes, determined at compilation time. Random attributes would ideally include:

• Margins
• Line spacing
• Font selection

For my particular use case, in-document references are not typically useful/a design constraint, so there's no first-order need to worry about layout being consistent across compilations.

I attempted to use \pgfmathrandomitem in a new .cls file, as follows:

% randocls.cls
\usepackage{pgffor}

\pgfmathdeclarerandomlist{marginmargins}{{0.0}{0.25}{0.5}{0.75}}
\pgfmathrandomitem{\marginns}{marginmargins}

% none of the following work...
% (the implied margins are different; this is MWE so nbd)

% Case 1:
\usepackage[margin={\marginns}in]{geometry}

% Case 2:

% Case 3:
% \let\rmarginns{\marginns}


Under Case 1:

("C:\Program Files\MiKTeX 2.9\tex/latex/geometry\geometry.cfg")
! Missing number, treated as zero.
{
l.1007 \ProcessOptionsKV[p]{Gm}
%


Under Case 2:

! Missing number, treated as zero.
{


Under Case 3:

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
...

l.30 \let\rmarginns{\marginns
}


My best guess is that the problem relates to when pgfmathrandomitem can actually yield a random item, but I am in over my head. Is there a way to work around this, or another randomization mechanism that will allow randomization in the document header?

• Note that the random seed is based on the minutes of the system clock. See tex.stackexchange.com/questions/144621/… if you want to have a new random seed more often. – Marijn May 2 '19 at 13:54
• @Marijn this is helpful. I'm going to be using XeTeX for font selection, so the linked solution will not work. However, outside of testing it's really not a big deal to have the random seed changed only once per minute. – kyle May 2 '19 at 14:25

There is some issue with expansion and groups - this is always tricky in LaTeX. A solution here is to put the unit in the list:

% randocls.cls
\usepackage{pgffor}

\pgfmathdeclarerandomlist{marginmargins}{{0.0in}{0.25in}{0.5in}{0.75in}}
\pgfmathrandomitem{\marginns}{marginmargins}

% Case 1:
\usepackage[margin=\marginns]{geometry}

\documentclass{randocls}
\begin{document}
margin: \marginns
\end{document}


• Great, this solves the margins issue; not as difficult as I thought! I'm going to make sure it solves the other issues (spacing, font selection) before accepting. – kyle May 2 '19 at 14:24
• The one note to add: because I would like to select different left-right and top-bottom margins, it's necessary to select two different random lengths. Due to pgf's innards, I need to select a random margin, edef it to a temporary variable, then select another random margin; otherwise, the same random margin is returned twice. – kyle May 2 '19 at 15:20