diff options
Diffstat (limited to 'macros/latex/contrib/stex/source/extensions/hwexam.dtx')
-rw-r--r-- | macros/latex/contrib/stex/source/extensions/hwexam.dtx | 684 |
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 |