summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/worksheet/worksheet.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/worksheet/worksheet.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/worksheet/worksheet.sty')
-rw-r--r--macros/latex/contrib/worksheet/worksheet.sty406
1 files changed, 406 insertions, 0 deletions
diff --git a/macros/latex/contrib/worksheet/worksheet.sty b/macros/latex/contrib/worksheet/worksheet.sty
new file mode 100644
index 0000000000..aa9e7929b7
--- /dev/null
+++ b/macros/latex/contrib/worksheet/worksheet.sty
@@ -0,0 +1,406 @@
+%------------------------------------------------------------------------------------------------------------%
+% 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