summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/stex/source/extensions/hwexam.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/stex/source/extensions/hwexam.dtx')
-rw-r--r--macros/latex/contrib/stex/source/extensions/hwexam.dtx684
1 files changed, 684 insertions, 0 deletions
diff --git a/macros/latex/contrib/stex/source/extensions/hwexam.dtx b/macros/latex/contrib/stex/source/extensions/hwexam.dtx
new file mode 100644
index 0000000000..3136f488d7
--- /dev/null
+++ b/macros/latex/contrib/stex/source/extensions/hwexam.dtx
@@ -0,0 +1,684 @@
+% \iffalse meta-comment
+% An Infrastructure for marking up Assignments
+% Copyright (c) 2019 Michael Kohlhase, all rights reserved
+% this file is released under the
+% LaTeX Project Public License (LPPL)
+% The original of this file is in the public repository at
+% http://github.com/sLaTeX/sTeX/
+% \fi
+%
+% \iffalse
+%
+%<*driver>
+\def\bibfolder{../../lib/bib}
+\input{../../doc/docheader}
+
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%\iffalse\CheckSum{464}\fi
+%
+% ^^A\changes{v0.9}{2006/09/18}{First Version with Documentation}
+%
+% \GetFileInfo{hwexam.sty}
+%
+% \MakeShortVerb{\|}
+% \def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}}
+% \def\latexml{\scsys{LaTeXML}}
+%
+% \title{\texttt{hwexam.sty/cls}: An Infrastructure for formatting Assignments
+% and Exams\thanks{Version {\fileversion} (last revised {\filedate})}}
+% \author{Michael Kohlhase\\
+% FAU Erlangen-N\"urnberg\\
+% \url{http://kwarc.info/kohlhase}}
+% \maketitle
+%
+%\ifinfulldoc\else
+% This is the documentation for the \pkg{hwexam} package.
+% For a more high-level introduction,
+% see \href{\basedocurl/manual.pdf}{the \sTeX Manual} or the
+% \href{\basedocurl/stex.pdf}{full \sTeX documentation}.
+%
+% \input{../../doc/packages/hwexam}
+% \fi
+%
+% \begin{documentation}
+%
+% The |hwexam| package and class allows individual course assignment sheets and
+% compound assignment documents using problem files marked up with the |problem| package.
+% \setcounter{tocdepth}{2}\tableofcontents\newpage
+%
+%\section{Introduction}\label{sec:intro}
+%
+% The |hwexam| package and class supplies an infrastructure that allows to format
+% nice-looking assignment sheets by simply including problems from problem files marked up
+% with the |problem| package~\cite{Kohlhase:problem}. It is designed to be
+% compatible with |problems.sty|, and inherits some of the functionality.
+%
+% \section{The User Interface}
+%
+% \subsection{Package and Class Options}\label{sec:user:options}
+%
+% The |hwexam| package and class take the options |solutions|, |notes|, |hints|, |gnotes|,
+% |pts|, |min|, and |boxed| that are just passed on to the |problems| package (cf. its
+% documentation for a description of the intended behavior).
+%
+% If the \DescribeMacro{showmeta}|showmeta| option is set, then the metadata keys are
+% shown (see~\cite{Kohlhase:metakeys} for details and customization options).
+%
+% The |hwexam| class additionally accepts the options |report|, |book|, |chapter|, |part|,
+% and |showignores|, of the |omdoc| package~\cite{Kohlhase:smomdl} on which it is
+% based and passes them on to that. For the |extrefs| option
+% see~\cite{Kohlhase:sref}.
+%
+% \subsection{Assignments}
+%
+% This package supplies the \DescribeEnv{assignment}|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).
+%
+% \subsection{Typesetting Exams}
+%
+% Furthermore, the |hwexam| package takes the option
+% \DescribeMacro{multiple}|multiple| that allows to combine multiple assignment 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 \DescribeEnv{testheading}|\testheading| takes an optional keyword argument
+% where the keys \DescribeMacro{duration}|duration| specifies a string that specifies the
+% duration of the test, \DescribeMacro{min}|min| specifies the equivalent in number of
+% minutes, and \DescribeMacro{reqpts}|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}
+% \title{320101 General Computer Science (Fall 2010)}
+% \begin{testheading}[duration=one hour,min=60,reqpts=27]
+% Good luck to all students!
+% \end{testheading}
+% \end{verbatim}
+% \vspace*{-3ex}\hrule\vspace*{.5ex} formats to\vspace*{1ex}
+% \hrule\par\noindent\vspace*{2ex}
+% \title{320101 General Computer Science (Fall 2010)}
+% \begin{testheading}[duration=one hour,min=60,reqpts=27]
+% good luck
+% \end{testheading}
+% \caption{A generated test heading.}\label{fig:testheading}
+% \end{exfig}
+%
+% \subsection{Including Assignments}
+%
+% The \DescribeMacro{\inputassignment}|\inputassignment| macro can be used to input
+% 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.
+%
+% \section{Limitations}\label{sec:limitations}
+%
+% In this section we document known limitations. If you want to help alleviate them,
+% please feel free to contact the package author. Some of them are currently discussed in
+% the \sTeX GitHub repository~\cite{sTeX:github:on}.
+% \begin{enumerate}
+% \item none reported yet.
+% \end{enumerate}
+%
+% \end{documentation}
+%
+%\begin{implementation}
+% \section{Implementation: The hwexam Class}\label{sec:impl:cls}
+%
+% The functionality is spread over the |hwexam| class and package. The class provides
+% the |document| environment and pre-loads some convenience packages, whereas the package
+% provides the concrete functionality.
+%
+% \subsection{Class Options}\label{sec:impl:cls:options}
+%
+% To initialize the |hwexam| class, we declare and process the necessary options by
+% passing them to the respective packages and classes they come from.
+%
+% \begin{macrocode}
+%<@@=hwexam>
+%<*cls>
+\ProvidesExplClass{hwexam}{2022/02/24}{3.0.0}{homework assignments and exams}
+\RequirePackage{l3keys2e}
+\DeclareOption*{
+ \PassOptionsToClass{\CurrentOption}{document-structure}
+ \PassOptionsToPackage{\CurrentOption}{stex}
+ \PassOptionsToPackage{\CurrentOption}{hwexam}
+ \PassOptionsToPackage{\CurrentOption}{tikzinput}
+}
+\ProcessOptions
+% \end{macrocode}
+%
+% We load |omdoc.cls|, and the desired packages. For the {\latexml} bindings, we make
+% sure the right packages are loaded.
+%
+% \begin{macrocode}
+\LoadClass{document-structure}
+\RequirePackage{stex}
+\RequirePackage{hwexam}
+\RequirePackage{tikzinput}
+\RequirePackage{graphicx}
+\RequirePackage{a4wide}
+\RequirePackage{amssymb}
+\RequirePackage{amstext}
+\RequirePackage{amsmath}
+% \end{macrocode}
+% Finally, we register another keyword for the |document| environment. We give a default
+% assignment type to prevent errors
+% \begin{macrocode}
+\newcommand\assig@default@type{\hwexam@assignment@kw}
+\def\document@hwexamtype{\assig@default@type}
+%<@@=document_structure>
+\keys_define:nn { document-structure / document }{
+ id .str_set_x:N = \c_document_structure_document_id_str,
+ hwexamtype .tl_set:N = \document@hwexamtype
+}
+%<@@=hwexam>
+%</cls>
+% \end{macrocode}
+%
+% \section{Implementation: The hwexam Package}
+%
+% \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>
+\ProvidesExplPackage{hwexam}{2022/02/24}{3.0.0}{homework assignments and exams}
+\RequirePackage{l3keys2e}
+
+\newif\iftest\testfalse
+\DeclareOption{test}{\testtrue}
+\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}
+\RequirePackage{keyval}[1997/11/10]
+\RequirePackage{problem}
+% \end{macrocode}
+%
+% \begin{macro}{\hwexam@*@kw}
+% For multilinguality, we define internal macros for keywords that can be specialized in
+% |*.ldf| files.
+% \begin{macrocode}
+\newcommand\hwexam@assignment@kw{Assignment}
+\newcommand\hwexam@given@kw{Given}
+\newcommand\hwexam@due@kw{Due}
+\newcommand\hwexam@testemptypage@kw{This~page~was~intentionally~left~
+ blank~for~extra~space}
+ \def\hwexam@minutes@kw{minutes}
+\newcommand\correction@probs@kw{prob.}
+\newcommand\correction@pts@kw{total}
+\newcommand\correction@reached@kw{reached}
+\newcommand\correction@sum@kw{Sum}
+\newcommand\correction@grade@kw{grade}
+\newcommand\correction@forgrading@kw{To~be~used~for~grading,~do~not~write~here}
+% \end{macrocode}
+% \end{macro}
+%
+% For the other languages, we set up triggers
+% \begin{macrocode}
+\AddToHook{begindocument}{
+ \ltx@ifpackageloaded{babel}{
+ \makeatletter
+ \clist_set:Nx \l_tmpa_clist {\bbl@loaded}
+ \clist_if_in:NnT \l_tmpa_clist {ngerman}{
+ \input{hwexam-ngerman.ldf}
+ }
+ \clist_if_in:NnT \l_tmpa_clist {finnish}{
+ \input{hwexam-finnish.ldf}
+ }
+ \clist_if_in:NnT \l_tmpa_clist {french}{
+ \input{hwexam-french.ldf}
+ }
+ \clist_if_in:NnT \l_tmpa_clist {russian}{
+ \input{hwexam-russian.ldf}
+ }
+ \makeatother
+ }{}
+}
+
+% \end{macrocode}
+% \subsection{Assignments}
+%
+% Then we set up a counter for problems and make the problem counter inherited from
+% |problem.sty| depend on it. Furthermore, we specialize the |\prob@label| macro to take
+% the assignment counter into account.
+% \begin{macrocode}
+\newcounter{assignment}
+\numberproblemsin{assignment}
+\renewcommand\prob@label[1]{\assignment@number.#1}
+% \end{macrocode}
+%
+% We will prepare the keyval support for the |assignment| environment.
+%
+% \begin{macrocode}
+\keys_define:nn { hwexam / assignment } {
+ id .str_set_x:N = \l_@@_assign_id_str,
+ number .int_set:N = \l_@@_assign_number_int,
+ title .tl_set:N = \l_@@_assign_title_tl,
+ type .tl_set:N = \l_@@_assign_type_tl,
+ given .tl_set:N = \l_@@_assign_given_tl,
+ due .tl_set:N = \l_@@_assign_due_tl,
+ loadmodules .code:n = {
+ \bool_set_true:N \l_@@_assign_loadmodules_bool
+ }
+}
+\cs_new_protected:Nn \_@@_assignment_args:n {
+ \str_clear:N \l_@@_assign_id_str
+ \int_set:Nn \l_@@_assign_number_int {-1}
+ \tl_clear:N \l_@@_assign_title_tl
+ \tl_clear:N \l_@@_assign_type_tl
+ \tl_clear:N \l_@@_assign_given_tl
+ \tl_clear:N \l_@@_assign_due_tl
+ \bool_set_false:N \l_@@_assign_loadmodules_bool
+ \keys_set:nn { hwexam / assignment }{ #1 }
+}
+% \end{macrocode}
+%
+% The next three macros are intermediate functions that handle the case gracefully, where
+% the respective token registers are undefined.
+%
+% The |\given@due| macro prints information about the given and due status of the
+% assignment. Its arguments specify the brackets.
+%
+% \begin{macrocode}
+\newcommand\given@due[2]{
+ \bool_lazy_all:nF {
+ {\tl_if_empty_p:V \l_@@_inclassign_given_tl}
+ {\tl_if_empty_p:V \l_@@_assign_given_tl}
+ {\tl_if_empty_p:V \l_@@_inclassign_due_tl}
+ {\tl_if_empty_p:V \l_@@_assign_due_tl}
+ }{ #1 }
+
+ \tl_if_empty:NTF \l_@@_inclassign_given_tl {
+ \tl_if_empty:NF \l_@@_assign_given_tl {
+ \hwexam@given@kw\xspace\l_@@_assign_given_tl
+ }
+ }{
+ \hwexam@given@kw\xspace\l_@@_inclassign_given_tl
+ }
+
+ \bool_lazy_or:nnF {
+ \bool_lazy_and_p:nn {
+ \tl_if_empty_p:V \l_@@_inclassign_due_tl
+ }{
+ \tl_if_empty_p:V \l_@@_assign_due_tl
+ }
+ }{
+ \bool_lazy_and_p:nn {
+ \tl_if_empty_p:V \l_@@_inclassign_due_tl
+ }{
+ \tl_if_empty_p:V \l_@@_assign_due_tl
+ }
+ }{ ,~ }
+
+ \tl_if_empty:NTF \l_@@_inclassign_due_tl {
+ \tl_if_empty:NF \l_@@_assign_due_tl {
+ \hwexam@due@kw\xspace \l_@@_assign_due_tl
+ }
+ }{
+ \hwexam@due@kw\xspace \l_@@_inclassign_due_tl
+ }
+
+ \bool_lazy_all:nF {
+ { \tl_if_empty_p:V \l_@@_inclassign_given_tl }
+ { \tl_if_empty_p:V \l_@@_assign_given_tl }
+ { \tl_if_empty_p:V \l_@@_inclassign_due_tl }
+ { \tl_if_empty_p:V \l_@@_assign_due_tl }
+ }{ #2 }
+}
+% \end{macrocode}
+%
+% \begin{macro}{\assignment@title}
+% This macro prints the title of an assignment, the local title is overwritten, if there
+% is one from the |\inputassignment|. |\assignment@title| takes three arguments the
+% first is the fallback when no title is given at all, the second and third go around
+% the title, if one is given.
+% \begin{macrocode}
+\newcommand\assignment@title[3]{
+ \tl_if_empty:NTF \l_@@_inclassign_title_tl {
+ \tl_if_empty:NTF \l_@@_assign_title_tl {
+ #1
+ }{
+ #2\l_@@_assign_title_tl#3
+ }
+ }{
+ #2\l_@@_inclassign_title_tl#3
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\assignment@number}
+% Like |\assignment@title| only for the number, and no around part.
+% \begin{macrocode}
+\newcommand\assignment@number{
+ \int_compare:nNnTF \l_@@_inclassign_number_int = {-1} {
+ \int_compare:nNnTF \l_@@_assign_number_int = {-1} {
+ \arabic{assignment}
+ } {
+ \int_use:N \l_@@_assign_number_int
+ }
+ }{
+ \int_use:N \l_@@_inclassign_number_int
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% 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. We first
+% define an assignment counter
+%
+% \begin{environment}{assignment}
+% For the |assignment| environment we delegate the work to the |@assignment| environment
+% that depends on whether |multiple| option is given.
+% \begin{macrocode}
+\newenvironment{assignment}[1][]{
+ \_@@_assignment_args:n { #1 }
+ %\sref@target
+ \int_compare:nNnTF \l_@@_assign_number_int = {-1} {
+ \global\stepcounter{assignment}
+ }{
+ \global\setcounter{assignment}{\int_use:N\l_@@_assign_number_int}
+ }
+ \setcounter{problem}{0}
+ \def\current@section@level{\document@hwexamtype}
+ %\sref@label@id{\document@hwexamtype \thesection}
+ \begin{@assignment}
+}{
+ \end{@assignment}
+}
+% \end{macrocode}
+% In the multi-assignment case we just use the |omdoc| environment for suitable
+% sectioning.
+% \begin{macrocode}
+\def\ass@title{
+ \protect\document@hwexamtype~\arabic{assignment}
+ \assignment@title{}{\;(}{)\;} -- \given@due{}{}
+}
+\ifmultiple
+ \newenvironment{@assignment}{
+ \bool_if:NTF \l_@@_assign_loadmodules_bool {
+ \begin{sfragment}[loadmodules]{\ass@title}
+ }{
+ \begin{sfragment}{\ass@title}
+ }
+ }{
+ \end{sfragment}
+ }
+% \end{macrocode}
+% for the single-page case we make a title block from the same components.
+% \begin{macrocode}
+\else
+ \newenvironment{@assignment}{
+ \begin{center}\bf
+ \Large\@title\strut\\
+ \document@hwexamtype~\arabic{assignment}\assignment@title{\;}{:\;}{\\}
+ \large\given@due{--\;}{\;--}
+ \end{center}
+ }{}
+\fi% multiple
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Including Assignments}
+%
+% \begin{macro}{\in*assignment}
+% This macro is essentially a glorified |\include| statement, it just sets some internal
+% macros first that overwrite the local points Importantly, it resets the |inclassig|
+% keys after the input.
+% \begin{macrocode}
+\keys_define:nn { hwexam / inclassignment } {
+ %id .str_set_x:N = \l_@@_assign_id_str,
+ number .int_set:N = \l_@@_inclassign_number_int,
+ title .tl_set:N = \l_@@_inclassign_title_tl,
+ type .tl_set:N = \l_@@_inclassign_type_tl,
+ given .tl_set:N = \l_@@_inclassign_given_tl,
+ due .tl_set:N = \l_@@_inclassign_due_tl,
+ mhrepos .str_set_x:N = \l_@@_inclassign_mhrepos_str
+}
+\cs_new_protected:Nn \_@@_inclassignment_args:n {
+ \int_set:Nn \l_@@_inclassign_number_int {-1}
+ \tl_clear:N \l_@@_inclassign_title_tl
+ \tl_clear:N \l_@@_inclassign_type_tl
+ \tl_clear:N \l_@@_inclassign_given_tl
+ \tl_clear:N \l_@@_inclassign_due_tl
+ \str_clear:N \l_@@_inclassign_mhrepos_str
+ \keys_set:nn { hwexam / inclassignment }{ #1 }
+}
+\_@@_inclassignment_args:n {}
+
+\newcommand\inputassignment[2][]{
+ \_@@_inclassignment_args:n { #1 }
+ \str_if_empty:NTF \l_@@_inclassign_mhrepos_str {
+ \input{#2}
+ }{
+ \stex_in_repository:nn{\l_@@_inclassign_mhrepos_str}{
+ \input{\mhpath{\l_@@_inclassign_mhrepos_str}{#2}}
+ }
+ }
+ \_@@_inclassignment_args:n {}
+}
+\newcommand\includeassignment[2][]{
+ \newpage
+ \inputassignment[#1]{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Typesetting Exams}
+%
+% \begin{macro}{\quizheading}
+% \begin{macrocode}
+\ExplSyntaxOff
+\newcommand\quizheading[1]{%
+ \def\@tas{#1}%
+ \large\noindent NAME: \hspace{8cm} MAILBOX:\\[2ex]%
+ \ifx\@tas\@empty\else%
+ \noindent TA:~\@for\@I:=\@tas\do{{\Large$\Box$}\@I\hspace*{1em}}\\[2ex]%
+ \fi%
+}
+\ExplSyntaxOn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\testheading}
+% \begin{macrocode}
+
+\def\hwexamheader{\input{hwexam-default.header}}
+
+\def\hwexamminutes{
+ \tl_if_empty:NTF \testheading@duration {
+ {\testheading@min}~\hwexam@minutes@kw
+ }{
+ \testheading@duration
+ }
+}
+
+\keys_define:nn { hwexam / testheading } {
+ min .tl_set:N = \testheading@min,
+ duration .tl_set:N = \testheading@duration,
+ reqpts .tl_set:N = \testheading@reqpts,
+ tools .tl_set:N = \testheading@tools
+}
+\cs_new_protected:Nn \_@@_testheading_args:n {
+ \tl_clear:N \testheading@min
+ \tl_clear:N \testheading@duration
+ \tl_clear:N \testheading@reqpts
+ \tl_clear:N \testheading@tools
+ \keys_set:nn { hwexam / testheading }{ #1 }
+}
+\newenvironment{testheading}[1][]{
+ \_@@_testheading_args:n{ #1 }
+ \newcount\check@time\check@time=\testheading@min
+ \advance\check@time by -\theassignment@totalmin
+ \newif\if@bonuspoints
+ \tl_if_empty:NTF \testheading@reqpts {
+ \@bonuspointsfalse
+ }{
+ \newcount\bonus@pts
+ \bonus@pts=\theassignment@totalpts
+ \advance\bonus@pts by -\testheading@reqpts
+ \edef\bonus@pts{\the\bonus@pts}
+ \@bonuspointstrue
+ }
+ \edef\check@time{\the\check@time}
+
+ \makeatletter\hwexamheader\makeatother
+}{
+ \newpage
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\testspace}
+% \begin{macrocode}
+\newcommand\testspace[1]{\iftest\vspace*{#1}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\testnewpage}
+% \begin{macrocode}
+\newcommand\testnewpage{\iftest\newpage\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\testemptypage}
+% \begin{macrocode}
+\newcommand\testemptypage[1][]{\iftest\begin{center}\hwexam@testemptypage@kw\end{center}\vfill\eject\else\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@problem}
+% This macro acts on a problem's record in the |*.aux| file. Here we redefine it (it was
+% defined to do nothing in |problem.sty|) to generate the correction table.
+% \begin{macrocode}
+%<@@=problems>
+\renewcommand\@problem[3]{
+ \stepcounter{assignment@probs}
+ \def\@@pts{#2}
+ \ifx\@@pts\@empty\else
+ \addtocounter{assignment@totalpts}{#2}
+ \fi
+ \def\@@min{#3}\ifx\@@min\@empty\else\addtocounter{assignment@totalmin}{#3}\fi
+ \xdef\correction@probs{\correction@probs & #1}%
+ \xdef\correction@pts{\correction@pts & #2}
+ \xdef\correction@reached{\correction@reached &}
+}
+%<@@=hwexam>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\correction@table}
+% This macro generates the correction table
+% \begin{macrocode}
+\newcounter{assignment@probs}
+\newcounter{assignment@totalpts}
+\newcounter{assignment@totalmin}
+\def\correction@probs{\correction@probs@kw}
+\def\correction@pts{\correction@pts@kw}
+\def\correction@reached{\correction@reached@kw}
+\stepcounter{assignment@probs}
+\newcommand\correction@table{
+ \resizebox{\textwidth}{!}{%
+\begin{tabular}{|l|*{\theassignment@probs}{c|}|l|}\hline%
+&\multicolumn{\theassignment@probs}{c||}%|
+{\footnotesize\correction@forgrading@kw} &\\\hline
+\correction@probs & \correction@sum@kw & \correction@grade@kw\\\hline
+\correction@pts &\theassignment@totalpts & \\\hline
+\correction@reached & & \\[.7cm]\hline
+\end{tabular}}}
+%</package>
+% \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
+%
+% \newcommand\bierglas{{\bierfont\char65}}
+% \newcommand\denker{{\denkerfont\char65}}
+% \newcommand\uhr{{\uhrfont\char65}}
+% \newcommand\warnschild{{\warnschildfont\char 65}}
+% \newcommand\hardA{\warnschild}
+% \newcommand\longA{\uhr}
+% \newcommand\thinkA{\denker}
+% \newcommand\discussA{\bierglas}
+% \end{verbatim}
+% \end{implementation}
+\endinput
+% \iffalse
+
+%%% Local Variables:
+%%% mode: doctex
+%%% TeX-master: t
+%%% End:
+% \fi
+% LocalWords: texttt scsys sc latexml fileversion filedate maketitle setcounter newpage
+% LocalWords: tocdepth tableofcontents pts showmeta showmeta showignores omdoc extrefs
+% LocalWords: testspace testnewpage testemptypage testheading testheading reqpts reqpts
+% LocalWords: exfig makeatletter makeatother vspace hrule vspace vspace noindent textsf
+% LocalWords: includeassignment includeassignment HorIacJuc cscpnrr11 importmodule baz
+% LocalWords: includemhassignment includemhassignment importmhmodule foobar ldots sref
+% LocalWords: mhcurrentrepos mh-variants mh-variant compactenum printbibliography Cwd
+% LocalWords: langle rangle langle rangle ltxml.cls ltxml.sty respetively metakeys qw
+% LocalWords: cwd stex graphicx amssymb amstext amsmath newif iftest testfalse testtrue
+% LocalWords: ifsolutions solutionsfalse ifmultiple multiplefalse multipletrue keyval
+% LocalWords: ltxml assig srefaddidkey addmetakey ifx assignment@titleblock stepcounter
+% LocalWords: document@hwexamtype importmodules metasetkeys inclassig@title inclassig
+% LocalWords: inclassig@title inclassig@type inclassig@type inclassig@number xspace kv
+% LocalWords: inclassig@number inclassig@due inclassig@due inclassig@given ignorespaces
+% LocalWords: inclassig@given newenvironment currentsectionlevel OptionalKeyVals kvi
+% LocalWords: omgroup vals hwexamtype ednote textbackslash newcommand inputassignment
+% LocalWords: unlist quizheading tas hspace hfill textbf newcount vfill addtocounter
+% LocalWords: theassignment@totalmin theassignment@totalpts assignment@probs xdef hline
+% LocalWords: assignment@totalpts assignment@totalmin correction@probs correction@probs
+% LocalWords: newcounter theassignment@probs footnotesize mh@currentrepos endinput
+% LocalWords: inclassig@mhrepos inclassig@mhrepos doctex inputmhassignment
+% LocalWords: GPL structuresharing STR iffalse cls NeedsTeXFormat hwexam hwexam.dtx sc