%%% %% 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