From 454c8a41568d515d1ce23a66b7916749c7efc6fa Mon Sep 17 00:00:00 2001 From: Stefan Huber Date: Mon, 24 Oct 2022 08:37:09 +0200 Subject: [PATCH] exsheet2: Add initial version --- README.markdown | 136 +++++++++++++++++++ exsheet2-demo-aufgabenblatt.tex | 33 +++++ exsheet2-demo-klausur-en.tex | 90 +++++++++++++ exsheet2-demo-klausur.tex | 87 ++++++++++++ exsheet2.cls | 225 ++++++++++++++++++++++++++++++++ 5 files changed, 571 insertions(+) create mode 100644 README.markdown create mode 100644 exsheet2-demo-aufgabenblatt.tex create mode 100644 exsheet2-demo-klausur-en.tex create mode 100644 exsheet2-demo-klausur.tex create mode 100644 exsheet2.cls diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..d0be65c --- /dev/null +++ b/README.markdown @@ -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 index 0000000..161de01 --- /dev/null +++ b/exsheet2-demo-aufgabenblatt.tex @@ -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 index 0000000..eba9461 --- /dev/null +++ b/exsheet2-demo-klausur-en.tex @@ -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 index 0000000..6b60d1b --- /dev/null +++ b/exsheet2-demo-klausur.tex @@ -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 index 0000000..c9a5826 --- /dev/null +++ b/exsheet2.cls @@ -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} +} + -- 2.30.2