Created
January 1, 2023 15:38
-
-
Save jacintak/2943f10e4f80f27c93f4044b9086a8be to your computer and use it in GitHub Desktop.
[R] TeX templates and R script for generating PDF exam and solution with exams2pdf and package [exams]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\documentclass[10pt,a4paper]{article} | |
%% packages | |
\usepackage[utf8]{inputenc} | |
\usepackage{a4wide,color,verbatim,Sweave,url,xargs,amsmath,booktabs,longtable,eurosym} | |
%% new environments | |
\newenvironment{question}{\item}{} | |
\newenvironment{solution}{\comment}{\endcomment} | |
\newenvironment{answerlist}{\renewcommand{\labelenumii}{(\alph{enumii})}\begin{enumerate}}{\end{enumerate}} | |
%% paragraphs | |
\setlength{\parskip}{0.7ex plus0.1ex minus0.1ex} | |
\setlength{\parindent}{0em} | |
%% compatibility with pandoc | |
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} | |
\setkeys{Gin}{keepaspectratio} | |
%% fonts: Helvetica | |
\usepackage{helvet} | |
\IfFileExists{sfmath.sty}{ | |
\RequirePackage[helvet]{sfmath} | |
}{} | |
\renewcommand{\sfdefault}{phv} | |
\renewcommand{\rmdefault}{phv} | |
\newcommand{\extext}[1]{\phantom{\large #1}} | |
\newcommandx{\exmchoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{% | |
\mbox{(a) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}}% | |
\if #2- \else \mbox{(b) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}} \hspace*{2mm}} \fi% | |
\if #3- \else \mbox{(c) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}} \hspace*{2mm}} \fi% | |
\if #4- \else \mbox{(d) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}} \hspace*{2mm}} \fi% | |
\if #5- \else \mbox{(e) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}} \hspace*{2mm}} \fi% | |
\if #6- \else \mbox{(f) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}} \hspace*{2mm}} \fi% | |
\if #7- \else \mbox{(g) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}} \hspace*{2mm}} \fi% | |
\if #8- \else \mbox{(h) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}} \hspace*{2mm}} \fi% | |
\if #9- \else \mbox{(i) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}} \hspace*{2mm}} \fi% | |
} | |
\newcommandx{\exclozechoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{\setcounter{enumiii}{1}% | |
\mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}\stepcounter{enumiii}}% | |
\if #2- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #3- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #4- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #5- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #6- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #7- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #8- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #9- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}} \hspace*{2mm}} \fi% | |
} | |
\newcommand{\exnum}[9]{% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}}}% | |
\mbox{ \makebox[3mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-2mm} .}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}}}% | |
} | |
\newcommand{\exstring}[1]{% | |
\mbox{\framebox[0.9\textwidth][l]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}}% | |
} | |
%% new commands | |
\makeatletter | |
\newcommand{\ID}[1]{\def\@ID{#1}} | |
\newcommand{\Date}[1]{\def\@Date{#1}} | |
\newcommand{\Class}[1]{\def\@Class{#1}} | |
\ID{00001} | |
\Date{YYYY-MM-DD} | |
\Class{Class Name Here} | |
%% \exinput{header} | |
\newcommand{\myClass}{\@Class} | |
\newcommand{\myID}{\@ID} | |
\newcommand{\myDate}{\@Date} | |
\makeatother | |
%% headings | |
\markboth{\textnormal{\bf \large \myID}}% | |
{\textnormal{\bf \large \myID}} | |
\pagestyle{myheadings} | |
\begin{document} | |
%% title page | |
\thispagestyle{empty} | |
{\sf | |
\textbf{\LARGE{\myClass}} | |
\textbf{\large{\myDate \hfill \myID}} | |
\vspace*{2cm} | |
\begin{tabular}{p{14cm}} | |
\textbf{Name:} \hrulefill \\[1.5cm] | |
\textbf{Student ID:} \hrulefill \\[1.5cm] | |
\textbf{Signature:} \hrulefill \\[1.5cm] | |
\end{tabular} | |
\vspace*{1cm} | |
} | |
\newpage | |
\textbf{Mark answers here} | |
%% \exinput{questionnaire} | |
\newpage | |
\begin{enumerate} | |
%% \exinput{exercises} | |
\end{enumerate} | |
\end{document} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Creating PDF exam | |
# Write questions as Rmd, use latex symbols instead of HTML | |
# get files as list. Could pool questions as well. | |
questions <- as.list(list.files("<location>", pattern = "*.Rmd", full.names = TRUE)) | |
exams::exams2pdf(qs, | |
# list of questions | |
n = 2, | |
# Number of unique copies | |
template = c("template/exam", "template/solution"), | |
# Use template | |
name = c("Blank", "Answer"), | |
# Give names to files | |
dir = "<output directory>", | |
# Location to save files | |
header = list(Date = "2023-01-01", | |
ID = "Class Code", | |
Class = "Class Name") | |
# Exam information | |
) | |
# Modified templates are in folder. Takes Date, ID and class name as inputs | |
# Answer sheet is on new page |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\documentclass[10pt,a4paper]{article} | |
%% packages | |
\usepackage[utf8]{inputenc} | |
\usepackage{a4wide,color,verbatim,Sweave,url,xargs,amsmath,booktabs,longtable,eurosym} | |
%% new environments | |
\newenvironment{question}{\item \textbf{Problem}\newline}{} | |
\newenvironment{solution}{\textbf{Solution}\newline}{} | |
\newenvironment{answerlist}{\renewcommand{\labelenumii}{(\alph{enumii})}\begin{enumerate}}{\end{enumerate}} | |
%% paragraphs | |
\setlength{\parskip}{0.7ex plus0.1ex minus0.1ex} | |
\setlength{\parindent}{0em} | |
%% compatibility with pandoc | |
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} | |
\setkeys{Gin}{keepaspectratio} | |
%% fonts: Helvetica | |
\usepackage{helvet} | |
\IfFileExists{sfmath.sty}{ | |
\RequirePackage[helvet]{sfmath} | |
}{} | |
\renewcommand{\sfdefault}{phv} | |
\renewcommand{\rmdefault}{phv} | |
\newcommand{\extext}[1]{\textbf{\large #1}} | |
\newcommandx{\exmchoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{% | |
\mbox{(a) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}}% | |
\if #2- \else \mbox{(b) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}} \hspace*{2mm}} \fi% | |
\if #3- \else \mbox{(c) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}} \hspace*{2mm}} \fi% | |
\if #4- \else \mbox{(d) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}} \hspace*{2mm}} \fi% | |
\if #5- \else \mbox{(e) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}} \hspace*{2mm}} \fi% | |
\if #6- \else \mbox{(f) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}} \hspace*{2mm}} \fi% | |
\if #7- \else \mbox{(g) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}} \hspace*{2mm}} \fi% | |
\if #8- \else \mbox{(h) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}} \hspace*{2mm}} \fi% | |
\if #9- \else \mbox{(i) \,\, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}} \hspace*{2mm}} \fi% | |
} | |
\newcommandx{\exclozechoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{\setcounter{enumiii}{1}% | |
\mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}\stepcounter{enumiii}}% | |
\if #2- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #3- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #4- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #5- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #6- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #7- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #8- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}} \hspace*{2mm}\stepcounter{enumiii}} \fi% | |
\if #9- \else \mbox{\roman{enumiii}. \, \framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}} \hspace*{2mm}} \fi% | |
} | |
\newcommand{\exnum}[9]{% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#2}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#3}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#4}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#5}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#6}}}% | |
\mbox{ \makebox[3mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-2mm} .}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#7}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#8}}}% | |
\mbox{\framebox[8mm]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#9}}}% | |
} | |
\newcommand{\exstring}[1]{% | |
\mbox{\framebox[0.9\textwidth][l]{\rule[-1mm]{0mm}{5mm} \hspace*{-1.6mm} \extext{#1}} \hspace*{2mm}}% | |
} | |
%% new commands | |
\makeatletter | |
\newcommand{\ID}[1]{\def\@ID{#1}} | |
\newcommand{\Date}[1]{\def\@Date{#1}} | |
\newcommand{\Class}[1]{\def\@Class{#1}} | |
\ID{00001} | |
\Date{YYYY-MM-DD} | |
\Class{Class Name Here} | |
%% \exinput{header} | |
\newcommand{\myClass}{\@Class} | |
\newcommand{\myID}{\@ID} | |
\newcommand{\myDate}{\@Date} | |
\makeatother | |
%% headings | |
\markboth{\textnormal{\bf \large \myID}}% | |
{\textnormal{\bf \large \myID}} | |
\pagestyle{myheadings} | |
\begin{document} | |
%% title page | |
\thispagestyle{empty} | |
{\sf | |
\textbf{\LARGE{\myClass}} | |
\textbf{\large{\myDate \hfill \myID}} | |
\vspace*{2cm} | |
\begin{tabular}{p{14cm}} | |
\textbf{Name:} \hrulefill \\[1.5cm] | |
\textbf{Student ID:} \hrulefill \\[1.5cm] | |
\textbf{Signature:} \hrulefill \\[1.5cm] | |
\end{tabular} | |
\vspace*{1cm} | |
} | |
\newpage | |
\textbf{Mark answers here} | |
%% \exinput{questionnaire} | |
\newpage | |
\begin{enumerate} | |
%% \exinput{exercises} | |
\end{enumerate} | |
\end{document} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment