.packageName <- "ProfessR"
`Get.testbank` <-
function(fn)
  {

    ALLQ = scan(file=fn, what="", sep="\n")

    q1 = grep("QUESTION:", ALLQ)


    Qbank = list()

    for(i in 1:length(q1))
      {
        i1 = q1[i]
	if(i<length(q1))
          { i2 = q1[i+1]-1 }	else { i2 = length(ALLQ)	}

        
        ## print(paste(sep=" ", "#####", i, i1, i2))
        ## print(ALLQ[i1:i2])
        
        quest = substring(ALLQ[i1], 11, nchar(ALLQ[i1]))


        ans1 = ALLQ[(i1+1):i2]
        grfig = grep("FIG:", ans1)
        if(length(grfig)>=1)
          {
            fig1 = ans1[grfig]
            ufig = unlist(strsplit(fig1, split=" "))
            
            figname = ufig[2]
            figtag = ufig[3]
            fignewt = list(fn=figname, tag =figtag) 
            ans1 = ans1[-grfig]
            
          }
        else
          {
            fignewt = NULL
          }
        
        a1 = grep("ANSWER:", ans1)
        fa1 = ans1[a1]
        a2 = substring(fa1, 9, nchar(fa1))
        ans1[a1] = a2

        Qbank[[i]] = list(Q=quest, A=ans1, a=fa1, numANS=a1, FIG=fignewt)

      }

    return(Qbank)



  }

`LETGRADE` <-
function(g)
  {

    lett = rep("I", length=length(g))
    
    SCRS = seq(from=100, by=(-4), length=13)
    LETS = c("A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-", "E", "E")
    SCRS[1] = 100.1
    SCRS[length(SCRS)+1]  = 0

    for(i in 2:length(SCRS))
      {
        lett[g>=SCRS[i] & g<SCRS[i-1] ] = LETS[i]

      }
    

    return(lett)

  }

`do.grades` <-
function(ggrades, divs=NULL, cut=0, tit="Exam Grades")
{
  if(missing(divs)) { divs=NULL }
  if(missing(cut)) { cut=NULL }
  if(missing(tit)) { tit = "Exam Grades" }


  if(!is.null(cut))
    {
      agrades = ggrades[ggrades>cut]

    }
  else
    {

      agrades = ggrades

    }
  
  BIGN = length(ggrades)
  
  HA = hist(agrades, breaks=BIGN/3, main=tit, xlab="Scores")
  m = mean(agrades)
  s = sqrt(var(agrades))

  B = boxplot(agrades,  plot = FALSE)
  Bdivs = c(min(agrades), B$stats[1:4] + diff(B$stats)/2, max(agrades) )

  abline(v=c( m-2*s,m-s, m,  m+s, m+2*s), lty=2, col=rgb(1, .7, .7) )
  mtext(text="mean", side=3, at=m, line=0)

  abline(v=Bdivs, lty=2, col=rgb(.1, .7, .7) )
  
  u = par("usr")
###	print(u)
if(is.null(divs))
{	
  text( c(20, (m-2*s+m-s)/2,(m-s+ m)/2, (m+m+s)/2, (m+s+m+2*s)/2 ), rep(u[4], 5),
       labels=c("E", "D", "C", "B", "A"), pos=1 , col=rgb(1, .7, .7)  )
}
  box()
  if(is.null(divs))
    {
      mtext(text="Click 4 divisions from LOW to HIGH", side=3, at = u[1], line=2, adj=0)
      K = locator(type='p', col=4, n=4)
      abline(v=K$x, col=4)
      divs = c(min(ggrades), K$x, max(ggrades))
    }

abline(v=divs[2:(length(divs)-1)], col=rgb(0,0,1) )	

ddivs = diff(divs)
xgrad = divs[1:(length(divs)-1)] + ddivs/2


	xmin = HA$breaks[1]+(divs[2]-HA$breaks[1])/2
     	xgrad[1]= xmin
	text(xgrad , rep(u[4], 5), labels=c("E", "D", "C", "B", "A"), pos=1   )

  

 
 ##### print(divs) 
  divs = sort(divs)

 cat("Grade divisions:", sep="\n")
  cat(divs, sep="\n")

#####  divisions are determined, now allocate grades.
###  this can be run independent of the divs determination

KAPPA = getlet(ggrades, divs)	
###ggrades, lett=letts, scor=scores, divs=divs, LETS=LETS, SCRS=SCRS
LETS = KAPPA$LETS
letts = KAPPA$lett
scores = KAPPA$scor	
SCRS = KAPPA$SCRS
 cat("Letter Grade Distribution:", sep="\n")
  for(i in 1:length(LETS))
    {
      cat(paste(sep=' ', i, LETS[i], length(letts[letts==LETS[i]])), sep="\n")
    }

 cat("Numeric Grade Distribution:", sep="\n")
  for(i in 1:length(SCRS))
    {
       cat(paste(sep=' ', i, SCRS[i], length(scores[scores==SCRS[i]])), sep="\n")
    }
  print(paste(sep=' ', "Mean Score=",mean(scores)))


  return(list(grades=ggrades, lett=letts, scor=scores, divs=divs, LETS=LETS, SCRS=SCRS, hist=HA))
}

`getlet` <-
function(ggrades, divs)
{
M = length(divs)
  N = M
  AP =  ggrades>=divs[N]-(divs[N]-divs[N-1])/3
  A =   ggrades>= (divs[N]-2*(divs[N]-divs[N-1])/3)& ggrades<divs[N]-(divs[N]-divs[N-1])/3
  AM =   ggrades>= (divs[N-1])& ggrades<divs[N]-2*(divs[N]-divs[N-1])/3

  N = M-1
  BP =  ggrades>=divs[N]-(divs[N]-divs[N-1])/3 & ggrades<divs[N]
  B =   ggrades>= (divs[N]-2*(divs[N]-divs[N-1])/3) & ggrades<divs[N]-(divs[N]-divs[N-1])/3
  BM =   ggrades>= (divs[N-1])& ggrades<divs[N]-2*(divs[N]-divs[N-1])/3

  N = M-2
  CP =  ggrades>=divs[N]-(divs[N]-divs[N-1])/3 & ggrades<divs[N]
  C =   ggrades>= (divs[N]-2*(divs[N]-divs[N-1])/3)& ggrades<divs[N]-(divs[N]-divs[N-1])/3
  CM =   ggrades>= (divs[N-1])& ggrades<divs[N]-2*(divs[N]-divs[N-1])/3

  N = M-3
  DP =  ggrades>=divs[N]-(divs[N]-divs[N-1])/3 & ggrades<divs[N]
  D =   ggrades>= (divs[N]-2*(divs[N]-divs[N-1])/3)& ggrades<divs[N]-(divs[N]-divs[N-1])/3
  DM =   ggrades>= (divs[N-1])& ggrades<divs[N]-2*(divs[N]-divs[N-1])/3

  N = M-4
  E = ggrades>=divs[N-1]&ggrades<divs[N]

  letts = rep("E", length(ggrades))
  scores  = rep(0, length(ggrades))

  SCRS = seq(from=100, by=(-4), length=13)
  LETS = c("A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-", "E")

  scores[AP] = SCRS[1]
  scores[A] = SCRS[2]
  scores[AM] = SCRS[3]

  scores[BP] = SCRS[4]
  scores[B] = SCRS[5]
  scores[BM] = SCRS[6]

  scores[CP] = SCRS[7]
  scores[C] = SCRS[8]
  scores[CM] = SCRS[9]

  scores[DP] = SCRS[10]
  scores[D] = SCRS[11]
  scores[DM] = SCRS[12]

 scores[E] = SCRS[13]-SCRS[13]*(divs[2]-ggrades[E])/divs[2]
  
  letts[AP] = LETS[1]
  letts[A] = LETS[2]
  letts[AM] = LETS[3]

  letts[BP] = LETS[4]
  letts[B] = LETS[5]
  letts[BM] = LETS[6]

  letts[CP] = LETS[7]
  letts[C] = LETS[8]
  letts[CM] = LETS[9]

  letts[DP] = LETS[10]
  letts[D] = LETS[11]
  letts[DM] = LETS[12]

  letts[E] = LETS[13]

 
 return(list(grades=ggrades, lett=letts, scor=scores, divs=divs, LETS=LETS, SCRS=SCRS))
}

`jist` <-
function(h, Z, L, col=2)
  {
    if(missing(col)) { col = 1 }
    ###  h = histogram structure
    ###  Z = scores
    #### L = letter grades or labels

    J = rep(1, length(Z))

    Kounts = c(0, h$counts)
    
    for(i in 1:length(Kounts))
      {
        if(Kounts[i]==0) next
        x1 = h$breaks[i]
        x2 = h$breaks[i+1]
        w = which(Z>=x1&Z<x2)
        k = Kounts[i]

        v = seq(1, length(w))
        J[w] = v
        
      }
    i = length(Kounts)
    x2 = h$breaks[i]
    w = which(Z>=x2)
    if(length(w)>0)
      {
        v = seq(1, length(w))
        J[w] = v
      }
    
    text(Z, J, labels=L, col=col, xpd=TRUE, cex=.8, font=2)
    invisible(J)
  }

`make.exam` <-
function(Qbank, ofile="examq.tex")
{
  if(missing(ofile)) { ofile = "examq.tex" }
 
  ansfile = paste(sep=".", ofile, "ANS")
  system(paste(sep=" ", "rm", ofile))
  system(paste(sep=" ", "rm", ansfile))

  for(i in 1:length(Qbank))
    {
      z = Qbank[[i]]
      A1 = substring(z$A, 3, 10000)
      A2 = paste("\\item {", A1, "}")

      THEQ = paste(z$Q)

      cat(file=ofile, "\\item {", sep="\n", append = TRUE)
      ## cat(file=ofile, "\\begin{minipage}{1\\linewidth}", sep="\n", append = TRUE)

       cat(file=ofile, "\\setlength{\\itemsep}{0cm}", sep="\n", append = TRUE)
     cat(file=ofile, "\\setlength{\\parskip}{.2cm}", sep="\n", append = TRUE)
   
      cat(file=ofile, "\\begin{samepage}", sep="\n", append = TRUE)

      ###########   questions are in Bold Font
      cat(file=ofile,  "\\textbf{", sep="\n", append = TRUE)
      cat(file=ofile,  z$Q , sep="\n", append = TRUE)
      cat(file=ofile,  "}", sep="\n", append = TRUE)
      cat(file=ofile, "\\begin{enumerate}", sep="\n", append = TRUE)
        cat(file=ofile, A2 , sep="\n", append = TRUE)

      cat(file=ofile, "\\end{enumerate}", sep="\n", append = TRUE)


      if(!is.null(z$FIG))
         {
           cat(file=ofile, "\\begin{figure}[htp]", sep="\n", append = TRUE)
           cat(file=ofile, "\\centering", sep="\n", append = TRUE)
           ofig = paste(sep="", "\\includegraphics[width=0.85\\textwidth]{", z$FIG$fn, "}")
           cat(file=ofile, ofig, sep="\n", append = TRUE)
           labfig = paste(sep="", "\\caption{}\\label{",z$FIG$tag ,"}")
           cat(file=ofile,labfig, sep="\n", append = TRUE)
           cat(file=ofile, "\\end{figure}", sep="\n", append = TRUE)
         }
      ##   cat(file=ofile, "}", sep="\n", append = TRUE)
      ##  cat(file=ofile, "\\end{minipage}", sep="\n", append = TRUE)
      cat(file=ofile, "\\end{samepage}", sep="\n", append = TRUE)

      cat(file=ofile, "}", sep="\n", append = TRUE)
      cat(file=ansfile, paste(i, z$a) , sep="\n", append = TRUE)
    }
  
}

`make.solution` <-
function(Qbank, ofile="answers.tex")
{
  if(missing(ofile)) { ofile = "answers.tex" }
 
  ## system(paste(sep=" ", "rm", ofile))
  prep.solution(ofile)
  for(i in 1:length(Qbank))
    {
      z = Qbank[[i]]
      A1 = substring(z$A, 3, 10000)
      A2 = paste("\\item {", A1, "}")

      THEQ = paste(z$Q)

      cat(file=ofile, "\\item {", sep="\n", append = TRUE)
      ## cat(file=ofile, "\\begin{minipage}{1\\linewidth}", sep="\n", append = TRUE)

       cat(file=ofile, "\\setlength{\\itemsep}{0cm}", sep="\n", append = TRUE)
     cat(file=ofile, "\\setlength{\\parskip}{.2cm}", sep="\n", append = TRUE)
   
      cat(file=ofile, "\\begin{samepage}", sep="\n", append = TRUE)

      ###########   questions are in Bold Font
      cat(file=ofile,  "\\textbf{", sep="\n", append = TRUE)
      cat(file=ofile,  z$Q , sep="\n", append = TRUE)
      cat(file=ofile,  "}", sep="\n", append = TRUE)

        cat(file=ofile, z$a , sep="\n", append = TRUE)

      if(!is.null(z$FIG))
         {
           cat(file=ofile, "\\begin{figure}[htp]", sep="\n", append = TRUE)
           cat(file=ofile, "\\centering", sep="\n", append = TRUE)
           ofig = paste(sep="", "\\includegraphics[width=0.3\\textwidth]{", z$FIG$fn, "}")
           cat(file=ofile, ofig, sep="\n", append = TRUE)
           labfig = paste(sep="", "\\caption{}\\label{",z$FIG$tag ,"}")
           cat(file=ofile,labfig, sep="\n", append = TRUE)
           cat(file=ofile, "\\end{figure}", sep="\n", append = TRUE)
         }
      ##   cat(file=ofile, "}", sep="\n", append = TRUE)
      ##  cat(file=ofile, "\\end{minipage}", sep="\n", append = TRUE)
      cat(file=ofile, "\\end{samepage}", sep="\n", append = TRUE)

      cat(file=ofile, "}", sep="\n", append = TRUE)
      
    }

  cat(file=ofile, "\\end{enumerate}", sep="\n", append = TRUE)
  cat(file=ofile, "\\end{document}", sep="\n", append = TRUE)
    


  
  
}


prep.exam<-function(OF, incfile, instructor="", examdate="", course="",  examname="", instructions="")
  {

    if(missing(instructor)) instructor=""
    if(missing(examdate)) examdate=""
    if(missing(course)) course=""
    if(missing(examname)) examname=""
    if(missing(instructions)) instructions=""

    cat(file=OF, "\\documentclass[12pt]{article}", sep="\n", append=FALSE)

    cat(file=OF, "\\usepackage{amsmath} %use  amsmath ", sep="\n", append=TRUE)
    cat(file=OF, "\\usepackage{amssymb} %Some extra symbols", sep="\n", append=TRUE)
    cat(file=OF, "\\usepackage{makeidx} % to generate an index, automatically", sep="\n", append=TRUE)
    cat(file=OF, "\\usepackage{graphicx} % for postscript graphics", sep="\n", append=TRUE)
    cat(file=OF, "%%%  \\usepackage{mystyle} %Create your own file, mystyle.sty ", sep="\n", append=TRUE)
    cat(file=OF, "\\usepackage{amscd}", sep="\n", append=TRUE)

    cat(file=OF, "\\newcommand{\\mydegree}{ \\ensuremath{^\\circ} }", sep="\n", append=TRUE)
    cat(file=OF, "\\newcommand{\\Rivpt}{\\rule{.1pt}{1pt}}", sep="\n", append=TRUE)
    cat(file=OF, "\\clubpenalty10000", sep="\n", append=TRUE)
    cat(file=OF, "\\widowpenalty10000", sep="\n", append=TRUE)
    cat(file=OF, "\\raggedbottom", sep="\n", append=TRUE)
    cat(file=OF, "\\addtolength{\\topskip}{0pt plus 10pt}", sep="\n", append=TRUE)
    cat(file=OF, "\\let\\oldsubsubsection=\\subsubsection", sep="\n", append=TRUE)
    cat(file=OF, "\\renewcommand{\\subsubsection}{%", sep="\n", append=TRUE)
    cat(file=OF, "\\filbreak", sep="\n", append=TRUE)
    cat(file=OF, "\\oldsubsubsection", sep="\n", append=TRUE)
    cat(file=OF, "}", sep="\n", append=TRUE)



    cat(file=OF, "\\def\\instructions{\\begin{center}", sep="\n", append=TRUE)
    cat(file=OF, "{\\bf INTRUCTIONS\\vspace{-.5em}\\vspace{0pt}}\\end{center}}", sep="\n", append=TRUE)
   
    
    cat(file=OF, "\\def\\endinstructions{\\par}", sep="\n", append=TRUE)
    
    cat(file=OF, "\\def\\studentinfo{\\noindent\\hspace*{0pt}{\\bfseries Given name}:\\rule{46mm}{0.6pt}", sep="\n", append=TRUE)
    cat(file=OF, "\\hspace*{2mm}{\\bfseries Family name}:\\rule{43mm}{0.6pt}", sep="\n", append=TRUE)
    cat(file=OF, "\\hspace*{0pt}\\par\\vspace{5mm}\\noindent\\hspace*{0pt}{\\bfseries Student number}:\\rule{45mm}{0.6pt}", sep="\n", append=TRUE)
    cat(file=OF, "\\hspace*{2mm}{\\bfseries Signature}:\\rule{60mm}{0.6pt}\\hspace*{0pt}}", sep="\n", append=TRUE)

    cat(file=OF, "\\newcommand{\\WriteOnTest}{", sep="\n", append=TRUE)
    cat(file=OF, "\\studentinfo", sep="\n", append=TRUE)
    cat(file=OF, "\\vspace*{4mm}}", sep="\n", append=TRUE)

    
 ###   cat(file=OF, "\\textwidth 6.5in", sep="\n", append=TRUE)
  ###  cat(file=OF, "\\textheight 9in", sep="\n", append=TRUE)

############  % Move the % down one line, as above, if necessary
  ###  cat(file=OF, "\\topmargin 0in", sep="\n", append=TRUE)
####%\topmargin .5in



cat(file=OF, "\\setlength\\topmargin{0in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\headheight{0in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\headsep{0in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\textheight{9in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\textwidth{7in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\oddsidemargin{-.3in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\evensidemargin{-.3in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\parindent{0.25in}", sep="\n", append=TRUE)
cat(file=OF, "\\setlength\\parskip{0.25in}", sep="\n", append=TRUE)


    


    cat(file=OF, "\\begin{document}", sep="\n", append=TRUE)

    cat(file=OF, "\\author{", sep="", append=TRUE)
    cat(file=OF, instructor, sep="", append=TRUE)
    if(course!=""){
      cat(file=OF, "\\\\", sep="\n", append=TRUE)
      cat(file=OF, course, sep="", append=TRUE)
    }
    cat(file=OF, "}", sep="\n", append=TRUE)

    tit = paste(sep="", "\\title{", examname, "}")

    cat(file=OF, tit, sep="\n", append=TRUE)

    edate =  paste(sep="", "\\date{", examdate, "}")

    cat(file=OF, edate, sep="\n", append=TRUE)

    cat(file=OF, "\\maketitle", sep="\n", append=TRUE)

    cat(file=OF, "\\WriteOnTest", sep="\n", append=TRUE)

    
    if(length(instructions)>0)
      {

         cat(file=OF, "{\\bfseries", sep="\n", append=TRUE)

        if(instructions[1]!=""){
          cat(file=OF, "\\begin{instructions}", sep="\n", append=TRUE)
          for(i in 1:length(instructions))
            {
              cat(file=OF,instructions[i], sep="\n", append=TRUE)
              
            }
          cat(file=OF, "\\end{instructions}", sep="\n", append=TRUE)
        }

             cat(file=OF, "}", sep="\n", append=TRUE)
      }
    
    cat(file=OF, "\\begin{enumerate}", sep="\n", append=TRUE)
    cat(file=OF, "\\setlength{\\parskip}{1cm}%", sep="\n", append=TRUE)

    zout = paste(sep="", "\\include{", incfile, "}")

    cat(file=OF, zout, sep="\n", append=TRUE)
    cat(file=OF, "\\end{enumerate}", sep="\n", append=TRUE)
    cat(file=OF, "\\end{document}", sep="\n", append=TRUE)


  }
`prep.solution` <-
function(ofile)
  {



    system(paste("rm ", ofile))
    
    cat(file=ofile, "\\documentclass[10pt]{article}", sep="\n", append = TRUE)
    cat(file=ofile, "\\usepackage{amsmath} %Never write a paper without using amsmath for its many new commands", sep="\n", append = TRUE)
    cat(file=ofile, "\\usepackage{amssymb} %Some extra symbols", sep="\n", append = TRUE)
    cat(file=ofile, "\\usepackage{makeidx} %If you want to generate an index, automatically", sep="\n", append = TRUE)
    cat(file=ofile, "\\usepackage{graphicx} %If you want to include postscript graphics", sep="\n", append = TRUE)
    cat(file=ofile, "%%%  \\usepackage{mystyle} %Create your own file, mystyle.sty where you put all your own \\newcommand statements", sep="\n", append = TRUE)
    cat(file=ofile, "\\usepackage{amscd}", sep="\n", append = TRUE)
    ##    cat(file=ofile, "\\usepackage{/home/lees/Class/TESTBANK/UOFTEXAM}", sep="\n", append = TRUE)
    cat(file=ofile, "\\newcommand{\\mydegree}{ \\ensuremath{^\\circ} }", sep="\n", append = TRUE)
    cat(file=ofile, "\\newcommand{\\Rivpt}{\\rule{.1pt}{1pt}}", sep="\n", append = TRUE)
    cat(file=ofile, "\\clubpenalty10000", sep="\n", append = TRUE)
    cat(file=ofile, "\\widowpenalty10000", sep="\n", append = TRUE)
    cat(file=ofile, "\\raggedbottom", sep="\n", append = TRUE)
    cat(file=ofile, "\\addtolength{\\topskip}{0pt plus 10pt}", sep="\n", append = TRUE)

    cat(file=ofile, "\\let\\oldsubsubsection=\\subsubsection", sep="\n", append = TRUE)
    cat(file=ofile, "\\renewcommand{\\subsubsection}{%", sep="\n", append = TRUE)
    cat(file=ofile, "\\filbreak", sep="\n", append = TRUE)
    cat(file=ofile, "\\oldsubsubsection", sep="\n", append = TRUE)
    cat(file=ofile, "}", sep="\n", append = TRUE)

    cat(file=ofile, "\\setlength\\topmargin{0in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\headheight{0in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\headsep{0in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\textheight{9in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\textwidth{7in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\oddsidemargin{-.3in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\evensidemargin{-.3in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\parindent{0.25in}", sep="\n", append = TRUE)
    cat(file=ofile, "\\setlength\\parskip{0.25in}", sep="\n", append = TRUE)

    cat(file=ofile, "\\begin{document}", sep="\n", append = TRUE)
    cat(file=ofile, "\\begin{enumerate}", sep="\n", append = TRUE)



  }

`ran.exam` <-
function(Qbank)
  {
    ran1 = sample(1:length(Qbank) )
    Q1 = list()
    for(i in 1:length(ran1))
      {
        Q1[[i]] = Qbank[[ran1[i]]]
        
      }
    return(Q1)
  }

`rename.answers` <-
function(Qbank, newnames=letters[1:26] , sep=") " )
  {
    if(missing(sep)) { sep = ") " }
    if(missing(newnames)) { newnames=letters[1:26] }
    

  ####   newnames=as.character(1:10)
    
    Q1 = Qbank
  for(i in 1:length(Qbank))
    {
      z = Qbank[[i]]
      A1 = substring(z$A, 3, 10000)
      
      LENA = length(A1)
      lets = paste(sep="", newnames[1:LENA], sep)
      
     #### paste(sep="", lets,  A1)
      pans = paste(sep="", lets,  A1)

      apans =  paste(sep="", "ANSWER: ",  pans[z$numANS])


          
          Q1[[i]]$A = pans
          Q1[[i]]$a = apans
      
    }
    
    return(Q1)
  }

`scramble.answers` <-
function(Qbank)
  {
    Q1 = Qbank
  for(i in 1:length(Qbank))
    {
      z = Qbank[[i]]
      A1 = substring(z$A, 3, 10000)
      A2 = paste("\\item {", A1, "}")

      LENA = length(A1)
      lets = paste(sep="", letters[1:LENA], ") ")
     #### paste(sep="", lets,  A1)

      isamp = sample(1:LENA)


      wans = which(isamp==z$numANS)

      pans = paste(sep="", lets,  A1[isamp])

      apans =  paste(sep="", "ANSWER: ",  pans[wans])


      #########  here must be worried about
      #####  answers that include "all of the above"
      #########   or "none of the above"
      ###   or an answer may refer to choices like a) and b) are correct.


      gexclude = c("all of the above",
        "none of the above",
        'None of these are correct',
        'all of the choices are correct',
        'All of the choices are correct',
        'Both choices are correct',
        'None of the choices are correct',
        'Both of the choices are correct',
        'All of these are correct',
        'Neither of these are correct')

      
      gskip = FALSE
      for(j in 1:length(gexclude))
        {
          gtest =grep(gexclude[j],  z$A, ignore.case =TRUE)
          if(length(gtest)>0)
            {
              gskip = TRUE
              break
            }
        }
  
     

      if(gskip)
        {
          
          Q1[[i]]$A = z$A
          Q1[[i]]$a = z$a
          
          
          
        }
      else
        {
          
####print(pans)
#### print(apans)
          
          Q1[[i]]$A = pans
          Q1[[i]]$a = apans
          
        }
    }
    
    return(Q1)
  }

`show.dist` <-
function(W)
  {

  for(i in 1:length(W$LETS))
    {
      print(paste(sep=' ', i, W$LETS[i], length(W$lett[W$lett==W$LETS[i]])))
    }

print("")
  
  for(i in 1:length(W$SCRS))
    {


      print(paste(sep=' ', i, W$SCRS[i], length(W$scor[W$scor==W$SCRS[i]])))
    }
  print("")
  
  print(paste(sep=' ', "mean=",mean(W$scor)))


  }

`version.exam` <-
function(Qbank, V, exnumber="Exam 1", seqnum="2", examdate='', instructor="", course="", instructions="" )
{
  if(missing(exnumber)) {  exnumber="Exam 1" }
  if(missing(seqnum)) { seqnum="1" }
  if(missing(examdate)) {   examdate=''}
    if(missing(instructor)) instructor=""
   
    if(missing(course)) course=""
    
    if(missing(instructions)) instructions=""

  
  QTEMP = ran.exam(Qbank)
  outtex = paste(sep=".",V, "tex" )
  outMAST  = paste(sep="", V, "MAST" )


  examname=paste(sep=" ", exnumber, "Seq", seqnum)



  
  MASTtex  = paste(sep=".", outMAST , "tex" )


    outsolut  = paste(sep="", V, "solutions.tex" )

  MASTdvi  = paste(sep=".", outMAST , "dvi" )
  MASTps  = paste(sep=".", outMAST , "ps" )
  MASTpdf  = paste(sep=".", outMAST , "pdf" )
  make.exam(QTEMP, ofile=outtex )

  
  make.solution(QTEMP, ofile= outsolut)


  prep.exam(MASTtex, V , instructor=instructor, examdate=examdate, course=course, examname=examname, instructions=instructions)


 
#### OLD:    prep.exam(MASTtex, V, exnumber=exnumber, seqnum=seqnum , examdate=examdate)

####  system(paste(sep=" ", "latex", outMAST ))

####  system(paste(sep=" ", "latex", outMAST ))

  
 
 #### system(paste(sep=" ", "dvips -Ppdf",  MASTdvi , " >" , MASTps ))
  
####  system(paste(sep=" ", "ps2pdf", MASTps,"  >", MASTpdf))

  cat("To get the final output, change directory to current directory.", sep="\n")
  cat("Execute the following system commands outside of R:", sep="\n")
  cat(paste(sep=" ", "latex", outMAST ), sep="\n")
  cat(paste(sep=" ", "latex", outMAST ), sep="\n")
  
 cat(paste(sep=" ", "dvips -Ppdf",  MASTdvi , " >" , MASTps ), sep="\n")
 cat(paste(sep=" ", "ps2pdf", MASTps,"  >", MASTpdf), sep="\n")

  
}

`wrist` <-
function(DB)
  {
    abline(v=DB$divs, col='blue')
    
    ex = (DB$divs[2:(length(DB$divs))] + DB$divs[1:(length(DB$divs)-1)])/2
    u =  par("usr")
    text( ex,  rep(u[4], length(ex)) , labels=c("E", "D", "C", "B", "A"), pos=1 , col=rgb(1, .7, .7)   )
    

  }

