diff options
| author | Frank Fuhlbrück | 2020-10-15 09:21:05 +0200 |
|---|---|---|
| committer | Frank Fuhlbrück | 2020-10-15 09:21:05 +0200 |
| commit | e480192748bfcf90d6b341056638d42ccc67c265 (patch) | |
| tree | 7ef46df84dd5d3356da03c008532c6864fc987f4 /exercisesheets-beamer.sty | |
| parent | f631c2775b7dbc3df0f4e5a8157f1e7874f66eff (diff) | |
| download | exercisesheets-e480192748bfcf90d6b341056638d42ccc67c265.tar.gz exercisesheets-e480192748bfcf90d6b341056638d42ccc67c265.tar.bz2 exercisesheets-e480192748bfcf90d6b341056638d42ccc67c265.zip | |
Beamer-Version
Diffstat (limited to 'exercisesheets-beamer.sty')
| -rw-r--r-- | exercisesheets-beamer.sty | 1017 |
1 files changed, 1017 insertions, 0 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% +} |
