exsheet2: Add initial version
authorStefan Huber <shuber@sthu.org>
Mon, 24 Oct 2022 06:37:09 +0000 (08:37 +0200)
committerStefan Huber <stefan.huber@fh-salzburg.ac.at>
Mon, 24 Oct 2022 10:32:52 +0000 (12:32 +0200)
README.markdown [new file with mode: 0644]
exsheet2-demo-aufgabenblatt.tex [new file with mode: 0644]
exsheet2-demo-klausur-en.tex [new file with mode: 0644]
exsheet2-demo-klausur.tex [new file with mode: 0644]
exsheet2.cls [new file with mode: 0644]

diff --git a/README.markdown b/README.markdown
new file mode 100644 (file)
index 0000000..d0be65c
--- /dev/null
@@ -0,0 +1,136 @@
+## Präamble
+
+Die LaTeX Klasse `exsheet2` ist zur Erstellung von Aufgabenblättern und
+Klausuren, also im weitesten Sinne "exercise sheets". Sie geht aus einer
+älteren Version `exsheet` hervor, die bislang nicht publiziert wurde und welche
+ich in den letzten 10 Jahren für diese Anwedungen verwendete.
+
+Viele Entwurfsaspekte von `exsheet2` stammen aus einer Erhebung am Department
+for Information Technologies and Digitalisation an der FH Salzburg.
+
+Ich verwende die Klasse für zwei Kategorien von Anwendungsfällen:
+
+   * Prüfungen, Tests oder Abschlussklausuren
+   * Aufgabenblätter oder Übungsblätter
+
+
+## Installation
+
+Die nachhaltige Lösung ist das Kopieren der Datei `exsheet2.cls` in ein
+[TEXINPUTS](https://www2.ph.ed.ac.uk/~wjh/tex/documents/environmental.pdf)
+Verzeichnis. Die schlechtere Alternativ ist, dass man `exsheet2.cls` lokal in
+jedes Verzeichnis gibt, wo es verwendet wird, d.h. wo die betreffenden LaTeX
+Dokumente liegen.
+
+
+## Allgemeine Features
+
+Es wird eine Umgebung `exercises` zur Verfügung gestellt, um Aufgaben zu
+formulieren. Man kann auch die Antwort mitformulieren und über die Option
+`showanswers` an die Dokumentenklasse diese anzeigen lassen.
+
+```latex
+\begin{exercise}
+  An exercise.
+\end{exercise}
+
+\begin{answer}
+  $\vec{a} = \frac{\vec{F}}{m}$
+\end{answer}
+```
+
+Ein optionales Argument erlaubt es die Punkteanzahl bekanntzugeben. Die
+Umgebung `choices` erlaubt es single- oder multiple-choice Fragen zu
+formulieren:
+
+```latex
+\begin{exercise}[4]  % Frage mit vier Punkten
+  Kreuzen Sie die richtigen Anworten an:
+  \begin{choices}
+    \item $1 + 1 = 0 \pmod 2$
+    \item $1 + 1 = 1 \pmod 2$
+    \item $1 + 1 = 1 \pmod 3$
+    \item $1 + 1 = 5 \pmod 7$
+  \end{choices}
+\end{exercise}
+```
+
+
+Über die Optionen `german`, `ngerman` oder `austrian` wird die Sprache
+entsprechend umgestellt. Die betreffenden Pakete werden geladen.
+
+Über die Option `exam` lassen sich Klausuren erstellen. Sie weitere
+Informationen unten.
+
+Die Optionen `10pt`, `12pt` und `twoside` werden an die Klasse `article`
+weitergeleitet.
+
+Es können über folgende Befehle entsprechend die Daten zur Klausur gesetzt
+werden: `\title`, `\author`, `\date`, `\course`, `\curriculum`, `\semester`,
+`\institute`, `\school`, `\duration`, `\instructions`.
+
+
+## Aufgsabenblätter
+
+Die Klassse `exsheet2` erzeugt ohne weitere Optionen einfache Aufgabenblätter.
+Es werden zwei Sprachen unterstützt und notwendige Packete entsprechend geladen:
+
+* american
+* german, ngerman
+
+Ein Beispiel [exsheet2-demo-aufgabenblatt.tex](exsheet2-demo-aufgabenblatt.tex)
+befindet sich als Demo im Repository. Ein einfaches Beispiel für ein
+Aufgabenblatt mit einer Aufgabe lautet wie folgt:
+
+```latex
+\documentclass[ngerman]{exsheet2}
+
+\usepackage{fontspec}
+
+\title{Aufgabenblatt 7}
+\course{ILV Numerik und Industrielle Algorithmen}
+\curriculum{ITS}
+
+\date{21.10.2022}
+\semester{WS 2022}
+
+\author{Stefan Huber}
+\institute{Department IT}
+\school{FH Salzburg}
+
+\begin{document}
+
+\maketitle
+
+\begin{exercise}
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+\end{document}
+```
+
+
+## Klausuren
+
+Klausuren werden durch die Option `exam` für die Klasse `exsheet2`erzeugt. Das
+führt zu folgendem zusätzlichem Verhalten:
+
+* Für Klausuren wird ein Deckblatt erzeugt.
+* Die Punktesumme der Aufgaben wird am Deckblatt angezeigt.
+* Es wird eine Zufallszahl als
+  [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) generiert, die
+  rechts unten auf den Blättern bedruckt wird. Das ermöglicht die Zuordnung von
+  losen Blättern zu Klausuren und verhindert, dass Blätter von Student·innen
+  vorgeschrieben werden können.
+
+Die Kopfzeile enthält jene Informationen, welche rasch erkennen lassen sollen,
+um welche Klausur es sich handelt. Das ist für Sammelklausuren, wo gleichzeitig
+viele verschiedene Klausuren durchgeführt werden, für die Beaufsichtigung
+wichtig.
+
+Zwei Beispiele befinden sich als Demo im Repository:
+
+* [exsheet2-demo-klausur.tex](exsheet2-demo-klausur-en.tex) ist eine deutsche Klausur
+* [exsheet2-demo-klausur-en.tex](exsheet2-demo-klausur-en.tex) ist eine englische Klausur
diff --git a/exsheet2-demo-aufgabenblatt.tex b/exsheet2-demo-aufgabenblatt.tex
new file mode 100644 (file)
index 0000000..161de01
--- /dev/null
@@ -0,0 +1,33 @@
+% grep begin{exercise} exsheet2-demo-klausur.tex | sed 's/^.*\[\(.*\)\]/\1/' | awk ' { s += $1 } END { print s } '
+\documentclass[ngerman]{exsheet2}
+
+\usepackage{fontspec}
+
+\title{Aufgabenblatt 7}
+\course{ILV Numerik und Industrielle Algorithmen}
+\curriculum{ITS}
+
+\date{21.10.2022}
+\semester{WS 2022}
+
+\author{Stefan Huber}
+\institute{Department IT}
+\school{FH Salzburg}
+
+\begin{document}
+
+\maketitle
+
+\begin{exercise}
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+\begin{exercise}
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+\end{document}
diff --git a/exsheet2-demo-klausur-en.tex b/exsheet2-demo-klausur-en.tex
new file mode 100644 (file)
index 0000000..eba9461
--- /dev/null
@@ -0,0 +1,90 @@
+% grep begin{exercise} exsheet2-demo-klausur-en.tex | sed 's/^.*\[\(.*\)\]/\1/' | awk ' { s += $1 } END { print s } '
+\documentclass[twoside,exam,showanswers]{exsheet2}
+
+\usepackage{fontspec}
+
+
+
+\title{2.\ Final Exam}
+\course{ILV Network-oriented Software Engineering}
+\curriculum{ITS-B, ITSB-B, WIN}
+
+\date{21.10.2022}
+\semester{SS 2022}
+
+\author{Stefan Huber}
+\institute{Department IT}
+\school{FH Salzburg}
+\duration{90 min.}
+
+
+\instructions{%
+\textbf{Permitted aids:}
+A non-programmable calculator is allowed. Beyond that no additional aids are
+permitted. Turn off your mobile phone and stow it. In case of urgent reasons of
+availability contact the exam supervisor.
+
+\medskip
+
+\textbf{Notices:}
+Write readable with a non-erasable pen in blue or black color. If you need
+additional paper, use only the provided, stamped sheets of paper. Keep the
+stapling intact. Put your name and number on all sheets you hand over.
+
+\medskip
+
+Give precise and concise answers.
+
+\bigskip
+
+It is not permitted to copy or distribute, even only partially, without
+explicit, written permit to do so. Making private copies is regulated by
+§\,42\ UrhG.
+
+\begin{center}
+  All the best!
+\end{center}
+
+}
+
+
+
+\begin{document}
+
+\maketitle
+
+
+\begin{exercise}[6]
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+\begin{answer}
+  $\vec{a} = \frac{\vec{F}}{m}$
+\end{answer}
+
+
+\begin{exercise}[4]
+  Kreuzen Sie die richtigen Anworten an:
+  \begin{choices}
+    \item $1 + 1 = 0 \pmod 2$
+    \item $1 + 1 = 1 \pmod 2$
+    \item $1 + 1 = 1 \pmod 3$
+    \item $1 + 1 = 5 \pmod 7$
+  \end{choices}
+\end{exercise}
+
+
+\begin{exercise}[1]
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+
+\newpage\null
+(Some empty page to create some space for student's notes but with exam header.)
+\newpage\null
+
+\end{document}
diff --git a/exsheet2-demo-klausur.tex b/exsheet2-demo-klausur.tex
new file mode 100644 (file)
index 0000000..6b60d1b
--- /dev/null
@@ -0,0 +1,87 @@
+% grep begin{exercise} exsheet2-demo-klausur.tex | sed 's/^.*\[\(.*\)\]/\1/' | awk ' { s += $1 } END { print s } '
+\documentclass[ngerman,twoside,exam,showanswers]{exsheet2}
+
+\usepackage{fontspec}
+
+
+\title{4.\ Klausur (Teil 2)}
+\course{VO Microcontroller}
+\curriculum{ITS-B, ITSB-B}
+
+\date{21.10.2022}
+\semester{SS 2022}
+
+\author{Stefan Huber}
+\institute{Department IT}
+\school{FH Salzburg}
+\duration{90 min.}
+
+
+\instructions{%
+\textbf{Hilfsmittel:}
+Es ist ein nicht-programmierbarer Taschenrechner erlaubt. Darüber hinaus sind
+keine Hilfsmittel gestattet. Mobiltelefon sind auszuschalten und zu verstauen.
+Dringender Erreichbarkeit mit der Klausuraufsicht absprechen.
+
+\medskip
+
+\textbf{Hinweise:}
+Schreiben Sie leserlich mit Kugelschreiber in blau oder schwarz. Als
+Zusatzblätter dürfen ausschließlich ausgegebene abgestempelten Blätter
+verwendet werden. Lösen Sie die Klammer nicht und beschriften Sie alle Blätter,
+die Sie abgeben, mit Namen und Personenkennzeichen.
+
+\medskip
+
+Antworten Sie präzise und nicht überschießend.
+
+\bigskip
+
+Die Vervielfältigung und Verbreitung, auch auszugsweise, ist nur nach
+vorheriger, schriftlicher Zustimmung erlaubt. Die Erstellung von Privatkopien
+unterliegt §\,42\ UrhG.
+
+\begin{center}
+  Alles Gute!
+\end{center}
+
+}
+
+
+
+\begin{document}
+
+\maketitle
+
+
+\begin{exercise}[6]
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+
+\begin{answer}
+  $\vec{a} = \frac{\vec{F}}{m}$
+\end{answer}
+
+
+\begin{exercise}[3]
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+
+\begin{exercise}[1]
+  Welche Beschleunigung $\vec{a}$ erfährt eine träge Masse $m$ im Kraftfeld
+  $\vec{F}$ nach Newton?
+  \vspace{2cm}
+\end{exercise}
+
+
+\newpage\null
+(Some empty page to create some space for student's notes but with exam header.)
+\newpage\null
+
+\end{document}
diff --git a/exsheet2.cls b/exsheet2.cls
new file mode 100644 (file)
index 0000000..c9a5826
--- /dev/null
@@ -0,0 +1,225 @@
+% Stefan Huber, 2022
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{exsheet2}
+
+\DeclareOption{10pt}{\PassOptionsToClass{\CurrentOption}{article}}
+\DeclareOption{12pt}{\PassOptionsToClass{\CurrentOption}{article}}
+\DeclareOption{twoside}{\PassOptionsToClass{\CurrentOption}{article}}
+
+\DeclareOption{german}{\def \exsheetgerman{}}
+\DeclareOption{ngerman}{\def \exsheetgerman{}}
+\DeclareOption{austrian}{\def \exsheetgerman{}}
+\DeclareOption{naustrian}{\def \exsheetgerman{}}
+\DeclareOption{showanswers}{\def \exsheetshowanswers{}}
+\DeclareOption{exam}{\def \exsheetexam{}}
+
+
+\PassOptionsToClass{a4paper}{article}
+\ProcessOptions\relax
+
+
+\LoadClass{article}
+
+\@ifundefined{exsheetgerman}{
+  \usepackage[american]{babel}
+  \usepackage[american]{isodate}
+  \newcommand{\theexercise}{Exercise}
+  \newcommand{\thepoint}{Point}
+  \newcommand{\thepoints}{Points}
+  \newcommand{\thename}{Name}
+  \newcommand{\thestudnumber}{Number}
+  \newcommand{\theanswer}{Answer}
+  \newcommand{\theduration}{Duration}
+  \newcommand{\thegrade}{Grade}
+  \newcommand{\theof}{of}
+}{%
+  \usepackage[ngerman]{babel}
+  \usepackage[german]{isodate}
+  \newcommand{\theexercise}{Aufgabe}
+  \newcommand{\thepoint}{Punkt}
+  \newcommand{\thepoints}{Punkte}
+  \newcommand{\thename}{Name}
+  \newcommand{\thestudnumber}{Personenkennzeichen}
+  \newcommand{\theanswer}{Antwort}
+  \newcommand{\theduration}{Prüfungsdauer}
+  \newcommand{\thegrade}{Note}
+  \newcommand{\theof}{von}
+}
+
+\RequirePackage{xifthen,geometry,fancyhdr,enumitem,comment,amssymb}
+
+\newcounter{exsheet2@pointsum}
+\def\droptotalpoints{unknown}
+\AtBeginDocument{\AtEndDocument{%
+    \immediate\write\@mainaux{%
+      \string\gdef\string\droptotalpoints{\number\value{exsheet2@pointsum}}%
+    }
+}}
+
+\newcounter{exsheet2@excounter}
+\setcounter{exsheet2@excounter}{1}
+\newenvironment{exercise}[1][]{%
+  \vspace*{2em}%
+  \textbf{\theexercise~\arabic{exsheet2@excounter}}
+  \ifthenelse{\isempty{#1}}{}{%
+    \addtocounter{exsheet2@pointsum}{#1}
+    \ifnum#1=1%
+      \hfill[#1 \thepoint]%
+    \else%
+      \hfill[#1 \thepoints]%
+    \fi%
+  }%
+  \newline}
+{\addtocounter{exsheet2@excounter}{1}}
+
+\@ifundefined{exsheetshowanswers}{
+  \excludecomment{answer}
+}{
+  \newenvironment{answer}{\vspace*{0.5em}\textit{\theanswer:} \hspace*{0.5em} }{}
+}
+
+\newenvironment{choices}{%
+  \begin{itemize}[label=$\square$, labelsep=2ex]
+  }{\end{itemize}}
+
+
+\def\@course{}
+\newcommand{\course}[1]{\def\@course{#1}}
+
+\def\@curriculum{}
+\newcommand{\curriculum}[1]{\def\@curriculum{#1}}
+
+\def\@semester{}
+\newcommand{\semester}[1]{\def\@semester{#1}}
+
+\def\@auth{}
+\renewcommand{\author}[1]{\def\@auth{#1}\def\@author{#1}}
+
+\def\@institute{\ }
+\newcommand{\institute}[1]{\def\@institute{#1}}
+
+\def\@school{\ }
+\newcommand{\school}[1]{\def\@school{#1}}
+
+\def\@duration{\ }
+\newcommand{\duration}[1]{\def\@duration{#1}}
+
+\def\@instructions{\ }
+\newcommand{\instructions}[1]{\def\@instructions{#1}}
+
+
+\geometry{a4paper,textwidth=16cm,textheight=23cm}
+
+
+\RequirePackage{lcg}
+\reinitrand[first=10000,last=99999,counter=examnonce,quiet]
+\rand
+
+\fancypagestyle{exsheet}
+{
+  \fancyhf{}%
+  \fancyhead[L]{%
+    \@course\\
+    \@semester
+  }
+  \fancyhead[C]{%
+    {\isodate \today}
+  }
+  \fancyhead[R]{%
+    \@auth\\
+    \@curriculum
+  }
+  \@ifundefined{exsheetexam}{}{%
+    \fancyfoot[R]{%
+      \tiny nounce: \arabic{examnonce}
+    }
+  }
+}
+
+\setlength{\headheight}{2.5em}
+\renewcommand{\headrulewidth}{1pt}
+
+\setlength{\parindent}{0em}
+
+
+\newcommand{\makestudentinfo}{%
+  {
+  \thename: \underline{\hspace{5cm}}
+  \hfill
+  \thestudnumber: \underline{\hspace{4cm}}
+  }
+}
+
+\newcommand{\makegradeinfo}{%
+  {
+  \thegrade: \underline{\hspace{5cm}}
+  \hfill
+  \thepoints: \underline{\hspace{2cm}} \theof\ \droptotalpoints
+  }
+}
+
+
+\let\oldmaketitle\maketitle
+
+
+\@ifundefined{exsheetexam}{
+  \PassOptionsToClass{notitlepage}{article}
+  \renewcommand{\@maketitle}{%
+      \begin{center}
+        \vspace*{1em}
+        {\LARGE \bf \@title}
+        \vspace*{2em}
+      \end{center}
+  }
+}{%
+  \renewcommand{\@maketitle}{%
+    \begin{titlepage}
+      \begin{center}
+        \vspace*{2cm}
+
+        \hrule
+        \vspace*{1cm}
+        {\LARGE \bf \@title}
+
+        \vspace*{1cm}
+        {\large \bf \@course\ (\@semester)}
+
+        \vspace*{1cm}
+        \hrule
+
+        \vspace*{2cm}
+
+        \@auth \\
+
+        \vspace*{1em}
+
+        \today\\
+
+        \vspace*{1em}
+        \@curriculum \\
+        \@institute \\
+        \@school \\
+
+        \vspace*{1cm}
+        \theduration: \@duration
+      \end{center}
+
+      \vspace{4em}
+      \@instructions
+
+      \vfill
+      \makestudentinfo
+
+      \vspace{3em}
+      \makegradeinfo
+    \end{titlepage}
+  }
+}
+
+\renewcommand{\maketitle}{%
+  \oldmaketitle
+  \thispagestyle{exsheet}
+  \pagestyle{exsheet}
+}
+