%% exercisesheets.sty %% Copyright 2008-2017 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.5j} \def\exsh@date{2017/04/27} \ProvidesPackage{exercisesheets}[\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@inplace \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/false/.code=\exsh@solutionsfalse\exsh@oralsolutionsfalse\exsh@nonoralsolutionsfalse, solutions/.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, pointsfloatright/.is if=exsh@pointsfloatright, pointsfloatright/.default=true, abbrev/.is if=exsh@abbrev, abbrev/.default=true, } % 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}{No \string\subject\space given}}} }{ \pgfkeys{/exsh/subject/.initial/.expand once=\@subject} } \ifdefstring{\@date}{\today}{ \pgfkeys{/exsh/semester/.initial={\PackageWarning{exercisesheets}{No semester given in \string\date}}} }{ \pgfkeys{/exsh/semester/.initial/.expand once=\@date} } \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={}, % % additional exercise info name/.initial={}, firstline/.initial={}, points/.initial={}, oral/.style={/exsh/points=oral},oral/.value forbidden, inplace/.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, % % translatable strings strings/sheet/.initial={}, strings/sheets/.initial={}, strings/solutions/.initial={}, strings/solutionsby/.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/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/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}{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, 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}, % % 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.sty\endcsname} % mark options as processed \expandafter\undef\csname opt@exercisesheets.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][]{% \clearpage \stepcounter{sheetid}% \pgfkeys{exsh,every sheet,#1}% \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}% \expandafter\exsh@skipsheet \fi }{% \par \begingroup \ifnum\value{page}=1\thispagestyle{empty}\fi \clearpage \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@skipsheet#1{% \ifstrequal{#1}{\begin}{\exsh@skipsheet@begin}{% \ifstrequal{#1}{\end}{\exsh@skipsheet@end}{% \ifstrequal{#1}{\label}{\exsh@skipsheet@label}{% \ifstrequal{#1}{\input}{\exsh@skipsheet@input}{% \ifstrequal{#1}{\exsh@skipsheet@endfile}{\currfile@pop\exsh@skipsheet}{% \ifstrequal{#1}{\setcounter}{\expandafter\exsh@skipsheet\setcounter}{% \ifstrequal{#1}{\item}{\ifdef{\@enumctr}{\@hyper@itemtrue\refstepcounter{\@enumctr}}{}}{}% \exsh@skipsheet}}}}}}% } \def\exsh@skipsheet@end#1{% \ifstrequal{#1}{sheet}{\end{sheet}}{\endgroup\exsh@skipsheet}% } \def\exsh@skipsheet@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@skipsheet@beginenum }{% \ifinlist{#1}{\exsh@nonenums}{% \undef\@enumctr }{}% \exsh@skipsheet }% } \def\exsh@skipsheet@beginenum{% \ifnum\@enumdepth>\thr@@ \@toodeep \else \advance\@enumdepth\@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \setcounter{\@enumctr}{0}% \fi \ifx\@enumlabel@\relax \exsh@skipsheet \else \@ifnextchar[{\@enumlabel@{\exsh@skipsheet}[}{\exsh@skipsheet}% \fi } \def\exsh@skipsheet@label#1{% \label{#1}\exsh@skipsheet } \def\exsh@skipsheet@input#1{% \CatchFileDef{\exsh@inputfilecontent}{#1}{}% \currfile@push \currfile@set{#1}% \expandafter\exsh@skipsheet\exsh@inputfilecontent\exsh@skipsheet@endfile } \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}% \part[\pgfkeysvalueof{/exsh/title}]{\normalsize \pgfkeysvalueof{/exsh/sheet header font}\centering% \begingroup\raggedright% {\pgfkeysvalueof{/exsh/subject font}\pgfkeysvalueof{/exsh/subject}}\hfill {\pgfkeysvalueof{/exsh/semester font}\pgfkeysvalueof{/exsh/semester}}\\ {\pgfkeysvalueof{/exsh/author font}\exsh@author}\hfill {\pgfkeysvalueof{/exsh/date font}\pgfkeysvalueof{/exsh/date}}\\ \vskip\pgfkeysvalueof{/exsh/above sheet title skip}\relax% \endgroup \begingroup \pgfkeysvalueof{/exsh/sheet title font}\exsh@tmp\\\unskip \endgroup \begingroup \pgfkeysvalueof{/exsh/sheet header font}% \ifexsh@solutions% \ifdefvoid{\exsh@solutionsby}{}{% \begingroup \pgfkeysvalueof{/exsh/solutionsby font}% \vskip\pgfkeysvalueof{/exsh/above solutionsby skip}\relax \pgfkeysvalueof{/exsh/strings/solutionsby}~\exsh@solutionsby\\\unskip% \endgroup }% \else \fi \ifthenelse{\equal{}{\pgfkeysvalueof{/exsh/note}}}{% }{% \begingroup \pgfkeysvalueof{/exsh/sheet note font}% \vskip\pgfkeysvalueof{/exsh/above sheet note skip}\relax \pgfkeysvalueof{/exsh/note}\\\unskip% \endgroup }% \endgroup }% \unskip \vskip\pgfkeysvalueof{/exsh/below sheet header skip}\relax \stepcounter{page}% } \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]}% \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}% }{} \newcommand{\exsh@label}[2]{#1{#2}\leavevmode\ignorespaces} \newcommand{\exsh@startsection}[2][]{% \@startsection{section}{1}{\z@}% {\pgfkeysvalueof{/exsh/above exercise skip}}% {1em}% afterskip corrected below {\pgfkeysvalueof{/exsh/exercise title font}}% [#1]{#2}% }% \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.} } \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)% } \newenvironment{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 }% }% \next }{% \ifthenelse{\equal{oral}{\pgfkeysvalueof{/exsh/points}}}{% \ifbool{exsh@oralsolutions}{\par}{}% }{% \ifbool{exsh@nonoralsolutions}{\par}{}% }% } \def\exsh@startsolution{\@afterindentfalse \vskip\pgfkeysvalueof{/exsh/above solution skip}\relax% {\parindent \z@ \pgfkeysvalueof{/exsh/solution title font}% \pgfkeysvalueof{/exsh/strings/solution}:\par}\nobreak% \@afterheading }% \long\def\exsh@skipsolution#1{% \ifstrequal{#1}{\end}{\exsh@endsolution}{\exsh@skipsolution}% } \def\exsh@endsolution#1{% \ifstrequal{#1}{solution}{\end{solution}}{\exsh@skipsolution}% } \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 } \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}% }