%%%
%% This is file `esami.sty',
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% esami.sty package,             2023-07-21            %%
%% Copyright (C) 2008-2023  G. Messineo e S. Vassallo   %%
%%                                                      %%
%% This program can be redistributed and/or modified    %%
%% under the terms of the LaTeX Project Public License  %%
%% Distributed from CTAN archives in directory          %%
%% macros/latex/base/lppl.txt; either version 1 of the  %%
%% License, or (at your option) any later version.      %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%% CHANGELOG %%%%%%%
% Version 1.0
% First release to CTAN
%Version 1.1 2013/12/09
%Inserted the dependance on the package \texttt{environ} to remove some errors in the \LaTeX\ compilation.
%Removed the dependance on the package \texttt{icomma} in the italian localization file es-italian.lng because
%of the introduction of new features in the package \texttt{babel} for the Italian langaguage (macro \texttt{IntelligentComma}).
% Version 2.0
% 2015/02/25
%Eliminated the dependance on \pkgname{pstricks}. Modified the use of \emph{fill-in} questions.
%Inserted the possibility to extract %more than one variant from a file. Now it is possible to view the solutions in tests.
%Modified the visualization of decimal places in command  \cmd{\FPsv}. Modified the definition of \cmd{\FPval} to allow the use of decimal places.
%Modified the algorithm of choice of a variant of an exercise, now completely deterministic.
% Added the command \cmd{\Acapo}. Added the serbian localization (latin alphabet).
%The compilation produces a new file with the list of the chosen exercises.
% Version 2.1
% 2016/07/25
%Modified es-german.lng and es-spanish.lng for an error in the input of the solutions. Introduced the macro randestrai.
%Introduced the macro FPsignpol. Introduced a control on the total points of the exercises. Solved the incompatibility
%with babel for the Spanish language. Removed the incompatibility between the command \fillin and the commands \sempli and \semplix.
% Version 2.2
% 2017/07/01
%Introduced the possibility to have two different seeds for exercises choice and for scrambling. Sligtly modified the command \estrai so that can be used
%to extract parameters from a list. Improved the documentation.
% Version 2.3
% 2017/09/18
%Corrected a misprint in the code
% Version 2.4
% 2018/02/10
% Documentation corrected.
% Version 2.5
% 2018/05/06
%Corrected a misprint in the code. Improved the selection of random exercises.
% Version 2.6
% 2021/10/11
%Improved the spacing in \cmd{\FPsignpol}. Corrected the code to  avoid some spourios spaces. 
% Version 2.7
% 2022/01/11
%Improved the spacing in \cmd{\sempli} and \cmd{\FPsignpol}. Corrected a misprint in the code. 
% 2013/07/21
%Documentation modified  to solve a problem with the Spanish Language.

\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{esami}
    [2023/07/21 v2.8 An Exam Construction Package]

% +=============================+
% |         THE OPTIONS         |
% +=============================+
\newif\ifes@language \es@languagefalse
\DeclareOption{italian}{\InputIfFileExists{es-\CurrentOption.lng}%
   { \es@languagetrue \typeout{esami: Verrà usata la lingua italiana}}%
   {\typeout{esami: Il file es-\CurrentOption.lng non esiste.}}}
\DeclareOption{UKenglish}{\InputIfFileExists{es-\CurrentOption.lng}%
   {\typeout{esami: English Language will be used} \es@languagetrue}%
   {\typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{USenglish}{\InputIfFileExists{es-\CurrentOption.lng}%
   {\typeout{esami: English Language will be used} \es@languagetrue}%
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{english}{\InputIfFileExists{es-UK\CurrentOption.lng}%
   { \typeout{esami: English Language will be used}\es@languagetrue}%
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{french}{\InputIfFileExists{es-\CurrentOption.lng}%
   { \typeout{esami: La langue française sera utilisée}\es@languagetrue}
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{spanish}{\InputIfFileExists{es-\CurrentOption.lng}%
   { \typeout{esami:Se utilizará el idioma español}\es@languagetrue}
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{german}{\InputIfFileExists{es-\CurrentOption.lng}%
   { \typeout{esami:Deutsch als Sprache soll angewandt werden}\es@languagetrue}
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}
\DeclareOption{greek}{\InputIfFileExists{es-\CurrentOption.lng}%
   { \typeout{esami:Greek language will be used}\es@languagetrue}
   { \typeout{esami: The file es-\CurrentOption.lng does not exists.}}}


\newif\ifes@twocolumns
\es@twocolumnsfalse
\DeclareOption{twocolumns}{\es@twocolumnstrue}%%% for tests on 2 columns
\DeclareOption{sansserif}{\renewcommand{\familydefault}{\sfdefault}}%%% sans serif font
\DeclareOption{solutionsonly}{\es@solutionsonlytrue \es@solutionstrue}%%% only solutions (false by default)
\newif\ifes@solutionsonly \es@solutionsonlyfalse
\DeclareOption{allowrandomize}{\es@randomizeChoicestrue}%%% MCQ with shuffled answers (default)
\DeclareOption{norandomize}{\es@randomizeChoicesfalse}%%% MCQ not shuffled
\newif\ifes@randomizeChoices \es@randomizeChoicestrue
\newif\ifes@fissa \es@fissatrue
\newif\ifes@shuffleQuestions \es@shuffleQuestionstrue%%% the exercises are shuffled by default
\DeclareOption{shuffle}{\es@fissatrue \es@shuffleQuestionstrue}
\DeclareOption{shufflerandom}{\es@shuffleQuestionstrue \es@fissafalse}%% the exercises are randomly shuffled
\DeclareOption{noshuffle}{\es@shuffleQuestionsfalse}
%%% 2013-06-03 eliminata opzione
\newif\ifes@fillin \es@fillinfalse
\DeclareOption{fillb}{\es@fillintrue}
\newif\ifes@pointsonright \es@pointsonrightfalse%%% the box with the points on the right side (from eqexam)
\DeclareOption{pointsonright}{\es@pointsonrighttrue \AtEndOfPackage{\PointsOnRight}}
\newif\ifes@solutions \es@solutionsfalse
\DeclareOption{solutions}{\es@solutionstrue
\AtEndDocument{
\immediate\closeout\loe
\immediate\closeout\parametri
\immediate\closeout\sols                                                         %
\stringasol} %%%%
}%%% for solutions
\DeclareOption{nosolutions}{\es@solutionsfalse}%%% no solutions (default)
\newif\ifes@noquizsolutions \es@noquizsolutionstrue
\DeclareOption{noquizsolutions}{\es@noquizsolutionstrue}
\DeclareOption{quizsolutions}{\es@noquizsolutionsfalse}
\DeclareOption*{\InputIfFileExists{esami-\CurrentOption.cfg}{}%%% reads a configuration file
    {\PackageError{esami}{\es@cfgerrormessageshort}
   {\es@cfgerrormessagelong}
   }}
\newif\ifes@autopst \es@autopstfalse%%% Do I need auto-pst?
\newif\ifes@pst \es@pstfalse%%% Do I need pstricks?
\DeclareOption{autopstoff}{\es@psttrue \es@autopstfalse}%%% autopstpdf inactive (default) %
\DeclareOption{autopston}{\es@psttrue  \es@autopsttrue }%%%% autopstpdf active
\newif\ifes@prova \es@provafalse
\DeclareOption{prova}{\es@solutionstrue \es@provatrue \es@randomizeChoicesfalse \es@noquizsolutionsfalse}%%% for the file "totale-versioni"
\DeclareOption{correzione}{\es@correzionetrue \es@solutionsfalse}%%% to print all the exercises with solutions only
\newif\ifes@correzione \es@correzionefalse
\newif\ifes@param \es@paramfalse%%% to print the parametric version in "totale-versioni"
\newif\ifes@test \es@testfalse%%% for tests

%========================================================%
%      Parametric version                                %
%========================================================%

\newwrite\parametri
\DeclareOption{param}{\es@paramtrue \AtBeginDocument{\newwrite\params}}
\ProcessOptions\relax

% +=============================+
% |        PACKAGES             |
% +=============================+

\usepackage{graphicx}
\usepackage{enumerate}
\usepackage[nomessages]{fp}
\usepackage{currfile}
\usepackage{array}
\usepackage{environ}
\usepackage{ifthen}
\usepackage{xargs}
\usepackage{multicol}
\usepackage{amssymb}


\ifes@pst
	\usepackage{pstricks,pstricks-add}
	\ifes@autopst
		\usepackage[crop=off,dvips={}]{auto-pst-pdf}
   \else
		\usepackage[off]{auto-pst-pdf}
    \fi
\else
    \@ifpackageloaded{xcolor}{}{\usepackage{xcolor}}
\fi

\input random

%========================================================%
%         Error Messages                                 %
%========================================================%

\def\testversioni{\ifthenelse{\not\equal{\numcompiti}{}}{\relax} %
    { \immediate\write16{\es@numcompitierror}
  {\endlinechar=-1 \global\read16 to\numcompiti}}}
  \ifthenelse{\equal{\jobname}{\detokenize{master}}} {{ \PackageError{esami} {\es@mastererror}{}}}%
   \ifthenelse{\equal{\jobname}{\detokenize{master-sol}}}{{\PackageError{esami}{\es@mastererror}{}}}%

\ifes@language 
\else 
	\InputIfFileExists{es-italian.lng}{ \typeout{esami: No language chosen: Italian language will be used.}}{NO LANGUAGE!!!}
\fi

%========================================================%
%          DIMENSIONS                                    %
%========================================================%

% We want the page full of text

\setlength\topmargin{-90pt}
\setlength\textheight\paperheight
\addtolength\textheight{-80pt}
\setlength\textwidth\paperwidth
\addtolength\textwidth{-70pt}
\setlength\oddsidemargin{-60pt}
\setlength\footskip{28pt}
\setlength\marginparwidth{0pt}
\setlength\marginparsep{0pt}

\newskip\aboveanswersSkip%%% the space between question and answers
\newlength\es@tmplength
\newdimen\es@tmpdima{}
\newsavebox{\es@tmpbox}{}
\newbox{\es@pointbox}
\newlength{\es@pointboxtotalheight}%%% the height of the point box
\newsavebox{\workareasb}
\newlength\mylabelsep

%========================================================%
%                exercise                                %
%========================================================%

\newcommand{\priorexskip}[1]{\def\es@priorexskip{\vspace{#1}}}%%% space above and below the text of the exercise
\let\es@postexerciseHook\relax
\newcommand{\esexerskip}[1]{\def\es@exerskip{\vskip#1}}

%========================================================%
%               test                                     %
%========================================================%

\def\rowsep#1{\gdef\@rowsep{[#1]}\gdef\@rowskip{#1}}
    \rowsep{\rowsep@default}
\def\rowsepDefault#1{\def\rowsep@default{#1}}

%========================================================%
%                 risposta                               %
%========================================================%

\newlength{\es@rig}%%%% lines in "risposta"

%========================================================%
%            SPACES                                      %
%========================================================%

\setlength{\parindent}{0pt}
\def\solutionsAfterSkip{\par\bigskip}
\priorexskip{\medskipamount}
\esexerskip{\medskipamount}
\let\afterlabelhskip=\space
\def\Acapo{\par}
%========================================================%
%               test                                     %
%========================================================%

\rowsepDefault{4pt}
\addtolength{\tabcolsep}{2pt} \addtolength{\arraycolsep}{2pt}
\def\sq@priorhook{\medskip\noindent}
\setlength\aboveanswersSkip{6pt}

% +=============================+
% |        COUNTERS             |
% +=============================+

\newcount\tmp@cnt%%% temporary counter
\newcount\tmp@a%%% temporary counter
\newcount\rnd@cnta%%% temporary counter in selectrandomly
\newcount\tmp@cntb%%% temporary counter in \estrai
\newcount\rnd@cnts%%% temporary counter in RandS
\newcount\rnd@cnt%%% temporary counter in \FPsetpar
\newcount\end@al%%% temporary counter in \estraialfa
\newcount\beg@al%%% temporary counter in \estraialfa
\newcounter{nomefile}%%% counter for year-month-day
\newcount\tmp@quest %%% the number of the exercise
\newcount\@probselN %%% in \selectrandomlyn
\newcount\@shfctr %%% In "\shuffle"
\newcount\@shfA %%% In "\shuffle"
\newcount\@shfB %%% In "\shuffle"
\newcount\icount  %%% counter to shuffle exercises
\newcount\io
\newcount\inizio
\newcount\old@rando
\FPeval\seme{round(\thenomefile+1-trunc(\thenomefile/(2^31-1):0)*(2^31-1):0)}
\def\semeex{\seme}
\inizio=1
%%%%
\newcounter{vers}%%% the number of the version
\setcounter{vers}{0}
\newcounter{n@par}%%% it counts the number of parameters
\newcount\loopCnt%%% the number of attempts in \FPsetpar
\newcounter{fp@contatore}%%% used in \FPsetpar
\newcount\old@randomii%%% used to change seed shuffling exercise
\newcount\old@randomi%%% used to change seed in \FPsetpar
\newcount\old@random%%% used to change seed in \selectrandomly 
\newcount\sh@max%%% used to choose the exercises
\newcount\@probN%%% number of exercises in \selectrandomly
\newcount\j@m%%% temporary counter in \newproblem
\newcount\i@sh
\newcount\j@sh
\newcounter{shuf@lop}
\newcounter{temp@cnt}
\newcounter{questionno}%%% the number of the question in test
\newcount\@esquestiondepth 
	\@esquestiondepth=0
\newcounter{esquestionnoi}
\renewcommand{\theesquestionnoi}{\arabic{esquestionnoi}}
\newcounter{esquestionnoii}
\renewcommand{\theesquestionnoii}{\alph{esquestionnoii}}
\newcounter{esquestionnoiii}
\renewcommand{\theesquestionnoiii}{\roman{esquestionnoiii}}
%\newdimen\punteggio %% NEW 2016/04/11 to check the total score of exercises
%\setlength{\punteggio}{0pt}
\newcommand\checkpoints\relax
\def\es@primo{1433}


%========================================================%
%                  test                                  %
%========================================================%

\newcounter{sq@quizno} \setcounter{sq@quizno}{0}%%% the number of the answer in a MCQ
\renewcommand\thesq@quizno{\alph{sq@quizno}}
\def\@shortquizCnt{0}
\newcount\es@tabColCnt%%% The number of columns of answers in MCQ

%========================================================%
%             esercizio                                  %
%========================================================%

\newcounter{ex@no}%%% The number of the exercise
\setcounter{ex@no}{0}
\@addtoreset{ex@no}{section}
\newcounter{ex@partno}%%% The parts of an exercise
\renewcommand\theex@partno{\alph{ex@partno}}

%========================================================%
%             risposta                                   %
%========================================================%

\newcounter{risp@righe}%%% the number of lines in a long answer (environment "risposta")

%========================================================%
%           matching                                     %
%========================================================%

\newcounter{match@plu}
\newcounter{match@plo}
\newcounter{match@q}

%========================================================%
%          aebrandom                                     %
%========================================================%

\newcount\aeb@numChoices
\newcount\aeb@ranChoice

% +=============================+
% |        LABELS               |
% +=============================+

%========================================================%
%          questions                                     %
%========================================================%

\newcommand{\labelesquestionnoi}{\bfseries\theesquestionnoi.}
\newcommand{\labelesquestionnoii}{\bfseries(\theesquestionnoii)}
\newcommand{\labelesquestionnoiii}{\bfseries(\theesquestionnoiii)}

%========================================================%
%          test                                          %
%========================================================%

\newcommand\sq@label{}
\newcommand\sqlabel{\sq@label}
\def\linkContentFormat{\alph{sq@quizno}}
\def\linkContentWrapper{(\hfil\linkContentFormat\hfil)}

%========================================================%
%         exercise                                       %
%========================================================%

\newcommand\exlabel{\es@exercisename}
\newcommand\exlabelsol{\exlabel}
\newcommand\exlabelformat{{\scshape\exlabel\ \theex@no.}}
\newcommand\exlabelformatwp{{\scshape\exlabel\ \theex@no.}}
\newcommand{\exsolafter}{\es@exsolafterDefault}
\newcommand{\es@exsolafterDefault}{\textit{\es@solutionname}: }
\newcommand{\esexlisttabheader}{(\hfil\theex@partno\hfil)}
\newcommand{\ex@header}{\hbox
{%
\if
	\exerstar*\exlabelformatwp%
\else
    \exlabelformat
    \fi
    }%
}

% +=============================+
% |        COMMANDS             |
% +=============================+

%========================================================%
%           Maths                                        %
%========================================================%


\newcommand{\FPsv}[2][0]
{%%%% It does operations with #1 decimals and with the "param" option it shows operations
	\FPeval{\fp@tmpa}{clip(round(#2:#1))}\numprint{\fp@tmpa}\relax
	}
\newcommandx{\FPval}[3][2=0]{%% it works like \FPsv with the option param, like \FPeval otherwise
	\FPeval{#1}{clip(round(#3:#2))%
	}%
	}


%========================================================%
%               fractions                                %
%========================================================%

\newcommand{\@sempli}[2]{%%%% simplification (private command)
    \FPeval\segnofrac{round(#1:0)*round(#2:0)}%
    \FPeval\fp@tmp{round(abs(#1):0)}%
    \FPset\fp@n{\fp@tmp}%
    \FPeval\fp@tmp{round(abs(#2):0)}%
		\FPifzero{\fp@tmp}
			\PackageError{esami}{\es@zerodenerror{#1}{#2}}%
		\fi
    \FPset\fp@d{\fp@tmp}%
    \FPeval\fp@num{max(\fp@n,\fp@d)}%
    \FPeval\fp@den{min(\fp@n,\fp@d)}%
    \FPset\fp@resto{\fp@den}%
		\whiledo{\fp@resto>0}%
			{%
			\FPset\fp@restoold{\fp@resto}%
			\FPeval\fp@resto{round((\fp@num-trunc((\fp@num)/\fp@den:0)*(\fp@den)):0)}%
			\FPset\fp@num{\fp@den}%
			\FPset\fp@den{\fp@resto}%
			}
	\FPeval\fp@num{round((\fp@n/\fp@restoold):0)}%
	\FPeval\fp@den{round((\fp@d/\fp@restoold):0)}%
		\FPifneg\segnofrac{-\:}
		\else{}
		\fi
	\ifthenelse{\fp@den=1}{%
			\ifthenelse{\fp@num=1}{1}{\fp@num}
	}
	{\frac{\fp@num}{\fp@den}}%
    }

\newcommand{\sempli}[2]{%%% simplification (user command)
    \FPeval\fp@tmp{round(abs(#1):0)}%
        \FPifzero{\fp@tmp}\PackageError{esami}{\es@zeronumerrorshort{#1}{#2}}{\es@zeronumerrorlong{#1}{#2}}\fi
    \FPeval\fp@temp{round(abs(#2):0)}%
        \FPifeq{\fp@tmp}{\fp@temp}\PackageWarning{esami}{\es@fraconewarn{#1}{#2}}\fi
    \@sempli{#1}{#2}%
    }

\newcommand{\semplix}[2]{%%% simplification (coefficients)
    \FPeval\fp@tmp{round(abs(#1):0)}%
    \FPifzero{\fp@tmp}\PackageError{esami}{\es@zeronumerrorshort{#1}{#2}}{\es@zeronumerrorlong{#1}{#2}}\fi
    \FPeval\t@mpa{round(#1:0)}\FPeval\t@mpb{round(#2:0)}%
		\ifthenelse{\t@mpa=\t@mpb}{}{\ifthenelse{\t@mpa=-\t@mpb}{-}{\@sempli{#1}{#2}}}
    }

\newcommand{\sempliz}[2]{%%% simplifications (zero)
    \FPeval\t@mpa{round(#1:0)}%
    \ifthenelse{\t@mpa=0}{0}{\@sempli{#1}{#2}}%
    }

\newcommand{\esempli}[2]{%%% simplification (exponents)
    \FPeval\fp@tmp{round(abs(#1):0)}%
       \FPifzero{\fp@tmp}\PackageError{esami}{\es@zeronumerrorshort{#1}{#2}}{\es@zeronumerrorlong{#1}{#2}}\fi
    \FPeval\t@mpa{round(#1:0)}%
    \FPeval\t@mpb{round(#2:0)}%
    \ifthenelse{\t@mpa=\t@mpb}{}{\ifthenelse{\t@mpa=-\t@mpb}{-1}{\@sempli{#1}{#2}}}
    }

%========================================================%
%                Radicals (simplification)               %
%========================================================%

\newcommand\simpsqrt[2]{%
    \FPset\tmp@sqi{2}%
    \FPset\sq@factor{1}%
    \FPset\tmp@factor{1}%
    \FPeval\sq@segno{round(#2:0)}%
    \FPeval\sq@rad{round(abs(#2):0)}%
    \FPeval\sq@ind{round(#1:0)}%
    \FPeval\tmp@sqpw{round(\tmp@sqi^(\sq@ind):0)}%
    \FPeval\tmp@sqj{round(\sq@rad+1:0)}%
		\ifthenelse{\equal\sq@rad{0}}{0}
		{%
			\whiledo{\tmp@sqpw<\tmp@sqj}
				{%
				\FPeval\tmp@rad{\sq@rad/\tmp@sqpw}%
				\FPeval\sq@resto{round((\sq@rad-trunc((\sq@rad)/\tmp@sqpw:0)*(\tmp@sqpw)):0)}%
					\ifthenelse{\equal\sq@resto{0}}
					{%
					\FPset\tmp@factor{\sq@factor}%
					\FPeval\sq@factor{round(\tmp@factor*\tmp@sqi:0)}%
					\FPeval\sq@rad{round(\tmp@rad:0)}%
					\FPset\tmp@sqi{1}
					}{}
				\FPset\tmp@sqii{\tmp@sqi}%
				\FPeval\tmp@sqi{round(\tmp@sqii+1:0)}%
				\FPeval\tmp@sqpw{round(\tmp@sqi^(\sq@ind):0)}
				}%
			\ifthenelse{\isodd{\sq@ind}}
			{%
				\ifthenelse{\equal{\sq@factor}{1}} 
				{%
					\ifthenelse{\equal{\sq@rad}{1}}
					{%
					\ifthenelse{\sq@segno<0}{-1}{1}
					}
					{%
					\ifthenelse{\sq@segno<0}{-\sqrt[\sq@ind]{\sq@rad}}
					{\sqrt[\sq@ind]{\sq@rad}}
					}
				}
				{%
					\ifthenelse{\equal{\sq@rad}{1}}
					{%
					\ifthenelse{\sq@segno<0}{-\sq@factor}{\sq@factor} 
					}
					{%
					\ifthenelse{\sq@segno<0}{-\sq@factor\sqrt[\sq@ind]{\sq@rad}}{\sq@factor\sqrt[\sq@ind]{\sq@rad} }
					}
				}
			}%
			{%
				\ifthenelse{\sq@segno<0}
				{\PackageError{esami}{\es@radicalerror}}
				{\ifthenelse{\equal{\sq@factor}{1}} 
				{%
					\ifthenelse{\equal{\sq@rad}{1}}
						{1}
						{%
						\ifthenelse{\sq@ind=2}{\sqrt{\sq@rad}}{\sqrt[\sq@ind]{\sq@rad}}
						} 
				}%
				{%
					\ifthenelse{\equal{\sq@rad}{1}}
						{\sq@factor}
						{\ifthenelse{\sq@ind=2}
							{\sq@factor\sqrt{\sq@rad}}
							{\sq@factor\sqrt[\sq@ind]{\sq@rad}}
						} 
				}
				}
			}
		}
   }

%========================================================%
%               Coefficients of polynomial               %
%========================================================%

\newcommand{\FPsignpol}[2] %%% adapted from code contributed by Hjalmar Basile NEW 2016/04/11
%{\FPval\tempsign{#1}
	%\ifthenelse{\equal{#2}{}}
	%{%
		%\ifnum \tempsign<0 {\:\sempli{\tempsign}{1}#2}
		%\else 
			%\ifnum \tempsign>0{\:+\:\sempli{\tempsign}{1}#2}
			%\else{}
			%\fi
		%\fi
	%}
	%{%
		%\ifnum \tempsign<0 {\:\semplix{\tempsign}{1}#2\:}
		%\else 
			%\ifnum \tempsign>0{\:+\:\semplix{\tempsign}{1}#2}
			%\else{}
			%\fi
		%\fi
	%}
%} %% improved for spacing 2021/10/11
{\FPval\tempsign{#1}
	\ifthenelse{\equal{#2}{}}
	{%
		\ifnum \tempsign<0 {\:\sempli{\tempsign}{1}#2}
		\else 
		\ifnum \tempsign>0{+\:\sempli{\tempsign}{1}#2}
		\else{}
		\fi
		\fi
	}
	{%
		\ifnum \tempsign<0 {\:\semplix{\tempsign}{1}#2\:}
		\else 
		\ifnum \tempsign>0{\:+\:\semplix{\tempsign}{1}#2}
		\else{}
		\fi
		\fi
	}
} %% improved for spacing 2021/10/11  

%========================================================%
%          Commands adapted from exerquiz                %
%========================================================%

\providecommand\PBS[1]{\let\temp=\\#1\let\\=\temp}
\def\es@lw@l{\es@l@l\ }
\def\es@l@l{\normalsize\normalfont(d)}
\newcommand\PTs{\def\es@star{x}\@PTs}
\def\@PTs#1{%
    \gdef\es@PTs{#1}\ifx\es@PTs\@empty\gdef\es@PTs{1}\fi
    \global\let\esPTs=\es@PTs\global\let\es@PTs=\@empty
    \if\es@star*\else\PTs@Hook\fi
}
\def\es@PTs{0}
\newcommand\PTsHook[1]{\def\PTs@Hook{#1}}%%% hooks for \PTs
\let\qMark@Hook\@empty
\newcommand{\post@questionsHook}{}
\newcommand{\punti}{}

%========================================================%
%           Commands adapted from eqexam                 %
%========================================================%

%%%%% Points in a box on the right %%%%%%

\ifes@pointsonright
\def\examenddef
{%
\bgroup
\raisebox{-30pt}[0pt][0pt]{%
    \hspace*{-\parindent} %
    {\es@rightmarginbox
    }} %
\egroup}
\else
\def\examenddef{}
\fi

\def\PointsOnRight{%
    \let\marginpoints=\es@rightmarginbox}
\newcommand\marginpointsboxtext{\small \emph{\punti\ifthenelse{\equal{\punti}{1}}{ \es@pointname}{ \es@pointsname}}}
\def\es@rightmarginbox{%
    \makebox[0pt][l]{%
        \setlength\tabcolsep{0pt}%
        \hspace*{\textwidth}\hspace*{\marginparsep}%
        \raisebox{-.5\height}[0pt][0pt]{%
            \parbox{40pt}{%
                \tabcolsep=0pt\relax
                \begin{tabular}{|c|}\hline
                   \vrule height20pt width0pt\hfill\\\hline
                   \makebox[40pt]{%
                        \marginpointsboxtext}\\\hline%
                \end{tabular}%
            }%
        }\hfil
    }%
}
\setbox\es@pointbox=\hbox{%
    \parbox{35pt}{%
        \tabcolsep=0pt\relax
        \begin{tabular}{|c|}\hline
            \vrule height15pt width0pt\\
            \hline
            \makebox[40pt]{%
                \marginpointsboxtext}\\
                \hline
        \end{tabular}%
    }%
}

%%%%%%% Fill in %%%%%%
\newcommand\fillinproblem{\es@fillintrue%
\ifes@solutions
	\immediate\openout\parametri=qf\nome q\romannumeral\tmp@quest e\thevers.parametri.tex
\fi
}
\ifes@solutions
	\def\fill@ans@color#1{\bfseries\color{red}{#1}}%%% with solutions answers are in red by default
   \else
\def\fill@ans@color#1{\phantom{#1}}%%% without solutions option -> no answers
 \fi
\newcommand{\fillin}[3][u]{%%% #1= the box (u=underlined, e=empty, b= boxed) #2= space for the answer, #3= the correct answer
\space
    \ifx#1u\let\fillin@Fmt=\underbar%%% by default underlined space
    \else
		\ifx#1e\let\fillin@Fmt=\relax%% empty space
		\else
			\ifx#1b\let\fillin@Fmt=\fbox%%% box
			\fi
		\fi
	\fi
\fillin@Fmt{\parbox[b][.8\height][b]{#2}{%
    \strut\hfil\fill@ans@color{#3}\hfil}%
        \ifes@test
           \ifes@prova
           \else
				\ifes@solutions%%% to write the string of solutions
				\immediate\write\sols{%
				\string\item\space\string\makeatletter\space\string\input\string{qf\nome q\romannumeral\tmp@quest e\thevers.parametri\string}\string\makeatother}
				\immediate\write\sols{\unexpanded{#3}}
				\immediate\write\loe{\es@exercisename\space\theesquestionnoi:\space \probchosen}
				\fi
		\fi
	\fi
 }
 }

%%%%% Other commands %%%%%%
\newcommand\stepverssols%
{%
\immediate\write\sols
	{%
\string\begin{minipage}{.33\string\textwidth}{\string\large\string\textbf{\es@solutionname\ \versionname\ n. \thevers}}
	}
}
\newcommand\closeverssols%
{%
\immediate\write\sols{\string\end{minipage}}
}
\newcommand\stepvers
{%
\stepcounter{vers}
	\ifes@solutions\stepverssols
	\immediate\write\loe{\versionname\space n. \thevers}
	\fi
}
 \newcommand\closevers
{%
\newpage\setcounter{page}{1}
\setcounter{ex@no}{0}
	\ifes@solutions
	\closeverssols
	\immediate\write\loe{\space}
	\immediate\write\loe{\space}
   \fi
}

\def\mydate#1/#2/#3\@empty{\setcounter{nomefile}{\two@digits{#1}\two@digits{#2}\two@digits{#3}}}%%% it gives to the counter "nomefile" a value determined by the date
\PTsHook{\emph{(\esPTs\ \ifthenelse{\equal{\esPTs}{\detokenize{1}}}{\es@pointname}{\es@pointsname})}}%%% The name of the points
\newcommand{\proofingsymbol}[1]{\def\@proofingsymbol{{#1}\hspace{-.3em}\es@segnala}}%%% this defines the symbol for the exact answer in MCQ and the label for the string of solutions
\proofingsymbol{$\blacktriangleright$}%%% the proofing symbol that can be changed in document
\newenvironment{gobbleenv}{\Collect@Body \@gobble}{}%%% this environment eats its content

\AtBeginDocument%% the date and the date component of the seed and some code for solutions
{%
    \def\longdate{\expandafter\es@longdate\@date\@empty}
    \def\shortdate{\expandafter\es@shortdate\@date\@empty}
    \expandafter\mydate\@date\@empty
		\ifes@prova
		\else
		\ifes@solutions
			\newwrite\sols
			\immediate\openout\sols=\jobname.sol.tex
			\newwrite\loe
			\immediate\openout\loe=\jobname.loe
		\fi
		\fi
	}
\newcommand\es@segnala%%% this command gives the reference of the exact answer in the string of solutions
{%
    \if\es@listType1
		\addtocounter{sq@quizno}{-1}
		\refstepcounter{sq@quizno}
	\fi
	\ifes@prova 
	\else 
		\label{\probchosen} 
		\immediate\write\sols{\string\item\string\ref{\probchosen}}
		\immediate\write\loe{\es@exercisename\space\theesquestionnoi:\space \probchosen} 
	\fi
 }
\newcommand{\prior@questionsHook}{}

%========================================================%
%            definitions of Fpsetpar                     %
%========================================================%
\def\maxLoopLimit{10}%
\ifes@param
\newcommandx{\FPsetpar}[5][1=\seme,5={}]{%      %% the parameters are not assigned
                \expandafter\def\csname#2\endcsname{#2}%%% in the parametric version, the parameter appears with its name and not with its value
              \immediate\write\params{% %% writes on a file
                \string\textbf\string{\string\noindent\space \es@parametermessage{#2}{#3}{#4}
                \space \ifx#5\@empty\else $#2\neq #5$.\fi\space \es@seedmessage{#1}
                \string}\string\newline}}%
                \else
\newcommandx{\FPsetpar}[5][1=\seme,5={}]{%
\ifnum#3>#4
	\PackageError{esami}{\es@fpsetparerrshort{#2}}{\es@fpsetparerrlong{#2}}%
\fi%
\@ifundefined{nome}{\setcounter{fp@contatore}{-2}}{%
	\@ifundefined{base\nome}{\setcounter{fp@contatore}{-2}}{\setcounter{fp@contatore}{-\csname base\nome \endcsname}}}%
\FPeval{randomico}{round(\thevers+\then@par+\thequestionno+#1:0)}%
\old@randomi=\number\randomi\relax%%% it saves the old seed
\stepcounter{n@par}%
\setcounter{fp@contatore}{-\value{vers}}%
\randomi=\randomico\relax
\ifnum#3>0 
	\addtocounter{fp@contatore}{-#3}
	\else 
	\addtocounter{fp@contatore}{#3}%
\fi%
\whiledo{\value{fp@contatore}<\value{questionno}}{\nextrandom\stepcounter{fp@contatore}}%
\setrannum{\tmp@a}{#3}{#4}%
\def\rand@ne{#5}%%% checks the parameter (adapted from rangen)
\ifx\rand@ne\@empty\else\loopCnt=0\relax
	\@whilenum\loopCnt<\maxLoopLimit\do{%
		\rnd@cnt=1\relax
		\@for\ne@@tmp:=\rand@ne\do{%
			\ifnum\tmp@a=\ne@@tmp\relax
				\multiply\rnd@cnt0\relax
			\else%
				\multiply\rnd@cnt1\relax
			\fi%
		}%
		\ifnum\rnd@cnt=1\relax%% all conditions are satisfied
			\loopCnt=\maxLoopLimit\relax
		\else%
			\advance\loopCnt1\relax
				\ifnum\loopCnt=\maxLoopLimit
					\PackageError{esami}{\es@fpsetparerrorshort}{\es@fpsetparerrorshort}%
				\else%
					\setrannum{\tmp@a}{#3}{#4}%
				\fi%
			\fi%
		}%
	\fi%
	\FPeval{#2}{round(\number\tmp@a:0)}%
	\ifes@fillin
		\immediate\write\parametri{\string\FPeval\string{#2\string}\string{round(\number\tmp@a:0)\string}}%
	\fi
	\randomi=\number\old@randomi%%%  restores the seed
}%
\fi%

%%%% Command for random sign (taken from rangen)  %%%%%
\newcommand{\RandS}{%
\setrannum{\rnd@cnts}{0}{1}
\ifnum\number\rnd@cnts>0
+
\else
-
\fi}%

%=========================================================================%
%   Modified commands for parametric version in "totale-versioni"         %
%=========================================================================%
%%%
\ifes@param
\renewcommand{\FPsv}[2][0]{(#2)}%%% \FPsv shows oparations
\renewcommandx{\FPval}[3][2=0]
{%
\expandafter\def\csname#1\endcsname{(#1)}
\immediate\write\params{%%% writes on a file
\string\textbf\string{\string\noindent\space \es@parametermessagea{#1}{#3}\string}\string\newline
}
}
\renewcommand{\FPsignpol}[2]{+(#1)#2} %%% adapted from code contributed by Hjalmar Basile NEW 2016/04/11
\renewcommand{\simpsqrt}[2]{\sqrt[#1]{(#2)}}%%% \simpsqrt shows operations
\renewcommand{\sempli}[2]{%%% all simplifications become \frac
    \ifthenelse{\equal{#2}{1}}{(#1)}{\frac{#1}{#2}}}
    \renewcommand{\semplix}[2]{\ifthenelse{\equal{#2}{1}}{(#1)}{\frac{#1}{#2}}}
    \renewcommand{\sempliz}[2]{\ifthenelse{\equal{#2}{1}}{(#1)}{\frac{#1}{#2}}}
    \renewcommand{\esempli}[2]{\ifthenelse{\equal{#2}{1}}{(#1)}{\frac{#1}{#2}}}
   \PTsHook{%
   \emph{(\esPTs\ \ifthenelse{\equal{\esPTs}{\detokenize{1}}}{\es@pointname}{\es@pointsname})} %
   \ifes@test
     \immediate\closeout\params
    \fi
					}
\fi

% +===================================+
% | OTHER ENVIRONMENTS AND EXERCISES  |
% +===================================+

%========================================================%
%        Tabella                                         %
%========================================================%

\newcolumntype{$}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}#1\ignorespaces}
	\ifes@solutions
		\colorlet{tab@ans@color}{red}
		\newcolumntype{C}[1]{>{\color{tab@ans@color}}#1}%%% the column of the solutions is red (option solution)
	\else
		\def\cancella#1\finqui{\phantom{#1}}
		\newcolumntype{C}[1]{>{\cancella}#1<{\finqui}}%%% the column of the solutions is empty (exam)
	\fi
\newenvironment{tabella}[3][2]{\bigskip%%% open answers in columns #1=n. of visible columns (+1 invisible), #2={r,c,l} alignment of visible columns,  #3={r,c,l} alignment of invisible column
\renewcommand\arraystretch{2}
\begin{tabular}{$#2*{#1}{|^C#3}}  }{\end{tabular} \renewcommand\arraystretch{1}}

%========================================================%
%         Risposta                                       %
%========================================================%

\ifes@solutions
	\newenvironment{risposta}[2][l]{\relax}{}
\else
	\newenvironment{risposta}[2][b]{% #1={b,l} box or lines, #2= heigth of box or number of lines
	\setlength{\es@rig}{#2cm minus 12pt}
		\ifx#1b  
			\fbox{\parbox[b][\es@rig]{\textwidth}{\vfill\hfill }}
		\else
			\ifx#1l 
				\setcounter{risp@righe}{-#2}\stepcounter{risp@righe}
				{%
				\whiledo{\therisp@righe < #2}
					{\par \vspace{.2cm} \dotfill \stepcounter{risp@righe}}
				}
			\else 
			\fi
		\fi}
	{}
\fi

%========================================================%
%       matching (from an idea of examdesign)            %
%========================================================%

\newcommand{\pair}[2]{%%% pairing of items
\stepcounter{match@q}
\expandafter\gdef\csname match@qst\thematch@q\endcsname{#1}
\expandafter\gdef\csname match@ans\thematch@q\endcsname{#2}
\expandafter\edef\csname match@num\thematch@q\endcsname{\thematch@q}
}
\ifes@solutions
	\def\match@ans@color#1{\bfseries\color{red}{#1}}%%% visible solutions in red (solutions)
\else
	\def\match@ans@color#1{\phantom{#1}}%%% invisible solutions (exam)
\fi
\newcommand{\matching}{%%% it generates the 2 columns
\@getitemsr \@getitemsl
\vspace{5mm}
\setcounter{match@q}{0}
}
\def\@getitemsl%%% left column and shuffle of items
{%
\i@sh=\thematch@q
\loop
	\expandafter\let \csname flag\number\i@sh\endcsname a%
	\advance\i@sh by-1
	\ifnum\i@sh > 0 \repeat
\i@sh=\thematch@q
\loop
	\setrannum{\j@sh}{1}{\thematch@q}
	\expandafter\ifx \csname flag\number\j@sh\endcsname a%
	\expandafter\let \csname flag\number\j@sh\endcsname b%%% Sets the flag.
	\expandafter\edef\csname match@qsti\number\i@sh\endcsname{\noexpand\csname match@qstii\number\j@sh\endcsname}
	\setcounter{match@plu}{\thematch@q}
	\addtocounter{match@plu}{-\csname match@numii\number\j@sh\endcsname}
	\addtocounter{match@plu}{1}
	\setcounter{match@plo}{\thematch@q}
	\addtocounter{match@plo}{- \number\i@sh}
	\addtocounter{match@plo}{1}
	\expandafter\edef\csname match@numi\number\i@sh\endcsname{(\Alph{match@plu})}
	\vspace{2ex}
	
	\begin{tabular}{p{.05\textwidth}p{.40\textwidth}p{.01\textwidth}p{.40\textwidth}}
   \underbar{\makebox[.5cm]{\match@ans@color{\csname match@numi\number\i@sh\endcsname}}}  & \csname match@qsti\number\i@sh\endcsname&&(\Alph{match@plo})\hspace{3mm}\csname match@ansi\number\i@sh\endcsname%\tabularnewline
	\end{tabular} 
   %% ADD next line
  % \vspace{2ex} \\
   %%
 \advance\i@sh by-1
 \ifnum\i@sh > 0 \fi
 \fi
    \ifnum\i@sh > 0\repeat
}
\def\@getitemsr{%%% right column and shuffle of tems
\i@sh=\thematch@q
\loop
\expandafter\let \csname flago\number\i@sh\endcsname c%
\advance\i@sh by-1
\ifnum\i@sh > 0 \repeat
\i@sh=\thematch@q
\loop
\setrannum{\j@sh}{1}{\thematch@q}
\expandafter\ifx \csname flago\number\j@sh\endcsname c%
\expandafter\let \csname flago\number\j@sh\endcsname d%
\expandafter\edef\csname match@qstii\number\i@sh\expandafter\endcsname{\noexpand\csname match@qst\number\j@sh\endcsname}
\expandafter\edef\csname match@ansi\number\i@sh\expandafter\endcsname{\noexpand\csname match@ans\number\j@sh\endcsname}
\expandafter\edef\csname match@numii\number\i@sh\endcsname{\csname match@num\number\i@sh\endcsname}
\advance\i@sh by-1
\ifnum\i@sh > 0 \fi
\fi
\ifnum\i@sh > 0
\repeat
}

%========================================================%
%     Commands adapted from probsoln                     %
%========================================================%

%%%%%% \newproblem  %%%%%%%%%%%%%

\newif\iffirstpass
\ifes@prova
	\newcommand{\newproblem}[1]%% \newproblem for the file "totale-versioni"
{%
	\advance\tmp@quest by1
		\iffirstpass
		\global\advance\@probN by 1
		\else
		\let\nome\currfilebase
		\global\def\problabel{e:\thevers-file:\nome}
		\global\def\probnumber{q:\romannumeral\tmp@quest}
			\ifes@fillin
			\immediate\openout\parametri=qf\nome q\number\j@n e\thevers.parametri.tex
			\fi
		\expandafter\global\expandafter\newcommand\csname \probnumber \endcsname{#1}
		\fi
}
\else
    \ifes@correzione
    \newcommand{\newproblem}[1]%% \newproblem for the "correzione" option
    {%
	\advance\tmp@quest by1
		\iffirstpass
		\global\advance\@probN by 1
		\else
		\let\nome\currfilebase
		\global\def\problabel{e:\thevers-file:\nome}
		\global\def\probnumber{q:\romannumeral\tmp@quest}
			\ifes@fillin
			\immediate\openout\parametri=qf\nome q\romannumeral\tmp@quest e\thevers.parametri.tex
			\fi
		\expandafter\global\expandafter\newcommand\csname @prob-\problabel-\probnumber \endcsname{\unexpanded{#1}}
		\expandafter\global\expandafter\newcommand\csname @probi-\problabel-\probnumber \endcsname{#1}
		\fi
}
	\else
	\newcommand{\newproblem}[1]%% \newproblem for the exam
	{%
	\advance\tmp@quest by1
		\iffirstpass
		\global\advance\@probN by 1
		\else
		\let\nome\currfilebase
		\global\def\problabel{e:\thevers-file:\nome}
		\global\def\probnumber{q:\romannumeral\tmp@quest}
			\ifes@fillin
				\ifes@solutions%%% to write the string of solutions
				\immediate\openout\parametri=qf\nome q\romannumeral\tmp@quest e\thevers.parametri.tex
				\fi
			\fi
		\expandafter\global\expandafter\newcommand\csname @prob-\problabel-\probnumber \endcsname{\unexpanded{#1}}
		\expandafter\global\expandafter\newcommand\csname @probi-\problabel-\probnumber\endcsname{#1}%%% it assigns a unique name to exercise
		\fi
	}
	\fi
\fi

\newcommand{\newfillinproblem}[1]{ \newproblem{\fillinproblem #1}}

%%%%%%%% \selectrandomly %%%%%%%

\newcommand{\selectrandomly}[1]
{%
\global\@probN=0\relax
\firstpasstrue
\tmp@quest=0
\input{#1}%%%%%
\firstpassfalse%%% now prints the question
\tmp@quest=0
\input{#1}
\@ifundefined{base\nome}{\old@random=\number\randomi 
\randomi=\semeex
\setrannum{\rnd@cnta}{1}{\@probN}
\randomi=\number\old@random
\expandafter\global\expandafter\edef\csname base\nome \endcsname{\number\rnd@cnta}
}{}
\old@rando=\number\randomi
		\randomi=\semeex
\ifthenelse{\number\semeex=\number\seme}
{\FPeval\restotrentasei{round(\thevers+\thenomefile+1+base\nome-trunc((\thevers+\thenomefile+base\nome)/36:0)*36:0)}}
{\FPeval\restotrentasei{round(1+\thenomefile+1+base\nome-trunc((1+\thenomefile+base\nome)/36:0)*36:0)}}
\randomi=\number\old@rando     %%% AGGIUNTO 2018/04/28 per giro sbagliato
\ifcase\@probN\or
\def\j@n{1}%%% just one variant
\or%%% 2 variants
\ifthenelse{\isodd{\restotrentasei}}{\def\j@n{1}}{\def\j@n{2}}
\or%%% 3 variants
\def\j@n{\ifcase\restotrentasei\or 3\or 2\or 1\or 2\or 1\or 3\or 1\or 3\or 2\or 3\or 1\or 2\or 1\or 2\or 3\or 2\or 3\or 1\or 3\or 2\or 1\or 2\or 1\or 3\or 1\or 3\or 2\or 3\or 1\or 2\or 1\or 2\or 3\or 2\or 3\or 1\fi}%
\or%%% 4 variants
\def\j@n{\ifcase\restotrentasei\or 3\or 4\or 1\or 2\or 1\or 2\or 3\or 4\or 3\or 1\or 4\or 2\or 4\or 2\or 3\or 1\or 2\or 3\or 1\or 4\or 2\or 3\or 4\or 1\or 3\or 2\or 1\or 4\or 1\or 4\or 2\or 3\or 4\or 3\or 2\or 1\fi}%
\or%%% 5 variants
\def\j@n{\ifcase\restotrentasei\or 5\or 1\or 2\or 3\or 4\or 5\or 2\or 3\or 5\or 1\or 4\or 3\or 1\or 4\or 2\or 5\or 4\or 2\or 3\or 5\or 1\or 5\or 1\or 4\or 2\or 3\or 1\or 3\or 5\or 4\or 2\or 3\or 4\or 5\or 2\or 1\fi}%
\or%%% 6 variants
\def\j@n{\ifcase\restotrentasei\or 2\or 5\or 1\or 3\or 4\or 2\or 6\or 1\or 3\or 6\or 5\or 4\or 2\or 3\or 2\or 5\or 4\or 1\or 6\or 1\or 4\or 3\or 2\or 6\or 5\or 4\or 6\or 2\or 5\or 1\or 3\or 6\or 3\or 5\or 1\or 4\fi}%
\or%%% 7 variants
\def\j@n{\ifcase\restotrentasei\or 2\or 4\or 1\or 5\or 3\or 6\or 7\or 4\or 1\or 5\or 7\or 6\or 2\or 3\or 7\or 2\or 4\or 6\or 5\or 3\or 1\or 3\or 4\or 7\or 2\or 6\or 1\or 5\or 4\or 5\or 6\or 7\or 3\or 2\or 1\or 5\fi}%
\or%%% 8 variants
\def\j@n{\ifcase\restotrentasei\or 2\or 8\or 6\or 7\or 4\or 3\or 1\or 5\or 8\or 5\or 1\or 3\or 7\or 6\or 4\or 2\or 7\or 1\or 8\or 6\or 3\or 2\or 5\or 4\or 1\or 3\or 7\or 5\or 6\or 4\or 2\or 8\or 4\or 3\or 1\or 5\fi}%
\else
\ifthenelse{\number\semeex=\number\seme}{
\FPeval\j@n{round(\thevers*\es@primo+base\nome+1-trunc((\thevers*\es@primo+base\nome)/\number\@probN:0)*\number\@probN:0)}}
{\FPeval\j@n{round(\es@primo+base\nome+1-trunc((\es@primo+base\nome)/\number\@probN:0)*\number\@probN:0)}}
\fi
\def\probchosen{\problabel-q:\romannumeral\j@n}
\ifes@test
\begin{minipage}{.95\linewidth}\csname @probi-\problabel-q:\romannumeral\j@n \endcsname \vspace{5mm}\end{minipage}
\Acapo
\else
\csname @probi-\problabel-q:\romannumeral\j@n \endcsname \vspace{5mm}
\Acapo
\fi
    \ifes@fillin
     \immediate\closeout\parametri
     \fi
}

%%%% \selectallproblems %%%%%

\newcommand{\selectallproblems}[2][]{%% %%% it selects all problems for "totale-versioni", with the option "random" the problems are in random order
\global\@probN=0\relax
\firstpasstrue
\tmp@quest=0
\input{\cartella/#2}%
\firstpassfalse
\tmp@quest=0
\input{\cartella/#2}%
\ifthenelse{\equal{#1}{random}}{\i@sh=0
\loop
\advance\i@sh by1
\expandafter\edef\csname ftmp\romannumeral\i@sh \endcsname {\romannumeral\i@sh}
\ifnum\i@sh <\number\tmp@quest
\repeat
\shuffle{ftmp}{\tmp@quest}}{}
\global\j@m=1\relax
\whiledo{\j@m < \@probN \TE@or \j@m = \@probN}{
    \ifes@prova
        \ifes@param%
 \immediate\openout\params=params %%% the file in which the parameters are written
        \fi
         \def\probchosen{\problabel-q:\romannumeral\j@m}
\csname q:\romannumeral\j@m \endcsname%
    \else
     \def\probchosen{\problabel-q:\romannumeral\j@m}
    \ifthenelse{\equal{#1}{random}}{
    \csname @probi-\problabel-q:\csname ftmp\romannumeral\j@m\endcsname \endcsname
    }{
\csname @probi-\problabel-q:\romannumeral\j@m \endcsname
 }%
 \Acapo
    \fi
\par\vspace{2mm}
    \ifes@param%
\input{params}
    \fi
\global\advance\j@m by 1\relax
}}

%%% working with datasets of exercises (you can choose more than one exercise from a file)

\newif\ifes@db %% to work with datasets
\es@dbfalse

\newwrite\dbtemp
\newenvironment{esdb}[1]{
\gdef\dbname{#1}
\immediate\openout\dbtemp=\dbname.tex
\es@dbtrue%
}{
\immediate\closeout\dbtemp
\esercizidb{\dbname}
\es@dbfalse%
}

\newcommand{\selectrandomlyn}[2]{
\global\@probN=0\relax
\firstpasstrue
\tmp@quest=0
\input{\cartella/#2}%
\ifthenelse{\equal{#1}{all}}{\@probselN=\number\tmp@quest}{
\ifnum\tmp@quest<#1 \relax
   \PackageWarning{esami}{\es@selectnwarn{#1}{#2}}
    \@probselN=\number\tmp@quest %
 \else
 \@probselN=#1
 \fi}
 \i@sh=0
\loop
\advance\i@sh by1
\expandafter\edef\csname ftmp\romannumeral\i@sh \endcsname {\romannumeral\i@sh}
\ifnum\i@sh <\number\tmp@quest
\repeat
\shuffle{ftmp}{\tmp@quest}
\firstpassfalse%
\tmp@quest=0
\input{\cartella/#2}
 \i@sh=0
\loop
\advance\i@sh by1
\global\def\probnumber{q:\csname ftmp\romannumeral\i@sh\endcsname}
\expandafter\immediate\write\dbtemp\expandafter{\string\defitem\string{%
\string\gdef\string\problabel{\problabel}\space
\string\gdef\string\probnumber{\probnumber}\space
\string}}
\ifnum\i@sh <\number\@probselN
\repeat
}

\def\defitem{%
  \advance\icount by1
  %%% It defines a macro called "\prbl n" where "n" is the number of the item.
  \expandafter\def \csname prbl\romannumeral\icount \endcsname
}

\newcommand{\esercizidb}[1]{ %%% NEW 2017/02/16 for different seeds  shuffling exercises and choosing them
 \icount=0
\input{#1.tex}%
\i@sh=0
\loop
\advance\i@sh by1
\expandafter\edef\csname ftemp\romannumeral\i@sh \endcsname {\romannumeral\i@sh}
\ifnum\i@sh <\number\icount
\repeat
%\shuffle{ftemp}{\icount}
\shufflees{ftemp}{\icount} %%% NEW 2017/02/16 for different seeds  shuffling exercises and choosing them
\setcounter{n@par}{1}
\io=\icount
\loop
\ifes@test
\begin{minipage}{.95\linewidth}
\fi
\ifes@shuffleQuestions
\csname prbl\csname ftemp\romannumeral\io\endcsname\endcsname
\else
\csname prbl\romannumeral\io \endcsname
\fi
\def\probchosen{\problabel-\probnumber}
\csname @probi-\problabel-\probnumber \endcsname
\ifes@test
 \vspace{5mm}\end{minipage}
 \Acapo
\vspace{4mm}
 \fi
       \advance\io by-1
    \ifnum\io > 0 \repeat
 \par}

% +=============================+
% |        ENVIRONMENTS         |
% +=============================+

%========================================================%
%    TEST                                                %
%========================================================%

%%%%% Test %%%%%

        \newenvironment{test}[1][]{%%%  test for MCQ, ecc.
        \es@testtrue
                    \renewcommand{\punti}{#1}
            \examenddef\begin{shortquiz}
            \ifes@twocolumns
            \begin{multicols}{2}
            \fi
            }{
             \ifes@twocolumns
            \end{multicols}
            \fi
      %                  \ifdim\punteggio=\punti pt %% NEW 2016/04/11 to check the total score of exercises
%           \else
%            \PackageError{esami}{\es@pointerrorshort} {\es@pointerrorlong}
%  \fi
%            \global\punteggio=0pt
\checkpoints
            \end{shortquiz}
}

%%%%%  questions (the environment in which you put the MCQ) %%%%%%

\newenvironment{questions}
{%
\stepcounter{questionno}
    \ifnum\@esquestiondepth>\tw@\@toodeep\else\advance\@esquestiondepth\@ne\fi
    \def\@quesctr{esquestionno\romannumeral\the\@esquestiondepth}%
    \begin{list}{\qMark@Hook\prior@questionsHook\gdef\esPTs{1}%
    \makebox[\labelwidth][r]{\normalfont\bfseries\csname label\@quesctr\endcsname}%
        \post@questionsHook}%
    {\usecounter{\@quesctr}%
    \settowidth{\labelwidth}{\normalfont\bfseries00.\ }%
    \setlength{\topsep}{3pt}\setlength{\parsep}{0pt}%
    \setlength{\itemindent}{0pt}\setlength{\itemsep}{3pt}%
    \setlength{\leftmargin}{\labelwidth}%
    \settowidth{\labelsep}{\ }}
    \ifes@prova
    \else
    \ifes@solutions
    \immediate\write\sols{\string\begin{enumerate}}
    \fi
    \fi%
}{\end{list}
\ifes@prova
\else
\ifes@solutions
\immediate\write\sols{\string\par\string\end{enumerate}\string\vspace{3ex}}
\fi
\fi
}

%%%%%%% shortquiz (where to put the environment questions) %%%%

\newenvironment{shortquiz}
{\es@testtrue%
    \goodbreak
    \@shortquiz
}{
\setcounter{sq@quizno}{0}%
        \par\aftershortquizskip}
\def\@shortquiz{
      \let\@Ans\Ans@sq@l
  \setcounter{questionno}{0}%
  \let\answers\answers@sq
  \let\endanswers\endanswers@sq
  \let\solution\solution@sq
  \let\endsolution\endsolution@sq
    \sq@priorhook\sqlabel\space
   \ignorespaces
}
\def\aftershortquizskip{\medskip}
\def\answers@sq{\stepcounter{questionno}%
    \answers@@sq
    }
\def\answers@@sq#1{%
    \gdef\aeb@numCols{#1}%
\ifx#11\gdef\es@listType{1}\expandafter\answers@sq@list\else
   \gdef\es@listType{0}\expandafter\answers@@sq@tabular\fi{#1}%
}
\newcommand\Ans@list[2][0]{\gdef\es@pPTs{#1}%
    \xdef\Ans@choice{#2}\item\relax\if\es@listType1%
    \addtocounter{sq@quizno}{-1}\refstepcounter{sq@quizno}\fi}
\newenvironment{answers@sq@list}[1]
{%
        \let\endanswers=\endanswers@sq@list
    \vskip\aboveanswersSkip
    \begin{list}{\strut\@Ans}
    {%
            \settowidth{\labelwidth}{\es@lw@l}%
        \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
        \setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}%
        \setlength{\listparindent}{\parindent}%
        \setlength{\leftmargin}{\labelwidth}%
        \setlength{\labelsep}{\mylabelsep}%
        \def\Ans{\Ans@list}%
    }%
}%
{\end{list}\setcounter{sq@quizno}{0}}
\newcommand\Ans@tabular[2][0]{\gdef\es@pPTs{#1}%
    \xdef\Ans@choice{#2}\leavevmode\@Ans
}
\def\answers@@sq@tabular#1{%
    \vskip\aboveanswersSkip\noindent\tabcolsep=0pt
    \es@tmpdima=\linewidth \divide \es@tmpdima by#1 %
    \def\Ans{\Ans@tabular}%
    \begin{tabular}{*{#1}{p{\es@tmpdima}}}}%
\def\endanswers@sq{\end{tabular}\setcounter{sq@quizno}{0}}%
\def\Ans@sq@l{%
    \leavevmode\if\es@listType1\stepcounter{sq@quizno}%
    \else\refstepcounter{sq@quizno}\fi\PBS\raggedright
    \settowidth{\es@tmplength}{\es@l@l}\sbox{\es@tmpbox}{\es@lw@l}%
    \es@tmpdima=\wd\es@tmpbox
    \def\link@@Content{\linkContentWrapper}%
    \hangindent=\es@tmplength\hangafter=1\relax
        {\makebox[\es@tmpdima]{\link@@Content}}%
    \Ans@proofing{\es@tmpdima}%
\ \ignorespaces}
\def\Ans@proofing#1{%
    \ifes@solutions\if\Ans@choice1\relax
        \llap{\@proofingsymbol\,\hskip#1\relax}%
    \fi\fi
}
\newcommand\answers@q
{%
    \setdefault@Ans
    \stepcounter{questionno}%
    \answers@@q
}
\def\answers@@q#1%
{%
    \gdef\aeb@numCols{#1}%
    \ifx#11\gdef\es@listType{1}\expandafter\answers@q@list\else
    \gdef\es@listType{0}\expandafter\answers@q@tabular\fi{#1}%
}
\newenvironment{answers@q@list}%[1]
{%
    \let\endanswers=\endanswers@q@list
    \vskip\aboveanswersSkip
    \begin{list}{\strut\@Ans}%\
    {%
        \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
        \setlength{\listparindent}{\parindent}
        \setlength{\leftmargin}{\labelwidth}%
        \setlength{\labelsep}{0pt}
        \def\Ans{\Ans@list}%
        }%
}{\end{list}\setcounter{sq@quizno}{0}%
    \setdefault@Ans
}
\def\answers@q@tabular#1{%
    \vskip\aboveanswersSkip\noindent\tabcolsep=0pt
    \es@tmpdima=\linewidth \advance\es@tmpdima-\leftskip
        \divide\es@tmpdima by#1
    \def\Ans{\Ans@tabular}%
    \let\endanswers=\endanswers@q@tabular
    \begin{tabular}{*{#1}{p{\es@tmpdima}}}%
}
\def\endanswers@q@tabular
{%
    \end{tabular}\setcounter{sq@quizno}{0}%
    \setdefault@Ans
}

\define@key{bchoice}{nCols}{\def\bChoiceNumCols{#1}}
\@for\i:=1,2,3,4,5,6,7,8,9,10 \do{\edef\temp@expand@def{%
    \noexpand\define@key{bchoice}{\i}[\i]{%
        \noexpand\def\noexpand\bChoiceNumCols{\i}}%
    }\temp@expand@def
}
\def\bChoiceNumCols{\aeb@numCols}
\define@key{bchoice}{random}[true]{%
    \csname if#1\endcsname\es@randomizeChoicestrue
        \else\es@randomizeChoicesfalse\fi
}
\def\bChoices{\@ifnextchar[{\@ansChoices}{\@ansChoices[\aeb@numCols]}}
\def\@ansChoices[#1]%
{%
    \setkeys{bchoice}{#1}%
    \global\es@tabColCnt=0
    \ifnum\aeb@numCols=1 % list mode
        \def\es@next{\@layoutListAns}%
    \else % tabular mode
         \def\es@next{\@layoutTabularAns{\bChoiceNumCols}}%
    \fi
    \es@next
}
\let\eChoices\relax
\def\@layoutListAns{\@ifnextchar\Ans{\@getListAns}%
    {\@lookforendansChoices{\@layoutListAns}}%
}
\long\def\@getListAns\Ans#1\eAns{%
    \Ans#1\vspace{\@rowskip}%
    \@layoutListAns
}
\long\def\@lookforendansChoices#1{%
    \@ifnextchar\eChoices{\rowsep{\rowsep@default}%
        \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}%
}
\def\@layoutTabularAns#1{%
    \let\es@tabSep=\@empty
    \xdef\numShortCols{#1}%
    \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi
    \@@layoutTabularAns
}
\def\@@layoutTabularAns{%
    \@ifnextchar\Ans{\@getTabAns}%
        {\@lookforendansChoices{\@@layoutTabularAns}}%
}
\long\def\@getTabAns\Ans#1\eAns{%
    \global\advance\es@tabColCnt1
    \let\@save@tabSep=\es@tabSep
    \ifnum\es@tabColCnt=\numShortCols
        \global\es@tabColCnt=0
            \xdef\es@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}%
    \else
        \gdef\es@tabSep{&}%
    \fi
    \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default}
        \expandafter\@findendans\@gobble}%
        {\@save@tabSep\Ans#1\@@layoutTabularAns}%
}
\def\@findendans{\@ifnextchar\end{}{\expandafter\@findendans\@gobble}}

\ifes@noquizsolutions
\def\solution@sq{\gobbleenv}
\def\endsolution@sq{\endgobbleenv}
\else
\def\solution@sq{
    \par\smallskip\noindent
    \textit{\es@solutionname}:\
}

\def\endsolution@sq
{}
\fi
%========================================================%
%   EXERCISE AND SIMILAR                                 %
%========================================================%

%%%% Exercise (adapted from exerquiz) %%%%

\newenvironment{exercise}
{\es@testfalse%%% you can't use it in test
    \par\es@priorexskip\noindent
    \def\es@argi{ex@no}
    \if\es@exerstarEnv*\def\exerstar{*}\else\def\exerstar{x}\fi
     \if\exerstar*%
\def\exerstar{*}\fi
\@exercise
}{\es@postexerciseHook\par\global\es@exerciseheadingtrue\es@exerskip}
\newif\ifes@exerciseheading \es@exerciseheadingtrue
\def\@exercise
{%
    \if\es@argi0\else\refstepcounter{\es@argi}\fi
    \if\exerstar*% exercise with parts
    \else
               \ifes@solutions
                     \else
               \gdef\es@writeexheader{%
                    \set@display@protect
                    \set@typeset@protect
                    }
               \fi
    \fi
    \ifvmode\ifdim\lastskip>\z@
        \vskip-\lastskip
    \fi\fi
    \if\exerstar*%
        \let\solution=\solnexer@woparts
        \let\endsolution=\endsolnexer@woparts
        \let\parts=\exercise@parts
        \let\endparts\endexercise@parts
    \else
        \let\solution=\solnexer@woparts
        \let\endsolution=\endsolnexer@woparts
        \let\parts=\relax
        \let\endparts=\relax
    \fi
    \ifes@exerciseheading
\ex@header
    \afterlabelhskip\ignorespaces
    \fi
}
\long\def\setsolnspace#1{%
    \def\newsolnspace{#1}%
    \let\solnhspace\newsolnspace
}
\let\solnhspace\space
\def\solnexer@woparts{\def\bLeaveVspace{x}%
    \def\next{\@ifnextchar[{\solnexer@@woparts}%
        {\solnexer@@woparts[\null]}}%
    \next}
\let\esPriorVspace\@gobble
\def\solnexer@@woparts[#1]{%
    \ifx#1\null
    \else
        \gdef\sameVspace{#1}%
        \ifes@solutions\else
                \let\bLeaveVspace=\@empty
                \def\leavevspace{%
                     \par\esPriorVspace{#1}%
                        {\nobreak\parbox[b][#1][t]{\linewidth}{\vfill}}%
                }%
        \fi
    \fi
    \solnexer@@@woparts
}
\def\solutionsafterSkip{\smallskip}
\def\solnexer@@@woparts
{%
     \ifx\bLeaveVspace\@empty\leavevspace\fi
                   \def\es@next{%
            \ifes@solutions
                \ifx\exsolafter\@empty\else
                \par\solutionsafterSkip
                \noindent\exsolafter\space\ignorespaces\fi
            \else
               \global\es@solutionsfalse\expandafter\gobbleenv
            \fi
        }%
   \es@next}
\def\endsolnexerhook{}
\def\endsolnexerhookaux{}
\def\endsolnexer@woparts
{%
        \ifes@solutions
        \else
          \endgobbleenv
                \endsolnexerhookaux
        \fi
\endsolnexerhook}
\let\es@exerstarEnv\relax
\newenvironment{exercise*}{\def\es@exerstarEnv{*}\exercise}
{\endexercise}
\def\exercise@parts{\@@par\ifdim\parskip>\z@\vskip-\parskip\fi
  \let\endparts=\endexercise@parts@list\exercise@parts@list%}
  }
\def\es@extralabelsep{0pt}
\newenvironment{exercise@parts@list}
{\settowidth{\es@tmplength}{\normalfont(d)}%
\begin{list}{\normalfont
    \makebox[\es@tmplength]{\esexlisttabheader}%
}{%
    \usecounter{ex@partno}%
    \setlength{\topsep}{3pt}%
    \setlength{\partopsep}{0pt plus 1pt minus 1pt}%
    \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
    \setlength{\listparindent}{\parindent}%
    \settowidth{\labelsep}{\normalfont\ }%
    \addtolength{\labelsep}{\es@extralabelsep}%
    \settowidth{\labelwidth}{\normalfont(d)}%
    \setlength{\leftmargin}{\labelwidth}%
    \addtolength{\leftmargin}{\labelsep}%
     }%
}{\end{list}}


%%%%% Problem %%%%%%%%

\newenvironment{problem}[1][]{%%% it's like exercise, but with points
\es@testfalse
\renewcommand{\punti}{#1}
\ifes@solutionsonly\else\examenddef\fi
\begin{exercise}
\ifes@prova
\else
\ifes@solutions
\immediate\write\loe{\es@exercisename\space \theex@no:\space \probchosen}
\fi
\fi
}
{
\end{exercise}
\ifes@param
\immediate\closeout\params
\fi}

\newenvironment{problem*}[1][]{\es@testfalse
\renewcommand{\punti}{#1}
\ifes@solutionsonly\else\examenddef\fi
\begin{exercise*}
\ifes@prova
\else
\ifes@solutions
\immediate\write\loe{\es@exercisename\space \theex@no:\space \probchosen}
\fi
\fi
}
{
\checkpoints
\end{exercise*}
\ifes@param
\immediate\closeout\params
\fi }

%%%%%%%%   Problem in minipage

\newenvironment{problemmp}[1][]{%%% it's like exercise, but with points
\es@testfalse
\begin{minipage}{\linewidth}  %%% new 2016/02/19
\renewcommand{\punti}{#1}
\ifes@solutionsonly\else\examenddef\fi
\begin{exercise}
\ifes@prova
\else
\ifes@solutions
\immediate\write\loe{\es@exercisename\space \theex@no:\space \probchosen}
\fi
\fi
}
{
\end{exercise}
\end{minipage}%%% new 2016/02/19
\ifes@param
\immediate\closeout\params
\fi}

\newenvironment{problemmp*}[1][]{\es@testfalse
\begin{minipage}{\linewidth}  %%% new 2016/02/19
\renewcommand{\punti}{#1}
\ifes@solutionsonly\else\examenddef\fi
\begin{exercise*}
\ifes@prova
\else
\ifes@solutions
\immediate\write\loe{\es@exercisename\space \theex@no:\space \probchosen}
\fi
\fi
}
{
%\ifdim\punteggio=\punti pt
%           \else
%            \PackageError{esami}{\es@pointerrorshort}
%   {\es@pointerrorlong}
%  \fi
%            \global\punteggio=0pt %% NEW 2016/04/11 to check the total score of exercises
\checkpoints
\end{exercise*}
\end{minipage}%%% new 2016/02/19
\ifes@param
\immediate\closeout\params
\fi }

%%%%%%%% Domanda %%%%%%%%
%%%%  (it can be used to hide the text of the exercise and print only the solution) %%%

\ifes@solutionsonly
    \newenvironment{domanda}{\gobbleenv}{\endgobbleenv}%
    \else
    \newenvironment{domanda}{}{}
    \fi

%%%%%%%%%%%%%  workarea (adapted from exerquiz) %%%%%

\newenvironment{workarea}[2][\linewidth]%%% #1=width #2=heigth
{%
    \edef\workareadepth{#2}%
    \begin{lrbox}{\workareasb}\setlength{\es@tmplength}{#1}
    \begin{minipage}[b][\workareadepth][t]{\es@tmplength}\vspace*{3pt}%
}
{%
    \end{minipage}\end{lrbox}%
    \par\ifes@solutions%
    \else
    \vspace{-\baselineskip}
            \noindent\strut\smash{\usebox{\workareasb}}%
   \fi
}

%==========================================%
%      Format                              %
%==========================================%

%%% Sections %%%

\renewcommand\section{\setcounter{ex@no}{0}
\@startsection
{section}{1}{0mm}
{-\baselineskip}
{0.5\baselineskip}
{\sffamily\Large\centering}}

%%% Subsections  %%%

\renewcommand\subsection{
\@startsection
{subsection}{1}{0mm}
{-\baselineskip}
{1\baselineskip}
{\sffamily\centering}}

% +===================================+
% |  PERMUTATIONS, SHUFFLE, ECC.      |
% +===================================+

%========================================================%
%     Permutations                                       %
%========================================================%

%% These values are used in pseudorandom permutations: they must be calculated for any version

\newcommand{\permuta}{
\FPeval\restosei{round(\thevers+\thenomefile+1-trunc((\thevers+\thenomefile)/6:0)*6:0)}%%% for 2 or 3 exercises permutations
\FPeval\restoventiquattro{round(\thevers+\thenomefile+1-trunc((\thevers+\thenomefile)/24:0)*24:0)}%%%% for 4 exercises permutations
\FPeval\restotrenta{round(\thevers+\thenomefile+1-trunc((\thevers+\thenomefile)/30:0)*30:0)} %%%% for 5,6,7,8 exercises permutations
}
\ifes@prova
\def\restosei{4}%%% for 2 or 3 exercises permutations
\def\restoventiquattro{21}%%%% for 4 exercises permutations
\def\restotrenta{17} %%%% for 5,6,7,8 exercises permutations
\fi

%%%  pseudorandom versions (permutations of 1 esercise!!)
\def\sceglii#1#2{\expandafter\def\csname #2i\endcsname{#1}}
\def\prendii#1#2{\sceglii{#1}{#2}}
%%%  pseudorandom versions (permutations of 2 esercises)
\def\scegliii#1#2#3{\expandafter\def\csname #3i\endcsname{#1}\expandafter\def\csname #3ii\endcsname{#2}}
\def\prendiii#1#2#3{\ifthenelse{\isodd{\thevers}}{\scegliii{#2}{#1}{#3}}{\scegliii{#1}{#2}{#3}}}
%%%  pseudorandom versions (permutations of 3 esercises)
\def\scegliiii#1#2#3#4{\expandafter\def\csname #4i\endcsname{#1}\expandafter\def\csname #4ii\endcsname{#2}%
\expandafter\def\csname #4iii\endcsname{#3}}
\def\prendiiii#1#2#3#4{\ifcase\restosei\or%
\scegliiii{#3}{#2}{#1}{#4}\or%
\scegliiii{#2}{#1}{#3}{#4}\or%
\scegliiii{#1}{#3}{#2}{#4}\or%
\scegliiii{#3}{#1}{#2}{#4}\or%
\scegliiii{#1}{#2}{#3}{#4}\or%
\scegliiii{#2}{#3}{#1}{#4}
\fi}
%%%  pseudorandom versions (permutations of 4 esercises)
\def\scegliiv#1#2#3#4#5{\expandafter\def\csname #5i\endcsname{#1}\expandafter\def\csname #5ii\endcsname{#2}%%
\expandafter\def\csname #5iii\endcsname{#3}\expandafter\def\csname #5iv\endcsname{#4}}
\def\prendiiv#1#2#3#4#5{\ifcase\restoventiquattro\or%
\scegliiv{#3}{#4}{#1}{#2}{#5}\or%
\scegliiv{#1}{#2}{#3}{#4}{#5}\or%
\scegliiv{#3}{#1}{#4}{#2}{#5}\or%
\scegliiv{#4}{#2}{#3}{#1}{#5}\or%
\scegliiv{#2}{#3}{#1}{#4}{#5}\or%
\scegliiv{#1}{#4}{#2}{#3}{#5}\or%
\scegliiv{#2}{#3}{#4}{#1}{#5}\or%
\scegliiv{#3}{#2}{#1}{#4}{#5}\or%
\scegliiv{#2}{#1}{#3}{#4}{#5}\or%
\scegliiv{#3}{#4}{#2}{#1}{#5}\or%
\scegliiv{#4}{#1}{#3}{#2}{#5}\or%
\scegliiv{#1}{#2}{#4}{#3}{#5}\or%
\scegliiv{#4}{#3}{#1}{#2}{#5}\or%
\scegliiv{#3}{#1}{#2}{#4}{#5}\or%
\scegliiv{#2}{#1}{#4}{#3}{#5}\or%
\scegliiv{#4}{#3}{#2}{#1}{#5}\or%
\scegliiv{#2}{#4}{#1}{#3}{#5}\or%
\scegliiv{#1}{#3}{#2}{#4}{#5}\or%
\scegliiv{#2}{#4}{#3}{#1}{#5}\or%
\scegliiv{#4}{#1}{#2}{#3}{#5}\or%
\scegliiv{#1}{#4}{#3}{#2}{#5}\or%
\scegliiv{#3}{#2}{#4}{#1}{#5}\or%
\scegliiv{#4}{#2}{#1}{#3}{#5}\or%
\scegliiv{#1}{#3}{#4}{#2}{#5}\fi}
%%%  pseudorandom versions (permutations of 5 esercises)
\def\scegliv#1#2#3#4#5#6{\expandafter\def\csname #6i\endcsname{#1}\expandafter\def\csname #6ii\endcsname{#2}%%
\expandafter\def\csname #6iii\endcsname{#3}\expandafter\def\csname #6iv\endcsname{#4}\expandafter\def\csname #6v\endcsname{#5}}
\def\prendiv#1#2#3#4#5#6{\ifcase\restotrenta\or
\scegliv{#1}{#5}{#3}{#2}{#4}{#6}\or%
\scegliv{#2}{#3}{#5}{#1}{#4}{#6}\or%
\scegliv{#1}{#4}{#5}{#3}{#2}{#6}\or%
\scegliv{#5}{#3}{#1}{#4}{#2}{#6}\or%
\scegliv{#3}{#1}{#4}{#5}{#2}{#6}\or%
\scegliv{#4}{#2}{#3}{#5}{#1}{#6}\or%
\scegliv{#5}{#1}{#2}{#4}{#3}{#6}\or%
\scegliv{#2}{#5}{#1}{#3}{#4}{#6}\or%
\scegliv{#1}{#3}{#5}{#4}{#2}{#6}\or%
\scegliv{#3}{#4}{#1}{#2}{#5}{#6}\or%
\scegliv{#4}{#5}{#1}{#3}{#2}{#6}\or%
\scegliv{#5}{#3}{#4}{#1}{#2}{#6}\or%
\scegliv{#3}{#1}{#4}{#2}{#5}{#6}\or%
\scegliv{#4}{#1}{#5}{#3}{#2}{#6}\or%
\scegliv{#1}{#4}{#3}{#2}{#5}{#6}\or%
\scegliv{#2}{#5}{#1}{#4}{#3}{#6}\or%
\scegliv{#5}{#2}{#4}{#1}{#3}{#6}\or%
\scegliv{#4}{#5}{#3}{#1}{#2}{#6}\or%
\scegliv{#1}{#5}{#2}{#3}{#4}{#6}\or%
\scegliv{#5}{#4}{#3}{#2}{#1}{#6}\or%
\scegliv{#3}{#2}{#4}{#1}{#5}{#6}\or%
\scegliv{#1}{#2}{#4}{#3}{#5}{#6}\or%
\scegliv{#4}{#2}{#1}{#3}{#5}{#6}\or%
\scegliv{#3}{#4}{#2}{#5}{#1}{#6}\or%
\scegliv{#2}{#3}{#5}{#4}{#1}{#6}\or%
\scegliv{#3}{#1}{#2}{#5}{#4}{#6}\or%
\scegliv{#5}{#2}{#4}{#3}{#1}{#6}\or%
\scegliv{#2}{#4}{#3}{#1}{#5}{#6}\or%
\scegliv{#4}{#3}{#2}{#5}{#1}{#6}\or%
\scegliv{#2}{#1}{#5}{#4}{#3}{#6}\fi}
%%%  pseudorandom versions (permutations of 6 esercises)
\def\sceglivi#1#2#3#4#5#6#7{\expandafter\def\csname #7i\endcsname{#1}\expandafter\def\csname #7ii\endcsname{#2}%%
\expandafter\def\csname #7iii\endcsname{#3}\expandafter\def\csname #7iv\endcsname{#4}\expandafter\def\csname #7v\endcsname{#5}%%
\expandafter\def\csname #7vi\endcsname{#6}}
\def\prendivi#1#2#3#4#5#6#7{\ifcase\restotrenta\or%
\sceglivi{#6}{#2}{#1}{#4}{#5}{#3}{#7}\or%
\sceglivi{#2}{#6}{#4}{#3}{#5}{#1}{#7}\or%
\sceglivi{#3}{#4}{#5}{#6}{#1}{#2}{#7}\or%
\sceglivi{#1}{#3}{#6}{#4}{#2}{#5}{#7}\or%
\sceglivi{#4}{#2}{#3}{#1}{#6}{#5}{#7}\or%
\sceglivi{#6}{#4}{#2}{#1}{#5}{#3}{#7}\or%
\sceglivi{#5}{#3}{#2}{#4}{#1}{#6}{#7}\or%
\sceglivi{#2}{#5}{#4}{#1}{#3}{#6}{#7}\or%
\sceglivi{#3}{#1}{#6}{#2}{#4}{#5}{#7}\or%
\sceglivi{#2}{#1}{#3}{#5}{#4}{#6}{#7}\or%
\sceglivi{#5}{#2}{#3}{#4}{#1}{#6}{#7}\or%
\sceglivi{#1}{#3}{#6}{#5}{#4}{#2}{#7}\or%
\sceglivi{#6}{#1}{#5}{#4}{#3}{#2}{#7}\or%
\sceglivi{#3}{#2}{#5}{#4}{#1}{#6}{#7}\or%
\sceglivi{#1}{#4}{#3}{#2}{#6}{#5}{#7}\or%
\sceglivi{#4}{#6}{#2}{#5}{#1}{#3}{#7}\or%
\sceglivi{#6}{#3}{#5}{#1}{#4}{#2}{#7}\or%
\sceglivi{#3}{#5}{#6}{#4}{#2}{#1}{#7}\or%
\sceglivi{#4}{#1}{#2}{#6}{#3}{#5}{#7}\or%
\sceglivi{#1}{#6}{#5}{#4}{#2}{#3}{#7}\or%
\sceglivi{#5}{#4}{#6}{#3}{#1}{#2}{#7}\or%
\sceglivi{#6}{#5}{#1}{#3}{#2}{#4}{#7}\or%
\sceglivi{#5}{#1}{#4}{#3}{#2}{#6}{#7}\or%
\sceglivi{#2}{#3}{#4}{#6}{#5}{#1}{#7}\or%
\sceglivi{#4}{#2}{#6}{#1}{#3}{#5}{#7}\or%
\sceglivi{#3}{#4}{#6}{#5}{#1}{#2}{#7}\or%
\sceglivi{#1}{#3}{#2}{#6}{#4}{#5}{#7}\or%
\sceglivi{#4}{#3}{#1}{#5}{#6}{#2}{#7}\or%
\sceglivi{#5}{#6}{#1}{#3}{#2}{#4}{#7}\or%
\sceglivi{#2}{#6}{#3}{#4}{#5}{#1}{#7}\fi}
%%%  pseudorandom versions (permutations of 7 esercises)
\def\sceglivii#1#2#3#4#5#6#7#8{\expandafter\def\csname #8i\endcsname{#1}\expandafter\def\csname #8ii\endcsname{#2}%%
\expandafter\def\csname #8iii\endcsname{#3}\expandafter\def\csname #8iv\endcsname{#4}\expandafter\def\csname #8v\endcsname{#5}%%
\expandafter\def\csname #8vi\endcsname{#6}\expandafter\def\csname #8vii\endcsname{#7}}
\def\prendivii#1#2#3#4#5#6#7#8{\ifcase\restotrenta\or%
\sceglivii{#5}{#7}{#1}{#4}{#6}{#3}{#2}{#8}\or%
\sceglivii{#6}{#3}{#4}{#2}{#1}{#5}{#7}{#8}\or%
\sceglivii{#2}{#5}{#1}{#6}{#7}{#4}{#3}{#8}\or%
\sceglivii{#1}{#2}{#7}{#5}{#3}{#4}{#6}{#8}\or%
\sceglivii{#5}{#6}{#4}{#1}{#7}{#3}{#2}{#8}\or%
\sceglivii{#6}{#4}{#1}{#5}{#3}{#2}{#7}{#8}\or%
\sceglivii{#4}{#1}{#5}{#7}{#6}{#2}{#3}{#8}\or%
\sceglivii{#7}{#2}{#4}{#6}{#5}{#3}{#1}{#8}\or%
\sceglivii{#3}{#4}{#7}{#2}{#6}{#1}{#5}{#8}\or%
\sceglivii{#4}{#5}{#6}{#7}{#3}{#2}{#1}{#8}\or%
\sceglivii{#5}{#7}{#4}{#3}{#2}{#1}{#6}{#8}\or%
\sceglivii{#3}{#6}{#7}{#4}{#1}{#2}{#5}{#8}\or%
\sceglivii{#1}{#2}{#6}{#7}{#5}{#3}{#4}{#8}\or%
\sceglivii{#6}{#1}{#4}{#3}{#7}{#2}{#5}{#8}\or%
\sceglivii{#3}{#4}{#5}{#1}{#6}{#7}{#2}{#8}\or%
\sceglivii{#7}{#6}{#1}{#4}{#3}{#5}{#2}{#8}\or%
\sceglivii{#5}{#1}{#4}{#3}{#2}{#6}{#7}{#8}\or%
\sceglivii{#6}{#5}{#2}{#1}{#3}{#7}{#4}{#8}\or%
\sceglivii{#2}{#4}{#7}{#3}{#5}{#1}{#6}{#8}\or%
\sceglivii{#7}{#3}{#6}{#5}{#2}{#4}{#1}{#8}\or%
\sceglivii{#4}{#2}{#3}{#6}{#5}{#7}{#1}{#8}\or%
\sceglivii{#5}{#6}{#1}{#2}{#3}{#4}{#7}{#8}\or%
\sceglivii{#4}{#5}{#6}{#3}{#1}{#7}{#2}{#8}\or%
\sceglivii{#1}{#3}{#5}{#4}{#2}{#7}{#6}{#8}\or%
\sceglivii{#2}{#3}{#7}{#5}{#6}{#1}{#4}{#8}\or%
\sceglivii{#1}{#6}{#4}{#2}{#7}{#5}{#3}{#8}\or%
\sceglivii{#7}{#5}{#2}{#4}{#1}{#3}{#6}{#8}\or%
\sceglivii{#2}{#7}{#3}{#1}{#6}{#5}{#4}{#8}\or%
\sceglivii{#1}{#3}{#4}{#2}{#7}{#6}{#5}{#8}\or%
\sceglivii{#3}{#5}{#1}{#6}{#2}{#4}{#7}{#8}\fi}
%%%  pseudorandom versions (permutations of 8 esercises)
\def\scegliviii#1#2#3#4#5#6#7#8#9{\expandafter\def\csname #9i\endcsname{#1}\expandafter\def\csname #9ii\endcsname{#2}%%
\expandafter\def\csname #9iii\endcsname{#3}\expandafter\def\csname #9iv\endcsname{#4}\expandafter\def\csname #9v\endcsname{#5}%%
\expandafter\def\csname #9vi\endcsname{#6}\expandafter\def\csname #9vii\endcsname{#7}\expandafter\def\csname #9viii\endcsname{#8}}
\def\prendiviii#1#2#3#4#5#6#7#8#9{\ifcase\restotrenta\or%
\scegliviii{#2}{#8}{#6}{#7}{#4}{#3}{#1}{#5}{#9}\or%
\scegliviii{#8}{#5}{#1}{#3}{#7}{#6}{#4}{#2}{#9}\or%
\scegliviii{#7}{#1}{#8}{#6}{#3}{#2}{#5}{#4}{#9}\or%
\scegliviii{#6}{#3}{#7}{#5}{#1}{#4}{#2}{#8}{#9}\or%
\scegliviii{#4}{#1}{#2}{#3}{#5}{#7}{#8}{#6}{#9}\or%
\scegliviii{#3}{#8}{#7}{#1}{#6}{#4}{#5}{#2}{#9}\or%
\scegliviii{#5}{#3}{#8}{#6}{#1}{#7}{#2}{#4}{#9}\or%
\scegliviii{#8}{#6}{#3}{#4}{#7}{#2}{#5}{#1}{#9}\or%
\scegliviii{#6}{#4}{#8}{#7}{#5}{#1}{#3}{#2}{#9}\or%
\scegliviii{#3}{#2}{#7}{#5}{#4}{#6}{#1}{#8}{#9}\or%
\scegliviii{#4}{#3}{#6}{#7}{#8}{#1}{#2}{#5}{#9}\or%
\scegliviii{#3}{#7}{#5}{#2}{#4}{#8}{#6}{#1}{#9}\or%
\scegliviii{#4}{#8}{#7}{#3}{#2}{#1}{#6}{#5}{#9}\or%
\scegliviii{#7}{#2}{#4}{#8}{#5}{#6}{#1}{#3}{#9}\or%
\scegliviii{#1}{#7}{#2}{#3}{#4}{#5}{#6}{#8}{#9}\or%
\scegliviii{#7}{#1}{#8}{#5}{#2}{#4}{#3}{#6}{#9}\or%
\scegliviii{#8}{#3}{#5}{#4}{#1}{#2}{#6}{#7}{#9}\or%
\scegliviii{#5}{#1}{#8}{#3}{#4}{#6}{#7}{#2}{#9}\or%
\scegliviii{#4}{#7}{#2}{#5}{#1}{#8}{#6}{#3}{#9}\or%
\scegliviii{#5}{#3}{#1}{#6}{#2}{#4}{#8}{#7}{#9}\or%
\scegliviii{#2}{#1}{#7}{#3}{#4}{#8}{#5}{#6}{#9}\or%
\scegliviii{#1}{#8}{#6}{#4}{#5}{#2}{#3}{#7}{#9}\or%
\scegliviii{#3}{#1}{#8}{#5}{#4}{#7}{#6}{#2}{#9}\or%
\scegliviii{#5}{#4}{#3}{#2}{#6}{#7}{#8}{#1}{#9}\or%
\scegliviii{#6}{#5}{#4}{#1}{#3}{#2}{#7}{#8}{#9}\or%
\scegliviii{#1}{#6}{#2}{#8}{#3}{#5}{#7}{#4}{#9}\or%
\scegliviii{#2}{#7}{#8}{#1}{#4}{#3}{#5}{#6}{#9}\or%
\scegliviii{#5}{#8}{#3}{#4}{#7}{#6}{#1}{#2}{#9}\or%
\scegliviii{#7}{#4}{#2}{#5}{#1}{#6}{#8}{#3}{#9}\or%
\scegliviii{#2}{#3}{#7}{#1}{#6}{#5}{#4}{#8}{#9}\fi}

%========================================================%
%        Shuffle                                         %
%========================================================%

\newcommand\shuf@ch{}%%% the exercise list
\renewcommand{\theshuf@lop}{\roman{shuf@lop}}%
\newcommand\shuf@ifch[3]{%  #2=the input item
\ifthenelse{\not\equal{\shuf@ch}{#1}}{\stepcounter{shuf@lop}\expandafter\edef\csname #2\theshuf@lop\endcsname{#3}}{}%
}
\newcommand\esami@item[2]{%%% #1=the list #2=name of the input item
  \edef\es@Lista{\zap@space#1 \@empty}%
    \@for\shuf@ch:=\es@Lista\do{%
    \shuf@ifch{}{#2}{\shuf@ch}%
}
}
\newcommand{\sh@chex}[2]{%%% #1=the list #2=name of the input item
\setcounter{shuf@lop}{0}%
\renewcommand{\theshuf@lop}{\roman{shuf@lop}}%
\esami@item{#1}{#2}%
\renewcommand{\theshuf@lop}{\arabic{shuf@lop}}%
}

%%% the command \es@randestrai choices in the list #2 leaving out #1 elements. #3=name input file, #4=name output file, #5=total number of file
\newcommand{\es@randestrai}[5][0]{\sh@max=#1\sh@chex{#2}{#3}\rand@getitems{#5}{#4}[#3]}%
\newcommand{\randes@trai}[3][0]{%%% it extracts objects from the list #2 leaving out #1 elements. The objects will be named #3i, #3ii, ecc.
\es@randestrai[#1]{#2}{tmp@in}{#3}{\theshuf@lop}
}
%%% \randestrai is the user command to randomly extract objects from the list #2 leaving out #1 elements.
%%% \randestraialfa extracts #1 random objects from the list #2 preserving order and naming them #3i,#3ii, ecc.

\ifes@param%%% for parametric version
\newcommand{\randestrai}[3][0]{
\randes@trai[#1]{#2}{tmp@out}
 \tmp@cntb=\value{shuf@lop}
  \advance\tmp@cntb by -#1
  \loop
   \expandafter\edef\csname #3\romannumeral\tmp@cntb\endcsname{#3\romannumeral\tmp@cntb}%
    \advance\tmp@cntb by-1
    \ifnum\tmp@cntb>0
   \repeat
\immediate\write\params{\es@EstraiMessage{#2}{#3}}%%% writes to a file
                 \immediate\closeout\params
}
\newcommand{\estraialfa}[3]{%
\beg@al=#1
\loop
\expandafter\edef\csname #3\romannumeral\beg@al \endcsname{(#3\romannumeral\beg@al)}
\advance\beg@al by-1
\ifnum\beg@al>0
\repeat
\immediate\write\params{\es@EstraiMessage{#2}{#3}}%%% writes to a file
}
\else
\newcommand{\randestrai}[3][0]{
\randes@trai[#1]{#2}{tmp@out}
 \tmp@cntb=\value{shuf@lop}
  \advance\tmp@cntb by -#1
  \loop
   \expandafter\edef\csname #3\romannumeral\tmp@cntb\endcsname{\csname tmp@out\romannumeral\tmp@cntb\endcsname}%
    \advance\tmp@cntb by-1
    \ifnum\tmp@cntb>0
   \repeat
    }%
 \newcommand{\estraialfa}[3]{\sh@chex{#2}{al@f}%
\end@al=\value{shuf@lop}%
\beg@al=#1%
\loop%
\advance\beg@al by-1%
\FPsetpar{tmpalf}{\beg@al}{\end@al}[\beg@al]%
\advance\beg@al by1 %
\expandafter\edef\csname #3\romannumeral\beg@al \endcsname{\csname al@f\romannumeral\tmpalf \endcsname}
\ifes@fillin%
\ifes@solutions
\immediate\write\parametri{\string\def\expandafter\unexpanded\expandafter{\csname #3\romannumeral\beg@al\endcsname}{\csname al@f\romannumeral\tmpalf \endcsname}}%
\fi%
\fi
%
\advance\beg@al by-1%
\end@al=\tmpalf%
\advance\end@al by-1%
\ifnum\beg@al>0%
\repeat%
}
\fi

%%% the command \es@estrai choices in list #2 leaving out #1 elements. #3=name input file, #4=name output file, #5=counter name
\newcommand{\es@estrai}[5][0]{\sh@max=#1\sh@chex{#2}{#3}\@getitems{#3}{#5}{#4}}

\newcommand{\es@trai}[3][0]{%%% it extracts objects from the list #2 leaving out #1 elements. The objects will be named #3i, #3ii, ecc.
\es@estrai[#1]{#2}{tmp@in}{#3}{\theshuf@lop}
}
%%% \estrai is the user command to extract objects from the list #2 leaving out #1 elements.
%%% \estraialfa extracts #1 random objects from the list #2 preserving order and naming them #3i,#3ii, ecc.

\ifes@param%%% for parametric version
\newcommand{\estrai}[3][0]{
\es@trai[#1]{#2}{tmp@out}
 \tmp@cntb=\value{shuf@lop}
  \advance\tmp@cntb by -#1
  \loop
   \expandafter\edef\csname #3\romannumeral\tmp@cntb\endcsname{#3\romannumeral\tmp@cntb}%
    \advance\tmp@cntb by-1
    \ifnum\tmp@cntb>0
   \repeat
\immediate\write\params{\es@EstraiMessage{#2}{#3}}%%% writes to a file
                 \immediate\closeout\params
}
\else
\newcommand{\estrai}[3][0]{
\es@trai[#1]{#2}{tmp@out}
 \tmp@cntb=\value{shuf@lop}
  \advance\tmp@cntb by -#1
  \loop
   \expandafter\edef\csname #3\romannumeral\tmp@cntb\endcsname{\csname tmp@out\romannumeral\tmp@cntb\endcsname}%
   \ifes@fillin%
\ifes@solutions
\immediate\write\parametri{\string\def\expandafter\unexpanded\expandafter{\csname #3\romannumeral\tmp@cntb\endcsname}{\csname tmp@out\romannumeral\tmp@cntb\endcsname}}%
\fi%
\fi
    \advance\tmp@cntb by-1
    \ifnum\tmp@cntb>0
   \repeat
    }%
\fi

%%% \esestrai is the user command to  extract exercises  from the list #2 leaving out #1 elements.

\newcommand{\estraies}[2][0]{\es@trai[#1]{#2}{tmp@out}
  \tmp@cnt=\value{shuf@lop}
  \advance\tmp@cnt by -#1
  \loop
    \selectrandomly{\cartella/\csname tmp@out\romannumeral\tmp@cnt\endcsname}
    \advance\tmp@cnt by-1
    \ifnum\tmp@cnt>0
    \repeat}%
%%% New user command to (randomly) extract  exercises  from the list #2 leaving out #1 elements.  NEW 2015.09.14
\newcommand{\randestraies}[2][0]{\randes@trai[#1]{#2}{tmp@out}
  \tmp@cnt=\value{shuf@lop}
  \advance\tmp@cnt by -#1
  \loop
    \selectrandomly{\cartella/\csname tmp@out\romannumeral\tmp@cnt\endcsname}
    \advance\tmp@cnt by-1
    \ifnum\tmp@cnt>0
    \repeat}%

%%% \esercizi is the command that selects and shuffles the exercises from the list #1

\newcommand{\esercizi}[1]{\sh@max=0\sh@chex{#1}{exe}\sh@mixex}

\newcommandx{\rand@getitems}[3][3=item]{%%% randomly shuffles #1  elements named #2i, #2ii, ecc. and renames them #3i, #3ii, ecc.
  \i@sh=#1
  \loop%
    \expandafter\let \csname flag\number\i@sh\endcsname a%
    \advance\i@sh by-1%
    \ifnum\i@sh > 0 \repeat%
  \i@sh=#1
  \loop%
    \setrannum{\j@sh}{1}{#1}%
    \expandafter\ifx \csname flag\number\j@sh\endcsname a%
      \expandafter\let \csname flag\number\j@sh\endcsname b
      \FPeval\n@tmp{round(#1-\number\i@sh+1:0)}%
     \expandafter\edef\csname #2\romannumeral\n@tmp\endcsname{\csname #3\romannumeral\j@sh\endcsname}%
                   \advance\i@sh by-1%
    \fi%
    \ifnum\i@sh>0 \repeat
}
\ifes@fissa%%% with n<8 exercises the shuffle is pseudorandom and it's random otherwise
\def\@getitems#1#2#3{
\ifcase#2\or\prendii{\csname #1i\endcsname}{#3}%
\or\prendiii{\csname #1i\endcsname}{\csname #1ii\endcsname}{#3}%
\or\prendiiii{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{#3}%
\or\prendiiv{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{\csname #1iv\endcsname}{#3}%
\or\prendiv{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{\csname #1iv\endcsname}{\csname #1v\endcsname}{#3}%
\or\prendivi{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{\csname #1iv\endcsname}{\csname #1v\endcsname}{\csname #1vi\endcsname}{#3}%
\or\prendivii{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{\csname #1iv\endcsname}{\csname #1v\endcsname}{\csname #1vi\endcsname}{\csname #1vii\endcsname}{#3}%
\or\prendiviii{\csname #1i\endcsname}{\csname #1ii\endcsname}{\csname #1iii\endcsname}{\csname #1iv\endcsname}{\csname #1v\endcsname}{\csname #1vi\endcsname}{\csname #1vii\endcsname}{\csname #1viii\endcsname}{#3}%
\else
\old@randomii=\number\randomi
\nextrandom
\rand@getitems{#2}{#3}[#1]%
\randomi\number\old@randomii
\fi%
}%
\else
\def\@getitems#1#2#3{%%% random shuffle
\rand@getitems{#2}{#3}[#1]%
}
\fi
\def\cartella{\currfiledir}
\ifthenelse{\equal{\cartella}{}}{\def\cartella{.}}{}
\ifes@shuffleQuestions
\newcommand{\sh@mixex}{%%% shuffled exercises
\@getitems{exe}{\theshuf@lop}{file}%
  \tmp@cnt=\value{shuf@lop}
  \loop
    \selectrandomly{\cartella/\csname file\romannumeral\tmp@cnt\endcsname}
    \advance\tmp@cnt by-1
    \ifnum\tmp@cnt>0
    \repeat
}%
\else
\newcommand{\sh@mixex}{%%% the exercises are not shuffled
  \tmp@cnt=1%
  \loop%
    \selectrandomly{\cartella/\csname exe\romannumeral\tmp@cnt\endcsname}
        \ifnum\tmp@cnt<\value{shuf@lop}
\advance\tmp@cnt by1
    \repeat
}
\fi


%%% another shuffling macro  %%% NEW 2017/02/16 for different seeds  shuffling exercises and choosing them
	
\newcommand{\shuffle}[3][]{% %%% this command has been adapted from probsoln
		\old@rando=\number\randomi
		\randomi=\semeex
  \@shfctr=1\relax
  \whiledo{\@shfctr < 101}%
  {%
    \setrannum{\@shfA}{1}{#3}\setrannum{\@shfB}{1}{#3}
    \ifnum\@shfA=\@shfB
    \else
      \edef\@@tmpA{\csname#2\romannumeral\@shfA\endcsname}%
      \let\@tmpA=\@@tmpA
      \edef\@@tmpB{\csname#2\romannumeral\@shfB\endcsname}%
      \let\@tmpB=\@@tmpB
      \expandafter\xdef\csname#2\romannumeral\@shfA\endcsname{\@tmpB}%
      \expandafter\xdef\csname#2\romannumeral\@shfB\endcsname{\@tmpA}%
    \fi
    \advance\@shfctr by 1\relax
    \ifthenelse{\equal{#1}{}}{}{
  \@shfA=0%
  \loop
  \advance\@shfA by1
  \expandafter\xdef\csname#1\romannumeral\@shfA\endcsname{\csname#2\romannumeral\@shfA\endcsname}
  \ifnum\@shfA<#3 \repeat
}
  }%
	\randomi=\number\old@rando
}

		\newcommand{\shufflees}[3][]{% %%% this command has been adapted from probsoln %%% NEW 2017/02/16 for different seeds  shuffling exercises and choosing them
		%\old@rando=\number\randomi
		%  \randomi=404
		  \@shfctr=1\relax
		  \whiledo{\@shfctr < 101}%
		  {%
			\setrannum{\@shfA}{1}{#3}\setrannum{\@shfB}{1}{#3}
			\ifnum\@shfA=\@shfB
			\else
			  \edef\@@tmpA{\csname#2\romannumeral\@shfA\endcsname}%
			  \let\@tmpA=\@@tmpA
			  \edef\@@tmpB{\csname#2\romannumeral\@shfB\endcsname}%
			  \let\@tmpB=\@@tmpB
			  \expandafter\xdef\csname#2\romannumeral\@shfA\endcsname{\@tmpB}%
			  \expandafter\xdef\csname#2\romannumeral\@shfB\endcsname{\@tmpA}%
			\fi
			\advance\@shfctr by 1\relax
			\ifthenelse{\equal{#1}{}}{}{
		  \@shfA=0%
		  \loop
		  \advance\@shfA by1
		  \expandafter\xdef\csname#1\romannumeral\@shfA\endcsname{\csname#2\romannumeral\@shfA\endcsname}
		  \ifnum\@shfA<#3 \repeat
		}
		  }%
		%\randomi=\number\old@rando
		}


%========================================================%
%     Random (adapted from aebrandom)                    %
%========================================================%

\ifes@randomizeChoices
\def\@ansChoices[#1]%
{%
    \ifes@randomizeChoices
        \setkeys{bchoice}{#1,random=true}%
    \else
        \setkeys{bchoice}{#1}%
    \fi
    \global\es@tabColCnt=0
    \ifes@randomizeChoices\expandafter\@@bChoices
    \else\expandafter\@@ansChoices\fi
}
\def\@@ansChoices{%
    \ifnum\aeb@numCols=1% % list mode
        \def\es@next{\@layoutListAns}%
    \else% % tabular mode
        \edef\es@next{\noexpand\@layoutTabularAns{\bChoiceNumCols}}%
    \fi
    \es@next
}
\newtoks\aeb@hold\aeb@hold={}
\def\@@bChoices{\gdef\@temphold{}\gdef\@tempholdrandom{}%
    \gdef\@tempholdfreeze{}\aeb@searchfortoken{\@getAns}%
}
\def\aeb@searchfortoken#1{%
    \@ifnextchar\Ans{\advance\aeb@numChoices1\relax#1}
        {\@ifnextchar\eFreeze{\expandafter\@getFreezeAns\@gobble}
        {\@ifnextchar\par{\def\@@temp{\aeb@searchfortoken{#1}}%
        \expandafter\@@temp\@gobble}{\@eChoices}}}%
}
\long\def\@getAns\Ans#1\eAns{%
    \g@addto@macro\@temphold{{\Ans#1\eAns}}%
    \aeb@searchfortoken{\@getAns}%
}
\def\@getFreezeAns{\aeb@searchfortoken{\@@getFreezeAns}}
\long\def\@@getFreezeAns\Ans#1\eAns{%
    \g@addto@macro\@tempholdfreeze{\Ans#1\eAns}%
    \aeb@searchfortoken{\@@getFreezeAns}%
}
\long\def\@eChoices#1\eChoices{%
    \aeb@randomizeChoices{\the\aeb@numChoices}%
}
\def\aeb@randomizeChoices#1{%
    \setrannum{\aeb@ranChoice}{1}{#1}
    \count0=0 \aeb@hold=\expandafter{\@temphold}\def\@temphold{}%
    \expandafter\@tfor\expandafter
        \@temp\expandafter:\expandafter=\the\aeb@hold \do {%
        \advance\count0by1
        \ifnum\count0=\aeb@ranChoice
            \aeb@hold=\expandafter\expandafter\expandafter
                {\expandafter\@tempholdrandom\@temp}%
            \edef\@tempholdrandom{\the\aeb@hold}%
        \else
            \aeb@hold=\expandafter\expandafter\expandafter
                {\expandafter\@temphold\expandafter{\@temp}}%
            \edef\@temphold{\the\aeb@hold}%
        \fi
    }%
    \aeb@numChoices=#1
    \advance\aeb@numChoices-1
    \ifnum\aeb@numChoices=0\relax\def\@next{\aeb@finishedRandomizing}\else
    \def\@next{\aeb@randomizeChoices{\the\aeb@numChoices}}\fi
    \@next
}
\def\aeb@finishedRandomizing{%
    \aeb@hold=\expandafter\expandafter\expandafter
        {\expandafter\@tempholdrandom\@tempholdfreeze}%
    \gdef\@temphold{}\gdef\@tempholdrandom{}\gdef\@tempholdfreeze{}%
    \edef\finished@Randomizing{%
    \noexpand\@@ansChoices
    \the\aeb@hold
    \noexpand\eChoices}%
    \finished@Randomizing
}
\fi
\endinput
