%------------------------------------------------------------------------------------------------------------%
% Package worksheet by Benjamin Zöllner (c)2018                                                              %
%                                                                                                            %
% This work may be distributed and/or modified under the                                                     %
% conditions of the LaTeX Project Public License (latest version).                                           %
%------------------------------------------------------------------------------------------------------------%

\NeedsTeXFormat{LaTeX2e}[2018]
\ProvidesPackage{worksheet}[2018/08/08 by Benjamin Zoellner (c)2018 v1.1 This Package provides macros and an environment for easy worksheet creation]

\PassOptionsToPackage{headsepline=1pt}{scrlayer-scrpage}
\RequirePackage{scrlayer-scrpage}

% BEWARE!
% DO NOT CHANGE THE FORMATTING OF FOLLOWING CODE! DO NOT DELETE EMPTY COMMENTS!

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Extraxt Number From \jobname

% Bools for Number Detection
\newcounter{@worksheet@numberFound}
\newcounter{@worksheet@numberEnded}

% evil String Search Hacking using Latex-Kernel Macros \in@ & \ifin@
\def\@worksheet@isInString#1#2{TT\fi\begingroup % What the f**k?!
\edef\x{\endgroup\noexpand\in@{#1}{#2}}\x\ifin@}

% Character-wise expanding Macro Loop for extracting containing Numbers leaving leading Zeroes
% if a single Character #1 is a natural Number less than 10, a containing Number is found
%     @worksheet@numberFound will be set
%     #1 will be displayed
% every following natural Number less than 10 including 0 will be displayed until #1 is a Character other than
% a natural Number less than 10 or 0
%     @worksheet@numberEnded will be set when #1 is not a number
\def\@worksheet@loopElementsExtractNumber#1{%
	\ifx\relax#1\else
		\ifnum\value{@worksheet@numberEnded}=0
			\ifnum\value{@worksheet@numberFound}=0
				\if\@worksheet@isInString{#1}{123456789}#1\setcounter{@worksheet@numberFound}{1}\fi
			\else
				\if\@worksheet@isInString{#1}{0123456789}#1\else\setcounter{@worksheet@numberEnded}{1}\fi
			\fi
		\fi
	\expandafter\@worksheet@loopElementsExtractNumber%
	\fi
}

% expand Loop and extract a containing Number
\def\@worksheet@expandNumberExtractingLoop#1{\setcounter{@worksheet@numberFound}{0}\setcounter{@worksheet@numberEnded}{0}\@worksheet@loopElementsExtractNumber#1\relax}

% expand \jobname
\edef\@worksheet@expandjobname{\jobname}

% accurate Loop Command Expansion
\def\@worksheet@numberInFileName{\expandafter\@worksheet@expandNumberExtractingLoop\expandafter{\@worksheet@expandjobname}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Language Selection

% Babel conforming Macros
\def\@worksheet@selectLanguage@english{
	\xdef\@worksheet@languageSelection@exercise{Exercise}
	\xdef\@worksheet@languageSelection@score{Maximum Score}
	\xdef\@worksheet@languageSelection@learningTargets{Learning Targets}
	\xdef\@worksheet@languageSelection@difficulty{Difficulty Level}
	\xdef\@worksheet@languageSelection@easy{easy}
	\xdef\@worksheet@languageSelection@medium{medium}
	\xdef\@worksheet@languageSelection@hard{hard}
}
\def\@worksheet@selectLanguage@french{
	\xdef\@worksheet@languageSelection@exercise{Exercice}
	\xdef\@worksheet@languageSelection@score{Points}
	\xdef\@worksheet@languageSelection@learningTargets{Buts}
	\xdef\@worksheet@languageSelection@difficulty{Difficulté}
	\xdef\@worksheet@languageSelection@easy{facile}
	\xdef\@worksheet@languageSelection@medium{moyen}
	\xdef\@worksheet@languageSelection@hard{difficile}
}
\def\@worksheet@selectLanguage@german{
	\xdef\@worksheet@languageSelection@exercise{Aufgabe}
	\xdef\@worksheet@languageSelection@score{Punkte}
	\xdef\@worksheet@languageSelection@learningTargets{Lernziele}
	\xdef\@worksheet@languageSelection@difficulty{Schwierigkeitsgrad}
	\xdef\@worksheet@languageSelection@easy{leicht}
	\xdef\@worksheet@languageSelection@medium{mittel}
	\xdef\@worksheet@languageSelection@hard{schwer}
}
\def\@worksheet@selectLanguage@ngerman{\@worksheet@selectLanguage@german}

% call Babel conforming Macro if defined
\def\@worksheet@checkLanguage{
	\expandafter\ifdefined\csname @worksheet@selectLanguage@\languagename\endcsname
		\csname @worksheet@selectLanguage@\languagename\endcsname
	\fi
}

% Macros to call at \begin{document}
\def\@worksheet@languageSelection@beginDocument{
	\let\@worksheet@originalselectlanguage\selectlanguage
	\def\selectlanguage##1{\@worksheet@originalselectlanguage{##1}\@worksheet@checkLanguage}

	\@worksheet@checkLanguage
}

% select default Language
\@worksheet@selectLanguage@english


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Title of worksheet

% worksheet internal Title & Subtitle
\def\@worksheet@title{}
\def\@worksheet@subTitle{}

% set worksheet internal Title & Subtitle by redifining
\def\worksheetTitle#1{\edef\@worksheet@title{#1}}
\def\worksheetSubTitle#1{\edef\@worksheet@subTitle{#1}}

% general Title Command
\def\worksheetMakeTitle{
	\ifx\relax\@worksheet@title\relax\else%
		\begin{center}
			\textbf{\sffamily\huge\@worksheet@title~\@worksheet@numberInFileName\nopagebreak}%
			\ifx\relax\@worksheet@subTitle\relax\else%
				\nopagebreak\par\addvspace{\topsep}{\sffamily\LARGE\@worksheet@subTitle}
			\fi
		\end{center}
		\nopagebreak\par\addvspace{\topsep}
	\fi	
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Directory File Name Extraction for temporary defining \@worksheet@currentFileName

% seperate Name and Extension and leave Extension out
\def\@worksheet@omitFileExtension#1.#2\@nil{#1}

% loop through Directory Elements and seperate Extension from last Element
\def\@worksheet@loopDirectoryElementsExtractName#1/#2/#3\@nil{\ifx\relax#2\relax\expandafter\@worksheet@omitFileExtension#1.\@nil\else\expandafter\@worksheet@loopDirectoryElementsExtractName#2/#3/\@nil\fi}

% accurate Loop Command Expansion
\def\@worksheet@ExtractFileName#1{\expandafter\@worksheet@loopDirectoryElementsExtractName#1//\@nil}

% define empty current File Name
\def\@worksheet@currentFileName{}

% redefining \@iinput using original \@iinput
\let\@worksheet@original@iinput\@iinput
\def\@iinput#1{\edef\@worksheet@currentFileName{\@worksheet@ExtractFileName{#1}}\@worksheet@original@iinput{#1}\def\@worksheet@currentFileName{}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Environment Exercise

% Counter for Number of Exercises
\newcounter{@worksheet@numberOfExercises}

% Control Flags
\newcounter{@worksheet@showFileNameFlag}
\newcounter{@worksheet@showScoreFlag}
\newcounter{@worksheet@showLearningTargetsFlag}
\newcounter{@worksheet@showDifficultyFlag}
\newcounter{@worksheet@showOccurrenceFlag}

% Commands: set and unset Flags
\def\worksheetShowFileName{\setcounter{@worksheet@showFileNameFlag}{1}}
\def\worksheetHideFileName{\setcounter{@worksheet@showFileNameFlag}{0}}
\def\worksheetShowScore{\setcounter{@worksheet@showScoreFlag}{1}}
\def\worksheetHideScore{\setcounter{@worksheet@showScoreFlag}{0}}
\def\worksheetShowLearningTargets{\setcounter{@worksheet@showLearningTargetsFlag}{1}}
\def\worksheetHideLearningTargets{\setcounter{@worksheet@showLearningTargetsFlag}{0}}
\def\worksheetShowDifficulty{\setcounter{@worksheet@showDifficultyFlag}{1}}
\def\worksheetHideDifficulty{\setcounter{@worksheet@showDifficultyFlag}{0}}
\def\worksheetShowOccurrence{\setcounter{@worksheet@showOccurrenceFlag}{1}}
\def\worksheetHideOccurrence{\setcounter{@worksheet@showOccurrenceFlag}{0}}

% Commands: set local Attributes of Exercise
\def\score#1{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\if\relax#1\relax\else%
			\edef\@worksheet@localScore{#1}%
		\fi%
	\fi%
	\ignorespaces%
}
\def\learningtargets#1{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\if\relax#1\relax\else%
			\edef\@worksheet@localLearningTargets{#1}%
		\fi%
	\fi%
	\ignorespaces%
}
\def\easy{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\edef\@worksheet@localDifficulty{\@worksheet@languageSelection@easy}%
	\fi%
	\ignorespaces%
}
\def\medium{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\edef\@worksheet@localDifficulty{\@worksheet@languageSelection@medium}%
	\fi%
	\ignorespaces%
}
\def\hard{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\edef\@worksheet@localDifficulty{\@worksheet@languageSelection@hard}%
	\fi%
	\ignorespaces%
}

% Commands: set global self emptying Attributes of Exercise
\def\@worksheet@occurence{}
\def\occurrence#1{%
	\ignorespaces%
	\ifdefined\@worksheet@localExerciseGroup%
		\if\relax#1\relax\else%
			\xdef\@worksheet@occurence{#1}%
		\fi%
	\fi%
	\ignorespaces%
}

% Exercise
\newenvironment{exercise}[1][]{

	% increase @worksheet@numberOfExercises
	\stepcounter{@worksheet@numberOfExercises}

	\begingroup\def\@worksheet@localExerciseGroup{}
	\sffamily
	% prevent other Text Sizes than normal, new Paragraph, make chaptersized vertical Space
	\normalsize\par\addvspace{\topsep}%

	% make Aufgabe Title preventing Indents and ignoring Spaces
	\noindent\ignorespaces\textbf{\@worksheet@languageSelection@exercise~\the@worksheet@numberOfExercises}%
	% call Commands in optional Argument which define \@worksheet@localScore, \@worksheet@localLearningTargets and \@worksheet@localDifficulty locally within this group
	#1%
	% check if Score should be shown and if Score have been set
	%     show footnotesized raggedleft Score
	\ifnum\value{@worksheet@showScoreFlag}=0\else
		\ifdefined\@worksheet@localScore
			{\hfill\footnotesize\@worksheet@languageSelection@score:~\@worksheet@localScore}
		\fi
	\fi

	% check if Difficulty should be shown and if Difficulty have been set
	%     show footnotesized natural Difficulty
	%     prevent Pagebreaks, Indents and Spaces
	\ifnum\value{@worksheet@showDifficultyFlag}=0\else
		\ifdefined\@worksheet@localDifficulty
			\nopagebreak\par\noindent\ignorespaces
			{\footnotesize\@worksheet@languageSelection@difficulty:~\@worksheet@localDifficulty%
			\ifnum\value{@worksheet@showLearningTargetsFlag}=0\else%
				\ifdefined\@worksheet@localLearningTargets%
					,%
				\fi%
			\fi%
			}%
		\fi%
	\fi%
	%
	% check if Learning Targets should be shown and if Learning Targets have been set
	%     show footnotesized raggedleft Learning Targets
	%     prevent Pagebreaks, Indents and Spaces
	\ifnum\value{@worksheet@showLearningTargetsFlag}=0\else%
		\ifdefined\@worksheet@localLearningTargets%
			\ifnum\value{@worksheet@showDifficultyFlag}=0%
				\nopagebreak\par\noindent\ignorespaces%
			\else%
				\ifdefined\@worksheet@localDifficulty\else%
					\nopagebreak\par\noindent\ignorespaces%
				\fi%
			\fi%
			{\footnotesize\hfill\@worksheet@languageSelection@learningTargets:~\@worksheet@localLearningTargets}
		\fi
	\fi

	\endgroup

	% prevent Pagebreaks, Indents and Spaces
	\nopagebreak\par\noindent\ignorespaces
}{
	% check if File Name should be shown and if \@worksheet@currentFilename is not empty
	%     prevent Pagebreaks, Indents and Spaces
	%     show tinyed non-empty \@worksheet@currentFileName
	\ifnum\value{@worksheet@showFileNameFlag}=0\else
		\if\@worksheet@currentFileName\relax\relax\else
			\nopagebreak\par\noindent\ignorespaces
			{\scriptsize\sffamily[\@worksheet@currentFileName]}%
		\fi%
	\fi%
	%
	% check if Occurrence should be shown and if \@worksheet@occurence is not empty
	%     prevent Pagebreaks, Indents and Spaces
	%     show tinyed non-empty \@worksheet@occurence
	\ifnum\value{@worksheet@showOccurrenceFlag}=0\else%
		\if\@worksheet@occurence\relax\relax\else%
			\ifnum\value{@worksheet@showFileNameFlag}=0%
				\nopagebreak\par\noindent\ignorespaces%
			\else%
				\if\@worksheet@currentFileName\relax\relax%
					\nopagebreak\par\noindent\ignorespaces%
				\fi%
			\fi%
			{\scriptsize\sffamily\hfill[\@worksheet@occurence]}
		\fi
	\fi
	\gdef\@worksheet@occurence{}
	
	\par\addvspace{\topsep}%
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Header

% Header Flags
\newcounter{@worksheet@hideHeader}
\newcounter{@worksheet@noSFFamilyInHeader}

% prevent Header
\def\worksheetHideHeader{\setcounter{@worksheet@hideHeader}{1}}
\def\worksheetNoSFFamilyInHeader{\setcounter{@worksheet@noSFFamilyInHeader}{1}}

% lv-File which should be loaded
\edef\@worksheet@lvFile{./lv.tex}

% change lv-File Name and Path
\def\worksheetChangelvFile#1{\edef\@worksheet@lvFile{#1}}

% define Header Information
%     only if not empty
\def\worksheetAuthors#1{\if\relax#1\relax\else\xdef\@worksheet@authors{#1}\fi}
\def\worksheetCourseName#1{\if\relax#1\relax\else\xdef\@worksheet@course{#1}\fi}

% formatting of worksheet Header
%\def\@worksheet@head#1#2{\vbox{\sffamily\small#1\hfill #2\par\vspace{3pt}\hrule}}

% make Header
%     make Header \sffamily if Document Class is KOMA
\def\@worksheet@makeHead#1#2{
	\clearpairofpagestyles
	\cfoot*{\pagemark}
	\@ifundefined{KOMAClassName}{%
		\ihead{#1}
		\ohead{#2}
    }{%
		\ihead{\ifnum\value{@worksheet@hideHeader}=0\sffamily\fi#1}
		\ohead{\ifnum\value{@worksheet@hideHeader}=0\sffamily\fi#2}
    }
	\pagestyle{headings}
}

% Macros to call at \begin{document}
\def\@worksheet@header@beginDocument{
	% default Pagestyle
	\pagestyle{plain}

	% load \@worksheet@lvFile ("./lv.tex" by default) if existing
	\begingroup
	\IfFileExists{\@worksheet@lvFile}{
		\input{\@worksheet@lvFile}
		\ifdefined\coursename\if\relax\coursename\relax\else\worksheetCourseName{\coursename}\fi\fi
		\ifdefined\authors\if\relax\authors\relax\else\worksheetAuthors{\authors}\fi\fi
		\ifdefined\lvname\if\relax\lvname\relax\else\worksheetCourseName{\lvname}\fi\fi
		\ifdefined\autoren\if\relax\autoren\relax\else\worksheetAuthors{\autoren}\fi\fi
	}{}
	\endgroup

	% make Header at Begin of Document if \@worksheet@authors or \@worksheet@course is defined
	\ifnum\value{@worksheet@hideHeader}=0
		\ifdefined\@worksheet@authors
			\ifdefined\@worksheet@course
				\@worksheet@makeHead{\@worksheet@course}{\@worksheet@authors}
			\else
				\@worksheet@makeHead{}{\@worksheet@authors}
			\fi
		\else
			\ifdefined\@worksheet@course
				\@worksheet@makeHead{\@worksheet@course}{}
			\fi
		\fi
	\fi
	\def\@worksheet@header@beginDocument{}
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% At Document Begin

\AtBeginDocument{
	\@worksheet@header@beginDocument
	\@worksheet@languageSelection@beginDocument
}

\endinput