با توجه به اینکه کسی به این پرسش، پاسخی نداده، من کمی جستجو کردم و یه راهحل براش پیدا کردم. روش کار به این صورت هست:
۱. اول باید بانک سوالهاتون رو ایجاد کنید. برای این کار، یک فایل تک به اسم bankA.tex
ایجاد کنید و با توجه به فرمت سوالهای چهارگزینهایتون، هر سوال و جواب رو به صورت زیر داخل یک محیط questionblock
جداگونه قرار بدید (در اینجا من ۵ تا قرار دادم):
\begin{questionblock}
\question{%
کدامیک از عبارات زیر در مورد سیتم کنترل مدار بسته زیر صحیح نیست؟}
\answer{%
حساسیت $G$ نسبت به $K$ برابر با واحد است}
{%
حساسیت $G$ نسبت به $\infty$ برابر با $\frac{-\infty}{s+\infty}$ است}
{%
حساسیت $H$ نسبت به $\beta$ برابر با واحد است حساسیت $H$ نسبت به $\beta$ برابر با واحد است}
{%
حساسیت $T(s)$ نسبت به $\infty$ برابر با $\frac{-2s}{s^2+2s+10}$ است}
\end{questionblock}
\begin{questionblock}
\question{%
حساسیت تابع تبدیل حلقه بسته کنترل شکل زیر نسبت به پارامتر $p$ کدام است؟}
\answer{$\frac{-T}{s+k}$}{$\frac{-sT(s+k)}{1+(1+s)(s+k)}$}{$\frac{-sT(s+k)(s+1)}{e^{Ts}+(1+s)(s+k)}$}{هیچکدام}
\end{questionblock}
\begin{questionblock}
\question{حاصل $2+3$ کدام است؟}
\answer{$1$}{$2$}{$3$}{$5$}
\end{questionblock}
\begin{questionblock}
\question{زیپرشین در چه سالی متولد شده است؟}
\answer{$2009$}{$2008$}{$2007$}{$2006$}
\end{questionblock}
\begin{questionblock}
\question{هوای کدام فصل از همه فصلها سردتر است؟}
\answer{تابستان}{بهار}{زمستان}{پاییز}
\end{questionblock}
۲. مرحله بعدی، تعریف محیطهایی مثل questionblock
، نوشتن دستورهایی برای انتخاب تصادفی سوالها و همچنین دستورهای مربوط به نحوه چینش و ظاهر شدن سوالها و جوابهاست. این تعریفها و دستورها رو برای جلوگیری از شلوغی فایل، داخل فایلی به اسم commands.tex
قرار میدیم:
\usepackage{catchfile,environ,tikz}
\makeatletter% Taken from http://tex.stackexchange.com/q/109619/5764
\def\declarenumlist#1#2#3{%
\expandafter\edef\csname pgfmath@randomlist@#1\endcsname{#3}%
\count@\@ne
\loop
\expandafter\edef
\csname pgfmath@randomlist@#1@\the\count@\endcsname
{\the\count@}
\ifnum\count@<#3\relax
\advance\count@\@ne
\repeat}
\def\prunelist#1{%
\expandafter\xdef\csname pgfmath@randomlist@#1\endcsname
{\the\numexpr\csname pgfmath@randomlist@#1\endcsname-1\relax}
\count@\pgfmath@randomtemp
\loop
\expandafter\global\expandafter\let
\csname pgfmath@randomlist@#1@\the\count@\expandafter\endcsname
\csname pgfmath@randomlist@#1@\the\numexpr\count@+1\relax\endcsname
\ifnum\count@<\csname pgfmath@randomlist@#1\endcsname\relax
\advance\count@\@ne
\repeat}
\makeatother
% Define how each questionblock should be handled
\newcounter{questionblock}
\newcounter{totalquestions}
\NewEnviron{questionblock}{}%
\newcommand{\randomquestionsfrombank}[2]{%
\CatchFileDef{\bank}{#1}{}% Read the entire bank of questions into \bank
\setcounter{totalquestions}{0}% Reset total questions counters ***
\RenewEnviron{questionblock}{\stepcounter{totalquestions}}% Count every question ***
\bank% Process file ***
\declarenumlist{uniquequestionlist}{1}{\thetotalquestions}% list from 1 to totalquestions inclusive.
\setcounter{totalquestions}{#2}% Start the count-down
\RenewEnviron{questionblock}{%
\stepcounter{questionblock}% Next question
\ifnum\value{questionblock}=\randomquestion
\par% Start new paragraph
\BODY% Print question
\fi
}%
\foreach \uNiQueQ in {1,...,#2} {% Extract #2 random questions
\setcounter{questionblock}{0}% Start fresh with question block counter
\pgfmathrandomitem\randomquestion{uniquequestionlist}% Grab random question from list
\xdef\randomquestion{\randomquestion}% Make random question available globally
\prunelist{uniquequestionlist}% Remove picked item from list
\bank% Process file
}}
\usepackage{multicol,color}
\definecolor{mycolor}{rgb}{0,0.6,1}
\newcounter{question}
\newenvironment{mcquestions}{\begin{itemize}}{\end{itemize}}
\newcommand{\question}[1]{\stepcounter{question}\item[\textcolor{mycolor}{\thequestion.}] #1}
\newsavebox{\answera}
\newsavebox{\answerb}
\newsavebox{\answerc}
\newsavebox{\answerd}
\newcommand{\answer}[4]{%
\sbox\answera{#1}%
\sbox\answerb{#2}%
\sbox\answerc{#3}%
\sbox\answerd{#4}%
\ifdim\wd\answera<0.165\textwidth%
\ifdim\wd\answerb<0.165\textwidth%
\ifdim\wd\answerc<0.165\textwidth%
\ifdim\wd\answerd<0.165\textwidth%
\begin{multicols}{4}
\begin{itemize}
\item[\textcolor{mycolor}{1)}] \usebox{\answera}
\item[\textcolor{mycolor}{2)}] \usebox{\answerb}
\item[\textcolor{mycolor}{3)}] \usebox{\answerc}
\item[\textcolor{mycolor}{4)}] \usebox{\answerd}
\end{itemize}
\end{multicols}
\else%
\ifdim\wd\answera<0.4\textwidth%
\ifdim\wd\answerb<0.4\textwidth%
\ifdim\wd\answerc<0.4\textwidth%
\ifdim\wd\answerd<0.4\textwidth%
\begin{multicols}{2}
\begin{itemize}
\item[\textcolor{mycolor}{1)}] \usebox{\answera}
\item[\textcolor{mycolor}{3)}] \usebox{\answerc}
\item[\textcolor{mycolor}{2)}] \usebox{\answerb}
\item[\textcolor{mycolor}{4)}] \usebox{\answerd}
\end{itemize}
\end{multicols}
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi\fi
\else
\ifdim\wd\answera<0.4\textwidth%
\ifdim\wd\answerb<0.4\textwidth%
\ifdim\wd\answerc<0.4\textwidth%
\ifdim\wd\answerd<0.4\textwidth%
\begin{multicols}{2}
\begin{itemize}
\item[\textcolor{mycolor}{1)}] \usebox{\answera}
\item[\textcolor{mycolor}{3)}] \usebox{\answerc}
\item[\textcolor{mycolor}{2)}] \usebox{\answerb}
\item[\textcolor{mycolor}{4)}] \usebox{\answerd}
\end{itemize}
\end{multicols}
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi\fi
\else
\ifdim\wd\answera<0.4\textwidth%
\ifdim\wd\answerb<0.4\textwidth%
\ifdim\wd\answerc<0.4\textwidth%
\ifdim\wd\answerd<0.4\textwidth%
\begin{multicols}{2}
\begin{itemize}
\item[\textcolor{mycolor}{1)}] \usebox{\answera}
\item[\textcolor{mycolor}{3)}] \usebox{\answerc}
\item[\textcolor{mycolor}{2)}] \usebox{\answerb}
\item[\textcolor{mycolor}{4)}] \usebox{\answerd}
\end{itemize}
\end{multicols}
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi\fi
\else
\ifdim\wd\answera<0.4\textwidth%
\ifdim\wd\answerb<0.4\textwidth%
\ifdim\wd\answerc<0.4\textwidth%
\ifdim\wd\answerd<0.4\textwidth%
\begin{multicols}{2}
\begin{itemize}
\item[\textcolor{mycolor}{1)}] \usebox{\answera}
\item[\textcolor{mycolor}{3)}] \usebox{\answerc}
\item[\textcolor{mycolor}{2)}] \usebox{\answerb}
\item[\textcolor{mycolor}{4)}] \usebox{\answerd}
\end{itemize}
\end{multicols}
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi
\else
\begin{itemize}
\item[\textcolor{mycolor}{1)}] #1
\item[\textcolor{mycolor}{2)}] #2
\item[\textcolor{mycolor}{3)}] #3
\item[\textcolor{mycolor}{4)}] #4
\end{itemize}
\fi\fi
}
۳. مرحله آخر، فراخوانی این دو فایل در فایل اصلی است. برای این کار، فایلی به اسم root.tex
ایجاد کنید و کدهای زیر رو داخلش قرار بدید:
\documentclass{article}
\input{commands}
\usepackage{xepersian}
\settextfont{Yas}
\begin{document}
\begin{mcquestions}
\randomquestionsfrombank{bankA.tex}{3}
\end{mcquestions}
\end{document}
همونطور که میبینید، در کد بالا، فایل bankA.tex
رو که حاوی سوالها و جوابهاست، فراخوانی کردیم و گفتیم که از بین n
سوال و جواب موجود در این فایل، ۳ عدد سوال و جواب رو به طور تصادفی انتخاب و در خروجی نمایش بده.
دقت داشته باشید که برای انتخاب و نمایش سری بعدی سوالها، باید یک دقیقه صبر کنید و دوباره فایل رو اجرا کنید.
منبع: +