aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exercisesheets-beamer.sty1017
-rw-r--r--exercisesheets.sty30
-rw-r--r--exercisesheets.tex39
3 files changed, 1076 insertions, 10 deletions
diff --git a/exercisesheets-beamer.sty b/exercisesheets-beamer.sty
new file mode 100644
index 0000000..c236166
--- /dev/null
+++ b/exercisesheets-beamer.sty
@@ -0,0 +1,1017 @@
+%% exercisesheets-beamer.sty
+%% Copyright 2008-2020 Sebastian Kuhnert, Frank Fuhlbrück
+%
+% This work may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in https://www.latex-project.org/lppl.txt and
+% version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Sebastian Kuhnert.
+%
+% This work consists of the files listed in README.
+
+
+%\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+
+% don't forget to update the version and date in exercisesheets.tex
+\def\exsh@version{0.7-Beamer}
+\def\exsh@date{2020/10/14}
+
+\ProvidesPackage{exercisesheets-beamer}[\exsh@date\space\exsh@version\space Typesetting of exercise sheets]
+\message{`Typesetting of exercise sheets' \exsh@version\space <\exsh@date>}
+
+% TODO: fix "above hint skip"
+
+
+\RequirePackage{etoolbox}[2008/06/28]
+\RequirePackage{scrlfile}
+
+\RequirePackage{pgfkeys}
+\RequirePackage{keyval}
+\RequirePackage{kvoptions}
+
+\RequirePackage{ifthen}
+\RequirePackage{ifluatex}
+
+\RequirePackage{amsmath}
+
+\RequirePackage{currfile}
+\RequirePackage{catchfile}
+
+% configuration keys
+
+\newif\ifexsh@solutions
+\newif\ifexsh@oralsolutions
+\newif\ifexsh@nonoralsolutions
+\newif\ifexsh@samplesolutions
+\newif\ifexsh@forcesample %force printing sample sol. of wrong type
+\newif\ifexsh@beamersolution
+\newif\ifexsh@gradingguides
+\newif\ifexsh@inplace
+\newif\ifexsh@sample
+\newif\ifexsh@hide%currently only set via sample in exercise env.
+\newif\ifexsh@pointsfloatright
+\newif\ifexsh@bonus
+\newif\ifexsh@abbrev
+
+\pgfkeys{/exsh/.is family,/exsh,
+ solutions/.is choice,
+ solutions/true/.code=\exsh@solutionstrue\exsh@oralsolutionstrue\exsh@nonoralsolutionstrue,
+ solutions/oral/.code=\exsh@solutionstrue\exsh@oralsolutionstrue\exsh@nonoralsolutionsfalse,
+ solutions/nonoral/.code=\exsh@solutionstrue\exsh@oralsolutionsfalse\exsh@nonoralsolutionstrue,
+ solutions/sample nonoral/.code=\exsh@solutionstrue\exsh@oralsolutionsfalse\exsh@nonoralsolutionstrue\exsh@samplesolutionstrue,
+ solutions/sample oral/.code=\exsh@solutionstrue\exsh@oralsolutionstrue\exsh@nonoralsolutionsfalse\exsh@samplesolutionstrue,
+ solutions/sample all/.code=\exsh@solutionstrue\exsh@oralsolutionstrue\exsh@nonoralsolutionstrue\exsh@samplesolutionstrue,
+ solutions/false/.code=\exsh@solutionsfalse\exsh@oralsolutionsfalse\exsh@nonoralsolutionsfalse,
+ solutions/.default=true,
+ forcesample/.is if=exsh@forcesample,
+ forcesample/.default=true,
+ beamersolution/.is if=exsh@beamersolution,
+ beamersolution/.default=true,
+ gradingguides/.is if=exsh@gradingguides,
+ gradingguides/.default=true,
+ only/.initial={-},
+ all/.style={/exsh/only={-}},all/.value forbidden,
+ solutionsby/.code={\def\exsh@solutionsby{#1}},solutionsby/.value required,
+ bonus/.is if=exsh@bonus,
+ bonus/.default=true,
+ inplace/.is if=exsh@inplace,
+ inplace/.default=true,
+ sample/.is if=exsh@sample,
+ sample/.default=true,
+ pointsfloatright/.is if=exsh@pointsfloatright,
+ pointsfloatright/.default=true,
+ abbrev/.is if=exsh@abbrev,
+ abbrev/.default=true,
+}
+
+\providecommand{\@subject}{}
+% store title data for sheet headers
+\ifundef\subject{% \subject is only provided by KOMA classes
+ \newcommand{\subject}[1]{}%
+ \def\@subject{}%
+}{}
+\apptocmd{\subject}{\pgfkeys{/exsh/subject={#1}}}{}{}%
+\ifdefempty{\@subject}{
+ \pgfkeys{exsh,subject/.initial={\PackageWarning{exercisesheets-beamer}{No \string\subject\space given}}}
+}{
+ \pgfkeys{/exsh/subject/.initial/.expand once=\@subject}
+}
+\ifdefstring{\@date}{\today}{
+ \pgfkeys{/exsh/semester/.initial={\PackageWarning{exercisesheets-beamer}{No semester given in \string\date}}}
+}{
+ \pgfkeys{/exsh/semester/.initial/.expand once=\@date}
+}
+\let\@exsh@origdate\date
+\renewcommand{\date}[1]{\@exsh@origdate{#1}\pgfkeys{/exsh/semester={#1}}}
+% this breaks (likely because of detokenization):
+% -> missing \begin{document}
+% \apptocmd{\date}{\pgfkeys{/exsh/semester={#1}}}{}{}
+\pgfkeys{/exsh/author/.code={%
+ \def\exsh@author{#1}%
+ \def\exsh@repeat{1}%
+ \loop\ifnum\exsh@repeat>0
+ \def\exsh@repeat{0}%
+ \patchcmd{\exsh@author}{\and}{, }{\def\exsh@repeat{1}}{}%
+ \repeat
+ },
+ /exsh/author/.expand once=\@author}
+\let\exsh@oldauthor\author
+\def\author#1{\exsh@oldauthor{#1}\pgfkeys{/exsh/author={#1}}}
+
+% helper macro for automatic language selection
+\newif\ifexsh@provideonly
+\def\exsh@deforprovide#1#2{%
+ \ifthenelse{\(\NOT\boolean{exsh@provideonly}\)
+ \OR \equal{}{\pgfkeysvalueof{#1}}}{%
+ \pgfkeys{#1=#2}%
+ }{}%
+}
+
+\pgfkeys{exsh,
+ % additional sheet info
+ title/.initial={},
+ date/.initial={},
+ note/.initial={},
+ exauthor/.initial={\exsh@author},
+ %
+ % additional exercise info
+ name/.initial={},
+ forcesample/.initial={false},
+ beamersolution/.initial={false},
+ firstline/.initial={},
+ points/.initial={},
+ oral/.style={/exsh/points=oral},oral/.value forbidden,
+ inplace/.initial={false},
+ sample/.initial={false},
+ pointsfloatright/.initial={false},
+ bonus/.initial={false},
+ nobonus/.style={/exsh/bonus=false},nobonus/.value forbidden,
+ abbrev/.initial={false},
+ noabbrev/.style={/exsh/abbrev=false},noabbrev/.value forbidden,
+ pointsinfo/.initial={},
+ optional/.style={/exsh/pointsinfo=\ifexsh@abbrev%
+ \pgfkeysvalueof{/exsh/strings/optional abbrev}%
+ \else%
+ \pgfkeysvalueof{/exsh/strings/optional}%
+ \fi},
+ optional/.value forbidden,
+ exercisemark/.initial={},
+ difficult/.style={/exsh/exercisemark=*},difficult/.value forbidden,
+ custom skip macro/.initial=\exsh@skipcustomstuff,
+ %
+ % translatable strings
+ strings/sheet/.initial={},
+ strings/sheets/.initial={},
+ strings/solutions/.initial={},
+ strings/solutionsby/.initial={},
+ strings/gradingguide/.initial={},
+ strings/exercise/.initial={},
+ strings/solution/.initial={},
+ strings/idea/.initial={},
+ strings/hint/.initial={},
+ strings/remark/.initial={},
+ strings/oral/.initial={},
+ strings/oral abbrev/.initial={},
+ strings/point/.initial={},
+ strings/points/.initial={},
+ strings/points abbrev/.initial={},
+ strings/bonus point/.initial={},
+ strings/bonus points/.initial={},
+ strings/bonus points abbrev/.initial={},
+ strings/optional/.initial={},
+ strings/optional abbrev/.initial={},
+ %
+ % languages: predifined string sets
+ language/.is choice,
+ language/german/.code={%
+ \exsh@deforprovide{/exsh/strings/sheet} {\"Ubungsblatt}%
+ \exsh@deforprovide{/exsh/strings/sheets} {\"Ubungsbl\"atter}%
+ \exsh@deforprovide{/exsh/strings/solutions} {L\"osungsvorschl\"age}%
+ \exsh@deforprovide{/exsh/strings/solutionsby} {L\"osungen von}%
+ \exsh@deforprovide{/exsh/strings/gradingguide}{Bepunktung}%
+ \exsh@deforprovide{/exsh/strings/exercise} {Aufgabe}%
+ \exsh@deforprovide{/exsh/strings/solution} {L\"osung}%
+ \exsh@deforprovide{/exsh/strings/idea} {L\"osungsidee}%
+ \exsh@deforprovide{/exsh/strings/hint} {Hinweis}%
+ \exsh@deforprovide{/exsh/strings/remark} {Bemerkung}%
+ \exsh@deforprovide{/exsh/strings/oral} {m\"undlich}%
+ \exsh@deforprovide{/exsh/strings/oral abbrev} {mdl.}%
+ \exsh@deforprovide{/exsh/strings/point} {Punkt}%
+ \exsh@deforprovide{/exsh/strings/points} {Punkte}%
+ \exsh@deforprovide{/exsh/strings/points abbrev}{P.}%
+ \exsh@deforprovide{/exsh/strings/bonus point} {Zusatzpunkt}%
+ \exsh@deforprovide{/exsh/strings/bonus points}{Zusatzpunkte}%
+ \exsh@deforprovide{/exsh/strings/bonus points abbrev}{ZP.}%
+ \exsh@deforprovide{/exsh/strings/optional} {optional}%
+ \exsh@deforprovide{/exsh/strings/optional abbrev} {opt.}%
+ },language/german/.value forbidden,
+ language/ngerman/.style={/exsh/language/german=#1},
+ language/english/.code={%
+ \exsh@deforprovide{/exsh/strings/sheet} {Exercise Sheet}%
+ \exsh@deforprovide{/exsh/strings/sheets} {Exercise Sheets}%
+ \exsh@deforprovide{/exsh/strings/solutions} {Suggested Solutions}%
+ \exsh@deforprovide{/exsh/strings/solutionsby} {Solutions by}%
+ \exsh@deforprovide{/exsh/strings/gradingguide}{Grading guideline}%
+ \exsh@deforprovide{/exsh/strings/exercise} {Exercise}%
+ \exsh@deforprovide{/exsh/strings/solution} {Solution}%
+ \exsh@deforprovide{/exsh/strings/idea} {Idea for solution}%
+ \exsh@deforprovide{/exsh/strings/hint} {Hint}%
+ \exsh@deforprovide{/exsh/strings/remark} {Remark}%
+ \exsh@deforprovide{/exsh/strings/oral} {oral}%
+ \exsh@deforprovide{/exsh/strings/oral abbrev} {oral}%
+ \exsh@deforprovide{/exsh/strings/point} {point}%
+ \exsh@deforprovide{/exsh/strings/points} {points}%
+ \exsh@deforprovide{/exsh/strings/points abbrev}{p.}%
+ \exsh@deforprovide{/exsh/strings/bonus point} {bonus point}%
+ \exsh@deforprovide{/exsh/strings/bonus points}{bonus points}%
+ \exsh@deforprovide{/exsh/strings/bonus points abbrev}{b.p.}%
+ \exsh@deforprovide{/exsh/strings/optional} {optional}%
+ \exsh@deforprovide{/exsh/strings/optional abbrev} {opt.}%
+ },language/english/.value forbidden,
+ language/.unknown/.code={%
+ \PackageWarning{exercisesheets-beamer}{Unknown language \pgfkeyscurrentname.
+ Defaulting to English.}{}%
+ \pgfkeys{/exsh/language=english}%
+ },
+ %
+ % alternate strings
+ idea/.style={/exsh/strings/solution=\pgfkeysvalueof{/exsh/strings/idea}},
+ remark/.style={/exsh/strings/hint=\pgfkeysvalueof{/exsh/strings/remark}},
+ %
+ % hooks
+ every sheet/.code={},
+ every exercise/.code={},
+ every solution/.code={},
+ every hint/.code={},
+ %
+ % font specifications
+ sheet header font/.initial=\normalfont\normalsize,
+ subject font/.initial=\scshape,
+ author font/.initial=\scshape,
+ semester font/.initial={},
+ date font/.initial={},
+ solutionsby font/.initial=\itshape,
+ sheet note font/.initial=\itshape\bfseries,
+ sheet title font/.initial=\Large\bfseries,
+ exercise title font/.initial=\bfseries,
+ points font/.initial=\itshape,
+ hint font/.initial={},
+ hint title font/.initial=\itshape,
+ solution font/.initial={},
+ solution title font/.initial=\bfseries,
+ grading guide font/.initial=\itshape,
+ todo marker font/.initial=\ifdef{\color}{\color{red}}{}\bfseries,
+ %
+ % skip values
+ above sheet title skip/.initial={4ex},
+ above sheet note skip/.initial={.7ex},
+ above solutionsby skip/.initial={1ex},
+ below sheet header skip/.initial={4ex plus 1ex minus .5ex},
+ above exercise skip/.initial={3ex plus 1ex minus .5em},
+ below exercise title skip/.initial={\parskip},
+ above solution skip/.initial={1ex},
+ above hint skip/.initial={1ex},
+ %
+ % page handling
+ sheet start page action/.initial={\clearpage},
+ sheet end page action/.initial={\clearpage},
+ %
+ % conditionals
+ ifsolutions/.code 2 args={\ifsolutions{\pgfkeysalso{#1}}{\pgfkeysalso{#2}}},
+ iforalsolutions/.code 2 args={\iforalsolutions{\pgfkeysalso{#1}}{\pgfkeysalso{#2}}},
+ ifnonoralsolutions/.code 2 args={\ifnonoralsolutions{\pgfkeysalso{#1}}{\pgfkeysalso{#2}}},
+}
+
+% default values
+\pgfkeys{exsh,solutions=false,all}
+
+% process package options
+\@expandtwoargs\pgfqkeys{/exsh}{\csname opt@exercisesheets-beamer.sty\endcsname}
+
+% mark options as processed
+\expandafter\undef\csname opt@exercisesheets-beamer.sty\endcsname
+
+% allow further keys to be set
+\def\exshset#1{\pgfkeys{exsh,#1}}
+
+% automatic language selection
+\AfterEndPreamble{%
+ \exsh@provideonlytrue
+ \ifdef{\bbl@main@language}{%
+ \pgfkeys{/exsh/language=\bbl@main@language}%
+ }{%
+ \pgfkeys{/exsh/language=english}%
+ }%
+ \exsh@provideonlyfalse
+}%
+
+% range checks
+\newif\ifexsh@isinrange
+\newif\ifexsh@singularrange
+\def\exsh@checkrange#1{%
+ \edef\exsh@range@entry{#1}%
+ \def\exsh@range@curstart{}%
+ \exsh@isinrangefalse
+ \exsh@singularrangetrue
+ \pgfkeysgetvalue{/exsh/only}{\exsh@temp}%
+ \ifthenelse{\equal{-}{\exsh@temp}}{%
+ \exsh@isinrangetrue
+ \ifnumequal{\exsh@lastsheet}{1}{%
+ \exsh@singularrangetrue
+ }{%
+ \exsh@singularrangefalse
+ }%
+ }{%
+ \expandafter\exsh@range@parsestart\exsh@temp\exsh@range@end
+ }%
+}
+\def\exsh@range@parsestart#1{%
+ \ifstrequal{#1}{,}{%
+ \exsh@singularrangefalse
+ \ifdefstring{\exsh@range@curstart}{last}{%
+ \let\exsh@range@curstart\exsh@lastsheet
+ }{}%
+ \ifdefequal{\exsh@range@entry}{\exsh@range@curstart}{%
+ \exsh@isinrangetrue
+ }{}%
+ \def\exsh@range@curstart{}%
+ \exsh@range@parsestart
+ }{%
+ \ifstrequal{#1}{\exsh@range@end}{%
+ \ifdefstring{\exsh@range@curstart}{last}{%
+ \let\exsh@range@curstart\exsh@lastsheet
+ }{}%
+ \ifdefequal{\exsh@range@entry}{\exsh@range@curstart}{%
+ \exsh@isinrangetrue
+ }{}%
+ }{%
+ \ifdefequal{#1}{-}{%
+ \exsh@singularrangefalse
+ \ifdefstring{\exsh@range@curstart}{}{%
+ \def\exsh@range@curstart{0}%
+ }{}%
+ \ifdefstring{\exsh@range@curstart}{last}{%
+ \let\exsh@range@curstart\exsh@lastsheet
+ }{}%
+ \def\exsh@range@curend{}%
+ \exsh@range@parseend
+ }{%
+ \appto{\exsh@range@curstart}{#1}%
+ \exsh@range@parsestart
+ }%
+ }%
+ }%
+}
+\def\exsh@range@parseend#1{%
+ \ifstrequal{#1}{,}{%
+ \ifdefstring{\exsh@range@curend}{last}{%
+ \def\exsh@range@curend{10000}%
+ }{}%
+ \ifdefstring{\exsh@range@curend}{}{
+ \def\exsh@range@curend{10000}%
+ }{}%
+ \ifthenelse{\NOT \(\exsh@range@curstart > \exsh@range@entry
+ \OR \exsh@range@entry > \exsh@range@curend\)}{%
+ \exsh@isinrangetrue
+ }{}%
+ \def\exsh@range@curstart{}%
+ \exsh@range@parsestart
+ }{%
+ \ifstrequal{#1}{\exsh@range@end}{%
+ \ifdefstring{\exsh@range@curend}{last}{%
+ \def\exsh@range@curend{10000}%
+ }{}%
+ \ifdefstring{\exsh@range@curend}{}{
+ \def\exsh@range@curend{10000}%
+ }{}%
+ \ifthenelse{\NOT \(\exsh@range@curstart > \exsh@range@entry
+ \OR \exsh@range@entry > \exsh@range@curend\)}{%
+ \exsh@isinrangetrue
+ }{%
+ }%
+ }{%
+ \appto{\exsh@range@curend}{#1}%
+ \exsh@range@parseend
+ }%
+ }%
+}
+
+% remember last sheet (for range checks)
+\def\exsh@lastsheet{0}% to be overridden in aux file
+\AtEndDocument{%
+ \immediate\write\@auxout{\string\gdef\string\exsh@lastsheet{\arabic{part}}}%
+}
+
+\numberwithin{page}{part}
+\renewcommand{\thepage}{\arabic{page}}%changed for every sheet
+\setcounter{secnumdepth}{-1}
+
+\AfterPackage*{hyperref}{%
+ % make PDF destinations unique:
+ \def\theHsection{\arabic{sheetid}.\arabic{section}}%
+ \def\theHpage{\arabic{sheetid}-\arabic{page}}%
+ %
+ % open bookmarks when typesetting a single sheet
+ \AtEndPreamble{%
+ \exsh@checkrange{0}%
+ \ifexsh@singularrange\hypersetup{bookmarksopen}\fi
+ }%
+}
+
+% automatic title selection
+\let\exsh@title\relax
+\let\exsh@title@new\relax
+\def\exsh@write@title#1{%
+ \xdef\exsh@title@new{\expandonce #1}%
+ \protected@write\@auxout{}{\string\gdef\string\exsh@title{\expandonce\exsh@title@new}}%
+}
+\AfterEndDocument{%
+ \ifthenelse{\equal{\exsh@title}{\exsh@title@new}}{}{%
+ \@latex@warning@no@line{Label(s) may have changed.
+ Rerun to get cross-references right}%
+ }%
+}
+\AfterEndPreamble{%
+ \exsh@checkrange{0}%
+ \ifexsh@singularrange\else
+ \pgfkeysgetvalue{/exsh/strings/sheets}{\exsh@tmp}%
+ \exsh@write@title{\exsh@tmp}%
+ \fi
+}
+
+\AtBeginDocument{%
+ \ifexsh@solutions
+ \title{\exsh@title: \pgfkeysvalueof{/exsh/strings/solutions}}%
+ \else
+ \title{\exsh@title}
+ \fi
+}
+\newcounter{sheetid}% only used to disambiguate hyperref labels
+\newenvironment{sheet}[1][]{%
+ \pgfkeys{exsh,every sheet,#1}%
+ \pgfkeysvalueof{/exsh/sheet start page action}%
+ \stepcounter{sheetid}%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/title}}}{%
+ \numdef\exsh@tmp{\value{part}+1}%
+ \edef\exsh@temp{\expandonce{\pgfkeysvalueof{/exsh/strings/sheet}}\noexpand~\exsh@tmp}%
+ \pgfkeys{/exsh/title/.expand once={\exsh@temp}}%
+ \def\thepage{\arabic{part}-\arabic{page}}%
+ }{%
+ \def\thepage{\arabic{page}}%
+ \setcounter{section}{0}%
+ }%
+ \numdef\exsh@tmp{\value{part}+1}%
+ \exsh@checkrange{\exsh@tmp}%
+ \ifexsh@isinrange
+ \ifexsh@singularrange
+ \pgfkeysgetvalue{/exsh/title}{\exsh@temp}%
+ \exsh@write@title{\exsh@temp}%
+ \fi
+ \exsh@sheethead
+ \else
+ \refstepcounter{part}%
+ \def\exsh@skipwhat{sheet}\expandafter\exsh@skipstuff
+ \fi
+}{%
+ \par
+ \begingroup
+ \ifnum\value{page}=1\thispagestyle{empty}\fi
+ \pgfkeysvalueof{/exsh/sheet end page action}%
+ \endgroup
+}
+\listadd{\exsh@enums}{enumerate}
+\listadd{\exsh@enums}{compactenum}
+\listadd{\exsh@enums}{asparaenum}
+\listadd{\exsh@enums}{inparaenum}
+\listadd{\exsh@nonenums}{itemize}
+\listadd{\exsh@nonenums}{compactitem}
+\listadd{\exsh@nonenums}{asparaitem}
+\listadd{\exsh@nonenums}{inparaitem}
+\listadd{\exsh@nonenums}{description}
+\listadd{\exsh@nonenums}{compactdesc}
+\listadd{\exsh@nonenums}{asparadesc}
+\listadd{\exsh@nonenums}{inparadesc}
+\listadd{\exsh@nonenums}{asparablank}
+\listadd{\exsh@nonenums}{inparablank}
+\listadd{\exsh@nonenums}{list}
+\long\def\exsh@skipstuff#1{%
+ \ifstrequal{#1}{\begin}{\exsh@skipstuff@begin}{%
+ \ifstrequal{#1}{\end}{\exsh@skipstuff@end}{%
+ \ifstrequal{#1}{\label}{\exsh@skipstuff@label}{%
+ \ifstrequal{#1}{\input}{\exsh@skipstuff@input}{%
+ \ifstrequal{#1}{\exsh@skipstuff@endfile}{\currfile@pop\exsh@skipstuff}{%
+ \ifstrequal{#1}{\setcounter}{\expandafter\exsh@skipstuff\setcounter}{%
+ \ifstrequal{#1}{\item}{\ifdef{\@enumctr}{%\@hyper@itemtrue%
+ \refstepcounter{\@enumctr}}{}}{}%
+ \pgfkeysvalueof{/exsh/custom skip macro}{#1}}}}}}}%
+}
+\let\exshskipcontinue\exsh@skipstuff
+\long\def\exsh@skipcustomstuff#1{\exshskipcontinue}
+\def\exsh@skipstuff@end#1{%
+ \expandafter\ifstrequal\expandafter{\exsh@skipwhat}{#1}{%
+ \expandafter\end\expandafter{\exsh@skipwhat}%
+ \let\exsh@skipwhat\relax%
+ }{
+ \endgroup\exsh@skipstuff%
+ }%
+}
+\def\exsh@skipstuff@begin#1{%
+ \begingroup
+ \ifstrequal{#1}{exercise}{\refstepcounter{section}%
+ % automatic label for the first exercise in every included file
+ \ifthenelse{\equal{\jobname}{\currfilebase}}{}{%
+ \ifcsdef{exsh@autolabel@\currfilebase}{}{%
+ \csdef{exsh@autolabel@\currfilebase}{}%
+ \label{ex:\currfilebase}}}%
+ }{}%
+ \ifinlist{#1}{\exsh@enums}{%
+ \exsh@skipstuff@beginenum
+ }{%
+ \ifinlist{#1}{\exsh@nonenums}{%
+ \undef\@enumctr
+ }{}%
+ \exsh@skipstuff
+ }%
+}
+\def\exsh@skipstuff@beginenum{%
+ \ifnum\@enumdepth>\thr@@
+ \@toodeep
+ \else
+ \advance\@enumdepth\@ne
+ \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+ \setcounter{\@enumctr}{0}%
+ \fi
+ \@ifundefined{@enumlabel@}{%
+ \exsh@skipstuff
+ }{%
+ \@ifnextchar[{\@enumlabel@{\exsh@skipstuff}[}{\exsh@skipstuff}%
+ }%
+}
+\def\exsh@skipstuff@label#1{%
+ % Locally modify \protected@write to use \immediate\write instead.
+ % This is needed to include labels after the last shipout in the aux file.
+ \begingroup
+ \def\protected@write##1##2##3{%
+ \begingroup
+ \let\protect\@unexpandable@protect
+ \immediate\write##1{##3}%
+ \endgroup
+ }%
+ \label{#1}%
+ \endgroup
+ \exsh@skipstuff
+}
+\def\exsh@skipstuff@input#1{%
+ \CatchFileDef{\exsh@inputfilecontent}{#1}{}%
+ \currfile@push
+ \currfile@set{#1}%
+ \expandafter\exsh@skipstuff\exsh@inputfilecontent\exsh@skipstuff@endfile
+}
+
+\long\def\exsh@sheethead{%
+ \pgfkeysgetvalue{/exsh/title}{\exsh@tmp}%
+ \ifexsh@solutions
+ \expandafter\edef\expandafter\exsh@tmp{\expandonce\exsh@tmp:\noexpand~\pgfkeysvalueof{/exsh/strings/solutions}}%
+ \fi
+ \refstepcounter{part}%
+ \begin{frame}
+ \begin{block}{}
+ \centering\Large\exsh@tmp
+ \end{block}
+ \begingroup
+ \pgfkeysvalueof{/exsh/sheet header font}%
+ \ifexsh@solutions%
+ \ifdefvoid{\exsh@solutionsby}{}{%
+ \begingroup
+ \begin{block}{}
+ \pgfkeysvalueof{/exsh/solutionsby font}%
+ \vskip\pgfkeysvalueof{/exsh/above solutionsby skip}%
+ \relax%
+ \pgfkeysvalueof{/exsh/strings/solutionsby}%
+ ~\exsh@solutionsby\\\unskip%
+ \end{block}%
+ \endgroup
+ }%
+ \else
+ \fi
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/note}}}{%
+ }{%
+ \ifbool{exsh@samplesolutions}{}{%
+ \begingroup
+ \begin{block}{}
+ \pgfkeysvalueof{/exsh/sheet note font}%
+ \vskip\pgfkeysvalueof{/exsh/above sheet note skip}\relax
+ \pgfkeysvalueof{/exsh/note}\\\unskip%
+ \end{block}%
+ \endgroup
+ }%
+ }%
+ \endgroup
+% \stepcounter{page}%
+ \end{frame}
+}
+
+\ifdef{\othersectionslevelsformat}{%
+ \renewcommand{\othersectionlevelsformat}[1]{%
+ \ifstrequal{#1}{section}%
+ {}%
+ {\csname the#1\endcsname\autodot\enskip}}%
+}{}
+
+\newenvironment*{exercise}[1][]{%
+ % TODO: \edef is not safe with luatex and umlauts, only fixed for "oral" for now
+ \pgfkeys{exsh,every exercise,#1}%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/points}}}{%
+ \def\exsh@points{}%
+ \def\exsh@shortpoints{}%
+ }{%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/points}}}{%
+ \edef\exsh@points{\pgfkeysvalueof{/exsh/pointsinfo}}%
+ }{%
+ \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifexsh@abbrev%
+ \pgfkeysgetvalue{/exsh/strings/oral abbrev}{\exsh@points}%
+ \else%
+ \pgfkeysgetvalue{/exsh/strings/oral}{\exsh@points}%
+ \fi%
+ }{%
+ \ifexsh@abbrev%
+ \ifexsh@bonus%
+ \edef\exsh@points{\pgfkeysvalueof{/exsh/points} \pgfkeysvalueof{/exsh/strings/bonus points abbrev}}%
+ \else%
+ \edef\exsh@points{\pgfkeysvalueof{/exsh/points} \pgfkeysvalueof{/exsh/strings/points abbrev}}%
+ \fi%
+ \else%
+ \ifthenelse{\equal{1}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifexsh@bonus%
+ \edef\exsh@points{1 \pgfkeysvalueof{/exsh/strings/bonus point}}%
+ \else%
+ \edef\exsh@points{1 \pgfkeysvalueof{/exsh/strings/point}}%
+ \fi%
+ }{%
+ \ifexsh@bonus%
+ \edef\exsh@points{\pgfkeysvalueof{/exsh/points} \pgfkeysvalueof{/exsh/strings/bonus points}}%
+ \else%
+ \edef\exsh@points{\pgfkeysvalueof{/exsh/points} \pgfkeysvalueof{/exsh/strings/points}}%
+ \fi%
+ }%
+ \fi%
+ }%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/pointsinfo}}}{}{%
+ \edef\exsh@points{\expandonce\exsh@points, \pgfkeysvalueof{/exsh/pointsinfo}}%
+ }%
+ }%
+ \ifthenelse{\equal{}{\exsh@points}}{%
+ \def\exsh@shortpoints{}%
+ }{%
+ \edef\exsh@shortpoints{ (\expandonce\exsh@points)}%
+ }%
+ \preto\exsh@points{\enskip\hfill\bgroup%
+ \pgfkeysvalueof{/exsh/points font}}%
+ \appto\exsh@points{\egroup}%
+ }%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/firstline}}}{%
+ \def\exsh@firstline{}%
+ }{%
+ \def\exsh@firstline{\pgfkeysvalueof{/exsh/firstline}}%
+ \preto\exsh@firstline{\quad\bgroup\normalfont\normalsize}%
+ \appto\exsh@firstline{\egroup}%
+ }%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/name}}}{%
+ \def\exsh@exname{}%
+ \def\exsh@shortexname{}%
+ }{%
+ \edef\exsh@exname{\space(\pgfkeysvalueof{/exsh/name})}%
+ \edef\exsh@shortexname{:\space\pgfkeysvalueof{/exsh/name}}%
+ }%
+ \refstepcounter{section}%
+ \edef\exsh@tmp{[\pgfkeysvalueof{/exsh/strings/exercise} \arabic{section}\exsh@shortexname\expandonce\exsh@shortpoints]}%
+ \ifbool{exsh@samplesolutions}{\ifbool{exsh@sample}{\exsh@hidefalse}{\exsh@hidetrue}}{\exsh@hidefalse}%
+ \ifbool{exsh@hide}{%
+ \def\exsh@skipwhat{exercise}\expandafter\exsh@skipstuff%
+ }{%
+ \expandafter\exsh@startsection\exsh@tmp{\noindent%
+ \hbox to 0pt{\hss\pgfkeysvalueof{/exsh/exercisemark}}%
+ \pgfkeysvalueof{/exsh/strings/exercise}~\arabic{section}\exsh@exname\exsh@firstline\expandonce\exsh@points}%
+ \unskip\vskip\pgfkeysvalueof{/exsh/below exercise title skip}\relax
+ \@afterindentfalse
+ % automatic label for the first exercise in every included file
+ \ifthenelse{\equal{\jobname}{\currfilebase}}{}{%
+ \ifcsdef{exsh@autolabel@\currfilebase}{}{%
+ \csdef{exsh@autolabel@\currfilebase}{}%
+ \label{ex:\currfilebase}}}%
+ % Use \leavevmode to ensure proper distances above environments that start
+ % with a new \par. Make sure that a \label does not mess up the layout.
+ \@ifnextchar\label{\exsh@label}{\leavevmode\ignorespaces}%
+ }%
+}{
+ \clearpage%
+}
+\newcommand{\exsh@label}[2]{#1{#2}\leavevmode\ignorespaces}
+\newcommand{\exsh@startsection}[2][]{%
+ \newpage
+% \begin{block}{}
+% \pgfkeysvalueof{/exsh/exercise title font}{#2}%
+% \end{block}
+ \begingroup
+ \usebeamercolor{block title}
+ \setbeamercolor{block body}{bg=bg,fg=fg}
+ \block{}{\pgfkeysvalueof{/exsh/exercise title font}{#2}}\endblock
+ \endgroup
+}%
+
+\AfterPackage*{varioref}{
+ \labelformat{section}{\pgfkeysvalueof{/exsh/strings/exercise}~\arabic{section}}
+ \labelformat{enumi}{\arabic{section}.\alph{enumi}}
+}
+\AfterPackage*{paralist}{
+ \setdefaultenum{(a)}{(1)}{i.}{A.}
+}
+\AfterPackage*{enumitem}{
+ \setenumerate[1]{label=(\alph*)}
+ \setenumerate[2]{label=(\arabic*)}
+ \setenumerate[3]{label=\roman*.}
+ \setenumerate[4]{label=\Alph.}
+ \setlist[enumerate,1]{label=(\alph*),after*=\setcounter{enumi}{0}}
+}
+\def\theHenumi{enumi.\arabic{part}.\arabic{section}.\arabic{enumi}}
+
+% reset equation numbering for each exercise
+\@addtoreset{equation}{section}
+
+\newenvironment{hint}[1][]{%
+ \par
+ \pgfkeys{exsh,every hint,#1,hint font}%
+ \vskip\pgfkeysvalueof{/exsh/above hint skip}\relax\noindent
+ {\pgfkeysvalueof{/exsh/hint title font}\pgfkeysvalueof{/exsh/strings/hint}:}~\ignorespaces
+}{%
+ \par
+}
+\newenvironment{hint*}[1][]{%
+ \pgfkeys{exsh,every hint,#1,hint font}%
+ ({\pgfkeysvalueof{/exsh/hint title font}\pgfkeysvalueof{/exsh/strings/hint}:}\space%
+}{%
+ \unskip)%
+}
+\providecommand{\solution}{}
+\renewenvironment{solution}[1][]{%
+ \pgfkeys{exsh,every solution,#1,solution font}%
+ \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifbool{exsh@oralsolutions}{%
+ \let\next\exsh@startsolution
+ }{%
+ \let\next\exsh@skipsolution
+ }%
+ }{%
+ \ifbool{exsh@nonoralsolutions}{%
+ \let\next\exsh@startsolution
+ }{%
+ \let\next\exsh@skipsolution
+ }%
+ }%
+ \ifbool{exsh@forcesample}{%
+ \ifbool{exsh@samplesolutions}{%
+ \let\next\exsh@startsolution
+ }{}%
+ }{}%
+ \ifbool{exsh@beamersolution}{%
+ \let\next\exsh@skipsolution
+ }{}%
+ \next
+}{%
+% \ifnum\value{enumi}=0
+ \ifbool{exsh@beamersolution}{}{%
+ \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifbool{exsh@oralsolutions}{\clearpage}{}%
+ }{%
+ \ifbool{exsh@nonoralsolutions}{\clearpage}{}%
+ }%
+ }%
+% \fi
+}
+
+\def\exsh@startsolution{%
+ \ifnum\value{enumi}=0%
+ \clearpage
+ \fi
+ \begingroup
+ \usebeamercolor{block title alerted}
+ \setbeamercolor{block body}{bg=bg,fg=fg}
+ \block{}
+ \pgfkeysvalueof{/exsh/solution title font}%
+ \pgfkeysvalueof{/exsh/strings/solution} %
+ (\pgfkeysvalueof{/exsh/strings/exercise} \arabic{section}%
+ \alph{enumi})%
+ \endblock
+ \endgroup
+ \@afterheading
+}%
+
+\long\def\exsh@skipsolution#1{%
+ \ifstrequal{#1}{\end}{\exsh@endsolution}{\exsh@skipsolution}%
+}
+\def\exsh@endsolution#1{%
+ \ifstrequal{#1}{solution}{
+ \end{solution}
+ }{%
+ \ifstrequal{#1}{beamersolution}{
+ \end{beamersolution}
+ }{%
+ \exsh@skipsolution}%
+ }%
+}
+
+\newenvironment<>{beamersolution}[1][]{%
+ \pgfkeys{exsh,every solution,#1,solution font}%
+ \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifbool{exsh@oralsolutions}{%
+ \let\next\exsh@startsolution
+ }{%
+ \let\next\exsh@skipsolution
+ }%
+ }{%
+ \ifbool{exsh@nonoralsolutions}{%
+ \let\next\exsh@startsolution
+ }{%
+ \let\next\exsh@skipsolution
+ }%
+ }%
+ \ifbool{exsh@forcesample}{%
+ \ifbool{exsh@samplesolutions}{%
+ \let\next\exsh@startsolution
+ }{}%
+ }{}%
+ \next
+}{%
+ \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{%
+ \ifbool{exsh@oralsolutions}{\clearpage}{}%
+ }{%
+ \ifbool{exsh@nonoralsolutions}{\clearpage}{}%
+ }%
+}
+
+
+\newcommand{\pun}[1][]{%
+ \PackageWarning{exercisesheets}{Obsolete \string\pun[] macro used. Please use
+ something\MessageBreak like \string\points{10} or \string\points{oral} instead.}{}%
+ \exsh@subexpoints{#1}%
+}
+\newcommand{\points}[2][]{%
+ \ifthenelse{\equal{}{#2}}{}{\exshset{points=#2}}%
+ \bgroup%
+ \exshset{#1}%
+ \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/pointsinfo}}}{%
+ \def\exsh@tmp{}%
+ }{%
+ \def\exsh@tmp{, \pgfkeysvalueof{/exsh/pointsinfo}}%
+ }%
+ \ifthenelse{\equal{#2}{oral}}{%
+ \ifexsh@abbrev%
+ \exsh@subexpoints{\pgfkeysvalueof{/exsh/strings/oral abbrev}\exsh@tmp}%
+ \else%
+ \exsh@subexpoints{\pgfkeysvalueof{/exsh/strings/oral}\exsh@tmp}%
+ \fi%
+ }{%
+ \ifthenelse{\equal{#2}{}}{%
+ \exsh@subexpoints{\pgfkeysvalueof{/exsh/pointsinfo}}%
+ }{%
+ \ifexsh@abbrev%
+ \ifexsh@bonus%
+ \exsh@subexpoints{#2~\pgfkeysvalueof{/exsh/strings/bonus points abbrev}\exsh@tmp}%
+ \else%
+ \exsh@subexpoints{#2~\pgfkeysvalueof{/exsh/strings/points abbrev}\exsh@tmp}%
+ \fi%
+ \else%
+ \ifthenelse{\equal{#2}{1}}{%
+ \ifexsh@bonus%
+ \exsh@subexpoints{1~\pgfkeysvalueof{/exsh/strings/bonus point}\exsh@tmp}%
+ \else%
+ \exsh@subexpoints{1~\pgfkeysvalueof{/exsh/strings/point}\exsh@tmp}%
+ \fi%
+ }{%
+ \ifexsh@bonus%
+ \exsh@subexpoints{#2~\pgfkeysvalueof{/exsh/strings/bonus points}\exsh@tmp}%
+ \else%
+ \exsh@subexpoints{#2~\pgfkeysvalueof{/exsh/strings/points}\exsh@tmp}%
+ \fi%
+ }%
+ \fi
+ }%
+ }%
+ \egroup
+ \ignorespaces
+}
+
+\newenvironment{gradingguide}[1][]{%
+ \pgfkeys{exsh,#1,grading guide font}%
+ \ifbool{exsh@gradingguides}{%
+ \let\next\exsh@startguide
+ }{%
+ \let\next\exsh@skipguide
+ }%
+ \next
+}{}
+
+\def\exsh@startguide{\@afterindentfalse%
+ \par
+ {\parindent \z@
+ \pgfkeysvalueof{/exsh/strings/gradingguide}: }\nobreak%
+ \@afterheading
+}%
+
+\long\def\exsh@skipguide#1{%
+ \ifstrequal{#1}{\end}{\exsh@endguide}{\exsh@skipguide}%
+}
+\def\exsh@endguide#1{%
+ \ifstrequal{#1}{gradingguide}{\end{gradingguide}}{\exsh@skipguide}%
+}
+
+
+\ifluatex%
+ \ifdefined\luatextextdir
+ \def\exsh@putatend#1{%
+ \leavevmode\luatextextdir TRT\unskip{\luatextextdir TLT{\hfill~~#1}}\luatextextdir TLT}%
+ \else
+ \def\exsh@putatend#1{%
+ \leavevmode\textdir TRT\unskip{\textdir TLT{\hfill~~#1}}\textdir TLT}%
+ \fi
+\else%
+ \def\exsh@putatend#1{%
+ \TeXXeTstate=1%
+ \beginR\unskip{\beginL~~#1\endL}\hfill\beginL\TeXXeTstate=0}%
+\fi
+
+\def\exsh@leaveinplace#1{\unskip~{#1} }
+\def\exsh@insertFill#1{\unskip\nobreak\space\nobreak\hspace*{\fill}\allowbreak\hspace*{\fill}{#1}\unskip}
+
+\newcommand{\exsh@subexpoints}[1]{%
+ \ifexsh@inplace%
+ \exsh@leaveinplace{\pgfkeysvalueof{/exsh/points font}\mbox{(#1)}}%
+ \else%
+ \ifexsh@pointsfloatright% can be used directly after \item etc.
+ \exsh@putatend{\pgfkeysvalueof{/exsh/points font}\mbox{(#1)}}%
+ \else% original points macro with fill
+ \exsh@insertFill{\pgfkeysvalueof{/exsh/points font}\mbox{(#1)}}%
+ \fi%
+ \fi%
+}
+
+\newcommand{\TODO}{%
+ \ifmmode
+ ${\pgfkeysvalueof{/exsh/todo marker font}TODO}$%
+ \else
+ {\pgfkeysvalueof{/exsh/todo marker font}TODO}%
+ \fi
+ \PackageWarning{exercisesheets}{TODO marker found}%
+}
+
+\newcommand{\ifsolutions}[2]{%
+ \ifbool{exsh@solutions}{#1}{#2}%
+}
+
+\newcommand{\iforalsolutions}[2]{%
+ \ifbool{exsh@oralsolutions}{#1}{#2}%
+}
+\newcommand{\ifnonoralsolutions}[2]{%
+ \ifbool{exsh@nonoralsolutions}{#1}{#2}%
+}
+\newcommand{\ifsamplesolutions}[2]{%
+ \ifbool{exsh@samplesolutions}{#1}{#2}%
+}
+\newcommand{\samplehide}[1]{%
+ \ifbool{exsh@samplesolutions}{}{#1}%
+}
+
+
+
+\setbeamertemplate{headline}{%
+\leavevmode%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=3.5em,dp=1.375ex]%
+ {frametitle}\footnotesize
+ \hspace*{2ex}{\pgfkeysvalueof{/exsh/subject font}\pgfkeysvalueof{/exsh/subject}} \hfill
+ {\pgfkeysvalueof{/exsh/semester font}\pgfkeysvalueof{/exsh/semester}}\hspace{2ex}\hfil\linebreak
+ \hspace*{2ex}{\pgfkeysvalueof{/exsh/author font}\exsh@author}\hfill
+ {\pgfkeysvalueof{/exsh/date font}\pgfkeysvalueof{/exsh/date}}%
+ \hspace{2ex}\hfil\linebreak\vspace{-1em}
+ \end{beamercolorbox}%
+ \vspace{3mm}
+}
+
+\setbeamertemplate{footline}
+{%
+ \leavevmode%
+ \hbox{\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm,rightskip=.3cm]{frametitle}%
+ {\pgfkeysvalueof{/exsh/author font}\pgfkeysvalueof{/exsh/exauthor}}
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}%
+ \usebeamerfont{author in head/foot}
+ \inserttitle
+ \hfill\insertpagenumber
+ \end{beamercolorbox}}%
+ \vskip0pt%
+}
diff --git a/exercisesheets.sty b/exercisesheets.sty
index 7038d00..c4a4e67 100644
--- a/exercisesheets.sty
+++ b/exercisesheets.sty
@@ -18,8 +18,8 @@
%\NeedsTeXFormat{LaTeX2e}[1994/12/01]
% don't forget to update the version and date in exercisesheets.tex
-\def\exsh@version{0.6}
-\def\exsh@date{2019/2/11}
+\def\exsh@version{0.7}
+\def\exsh@date{2020/10/11}
\ProvidesPackage{exercisesheets}[\exsh@date\space\exsh@version\space Typesetting of exercise sheets]
\message{`Typesetting of exercise sheets' \exsh@version\space <\exsh@date>}
@@ -84,6 +84,9 @@
pointsfloatright/.default=true,
abbrev/.is if=exsh@abbrev,
abbrev/.default=true,
+ %options from exercisesheets-beamer are ignored
+ beamersolution/.default={ignore},
+ beamersolution/.initial={ignore}
}
% store title data for sheet headers
@@ -102,7 +105,11 @@
}{
\pgfkeys{/exsh/semester/.initial/.expand once=\@date}
}
-\apptocmd{\date}{\pgfkeys{/exsh/semester={#1}}}{}{}
+\let\@exsh@origdate\date
+\renewcommand{\date}[1]{\@exsh@origdate{#1}\pgfkeys{/exsh/semester={#1}}}
+% this breaks (likely because of detokenization):
+% -> missing \begin{document}
+% \apptocmd{\date}{\pgfkeys{/exsh/semester={#1}}}{}{}
\pgfkeys{/exsh/author/.code={%
\def\exsh@author{#1}%
\def\exsh@repeat{1}%
@@ -129,6 +136,7 @@
title/.initial={},
date/.initial={},
note/.initial={},
+ exauthor/.initial={\exsh@author},
%
% additional exercise info
name/.initial={},
@@ -781,11 +789,21 @@
\@afterheading
}%
+%the regular version of exercisesheets.sty skips all beamer solutions
+\newenvironment{beamersolution}[1][]{\exsh@skipsolution}{}%
+
\long\def\exsh@skipsolution#1{%
\ifstrequal{#1}{\end}{\exsh@endsolution}{\exsh@skipsolution}%
}
\def\exsh@endsolution#1{%
- \ifstrequal{#1}{solution}{\end{solution}}{\exsh@skipsolution}%
+ \ifstrequal{#1}{solution}{
+ \end{solution}
+ }{%
+ \ifstrequal{#1}{beamersolution}{
+ \end{beamersolution}
+ }{%
+ \exsh@skipsolution}%
+ }%
}
@@ -850,8 +868,8 @@
\next
}{}
-\def\exsh@startguide{\@afterindentfalse
- \linebreak
+\def\exsh@startguide{\@afterindentfalse%
+ \par
{\parindent \z@
\pgfkeysvalueof{/exsh/strings/gradingguide}: }\nobreak%
\@afterheading
diff --git a/exercisesheets.tex b/exercisesheets.tex
index 760c5f9..9c1d67c 100644
--- a/exercisesheets.tex
+++ b/exercisesheets.tex
@@ -53,17 +53,20 @@
\usepackage[english,iso]{isodate}
\title{The \exsh Package}
\author{Sebastian Kuhnert\and Frank Fuhlbrück}
-\date{Version 0.6, \printdateTeX{2019/2/11}}
+\date{Version 0.7, \printdateTeX{2020/10/15}}
\begin{document}
\maketitle
The \exsh package provides a way to typeset exercise sheets as used in
university courses. It evolved from a set of macros an environments that were
-finally combined into this package.
+finally combined into this package. Starting from Version 0.7, there
+is an alternative variant designed for use eith the beamer package.
+This variant is called exercisesheets-beamer. Not all combinations of options have been testet with the beamer variant.
+
\subsection*{Licence}
-Copyright \textcopyright{} 2008--2019 Sebastian Kuhnert and Frank Fuhlbrück.
+Copyright \textcopyright{} 2008--2020 Sebastian Kuhnert and Frank Fuhlbrück.
Permission is granted to copy, distribute and/or modify this software under the
terms of the \LaTeX{} Project Public Licence, version 1.3c or later. This
package is maintained, the Current Maintainer is Sebastian
@@ -114,6 +117,10 @@ Kuhnert\footnote{\href{mailto:mail@sebastian-kuhnert.de}{mail@sebastian-kuhnert.
\section{Basic Usage}
\subsection{Package Loading}
+There are two versions of the package: one for article and similar
+classes and one for the beamer document class. If you want the latter,
+replace \enquote{exercisesheets} with \enquote{exercisesheets-beamer}.
+
\begin{lstlisting}
\usepackage(*\opt{[\param{options}]}*){exercisesheets}
\end{lstlisting}
@@ -191,6 +198,16 @@ automatically generate an appropriate one (this may require an additional
All this information is included in the PDF meta-data if the \texttt{hyperref}
package is loaded with the option \texttt{pdfusetitle}.
+There is also a related option:
+\begin{description}
+ \item[\option{exauthor=\param{list of names}}] If you want to use the
+ \lstinline|\author| macro for the general author of a course but
+ there are different authors for individual exercises or all
+ exercises in general, you can set this key. Currently only
+ exercisesheets-baemer uses this for the footline, while
+ \option{author} is used for the headline.
+\end{description}
+
\subsection{Defining Exercise Sheets}
\label{sec:sheet}
\begin{lstlisting}
@@ -220,6 +237,8 @@ The following \param{options} are supported:
typeset exams.
\item[\option{author=\param{author}}] Set the author included in the sheet
head. By default, the value passed to \verb|\author| is used.
+ \item[\option{exauthor=\param{exauthor}}] Only used by \exsh-beamer,
+ see above.
\item[\option{subject=\param{subject}}] Set the subject included in the sheet
head. By default, the value passed to \verb|\subject| is used.
\item[\option{semester=\param{semester}}] Set the semester included in the
@@ -235,10 +254,19 @@ The following \param{options} are supported:
\begin{solution}(*\opt{[\param{solution options}]}*)
(*\param{solution text}*)
\end{solution}
+ \begin{beamersolution}(*\opt{[\param{solution options}]}*)
+ (*\param{solution text}*)
+ \end{beamersolution}
\end{exercise}
\end{lstlisting}
-This inserts an exercise into the current document. The following options are
+This inserts an exercise into the current document. All
+\option{beamersolution}s are ignored, if the usual
+\exsh package is loaded, but \exsh-beamer also processes
+normal solututions by default (set option \option{beamersolution}
+to turn this off).
+
+The following options are
supported:
\begin{description}
\item[\option{name=\param{text}}] Use \param{text} as the name of the exercise.
@@ -263,6 +291,9 @@ supported:
document (or sheet) default.
\item[\option{sample}] Include this exercise (and its solution) in while compiling
sample solutions.
+ \item[\option{beamersolution}] For \exsh-beamer only. If this option
+ is set all normal solutions will not be included and only
+ \option{beamersolution}s are typeset.
\end{description}
Solutions are only typeset, if the \option{solutions} option is in effect. There