% \iffalse meta-comment
% An Infrastructure for marking up Assignments
% $URL: https://svn.kwarc.info/repos/stex-content/sty/assignment/assignment.dtx $
% $Rev: 2871 $; last modified by $Author: kohlhase $
% $Date: 2010-05-29 07:43:20 +0200 (Sat, 29 May 2010) $
% Copyright (c) 2007 Michael Kohlhase, all rights reserved
% this file is released under the
% LaTeX Project Public License (LPPL)
% \fi
%
% \iffalse
%\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%\ProvidesPackage{assignment}[2010/06/25 v0.9a assignment documents]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{url,array,float}
\usepackage[show]{ed}
\usepackage{hyperref}
\usepackage{assignment}
\makeindex
\floatstyle{boxed}
\newfloat{exfig}{thp}{lop}
\floatname{exfig}{Example}
\begin{document}\DocInput{assignment.dtx}\end{document}
%
% \fi
% \changes{v0.9}{2006/09/18}{First Version with Documentation}
%
% \GetFileInfo{assignment.sty}
%
% \MakeShortVerb{\|}
%\def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}}
% \def\latexml{\scsys{LaTeXML}}
%
% \title{An Infrastructure for formatting Assignments\thanks{Version {\fileversion} (last revised
% {\filedate})}}
% \author{Michael Kohlhase\\
% Jacobs University, Bremen\\
% \url{http://kwarc.info/kohlhase}}
% \maketitle
%
% \begin{abstract}
% The |assignment| packge allows individual course assignment sheets and compond
% assignment documents using problem files marked up with the |problem| package.
% \end{abstract}
% \setcounter{tocdepth}{2}\tableofcontents\newpage
%
%\section{Introduction}\label{sec:intro}
%
% The |assignment| package supplies an infrastructure that allows to format nice-looking
% assignment sheets by simply including problems from problem files marked up with the
% |problem| package. It is designed to be compatible with |problems.sty|, and inherits
% some of the functionality.
%
% \section{The User Interface}
%
% \subsection{Assignments}
% \DescribeEnv{assignment} This package supplies the |assignment| environment that groups
% problems into assignment sheets. It takes an optional KeyVal argument with the keys
% \DescribeMacro{number}|number| (for the assignment number; if none is given, 1 is
% assumed as the default or --- in multi-assignment documents --- the ordinal of the
% |assignment| environment), \DescribeMacro{title}|title| (for the assignment title; this
% is referenced in the title of the assignment sheet), \DescribeMacro{type}|type| (for the
% assignment type; e.g. ``quiz'', or ``homework''), \DescribeMacro{given}|given| (for the
% date the assignment was given), and \DescribeMacro{due}|due| (for the date the
% assignment is due).
%
% \DescribeMacro{\CourseTitle} |\Coursetitle{|\meta{title}|}| can be used to specify the
% title of the course. It is usually specified in the driver file.
%
% \DescribeMacro{\AssignmentType} Similarly, |\AssignmentType{|\meta{type}|}| can be used
% to specify the default assignment type.
%
% The |assignment| package takes the options \DescribeMacro{solutions}|solutions|,
% \DescribeMacro{notes}|notes|, \DescribeMacro{hints}|hints|, \DescribeMacro{pts}|pts|,
% \DescribeMacro{min}|min|, and \DescribeMacro{boxed}|boxed| that are just passed on to
% the |problems| package (cf. its documentation for a description of the intended
% behavior).
%
% \subsection{Typesetting Exams}
%
% Furthermore, the |assignment| package takes the option
% \DescribeMacro{multiple}|multiple| that allows to combine multiple assigment sheets into
% a compound document (the assignment sheets are treated as section, there is a table of
% contents, etc.).
%
% Finally, there is the option \DescribeMacro{test}|test| that modifies the behavior to
% facilitate formatting tests. Only in |test| mode, the macros |\testspace|,
% |\testnewpage|, and |\testemptypage| have an effect: they generate space for the
% students to solve the given problems. Thus they can be left in the {\LaTeX} source.
%
% \DescribeMacro{\testspace}|\testspace| takes an argument that expands to a dimension,
% and leaves vertical space accordingly. \DescribeMacro{\testnewpage}|\testnewpage| makes
% a new page in |test| mode, and \DescribeMacro{\testemptypage}|\testemptypage| generates
% an empty page with the cautionary message that this page was intentionally left empty.
%
% Finally, the \DescribeMacro{\testheading}|\testheading| takes a keyword argument where
% the keys |duation| specifies a string that specifies the duration of the test, |min|
% specifies the equivalent in number of minutes, and |reqpts| the points that are required
% for a perfect grade.
% \begin{exfig}[ht]
% \makeatletter
% \@problem{1.1}{4}{10}
% \@problem{2.1}{4}{8}
% \@problem{2.2}{6}{10}
% \@problem{2.3}{6}{10}
% \@problem{3.1}{4}{8}
% \@problem{3.2}{4}{8}
% \@problem{3.3}{2}{4}
% \makeatother
% \begin{verbatim}
% \testheading{duration=one hour,min=60,reqpts=27}
% \end{verbatim}
% \vspace*{-3ex}\hrule\vspace*{.5ex} formats to\vspace*{1ex} \hrule\par\noindent\vspace*{2ex}
% \testheading{duration=one hour,min=60,reqpts=27}
% \caption{A generated test heading.}\label{fig:testheading}
% \end{exfig}
%
% \subsection{Including Assignments}
%
% The \DescribeMacro{\includeassignment}|\includeassignment| macro can be used to include
% an assignment from another file. It takes an optional KeyVal argument and a second
% argument which is a path to the file containing the problem (the macro assumes that
% there is only one |assignment| environment in the included file). The keys
% \DescribeMacro{number}|number|, \DescribeMacro{title}|title|,
% \DescribeMacro{type}|type|,\DescribeMacro{given}|given|, and \DescribeMacro{due}|due|
% are just as for the |assignment| environment and (if given) overwrite the ones specified
% in the |assignment| environment in the included file.
%
% \StopEventually{\newpage\PrintChanges}
% \newpage
%
% \section{The Implementation}
%
% \subsection{Package Options}
%
% The first step is to declare (a few) package options that handle whether certain
% information is printed or not. Some come with their own conditionals that are set by the
% options, the rest is just passed on to the |problems| package.
%
% \begin{macrocode}
%<*package>
\newif\iftest\testfalse
\newif\ifsolutions\solutionsfalse
\DeclareOption{test}{\testtrue\solutionsfalse}
\newif\ifmultiple\multiplefalse
\DeclareOption{multiple}{\multipletrue}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{problem}}
\ProcessOptions
%
% \end{macrocode}
% Then we make sure that the necessary packages are loaded (in the right versions).
% \begin{macrocode}
%<*package>
\RequirePackage{keyval}[1997/11/10]
\RequirePackage{problem}
%
% \end{macrocode}
%
% Here comes the equivalent header information for {\latexml}, we also initialize the
% package inclusions. Since {\latexml} does not handle options yet, we have nothing to
% do.
% \begin{macrocode}
%<*ltxml>
# -*- CPERL -*-
package LaTeXML::Package::Pool;
use strict;
use LaTeXML::Package;
RequirePackage('problem');
%
% \end{macrocode}
%
% Then we register the namespace of the requirements ontology
% \begin{macrocode}
%<*ltxml>
RegisterNamespace('assig'=>"http://omdoc.org/ontology/assignments#");
RegisterDocumentNamespace('assig'=>"http://omdoc.org/ontology/assignments#");
%
% \end{macrocode}
%
% \subsection{Assignments}
%
% We will prepare the keyval support for the |assignment| environment.
%
% \begin{macrocode}
%<*package>
\omdaddkey{assig}{number}
\omdaddkey{assig}{title}
\omdaddkey{assig}{type}
\omdaddkey{assig}{given}
\omdaddkey{assig}{due}
%
% \end{macrocode}
%
% The next macro just sets the internal token register to the intended string.
%
% \begin{macrocode}
%<*package>
\def\AssignmentType#1{\gdef\assig@default@type{#1}}
\def\assig@default@type{Assignment}
%
%<*ltxml>
%
% \end{macrocode}
%
% The next three macros are intermediate functions that handle the case gracefully, where
% the respective token registers are undefined.
%
% \begin{macrocode}
%<*package>
\def\Assig@Type{\ifx\assig@type\@empty\assig@default@type\else\assig@type\fi}
\def\Assig@Title{\ifx\assig@title\@empty\else\assig@title~\fi}
% \end{macrocode}
%
% The |\given@due| macro prints information about the given and due status of the
% assignment. Its arguments specify the brackets.
%
% \begin{macrocode}
\def\given@due#1#2{%
\ifx\assig@given\@empty\else\ifx\assig@due\@empty\else{#1}\fi\fi%
\ifx\assig@given\@empty\else{Given {\assig@given}}\fi%
\ifx\assig@given\@empty\else\ifx\assig@due\@empty\else{, }\fi\fi%
\ifx\assig@due\@empty\else{Due {\assig@due}}\fi%
\ifx\assig@given\@empty\else{\ifx\assig@due\@empty\else{#2}\fi}\fi}
%
% \end{macrocode}
%
% With them, we can define the central |assignment| environment. This has two forms
% (separated by |\ifmultiple|) in one we make a title block for an assignment sheet, and
% in the other we make a section heading and add it to the table of
% contents.
%
% \begin{environment}{assignment}
% \begin{macrocode}
%<*package>
\newenvironment{assignment}[1][]% keyval args
{\omdsetkeys{assig}{#1}% collect the keys and correct them from the outside
\@ifundefined{incl@assig@title}{}{\def\assig@title{\incl@assig@title}}
\@ifundefined{incl@assig@type}{}{\def\assig@type{\incl@assig@type}}
\@ifundefined{incl@assig@num}{}{\def\assig@num{\incl@assig@num}}
\@ifundefined{incl@assig@due}{}{\def\assig@due{\incl@assig@due}}
\@ifundefined{incl@assig@given}{}{\def\assig@given{\incl@assig@given}}
\@ifundefined{assig@num}{\stepcounter{section}}%
{\setcounter{section}{\assig@num}\setcounter{problem}{0}}
\ifmultiple%
\section*{\Assig@Type~\arabic{section}:~\Assig@Title\given@due{\\(})}
\addcontentsline{toc}{section}{\Assig@Type~{\arabic{section}}:~\Assig@Title}
\else
\begin{center}
\Large\Course@Title\\
{\bf{\Assig@Type}~{\arabic{section}}:~\Assig@Title\strut\\\large{\given@due()}}
\end{center}
\fi%ifmultiple
}{}
%
% \end{macrocode}
%
% \begin{macrocode}
%<*ltxml>
DefEnvironment('{assignment} OptionalKeyVals:assig',
""
. ""
. ""
. "Assignment ?&KeyVal(#1,'num')(&KeyVal(#1,'num').)()"
. "?&KeyVal(#1,'title')((&KeyVal(#1,'title')))"
. ""
. "?&KeyVal(#1,'given')(&KeyVal(#1,'given'))()"
. "?&KeyVal(#1,'due')(&KeyVal(#1,'due'))()"
. "?&KeyVal(#1,'pts')(&KeyVal(#1,'pts'))()"
. ""
. "#body"
."\n");
%
% \end{macrocode}
% \end{environment}
%
% \subsection{Including Assignments}
%
% The next command is essentially a glorified |\include| statement, it just sets some
% internal macros first that overwrite the local points,
%
% \begin{macrocode}
%<*package>
\define@key{incl@assig}{number}{\def\incl@assig@num{#1}}
\define@key{incl@assig}{title}{\def\incl@assig@title{#1}}
\define@key{incl@assig}{type}{\def\incl@assig@type{#1}}
\define@key{incl@assig}{given}{\def\incl@assig@given{#1}}
\define@key{incl@assig}{due}{\def\incl@assig@due{#1}}
\newcommand{\includeassignment}[2][]{\bgroup\setkeys{incl@assig}{#1}\include{#2}\egroup}
%
%<*ltxml>
DefMacro('\includeassignment [] {}','\input{#2}');
%
% \end{macrocode}
%
% \begin{macrocode}
%<*package>
\def\CourseTitle#1{\gdef\Course@Title{#1}}
%
%<*ltxml>
DefConstructor('\CourseTitle{}','');
%
% \end{macrocode}
%
% \subsection{Typesetting Exams}
%
% \begin{macrocode}
%<*package>
\omdaddkey{testheading}{min}
\omdaddkey{testheading}{duration}
\omdaddkey{testheading}{reqpts}
\def\testheading#1{\omdsetkeys{testheading}{#1}
{\noindent\large NAME: \\[1ex] MATRICULATION NUMBER:\\[2ex]
{\textbf{You have
\ifx\test@heading@duration\@empty\testheading@min minutes\else\testheading@duration\fi
(sharp) for the test}};\\ Write the solutions to the sheet.}\par\noindent
\newcount\check@time\check@time=\testheading@min
\advance\check@time by -\theassignment@totalmin
The scheduled time for solving this exam is {\theassignment@totalmin} minutes,
leaving you {\the\check@time} minutes for revising your exam.
\newcount\bonus@pts\bonus@pts=\theassignment@totalpts
\advance\bonus@pts by -\testheading@reqpts
You can reach {\theassignment@totalpts} points if you solve all problems. You will only need
{\testheading@reqpts} points for a perfect score, i.e.\ {\the\bonus@pts} points are
bonus points. \vfill
\begin{center}
{\Large\em
% You have ample time, so take it slow and avoid rushing to mistakes!\\[2ex]
Different problems test different skills and knowledge, so do not get stuck on
one problem.}\vfill\par\correction@table
\end{center}\newpage}
%
%<*ltxml>
DefConstructor('\testheading{}','');
%
% \end{macrocode}
%
% \begin{macrocode}
%<*package>
\def\testspace#1{\iftest\vspace*{#1}\fi}
\def\testnewpage{\iftest\newpage\fi}
\def\testemptypage{\iftest\begin{center}This page was intentionally left
blank for extra space\end{center}\vfill\eject\else\fi}
%
%<*ltxml>
DefConstructor('\testspace{}','');
DefConstructor('\testnewpage','');
DefConstructor('\testemptypage','');
%
% \end{macrocode}
%
% \begin{macro}{\@problem}
% This macro acts on a problem's record in the |*.aux| file. Here we redefine it to
% generate the correction table.
% \begin{macrocode}
%<*package>
\def\@problem#1#2#3{\stepcounter{assignment@probs}
\def\@test{#2}\ifx\@test\@empty\else\addtocounter{assignment@totalpts}{#2}\fi
\def\@test{#3}\ifx\@test\@empty\else\addtocounter{assignment@totalmin}{#3}\fi
\xdef\correction@probs{\correction@probs & #1}%
\xdef\correction@pts{\correction@pts & #2}
\xdef\correction@reached{\correction@reached &}}
%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\correction@table}
% This macro generates the correction table
% \begin{macrocode}
%<*package>
\newcounter{assignment@probs}
\newcounter{assignment@totalpts}
\newcounter{assignment@totalmin}
\def\correction@probs{prob.}%
\def\correction@pts{total}%
\def\correction@reached{reached}%
\stepcounter{assignment@probs}
\def\correction@table{\begin{tabular}{|l|*{\theassignment@probs}{c|}|p{3cm}|}\hline%
&\multicolumn{\theassignment@probs}{c||}%
{\footnotesize To be used for grading, do not write here} &\\\hline
\correction@probs & Sum & grade\\\hline
\correction@pts &\theassignment@totalpts & \strut\hspace{3cm}\strut\\\hline
\correction@reached & & \\[.7cm]\hline
\end{tabular}}
%
% \end{macrocode}
% \end{macro}
%
% \subsection{Leftovers}
%
% at some point, we may want to reactivate the logos font, then we use
% \begin{verbatim}
% here we define the logos that characterize the assignment
% \font\bierfont=../assignments/bierglas
% \font\denkerfont=../assignments/denker
% \font\uhrfont=../assignments/uhr
% \font\warnschildfont=../assignments/achtung
%
% \def\bierglas{{\bierfont\char65}}
% \def\denker{{\denkerfont\char65}}
% \def\uhr{{\uhrfont\char65}}
% \def\warnschild{{\warnschildfont\char 65}}
% \def\hardA{\warnschild}
% \def\longA{\uhr}
% \def\thinkA{\denker}
% \def\discussA{\bierglas}
% \end{verbatim}
%
% Finally, we need to terminate the file with a success mark for perl.
% \begin{macrocode}
%1;
% \end{macrocode}
% \Finale
\endinput
% \iffalse
% LocalWords: GPL structuresharing STR
%%% Local Variables:
%%% mode: doctex
%%% TeX-master: t
%%% End:
% \fi