summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/exsheets
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2012-10-13 09:39:42 +0000
committerNorbert Preining <preining@logic.at>2012-10-13 09:39:42 +0000
commitd2e50e76ef7e64efa460c918c4c751262c063476 (patch)
tree58cbbfdd6baf7d60d38344a470d7ab91d4add134 /Master/texmf-dist/tex/latex/exsheets
parente75b4f01a9c31f808000ab47365e040897e7cf23 (diff)
new latex packages exsheets (12Oct)
git-svn-id: svn://tug.org/texlive/trunk@27953 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/exsheets')
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/cntformats.sty324
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets.sty2045
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets_configurations.cfg5
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets_headings.cfg302
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets_headings.def371
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.cfg56
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.def334
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/translations.sty311
8 files changed, 3748 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/exsheets/cntformats.sty b/Master/texmf-dist/tex/latex/exsheets/cntformats.sty
new file mode 100644
index 00000000000..41e4cef75d3
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/cntformats.sty
@@ -0,0 +1,324 @@
+% --------------------------------------------------------------------------
+% the CNTFORMATS package
+%
+% A different way to read counters
+%
+% This package is part of the exsheets bundle
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The cntformats package consists of the files
+% - cntformats.sty
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\def\cntfmts@date{2012/10/08}
+\def\cntfmts@version{v0.2b}
+
+\ProvidesPackage{cntformats}[\cntfmts@date\space \cntfmts@version\space A different way to read counters.]
+\RequirePackage{etoolbox,xparse}
+% --------------------------------------------------------------------------
+% message handling
+\def\@cntfmts@error@message{%
+ For details have a look at the `exsheets' manual.}
+
+\def\@cntfmts@create@message#1{%
+ \ifstrequal{#1}{Error}
+ {%
+ \lowercase{\csdef{@cntfmts@#1}}##1{%
+ \csuse{Package#1}{cntformats}{##1}{\@cntfmts@error@message}}%
+ }{%
+ \lowercase{\csdef{@cntfmts@#1}}##1{%
+ \csuse{Package#1}{cntformats}{##1}}%
+ }}
+\@cntfmts@create@message{Error}
+\@cntfmts@create@message{Warning}
+\@cntfmts@create@message{WarningNoLine}
+\@cntfmts@create@message{Info}
+
+\def\@cntfmts@err@already@defined#1{%
+ \@cntfmts@error{The counter `#1' already exists!}}
+\def\@cntfmts@err@unknown@counter#1{%
+ \@cntfmts@error{The counter `#1' is undefined!}}
+\def\@cntfmts@err@pattern@defined#1#2{%
+ \@cntfmts@error{The pattern `#2' for module `#1' is already defined!}}
+\def\@cntfmts@err@pattern@undefined#1#2{%
+ \@cntfmts@error{The pattern `#2' for module `#1' is undefined!}}
+
+% ----------------------------------------------------------------------------
+% tokenlist analyzing and manipulating
+% if you happen to read this code and notice some obvious reasons why these
+% macros shoudn't be used like this, please send me your improved version
+% (seriously! But please explain why yours is better)
+\def\ifintl#1#2{%
+ \def\@cntfmts@intl@tmpa##1#2{}%
+ \expandafter\if\expandafter\relax\expandafter
+ \detokenize\expandafter{\@cntfmts@intl@tmpa#1{}{}#2}\relax%
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+\def\ifintlcs#1{%
+ \expandafter\ifintl\expandafter{#1}}
+
+\long\def\replaceonceincs#1#2#3{%
+ \ifintlcs#1{#2}%
+ {\@cntfmts@replace@once@incs#1{#2}{#3}}{}%
+}
+\long\def\@cntfmts@replace@once@incs#1#2#3{%
+ \def\@cntfmts@replo@tmpa##1#2##2\q@stop{%
+ \def#1{##1#3##2}}%
+ \expandafter\@cntfmts@replo@tmpa#1\q@stop
+}
+
+\long\def\replaceallin#1#2#3{%
+ \def\@cntfmts@repla@tmpa{#1}%
+ \replaceonceincs\@cntfmts@repla@tmpa{#2}{#3}%
+ \ifintlcs\@cntfmts@repla@tmpa{#2}%
+ {\expandafter\replaceallin\expandafter{\@cntfmts@repla@tmpa}{#2}{#3}}%
+ {\expandonce\@cntfmts@repla@tmpa}%
+}
+\long\def\replaceallincs#1#2#3{%
+ \replaceonceincs#1{#2}{#3}%
+ \ifintlcs#1{#2}{\replaceallincs#1{#2}{#3}}{}%
+}
+
+% ----------------------------------------------------------------------------
+% expansion tools
+% heavily inspired by expl3's \exp_args:N<spec>
+\long\def\@cntfmts@getnextbraced#1#2#3{#2\@cntfmts@firstofone{#3{#1}}}
+\long\def\@cntfmts@firstofone#1{#1}
+\long\def\@cntfmts@braced@unexpanded#1\@cntfmts@firstofone#2#3{%
+ #1\@cntfmts@firstofone{#2{#3}}}
+\long\def\@cntfmts@braced@expandedonce#1\@cntfmts@firstofone#2#3{%
+ \expandafter\@cntfmts@getnextbraced\expandafter{#3}{#1}{#2}}
+
+\long\def\@cntfmts@expand@first{%
+ \@cntfmts@braced@expandedonce
+ \@cntfmts@firstofone}
+
+\long\def\@cntfmts@expand@second{%
+ \@cntfmts@braced@unexpanded
+ \@cntfmts@braced@expandedonce
+ \@cntfmts@firstofone}
+
+\long\def\@cntfmts@expand@third{%
+ \@cntfmts@braced@unexpanded
+ \@cntfmts@braced@unexpanded
+ \@cntfmts@braced@expandedonce
+ \@cntfmts@firstofone}
+
+% ----------------------------------------------------------------------------
+% expandable commands with optional argument (and no mandatory)
+% this is probably not very robust. If you know what you're doing you're
+% probably able to define a better version yourself. If not, don't use it
+\long\def\@cntfmts@isopt@#1[#2\q@marker#3#{%
+ \if\relax\detokenize{#1#2}\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\long\def\@cntfmts@isopt#1#2#3{%
+ \@cntfmts@isopt@#1\q@marker[\q@marker{#2#1}{#2[{#3}]{#1}}}
+
+\long\def\@cntfmts@defwopt#1[#2]#3{%
+ \long\def#1##1{\@cntfmts@isopt{##1}{\csuse{\@cntfmts@strip@bs#1@opt}}{#2}}%
+ \long\csdef{\@cntfmts@strip@bs#1@opt}[##1]{#3}}
+
+\def\@cntfmts@strip@bs{\expandafter\@gobble\string}
+
+% ----------------------------------------------------------------------------
+% #1: module
+% #2: counter
+\def\@cntfmts@def@counter@read#1#2#3{%
+ \@cntfmts@expand@second\csdef
+ {@#1@read@#3@counter}%
+ {\csname @#1@read@#2@counter\endcsname}}
+
+% create pattern for an existing counter:
+% #1: module
+% #2: counter
+% #3: id
+\newcommand*\@cntfmts@add@counter@pattern[3][cntfmts]{%
+ \ifcsdef{the#2}
+ {}{\@cntfmts@err@unknown@counter{#2}}%
+ \ifcsdef{@#1@#2@counter}
+ {\@cntfmts@err@pattern@defined{#1}{#2}}
+ {\csdef{@#1@#2@counter}{}}%
+ \listcsadd{@#1@counter@ids}{#3}%
+ \@cntfmts@def@counter@read{#1}{#2}{#3}%
+}
+
+\newcommand*\@cntfmts@add@counter@pattern@nostar[3][cntfmts]{%
+ \@cntfmts@add@counter@pattern[#1]{#2}{#3}%
+ \@cntfmts@expand@third
+ \@cntfmts@create@read@counter{#1}{#2}{\csname c@#2\endcsname}}
+
+\newrobustcmd*\AddCounterPattern{%
+ \@ifstar
+ {\@cntfmts@add@counter@pattern}
+ {\@cntfmts@add@counter@pattern@nostar}}
+\@onlypreamble\AddCounterPattern
+
+% create pattern for a new counter
+% #1: counter
+% #2: id
+\newcommand*\@cntfmts@new@counter@pattern[3][cntfmts]{%
+ \ifcsdef{the#2}
+ {\@cntfmts@err@counter@defined{#2}}{}%
+ \newcounter{#2}%
+ \listcsadd{@#1@counter@ids}{#3}%
+ \@cntfmts@def@counter@read{#1}{#2}{#3}%
+ \csdef{@#1@#2@counter}{}
+}
+
+\newcommand*\@cntfmts@new@counter@pattern@nostar[3][cntfmts]{%
+ \@cntfmts@new@counter@pattern[#1]{#2}{#3}%
+ \@cntfmts@expand@third
+ \@cntfmts@create@read@counter{#1}{#2}{\csname c@#2\endcsname}}
+
+\newrobustcmd*\NewCounterPattern{%
+ \@ifstar
+ {\@cntfmts@new@counter@pattern}
+ {\@cntfmts@new@counter@pattern@nostar}}
+\@onlypreamble\NewCounterPattern
+
+% renew pattern:
+\newcommand*\@cntfmts@renew@counter@pattern[3][cntfmts]{%
+ \ifcsdef{the#2}
+ {}{\@cntfmts@err@unknown@counter{#2}}%
+ \ifcsdef{@#1@#2@counter}{}
+ {\@cntfmts@err@pattern@undefined{#1}{#2}}%
+ \ifinlistcs{@#1@counter@ids}{#3}
+ {}{\listcsadd{@#1@counter@ids}{#3}}%
+ \@cntfmts@def@counter@read{#1}{#2}{#3}%
+}
+
+\newcommand*\@cntfmts@renew@counter@pattern@nostar[3][cntfmts]{%
+ \@cntfmts@renew@counter@pattern[#1]{#2}{#3}%
+ \@cntfmts@expand@third
+ \@cntfmts@create@read@counter{#1}{#2}{\csname c@#2\endcsname}}
+
+\newrobustcmd\RenewCounterPattern{%
+ \@ifstar
+ {\@cntfmts@renew@counter@pattern}
+ {\@cntfmts@renew@counter@pattern@nostar}}
+\@onlypreamble\RenewCounterPattern
+
+% ----------------------------------------------------------------------------
+% assign a different internal command to <counter> than \c@<counter>
+% can/must be used after a call from \AddCounterPattern* or
+% \NewCounterPattern*
+% #1: module
+% #2: counter
+% #3: internal command
+\def\@cntfmts@create@read@counter#1#2#3{%
+ \expandafter\@cntfmts@defwopt\csname @#1@read@#2@counter\endcsname[]{%
+ \ifblank{##1}
+ {\@arabic{#3}}
+ {\csuse{@cntfmts@counter@type@##1}{#3}}%
+ }%
+}
+
+\newrobustcmd*\ReadCounterFrom[3][cntfmts]{%
+ \@cntfmts@create@read@counter{#1}{#2}{#3}}
+
+% ----------------------------------------------------------------------------
+% pattern formats
+% #1: key
+% #2: number presentation command like \@alph
+\def\@cntfmts@new@pattern@format#1#2{%
+ \csdef{@cntfmts@counter@type@#1}{#2}}
+
+\newrobustcmd*\NewPatternFormat[2]{%
+ \@cntfmts@new@pattern@format{#1}{#2}}
+\@onlypreamble\NewPatternFormat
+
+% ----------------------------------------------------------------------------
+% interpret and print pattern:
+% #1: module
+% #2: list
+% #3: pattern
+\def\@cntfmts@read@counter@pattern#1#2#3{%
+ \def\@cntfmts@parsed@pattern{#3\relax}%
+ \forlistcsloop{\@cntfmts@replace@pattern{#1}}{#2}%
+}
+% #1: module
+% #2: pattern-key
+\def\@cntfmts@replace@pattern#1#2{%
+ \replaceallincs\@cntfmts@parsed@pattern
+ {#2}{{}\csuse{@#1@read@#2@counter}}}
+
+\newrobustcmd*\ReadCounterPattern[2][cntfmts]{%
+ \@cntfmts@read@counter@pattern{#1}{@#1@counter@ids}{#2}\@cntfmts@parsed@pattern}
+
+\newrobustcmd*\ReadCounterPatternFrom[2][cntfmts]{%
+ \@cntfmts@expand@third\@cntfmts@read@counter@pattern{#1}{@#1@counter@ids}{#2}%
+ \@cntfmts@parsed@pattern}
+
+% #1: save pattern in
+% #2: save interpretation in
+% #3: pattern
+% #4: module
+\newcommand*\@cntfmts@save@counter@pattern[4]{%
+ \@cntfmts@read@counter@pattern{#4}{@#4@counter@ids}{#3}%
+ \let#2\@cntfmts@parsed@pattern
+ \def#1{#3}%
+}
+
+\newcommand*\@cntfmts@esave@counter@pattern[4]{%
+ \@cntfmts@read@counter@pattern{#4}{@#4@counter@ids}{#3}%
+ \edef#2{\@cntfmts@parsed@pattern}%
+ \def#1{#3}%
+}
+
+\newrobustcmd*\SaveCounterPattern[4][cntfmts]{%
+ \@cntfmts@save@counter@pattern{#2}{#3}{#4}{#1}}
+
+\newrobustcmd*\SaveCounterPatternFrom[4][cntfmts]{%
+ \@cntfmts@expand@third\@cntfmts@save@counter@pattern{#2}{#3}{#4}{#1}}
+
+\newrobustcmd*\eSaveCounterPattern[4][cntfmts]{%
+ \@cntfmts@esave@counter@pattern{#2}{#3}{#4}{#1}}
+
+\newrobustcmd*\eSaveCounterPatternFrom[4][cntfmts]{%
+ \@cntfmts@expand@third\@cntfmts@esave@counter@pattern{#2}{#3}{#4}{#1}}
+
+% ----------------------------------------------------------------------------
+% predefined formats and pattern
+\NewPatternFormat{a}{\@alph}
+\NewPatternFormat{A}{\@Alph}
+\NewPatternFormat{1}{\@arabic}
+\NewPatternFormat{r}{\@roman}
+\NewPatternFormat{R}{\@Roman}
+
+\ifdef\theparagraph
+ {\AddCounterPattern{paragraph}{pg}}{}
+\ifdef\thesubsubsection
+ {\AddCounterPattern{subsubsection}{ssse}}{}
+\ifdef\thesubsection
+ {\AddCounterPattern{subsection}{sse}}{}
+\ifdef\thesection
+ {\AddCounterPattern{section}{se}}{}
+\ifdef\thechapter
+ {\AddCounterPattern{chapter}{ch}}{}
+
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets.sty b/Master/texmf-dist/tex/latex/exsheets/exsheets.sty
new file mode 100644
index 00000000000..db748f1baf5
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets.sty
@@ -0,0 +1,2045 @@
+% ----------------------------------------------------------------------------
+% the EXSHEETS package
+%
+% Yet another package for the creation of exercise sheets
+%
+% ----------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% ----------------------------------------------------------------------------
+% Copyright 2011-2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% ----------------------------------------------------------------------------
+% The exsheets package consists of the files
+% - exsheets.sty, exsheets_headings.def, exsheets_headings.cfg,
+% exsheets_tasks.def, exsheets_tasks.cfg, exsheets_configurations.cfg,
+% - exsheets_en.tex, exsheets_en.pdf,
+% - README
+% ----------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% ----------------------------------------------------------------------------
+\def\exsheets@date{2012/10/08}
+\def\exsheets@version{0.2b}
+
+\RequirePackage { expl3 , xparse }
+\ProvidesExplPackage
+ {exsheets}
+ {\exsheets@date}
+ {\exsheets@version}
+ {Yet another package for the creation of exercise sheets and exams.}
+
+% ----------------------------------------------------------------------------
+% temporary variables
+\tl_new:N \l__exsheets_tmpa_tl
+\tl_new:N \l__exsheets_tmpb_tl
+\tl_new:N \l__exsheets_tmpc_tl
+\int_new:N \l__exsheets_tmpa_int
+\int_new:N \l__exsheets_tmpb_int
+\dim_new:N \l__exsheets_tmpa_dim
+\seq_new:N \l__exsheets_tmpa_seq
+\fp_new:N \l__exsheets_tmpa_fp
+\clist_new:N \l__exsheets_tmpa_clist
+
+% ----------------------------------------------------------------------------
+% messages
+\msg_new:nnn { exsheets} { totalpoints }
+ {
+ You~need~to~activate~"points/parse"~if~you~want~to~use~
+ \token_to_str:N \totalpoints .~I~will~do~nothing~instead.
+ }
+
+\msg_new:nnn { exsheets} { headings }
+ {
+ You~requested~the~headings~instance~`#1'~which~is~not~defined.~Did~you~
+ forget~to~use~the~package~option~`load-headings'?~Anyway,~I~will~use~the~
+ instance~`block'~instead~and~pretend~nothing~happened.
+ }
+
+\msg_new:nnn { exsheets } { random }
+ {
+ You~asked~me~to~select~#1~questions~from~file~#2~but~there~are~only~#3.~
+ I'll~select~all~of~them.
+ }
+
+\msg_new:nnn { exsheets } { only-inside-question }
+ {
+ The~command~\token_to_str:N #1 \c_space_tl can~only~be~used~inside~
+ the~question~environment.
+ }
+
+\msg_new:nnn { exsheets } { loading-configurations }
+ { Loading~custom~configurations~file~`exsheets_configurations.cgf'. }
+
+\msg_new:nnn { exsheets } { deprecated-command }
+ {
+ The~command~"~\token_to_str:N #1 \c_space_tl"~is~deprecated.~
+ Use~"~\token_to_str:N #2 \c_space_tl"~instead.
+ }
+
+\msg_new:nnn { exsheets } { grade-missing }
+ { The~grade~`#1'~has~never~been~declared. }
+
+\msg_new:nnn { exsheets } { grade-parse }
+ {
+ I~cannot~calculate~the~points~for~grade~`#1'~since~you're~using~the~option~
+ `points/parse=false'.
+ }
+
+\cs_new:Npn \exsheets_depr_cmd:nn #1#2
+ {
+ \cs_new:Npn #1
+ { \msg_warning:nnnn { exsheets } { deprecated-command } { #1 } { #2 } #2 }
+ }
+
+% ----------------------------------------------------------------------------
+\RequirePackage
+ { xtemplate , l3sort , l3keys2e , xcolor , etoolbox , environ , lcg , silence }
+
+% ----------------------------------------------------------------------------
+% color:
+\xdefinecolor { exsheetsblue } { rgb } { 0.02 , 0.04 , 0.48 }
+\xdefinecolor { exsheetsred } { rgb } { 0.65 , 0.04 , 0.07 }
+\tl_new:N \g__exsheets_color_tl
+\tl_gset:Nn \g__exsheets_color_tl { exsheetsblue }
+
+% ----------------------------------------------------------------------------
+% how are questions/solutions/... counted?
+\bool_new:N \l__exsheets_print_number_bool
+\bool_set_true:N \l__exsheets_print_number_bool
+
+\tl_new:N \l__exsheets_qu_counter_pattern_tl
+\tl_set:Nn \l__exsheets_qu_counter_pattern_tl { qu. }
+\tl_new:N \l__exsheets_qu_counter_interpretation_tl
+\tl_new:N \l__exsheets_counter_patterns_tl
+\tl_new:N \l__exsheets_current_pattern_interpretation_tl
+\tl_new:N \l__exsheets_current_pattern_tl
+
+\RequirePackage { cntformats }
+
+\cs_if_exist:NT \thechapter
+ {
+ \AddCounterPattern* [ exsheets ] { chapter } { ch }
+ \ReadCounterFrom [ exsheets ] { chapter } \l__exsheets_counter_ch_int
+ }
+
+\AddCounterPattern* [ exsheets ] { section } { se }
+\ReadCounterFrom [ exsheets ] { section } \l__exsheets_counter_sec_int
+
+\NewCounterPattern* [ exsheets ] { question } { qu }
+\ReadCounterFrom [ exsheets ] { question } \l__exsheets_counter_qu_int
+
+% ----------------------------------------------------------------------------
+% (also) package options:
+\bool_new:N \l__exsheets_load_headings_bool
+\bool_new:N \l__exsheets_load_tasks_bool
+\bool_new:N \l__exsheets_solutions_by_ref_bool
+\bool_new:N \l__exsheets_questions_totoc_bool
+\bool_new:N \l__exsheets_solutions_totoc_bool
+
+\tl_new:N \l__exsheets_heading_instance_tl
+\tl_set:Nn \l__exsheets_heading_instance_tl { block }
+\tl_new:N \l__exsheets_heading_title_user_format_tl
+\tl_set:Nn \l__exsheets_heading_title_user_format_tl { \normalsize\bfseries }
+\tl_new:N \l__exsheets_questions_toclevel_tl
+\tl_set:Nn \l__exsheets_questions_toclevel_tl { subsection }
+\tl_new:N \l__exsheets_solutions_toclevel_tl
+\tl_set:Nn \l__exsheets_solutions_toclevel_tl { subsection }
+
+\AtBeginDocument{
+ \cs_if_exist:NF \phantomsection
+ { \cs_new:Npn \phantomsection {} }
+}
+
+\keys_define:nn { exsheets }
+ {
+ color .tl_gset:N = \g__exsheets_color_tl ,
+ counter-format .code:n =
+ \SaveCounterPattern [ exsheets ]
+ \l__exsheets_qu_counter_pattern_tl
+ \l__exsheets_qu_counter_interpretation_tl
+ { #1 } ,
+ counter-within .code:n = \@addtoreset{question}{#1} ,
+ headings .tl_set:N = \l__exsheets_heading_instance_tl ,
+ load-headings .bool_set:N = \l__exsheets_load_headings_bool ,
+ headings-format .tl_set:N = \l__exsheets_heading_title_user_format_tl ,
+ load-tasks .bool_set:N = \l__exsheets_load_tasks_bool ,
+ use-ref .bool_set:N = \l__exsheets_solutions_by_ref_bool ,
+ totoc .choice: ,
+ totoc / true .code:n =
+ \bool_set_true:N \l__exsheets_questions_totoc_bool
+ \bool_set_true:N \l__exsheets_solutions_totoc_bool ,
+ totoc / false .code:n =
+ \bool_set_false:N \l__exsheets_questions_totoc_bool
+ \bool_set_false:N \l__exsheets_solutions_totoc_bool ,
+ totoc .default:n = true ,
+ questions-totoc .bool_set:N = \l__exsheets_questions_totoc_bool ,
+ solutions-totoc .bool_set:N = \l__exsheets_solutions_totoc_bool ,
+ toc-level .code:n =
+ \tl_set:Nn \l__exsheets_questions_toclevel_tl { #1 }
+ \tl_set:Nn \l__exsheets_solutions_toclevel_tl { #1 } ,
+ questions-toc-level .tl_set:N = \l__exsheets_questions_toclevel_tl ,
+ solutions-toc-level .tl_set:N = \l__exsheets_solutions_toclevel_tl
+ }
+\keys_set:nn { exsheets} { counter-format = qu. }
+
+% process package options:
+\ProcessKeysOptions { exsheets }
+
+% ----------------------------------------------------------------------------
+% points for exercises
+\bool_new:N \l__exsheets_points_questions_default_bool
+\bool_set_false:N \l__exsheets_points_questions_default_bool
+\bool_new:N \l__exsheets_parse_points_bool
+\bool_set_true:N \l__exsheets_parse_points_bool
+\bool_new:N \l__exsheets_points_name_bool
+\bool_set_true:N \l__exsheets_points_name_bool
+\bool_new:N \l__exsheets_points_separate_bonus_bool
+
+\fp_new:N \g__exsheets_points_sum_fp
+\fp_new:N \l__exsheets_points_default_fp
+\fp_set:Nn \l__exsheets_points_default_fp { 1 }
+\fp_new:N \l__exsheets_question_points_fp
+\fp_new:N \g__exsheets_total_points_fp
+\fp_new:N \g__exsheets_bonus_sum_fp
+\fp_new:N \l__exsheets_question_bonus_fp
+\fp_new:N \g__exsheets_total_bonus_fp
+
+\tl_new:N \l__exsheets_points_name_tl
+\tl_set:Nn \l__exsheets_points_name_tl { P. }
+\tl_new:N \l__exsheets_points_name_plural_tl
+\tl_set:Nn \l__exsheets_points_name_plural_tl { P. }
+\tl_new:N \l__exsheets_bonus_name_tl
+\tl_set:Nn \l__exsheets_bonus_name_tl { P. }
+\tl_new:N \l__exsheets_bonus_name_plural_tl
+\tl_set:Nn \l__exsheets_bonus_name_plural_tl { P. }
+\tl_new:N \l__exsheets_points_number_format_tl
+\tl_new:N \l__exsheets_bonus_number_format_tl
+\tl_new:N \l__exsheets_points_pre_bonus_marker_tl
+\tl_set:Nn \l__exsheets_points_pre_bonus_marker_tl { (+ }
+\tl_new:N \l__exsheets_points_post_bonus_marker_tl
+\tl_set:Nn \l__exsheets_points_post_bonus_marker_tl { ) }
+
+\cs_new_nopar:Npn \exsheets_set_points_name:n #1
+ {
+ \tl_if_in:nnTF { #1 } { / }
+ { \__exsheets_set_points_name_aux:nn #1 \q_stop }
+ { \__exsheets_set_points_name_aux:nn #1 / \q_stop }
+ }
+
+\cs_new_nopar:Npn \__exsheets_set_points_name_aux:nn #1/#2 \q_stop
+ {
+ \tl_set:Nn \l__exsheets_points_name_tl { #1 }
+ \tl_set:Nn \l__exsheets_points_name_plural_tl { #1#2 }
+ }
+
+\cs_new_nopar:Npn \exsheets_set_bonus_name:n #1
+ {
+ \tl_if_in:nnTF { #1 } { / }
+ { \__exsheets_set_bonus_name_aux:nn #1 \q_stop }
+ { \__exsheets_set_bonus_name_aux:nn #1 / \q_stop }
+ }
+
+\cs_new_nopar:Npn \__exsheets_set_bonus_name_aux:nn #1/#2 \q_stop
+ {
+ \tl_set:Nn \l__exsheets_bonus_name_tl { #1 }
+ \tl_set:Nn \l__exsheets_bonus_name_plural_tl { #1#2 }
+ }
+
+% FIXME: \fp_add will deprecate!
+\cs_new_nopar:Npn \exsheets_add_points:n #1
+ { \fp_gadd:Nn \g__exsheets_points_sum_fp { #1 } }
+\cs_generate_variant:Nn \exsheets_add_points:n { V }
+
+\cs_new_nopar:Npn \exsheets_add_bonus:n #1
+ { \fp_gadd:Nn \g__exsheets_bonus_sum_fp { #1 } }
+\cs_generate_variant:Nn \exsheets_add_bonus:n { V }
+
+\cs_new_nopar:Npn \exsheets@sum@of@points #1
+ { \fp_gset:Nn \g__exsheets_total_points_fp { #1 } }
+
+\cs_new_nopar:Npn \exsheets@sum@of@bonus #1
+ { \fp_gset:Nn \g__exsheets_total_bonus_fp { #1 } }
+
+\cs_new_nopar:Npn \exsheets_parse_points:n #1
+ {
+ \group_begin:
+ \tl_use:N \l__exsheets_points_number_format_tl
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ { \exsheets_num:n { \fp_to_decimal:n { #1 } } }
+ { \use:n { \fp_to_decimal:n { #1 } } }
+ }
+ \group_end:
+ }
+\cs_generate_variant:Nn \exsheets_parse_points:n { V }
+
+\cs_new_nopar:Npn \exsheets_parse_bonus:n #1
+ {
+ \group_begin:
+ \tl_use:N \l__exsheets_bonus_number_format_tl
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ { \exsheets_num:n { \fp_to_decimal:n { #1 } } }
+ { \use:n { \fp_to_decimal:n { #1 } } }
+ }
+ \group_end:
+ }
+\cs_generate_variant:Nn \exsheets_parse_bonus:n { V }
+
+\cs_new_nopar:Npn \exsheets_num:n #1
+ {
+ \group_begin:
+ \fp_set:Nn \l__exsheets_tmpa_tl { #1 }
+ \fp_to_tl:N \l__exsheets_tmpa_tl
+ \group_end:
+ }
+\cs_generate_variant:Nn \exsheets_num:n { x }
+
+\cs_new_nopar:Npn \exsheets_points_name:n #1
+ {
+ \bool_if:NT \l__exsheets_points_name_bool
+ {
+ \,
+ \hbox:n
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ {
+ \tl_if_eq:nnTF { #1 } { ?? }
+ { \tl_use:N \l__exsheets_points_name_plural_tl }
+ {
+ \fp_compare:nTF { #1 <= 1 }
+ { \tl_use:N \l__exsheets_points_name_tl }
+ { \tl_use:N \l__exsheets_points_name_plural_tl }
+ }
+ }
+ { \tl_use:N \l__exsheets_points_name_plural_tl }
+ }
+ }
+ }
+\cs_generate_variant:Nn \exsheets_points_name:n { V }
+
+\cs_new_nopar:Npn \exsheets_bonus_name:n #1
+ {
+ \bool_if:NT \l__exsheets_points_name_bool
+ {
+ \,
+ \hbox:n
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ {
+ \tl_if_eq:nnTF { #1 } { ?? }
+ { \tl_use:N \l__exsheets_bonus_name_plural_tl }
+ {
+ \fp_compare:nTF { #1 <= 1 }
+ { \tl_use:N \l__exsheets_bonus_name_tl }
+ { \tl_use:N \l__exsheets_bonus_name_plural_tl }
+ }
+ }
+ { \tl_use:N \l__exsheets_bonus_name_plural_tl }
+ }
+ }
+ }
+\cs_generate_variant:Nn \exsheets_bonus_name:n { V }
+
+\NewDocumentCommand \addpoints { sm }
+ {
+ \bool_if:NTF \l__exsheets_inside_question_bool
+ {
+ \exsheets_add_points:n { #2 }
+ \IfBooleanF { #1 } { \exsheets_print_points:n { #2 } }
+ }
+ { \msg_error:nnn { exsheets } { only-inside-question } { \addpoints } }
+ }
+
+\NewDocumentCommand \addbonus { sm }
+ {
+ \bool_if:NTF \l__exsheets_inside_question_bool
+ {
+ \exsheets_add_bonus:n { #2 }
+ \IfBooleanF { #1 } { \exsheets_print_bonus:n { #2 } }
+ }
+ { \msg_error:nnn { exsheets } { only-inside-question } { \addbonus } }
+ }
+
+\NewDocumentCommand \points { sm }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_points:n { #2 } }
+ { \exsheets_print_points:n { #2 } }
+ }
+
+\NewDocumentCommand \bonus { sm }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_bonus:n { #2 } }
+ { \exsheets_print_bonus:n { #2 } }
+ }
+
+\cs_new_nopar:Npn \exsheets_print_points:n #1
+ {
+ \exsheets_parse_points:n { #1 }
+ \exsheets_points_name:n { #1 }
+ }
+\cs_generate_variant:Nn \exsheets_print_points:n { V }
+
+\cs_new_nopar:Npn \exsheets_print_bonus:n #1
+ {
+ \exsheets_parse_bonus:n { #1 }
+ \exsheets_bonus_name:n { #1 }
+ }
+\cs_generate_variant:Nn \exsheets_print_bonus:n { V }
+
+\NewDocumentCommand \pointssum { s }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_points:n { \g__exsheets_total_points_fp } }
+ { \exsheets_print_points:n { \g__exsheets_total_points_fp } }
+ }
+
+\NewDocumentCommand \bonussum { s }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_bonus:n { \g__exsheets_total_bonus_fp } }
+ { \exsheets_print_bonus:n { \g__exsheets_total_bonus_fp } }
+ }
+
+\NewDocumentCommand \currentpointssum { s }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_points:n { \g__exsheets_points_sum_fp } }
+ { \exsheets_print_points:n { \g__exsheets_points_sum_fp } }
+ }
+
+\NewDocumentCommand \currentbonussum { s }
+ {
+ \IfBooleanTF { #1 }
+ { \exsheets_parse_bonus:n { \g__exsheets_bonus_sum_fp } }
+ { \exsheets_print_bonus:n { \g__exsheets_bonus_sum_fp } }
+ }
+
+\NewDocumentCommand \totalpoints { s }
+ {
+ \exsheets_totalpoints:
+ \IfBooleanF { #1 }
+ {
+ \bool_if:nT
+ {
+ \l__exsheets_points_separate_bonus_bool ||
+ \fp_compare_p:n { \g__exsheets_total_bonus_fp = 0 }
+ }
+ { \exsheets_points_name:n { \g__exsheets_total_points_fp } }
+ }
+ \exsheets_totalbonus:
+ \IfBooleanF { #1 }
+ {
+ \fp_compare:nF { \g__exsheets_total_bonus_fp = 0 }
+ {
+ \bool_if:NTF \l__exsheets_points_separate_bonus_bool
+ { \exsheets_bonus_name:n { \g__exsheets_total_bonus_fp } }
+ {
+ \exsheets_points_name:n
+ { \g__exsheets_total_points_fp + \g__exsheets_total_bonus_fp }
+ }
+ }
+ }
+ }
+
+\exsheets_depr_cmd:nn { \sumpoints } { \totalpoints* }
+
+\cs_new_nopar:Npn \exsheets_totalpoints:
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ {
+ \fp_compare:nTF { \g__exsheets_total_points_fp = 0 }
+ { ?? \, \exsheets_points_name:n { ?? } }
+ {
+ \exsheets_parse_points:n
+ { \g__exsheets_total_points_fp }
+ }
+ }
+ { \msg_warning:nn { exsheets } { totalpoints } }
+ }
+
+\cs_new_nopar:Npn \exsheets_totalbonus:
+ {
+ \bool_if:NT \l__exsheets_parse_points_bool
+ {
+ \fp_compare:nF { \g__exsheets_total_bonus_fp = 0 }
+ {
+ \tl_use:N \c_space_tl
+ \tl_use:N \l__exsheets_points_pre_bonus_marker_tl
+ \exsheets_parse_bonus:n
+ { \g__exsheets_total_bonus_fp }
+ \tl_use:N \l__exsheets_points_post_bonus_marker_tl
+ }
+ }
+ }
+
+\keys_define:nn { exsheets / points }
+ {
+ name .code:n =
+ \exsheets_set_points_name:n { #1 }
+ \exsheets_set_bonus_name:n { #1 } ,
+ name-plural .code:n =
+ \tl_set:Nn \l__exsheets_points_name_plural_tl { #1 }
+ \tl_set:Nn \l__exsheets_bonus_name_plural_tl { #1 } ,
+ bonus-name .code:n = \exsheets_set_bonus_name:n { #1 } ,
+ bonus-plural .tl_set:N = \l__exsheets_bonus_name_plural_tl ,
+ pre-bonus .tl_set:N = \l__exsheets_points_pre_bonus_marker_tl ,
+ post-bonus .tl_set:N = \l__exsheets_points_post_bonus_marker_tl ,
+ use-name .bool_set:N = \l__exsheets_points_name_bool ,
+ number-format .tl_set:N = \l__exsheets_points_number_format_tl ,
+ bonus-format .tl_set:N = \l__exsheets_bonus_number_format_tl ,
+ parse .bool_set:N = \l__exsheets_parse_points_bool ,
+ separate-bonus .bool_set:N = \l__exsheets_points_separate_bonus_bool
+ }
+
+% ----------------------------------------------------------------------------
+% Noten-Verteilung
+\prop_new:N \l__exsheets_relgrades_prop
+\fp_new:N \l__exsheets_grade_round_fp
+\fp_zero:N \l__exsheets_grade_round_fp
+\bool_new:N \l__exsheets_grades_half_bool
+
+\cs_new:Npn \__exsheets_fp_round_to_half:n #1
+ { round( 2*(#1),0)/2 }
+
+\cs_new:Npn \__exsheets_grades_round:n #1
+ { round ( #1 , \l__exsheets_grade_round_fp ) }
+
+\cs_new:Npn \__exsheets_grade_rounded:
+ {
+ \bool_if:NTF { \l__exsheets_grades_half_bool }
+ { \__exsheets_fp_round_to_half:n }
+ { \__exsheets_grades_round:n }
+ { \g__exsheets_total_points_fp * \l__exsheets_tmpa_fp }
+ }
+
+\cs_new:Npn \exsheets_strip_braces:N #1
+ { \exp_after:wN \__exsheets_strip_braces:w \exp_after:wN #1#1 \q_stop }
+\cs_new:Npn \__exsheets_strip_braces:w #1#2 \q_stop
+ { \tl_set:Nn #1 { #2 } }
+
+\cs_new:Npn \__exsheets_declare_relgrades:n #1
+ {
+ \clist_set:Nn \l__exsheets_tmpa_clist { #1 }
+ \clist_map_inline:Nn \l__exsheets_tmpa_clist
+ { \__exsheets_declare_relgrade:w ##1 \q_stop }
+ }
+
+\cs_new:Npn \__exsheets_declare_relgrade:w #1 = #2 \q_stop
+ {
+ \tl_set:Nn \l__exsheets_tmpa_tl { #1 }
+ \tl_set:Nn \l__exsheets_tmpb_tl { #2 }
+ \tl_trim_spaces:N \l__exsheets_tmpa_tl
+ \exsheets_strip_braces:N \l__exsheets_tmpa_tl
+ \tl_trim_spaces:N \l__exsheets_tmpb_tl
+ \exsheets_strip_braces:N \l__exsheets_tmpb_tl
+ \prop_put:NVV \l__exsheets_relgrades_prop
+ \l__exsheets_tmpa_tl
+ \l__exsheets_tmpb_tl
+ }
+
+\NewDocumentCommand \DeclareRelGrades { m }
+ { \__exsheets_declare_relgrades:n { #1 } }
+\@onlypreamble\DeclareRelGrades
+
+\cs_new:Npn \__exsheets_grade:nn #1#2
+ {
+ \prop_get:NnNTF \l__exsheets_relgrades_prop { #2 } \l__exsheets_tmpa_fp
+ {
+ \bool_if:NTF \l__exsheets_parse_points_bool
+ {
+ \exsheets_parse_points:n
+ { min( \__exsheets_grade_rounded: , \g__exsheets_total_points_fp ) }
+ \int_compare:nT { #1 = 1 }
+ {
+ \exsheets_points_name:n
+ { min( \__exsheets_grade_rounded: , \g__exsheets_total_points_fp ) }
+ }
+ }
+ { \msg_warning:nnn { exsheets } { grade-parse } { #1 } \textbf{??} }
+ }
+ { \msg_warning:nnn { exsheets } { grade-missing } { #1 } \textbf{??} }
+ }
+
+\NewDocumentCommand \grade { sm }
+ {
+ \IfBooleanTF { #1 }
+ { \__exsheets_grade:nn { 0 } { #2 } }
+ { \__exsheets_grade:nn { 1 } { #2 } }
+ }
+
+\keys_define:nn { exsheets / grades }
+ {
+ round .fp_set:N = \l__exsheets_grade_round_fp ,
+ half .bool_set:N = \l__exsheets_grades_half_bool
+ }
+
+% ----------------------------------------------------------------------------
+% Aufgaben und Lösungen
+
+% Einteilung in Klassen und Themen
+\prop_new:N \g__exsheets_questions_class_prop
+\prop_new:N \g__exsheets_classes_prop
+\prop_new:N \g__exsheets_classes_active_prop
+\prop_new:N \g__exsheets_questions_topic_prop
+\prop_new:N \g__exsheets_topics_prop
+\prop_new:N \g__exsheets_topics_active_prop
+
+\bool_new:N \g__exsheets_questions_use_bool
+\bool_gset_true:N \g__exsheets_questions_use_bool
+\bool_new:N \l__exsheets_questions_use_bool
+\bool_set_true:N \l__exsheets_questions_use_bool
+\bool_new:N \l__exsheets_questions_deactivate_bool
+\bool_new:N \l__exsheets_questions_class_bool
+\bool_set_false:N \l__exsheets_questions_class_bool
+\bool_new:N \g__exsheets_use_classes_bool
+\bool_gset_false:N \g__exsheets_use_classes_bool
+\bool_new:N \l__exsheets_class_active_bool
+\bool_new:N \l__exsheets_questions_topic_bool
+\bool_set_false:N \l__exsheets_questions_topic_bool
+\bool_new:N \g__exsheets_use_topics_bool
+\bool_gset_false:N \g__exsheets_use_topics_bool
+\bool_new:N \l__exsheets_topic_active_bool
+\bool_new:N \l__exsheets_solutions_use_bool
+\bool_set_true:N \l__exsheets_solutions_use_bool
+
+\tl_new:N \l__exsheets_questions_class_tl
+\tl_new:N \l__exsheets_questions_topic_tl
+
+\dim_new:N \l__exsheets_questions_skip_below_dim
+\dim_set:Nn \l__exsheets_questions_skip_below_dim { .5\baselineskip }
+\dim_new:N \l__exsheets_solutions_skip_below_dim
+\dim_set:Nn \l__exsheets_solutions_skip_below_dim { .5\baselineskip }
+
+\cs_new_nopar:Npn \exsheets_glue:N #1
+ { \cleaders \vbox:n {} \skip_vertical:N #1 }
+
+\keys_define:nn { exsheets }
+ {
+ use-classes .code:n =
+ {
+ \bool_gset_true:N \g__exsheets_use_classes_bool
+ \__exsheets_activate_classes:n { #1 }
+ } ,
+ use-topics .code:n =
+ {
+ \bool_gset_true:N \g__exsheets_use_topics_bool
+ \__exsheets_activate_topics:n { #1 }
+ } ,
+ skip-below .code:n =
+ \dim_set:Nn \l__exsheets_questions_skip_below_dim { #1 }
+ \dim_set:Nn \l__exsheets_solutions_skip_below_dim { #1 }
+ }
+
+\cs_new:Npn \__exsheets_activate_classes:n #1
+ {
+ \prop_gclear:N \g__exsheets_classes_active_prop
+ \seq_set_split:Nnn \l__exsheets_tmpa_seq { , } { #1 }
+ \seq_map_inline:Nn \l__exsheets_tmpa_seq
+ {
+ \prop_gput:Nnn \g__exsheets_classes_active_prop
+ { ##1 } { \__exsheets_dummy: }
+ }
+ }
+
+\cs_new:Npn \__exsheets_activate_topics:n #1
+ {
+ \prop_gclear:N \g__exsheets_topics_active_prop
+ \seq_set_split:Nnn \l__exsheets_tmpa_seq { , } { #1 }
+ \seq_map_inline:Nn \l__exsheets_tmpa_seq
+ {
+ \prop_gput:Nnn \g__exsheets_topics_active_prop
+ { ##1 } { \__exsheets_dummy: }
+ }
+ }
+
+\cs_new_nopar:Npn \__exsheets_questions_use_classes:
+ {
+ % is there a class provided?
+ \bool_if:NT \l__exsheets_questions_class_bool
+ {
+ % add class to questions property
+ \prop_gput:Nff \g__exsheets_questions_class_prop
+ { \int_to_arabic:n { \g__exsheets_questions_id_int } }
+ { \l__exsheets_questions_class_tl }
+ % add to classes list, if it's a new one
+ \prop_get:NoN \g__exsheets_classes_prop
+ { \l__exsheets_questions_class_tl }
+ \l__exsheets_tmpa_tl
+ \tl_if_eq:NNT \l__exsheets_tmpa_tl \q_no_value
+ {
+ \prop_gput:Nfn \g__exsheets_classes_prop
+ { \l__exsheets_questions_class_tl }
+ { \__exsheets_dummy: }
+ }
+ }
+ % are we using classes?
+ \bool_if:NT \g__exsheets_use_classes_bool
+ {
+ % is this question an active one?
+ \prop_get:NoN \g__exsheets_classes_active_prop
+ { \l__exsheets_questions_class_tl }
+ \l__exsheets_tmpa_tl
+ \tl_if_eq:NNTF \l__exsheets_tmpa_tl \q_no_value
+ {
+ \bool_set_false:N \l__exsheets_class_active_bool
+ \bool_set_false:N \l__exsheets_questions_print_bool
+ }
+ { \bool_set_true:N \l__exsheets_class_active_bool }
+ }
+ }
+
+\cs_new_nopar:Npn \__exsheets_questions_use_topics:
+ {
+ % is there a topic provided?
+ \bool_if:NT \l__exsheets_questions_topic_bool
+ {
+ % add topic to questions property
+ \prop_gput:Nff \g__exsheets_questions_topic_prop
+ { \int_to_arabic:n { \g__exsheets_questions_id_int } }
+ { \l__exsheets_questions_topic_tl }
+ % add to topics list, if it's a new one
+ \prop_get:NoN \g__exsheets_topics_prop
+ { \l__exsheets_questions_topic_tl }
+ \l__exsheets_tmpa_tl
+ \tl_if_eq:NNT \l__exsheets_tmpa_tl \q_no_value
+ {
+ \prop_gput:Nfn \g__exsheets_topics_prop
+ { \l__exsheets_questions_topic_tl }
+ { \__exsheets_dummy: }
+ }
+ }
+ % are we using topics?
+ \bool_if:NT \g__exsheets_use_topics_bool
+ {
+ % is this question an active one?
+ \prop_get:NoN \g__exsheets_topics_active_prop
+ { \l__exsheets_questions_topic_tl }
+ \l__exsheets_tmpa_tl
+ \tl_if_eq:NNTF \l__exsheets_tmpa_tl \q_no_value
+ {
+ \bool_set_false:N \l__exsheets_topic_active_bool
+ \bool_set_false:N \l__exsheets_questions_print_bool
+ }
+ { \bool_set_true:N \l__exsheets_topic_active_bool }
+ }
+ \int_set:Nn \l__exsheets_counter_qu_int { \arabic{question} }
+ }
+
+\cs_new_nopar:Npn \__exsheets_solutions_use_classes:
+ {
+ % are we using classes?
+ \bool_if:NT \g__exsheets_use_classes_bool
+ {
+ % is the question to this solution an active one?
+ % get question number from ID
+ \prop_get:NoN \g__exsheets_questions_id_prop
+ { \g__exsheets_questions_current_id_tl } \l__exsheets_tmpa_tl
+ % get question class from number
+ \prop_get:NoN \g__exsheets_questions_class_prop
+ { \l__exsheets_tmpa_tl } \l__exsheets_tmpb_tl
+ % test if class is active
+ \prop_get:NoN \g__exsheets_classes_active_prop
+ { \l__exsheets_tmpb_tl } \l__exsheets_tmpc_tl
+ \tl_if_eq:NNTF \l__exsheets_tmpc_tl \q_no_value
+ { \bool_set_false:N \l__exsheets_solutions_use_bool }
+ { \bool_set_true:N \l__exsheets_solutions_use_bool }
+ }
+ }
+
+\cs_new_nopar:Npn \__exsheets_solutions_use_topics:
+ {
+ % are we using topics?
+ \bool_if:NTF \g__exsheets_use_topics_bool
+ {
+ % is the question to this solution an active one?
+ % get question number from ID
+ \prop_get:NoN \g__exsheets_questions_id_prop
+ { \g__exsheets_questions_current_id_tl } \l__exsheets_tmpa_tl
+ % get question topic from number
+ \prop_get:NoN \g__exsheets_questions_topic_prop
+ { \l__exsheets_tmpa_tl } \l__exsheets_tmpb_tl
+ % test if topic is active
+ \prop_get:NoN \g__exsheets_topics_active_prop
+ { \l__exsheets_tmpb_tl } \l__exsheets_tmpc_tl
+ \tl_if_eq:NNT \l__exsheets_tmpc_tl \q_no_value
+ { \bool_set_false:N \l__exsheets_solutions_use_bool }
+ }
+ {
+ \bool_if:NF \g__exsheets_use_classes_bool
+ { \bool_set_true:N \l__exsheets_solutions_use_bool }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+% die 'question' Umgebung
+\tl_new:N \l__exsheets_questions_name_tl
+\tl_set:Nn \l__exsheets_questions_name_tl { Question }
+\tl_new:N \l__exsheets_exsheets_name_tl
+\tl_set:Nn \l__exsheets_exsheets_name_tl { Exercise }
+
+\bool_new:N \l__exsheets_questions_print_bool
+\bool_set_true:N \l__exsheets_questions_print_bool
+\bool_new:N \l__exsheets_inside_question_bool
+
+\int_new:N \g__exsheets_questions_id_int
+\int_gzero:N \g__exsheets_questions_id_int
+
+\NewEnviron { __exsheets_questions_internal: }
+ {
+ \cspreto { BODY } { \ifhmode \vspace*{0pt} \fi }
+ \csappto { BODY }
+ {
+ \par
+ \dim_compare:nNnT { \parskip } = { 0pt }
+ { \exsheets_glue:N \l__exsheets_questions_skip_below_dim }
+ }
+ \bool_if:nT
+ {
+ \l__exsheets_questions_print_bool &&
+ \g__exsheets_questions_use_bool &&
+ !\l__exsheets_questions_deactivate_bool
+ }
+ {
+ \__exsheets_save_number_in:N \g__exsheets_question_number_prop
+ \BODY
+ }
+ }
+
+\prop_new:N \g__exsheets_questions_id_prop
+
+\tl_new:N \l__exsheets_questions_id_tl
+\tl_new:N \g__exsheets_questions_current_id_tl
+\tl_new:N \l__exsheets_title_tl
+
+\bool_new:N \l__exsheets_points_not_given_bool
+
+\cs_new:Npn \__exsheets_read_points:w #1+#2+#3 \q_stop
+ {
+ \tl_if_blank:nTF { #1 }
+ { \fp_zero:N \l__exsheets_question_points_fp }
+ { \fp_set:Nn \l__exsheets_question_points_fp { #1 } }
+ \tl_if_blank:nTF { #2 }
+ { \fp_zero:N \l__exsheets_question_bonus_fp }
+ {
+ \tl_if_blank:nTF { #3 }
+ { \fp_zero:N \l__exsheets_question_bonus_fp }
+ { \fp_set:Nn \l__exsheets_question_bonus_fp { #2 } }
+ }
+ }
+\cs_new:Npn \__exsheets_read_points:n #1
+ { \__exsheets_read_points:w #1++ \q_stop }
+
+\NewDocumentEnvironment { question } { og }
+ {
+ \bool_set_true:N \l__exsheets_inside_question_bool
+ \bool_if:NT \l__exsheets_questions_use_bool
+ { \bool_gset_true:N \g__exsheets_questions_use_bool }
+ % Optionen:
+ \IfNoValueF { #1 } { \keys_set:nn { exsheets / question } { #1 } }
+ % Punktevergabe:
+ \IfNoValueTF { #2 }
+ {
+ \__exsheets_read_points:n { 0 }
+ \bool_if:NT \l__exsheets_points_questions_default_bool
+ {
+ \fp_set_eq:NN
+ \l__exsheets_question_points_fp
+ \l__exsheets_points_default_fp
+ }
+ }
+ { \__exsheets_read_points:n { #2 } }
+ % ID:
+ \int_gincr:N \g__exsheets_questions_id_int
+ \tl_if_blank:VTF \l__exsheets_questions_id_tl
+ {
+ \prop_gput:NVV \g__exsheets_questions_id_prop
+ \g__exsheets_questions_id_int
+ \g__exsheets_questions_id_int
+ \tl_gset:Nx \g__exsheets_questions_current_id_tl
+ { \int_use:N \g__exsheets_questions_id_int }
+ }
+ {
+ \prop_gput:NVV \g__exsheets_questions_id_prop
+ \l__exsheets_questions_id_tl
+ \g__exsheets_questions_id_int
+ \tl_gset:Nx \g__exsheets_questions_current_id_tl
+ { \tl_use:N \l__exsheets_questions_id_tl }
+ }
+ % Auswahl der Frage:
+ \__exsheets_select_question:V \g__exsheets_questions_current_id_tl
+ \bool_if:nT
+ {
+ \g__exsheets_questions_use_bool &&
+ !\l__exsheets_questions_deactivate_bool
+ }
+ {
+ \__exsheets_questions_use_classes:
+ \__exsheets_questions_use_topics:
+ \bool_if:nT
+ {
+ ( \l__exsheets_class_active_bool && \l__exsheets_topic_active_bool ) ||
+ ( \l__exsheets_class_active_bool && !\g__exsheets_use_topics_bool ) ||
+ ( !\g__exsheets_use_classes_bool && \l__exsheets_topic_active_bool ) ||
+ ( !\g__exsheets_use_classes_bool && !\g__exsheets_use_topics_bool )
+ }
+ { \refstepcounter{question} }
+ \cs_if_exist:NT \chapter
+ { \int_set:Nn \l__exsheets_counter_ch_int { \arabic{chapter} } }
+ \int_set:Nn \l__exsheets_counter_sec_int { \arabic{section} }
+ \int_set:Nn \l__exsheets_counter_qu_int { \arabic{question} }
+ \bool_if:nT
+ {
+ (
+ \l__exsheets_points_questions_default_bool &&
+ \l__exsheets_parse_points_bool
+ ) ||
+ (
+ \l__exsheets_parse_points_bool &&
+ \l__exsheets_questions_print_bool
+ )
+ }
+ {
+ \exsheets_add_points:V \l__exsheets_question_points_fp
+ \exsheets_add_bonus:V \l__exsheets_question_bonus_fp
+ }
+ \bool_if:NT \l__exsheets_questions_print_bool
+ {
+ \bool_if:NTF \l__exsheets_exam_bool
+ { \tl_set_eq:NN \l__exsheets_title_tl \l__exsheets_questions_name_tl }
+ { \tl_set_eq:NN \l__exsheets_title_tl \l__exsheets_exsheets_name_tl }
+ \__exsheets_use_heading:VVVnn
+ \l__exsheets_heading_instance_tl
+ \l__exsheets_title_tl
+ \l__exsheets_qu_counter_interpretation_tl
+ { \l__exsheets_question_points_fp }
+ { \l__exsheets_question_bonus_fp }
+ }
+ }
+ \__exsheets_questions_internal:
+ }
+ { \end__exsheets_questions_internal: }
+
+% current question number:
+\prop_new:N \g__exsheets_question_number_prop
+
+\cs_new_protected:Npn \exsheets@save@number #1#2
+ { \expandafter\global\expandafter\edef\csname exsheets@question@#1\endcsname{#2} }
+
+\cs_new:Npn \__exsheets_save_number_in:N #1
+ {
+ \bool_if:NTF \l__exsheets_print_number_bool
+ {
+ \cs_if_exist:NTF \thechapter
+ {
+ \prop_gput:Nfx #1
+ { \int_use:N \g__exsheets_questions_id_int }
+ { \arabic{chapter}-\arabic{section}-\arabic{question} }
+ \iow_now:Nx \@auxout
+ {
+ \exsheets@save@number
+ { \g__exsheets_questions_current_id_tl }
+ { \arabic{chapter}-\arabic{section}-\arabic{question} }
+ }
+ }
+ {
+ \prop_gput:Nfx #1
+ { \int_use:N \g__exsheets_questions_id_int }
+ { -\arabic{section}-\arabic{question} }
+ \iow_now:Nx \@auxout
+ {
+ \exsheets@save@number
+ { \g__exsheets_questions_current_id_tl }
+ { -\arabic{section}-\arabic{question} }
+ }
+ }
+ }
+ {
+ \cs_if_exist:NTF \thechapter
+ {
+ \prop_gput:Nfx #1
+ { \int_use:N \g__exsheets_questions_id_int }
+ { @@@\arabic{chapter}-\arabic{section}-\arabic{question} }
+ \iow_now:Nx \@auxout
+ {
+ \exsheets@save@number
+ { \g__exsheets_questions_current_id_tl }
+ { @@@\arabic{chapter}-\arabic{section}-\arabic{question} }
+ }
+ }
+ {
+ \prop_gput:Nfx #1
+ { \int_use:N \g__exsheets_questions_id_int }
+ { @@@-\arabic{section}-\arabic{question} }
+ \iow_now:Nx \@auxout
+ {
+ \exsheets@save@number
+ { \g__exsheets_questions_current_id_tl }
+ { @@@-\arabic{section}-\arabic{question} }
+ }
+ }
+ }
+ }
+
+\cs_new:Npn \__exsheets_restore_number_from_and_do:Nnn #1#2#3
+ {
+ \prop_get:NnN #1 { #2 } \l__exsheets_tmpc_tl
+ \tl_if_eq:NNF \l__exsheets_tmpc_tl \q_no_value
+ {
+ \exp_after:wN
+ \__exsheets_read_number:w \l__exsheets_tmpc_tl \q_stop
+ #3
+ }
+ % use \exsheets_read_counter_settings:V \l__exsheets_qu_counter_format_tl
+ % afterwards to print the number
+ }
+\cs_generate_variant:Nn \__exsheets_restore_number_from_and_do:Nnn { NV }
+
+\NewDocumentCommand \QuestionNumber { m }
+ { \exsheets_question_number:c { exsheets@question@#1 } }
+
+\cs_new:Npn \exsheets_question_number:N #1
+ {
+ \cs_if_exist:NTF #1
+ {
+ \exp_after:wN \__exsheets_get_question_number:w #1 \q_stop
+ \ReadCounterPatternFrom [ exsheets ] \l__exsheets_qu_counter_pattern_tl
+ }
+ { \textbf{??} }
+ }
+\cs_generate_variant:Nn \exsheets_question_number:N { c }
+
+\cs_new:Npn \__exsheets_get_question_number:w #1-#2-#3 \q_stop
+ {
+ \cs_if_exist:NT \thechapter
+ { \int_set:Nn \l__exsheets_counter_ch_int { #1 } }
+ \int_set:Nn \l__exsheets_counter_sec_int { #2 }
+ \int_set:Nn \l__exsheets_counter_qu_int { #3 }
+ }
+
+% ----------------------------------------------------------------------------
+% title of a question:
+\input { exsheets_headings.def }
+\bool_if:NT \l__exsheets_load_headings_bool
+ {
+ \RequirePackage { amssymb }
+ \input { exsheets_headings.cfg }
+ }
+% #1: instance
+% #2: title
+% #3: number
+% #4: points
+% #5: bonus
+\cs_new_nopar:Npn \__exsheets_use_heading:nnnnn #1#2#3#4#5
+ {
+ \IfInstanceExistTF { exsheets-heading } { #1 }
+ { \UseInstance { exsheets-heading } { #1 } }
+ {
+ \msg_warning:nnx { exsheets} { headings } { #1 }
+ \UseInstance { exsheets-heading } { block }
+ }
+ { #2 } { #3 } { #4 } { #5 }
+ }
+\cs_generate_variant:Nn \__exsheets_use_heading:nnnnn { V , VV , VVV }
+
+\bool_new:N \l__exsheets_exam_bool
+\bool_set_false:N \l__exsheets_exam_bool
+\bool_new:N \l__exsheets_questions_runin_bool
+\bool_set_false:N \l__exsheets_questions_runin_bool
+
+% options for the questions:
+\keys_define:nn { exsheets / question }
+ {
+ type .choice: ,
+ type / exam .code:n =
+ \bool_set_true:N \l__exsheets_exam_bool ,
+ type / exercise .code:n =
+ \bool_set_false:N \l__exsheets_exam_bool ,
+ name .code:n =
+ \tl_set:Nn \l__exsheets_exsheets_name_tl { #1 }
+ \tl_set:Nn \l__exsheets_questions_name_tl { #1 } ,
+ print .bool_set:N = \l__exsheets_questions_print_bool ,
+ print .default:n = true ,
+ ID .tl_set:N = \l__exsheets_questions_id_tl ,
+ class .code:n =
+ \bool_set_true:N \l__exsheets_questions_class_bool
+ \tl_set:Nn \l__exsheets_questions_class_tl { #1 } ,
+ topic .code:n =
+ \bool_set_true:N \l__exsheets_questions_topic_bool
+ \tl_set:Nn \l__exsheets_questions_topic_tl { #1 } ,
+ use .choice: ,
+ use / true .code:n =
+ \bool_gset_true:N \g__exsheets_questions_use_bool
+ \bool_set_true:N \l__exsheets_questions_use_bool ,
+ use / false .code:n =
+ \bool_gset_false:N \g__exsheets_questions_use_bool
+ \bool_set_false:N \l__exsheets_questions_use_bool ,
+ use .default:n = true ,
+ skip-below .dim_set:N = \l__exsheets_questions_skip_below_dim
+ }
+
+% ----------------------------------------------------------------------------
+% using ``metadata'':
+\cs_new:Npn \__exsheets_declare_question_property:n #1
+ {
+ \prop_new:c { g__exsheets_question_property_#1_prop }
+ \keys_define:nn { question / meta }
+ { #1 .code:n = \__exsheets_question_set_property:nn { #1 } { ##1 } }
+ }
+
+\cs_new_eq:NN \exsheets_declare_question_property:n
+ \__exsheets_declare_question_property:n
+
+\NewDocumentCommand \DeclareQuestionProperty { m }
+ { \exsheets_declare_question_property:n { #1 } }
+\@onlypreamble\DeclareQuestionProperty
+
+\NewDocumentCommand \SetQuestionProperties { m }
+ { \exsheets_set_question_properties:n { #1 } }
+
+\cs_new:Npn \__exsheets_set_question_properties:n #1
+ {
+ \@bsphack
+ \bool_if:NTF \l__exsheets_inside_question_bool
+ { \keys_set:nn { question / meta } { #1 } }
+ {
+ \msg_error:nnn { exsheets } { only-inside-question }
+ { \SetQuestionProperties }
+ }
+ \@esphack
+ }
+
+\cs_new_eq:NN \exsheets_set_question_properties:n
+ \__exsheets_set_question_properties:n
+
+\cs_new:Npn \__exsheets_question_set_property:nn #1#2
+ {
+ \prop_gput:cVn { g__exsheets_question_property_#1_prop }
+ \g__exsheets_questions_current_id_tl { #2 }
+ }
+
+\NewDocumentCommand \GetQuestionProperty { mm }
+ { \exsheets_get_question_property:nn { #1 } { #2 } }
+
+\cs_new:Npn \exsheets_get_question_property:nn #1#2
+ {
+ \prop_if_in:cnT { g__exsheets_question_property_#1_prop } { #2 }
+ { \prop_get:cn { g__exsheets_question_property_#1_prop } { #2 } }
+ }
+
+% ----------------------------------------------------------------------------
+% debug-Info:
+\bool_new:N \l__exsheets_questions_debug_bool
+\bool_set_false:N \l__exsheets_questions_debug_bool
+
+\colorlet { exsheetsdebugcolor } { yellow }
+
+\cs_new_nopar:Npn \exsheets_questions_debug:
+ {
+ \bool_if:nT { \l__exsheets_questions_debug_bool && \l__exsheets_inside_question_bool }
+ {
+ \colorbox { exsheetsdebugcolor }
+ {
+ \group_begin:
+ \normalfont\normalsize\normalcolor
+ ID:~
+ \tl_if_blank:VTF \l__exsheets_questions_id_tl
+ { \int_use:N \g__exsheets_questions_id_int }
+ { \tl_use:N \l__exsheets_questions_id_tl }
+ \bool_if:NT \l__exsheets_questions_class_bool
+ { ,~CLASS:~ \tl_use:N \l__exsheets_questions_class_tl }
+ \bool_if:NT \l__exsheets_questions_topic_bool
+ { ,~TOPIC:~ \tl_use:N \l__exsheets_questions_topic_tl }
+ \group_end:
+ }
+ }
+ }
+
+\NewDocumentCommand \DebugExSheets { G{true} }
+ { \use:c { bool_set_#1:N } \l__exsheets_questions_debug_bool }
+
+% ----------------------------------------------------------------------------
+% include random/selected questions from a file:
+\bool_new:N \l__exsheets_select_questions_bool
+\bool_new:N \l__exsheets_include_all_bool
+\bool_new:N \l__exsheets_include_random_bool
+\bool_set_true:N \l__exsheets_include_all_bool
+\prop_new:N \g__exsheets_selected_questions_prop
+\clist_new:N \l__exsheets_include_id_clist
+\int_new:N \l__exsheets_include_random_int
+\int_zero:N \l__exsheets_include_random_int
+\tl_new:N \l__exsheets_random_seed_tl
+\tl_set:Nn \l__exsheets_random_seed_tl { -1 }
+\newcounter {exsheets@include@random}
+
+\cs_new:Npn \file_input_if_exist:n #1
+ { \file_if_exist:nT { #1 } { \file_input:n { #1 } } }
+
+\cs_if_exist:NF \prop_length:N
+ {
+ \cs_new:Npn \prop_length:N #1
+ {
+ \prop_length:NN #1 \l__exsheets_tmpa_int
+ \int_use:N \l__exsheets_tmpa_int
+ }
+ }
+
+\cs_new:Npn \prop_length:NN #1#2
+ {
+ \int_zero:N #2
+ \prop_map_inline:Nn #1
+ { \int_incr:N #2 }
+ }
+
+\NewDocumentCommand \includequestions { om }
+ {
+ \group_begin:
+ \IfNoValueF { #1 }
+ { \keys_set:nn { exsheets / include } { #1 } }
+ \exsheets_include_questions:n { #2 }
+ \group_end:
+ }
+
+\cs_new:Npn \exsheets_include_questions:n #1
+ {
+ \seq_set_split:Nnn \l__exsheets_tmpa_seq { , } { #1 }
+ \seq_map_inline:Nn \l__exsheets_tmpa_seq
+ {
+ \bool_set_true:N \l__exsheets_questions_deactivate_bool
+ \file_input_if_exist:n { ##1 }
+ \bool_if:NT \l__exsheets_questions_debug_bool
+ {
+ \colorbox { exsheetsdebugcolor }
+ {
+ The~file~ ` \texttt { \tl_to_str:n { ##1 } } ' ~contains~
+ \prop_length:N \g__exsheets_selected_questions_prop \c_space_tl
+ questions.
+ }
+ \par
+ }
+ \bool_set_false:N \l__exsheets_questions_deactivate_bool
+ \__exsheets_select_question_random:n { ##1 }
+ \file_input_if_exist:n { ##1 }
+ \prop_gclear:N \g__exsheets_selected_questions_prop
+ \clist_clear:N \l__exsheets_include_id_clist
+ }
+ }
+
+% options:
+% - IDs=<list of IDs>
+% - all=true|false % default when no option is given
+% - random=<num>
+% - seed=<num> % set the seed for the random selection
+\keys_define:nn { exsheets / include }
+ {
+ all .bool_set:N = \l__exsheets_include_all_bool ,
+ IDs .code:n =
+ \bool_set_false:N \l__exsheets_include_all_bool
+ \bool_set_false:N \l__exsheets_include_random_bool
+ \clist_set:Nn \l__exsheets_include_id_clist { #1 } ,
+ random .code:n =
+ \bool_set_false:N \l__exsheets_include_all_bool
+ \bool_set_true:N \l__exsheets_include_random_bool
+ \int_set:Nn \l__exsheets_include_random_int { #1 } ,
+ seed .tl_set:N = \l__exsheets_random_seed_tl
+ }
+
+\cs_new:Npn \__exsheets_select_question:n #1
+ {
+ \bool_if:NTF \l__exsheets_questions_deactivate_bool
+ {
+ \prop_gput:Nnn \g__exsheets_selected_questions_prop
+ { #1 } { \__exsheets_dummy: }
+ }
+ {
+ \bool_if:NF \l__exsheets_include_all_bool
+ { \__exsheets_select_question_by_id:n { #1 } }
+ }
+ }
+\cs_generate_variant:Nn \__exsheets_select_question:n { V }
+
+\cs_new:Npn \__exsheets_select_question_by_id:n #1
+ {
+% \clist_show:N \l__exsheets_include_id_clist
+ \clist_if_in:NnTF
+ \l__exsheets_include_id_clist
+ { #1 }
+ { \bool_gset_true:N \g__exsheets_questions_use_bool }
+ { \bool_gset_false:N \g__exsheets_questions_use_bool }
+ }
+
+\cs_new:Npn \__exsheets_select_question_random:n #1
+ {
+ \bool_if:NT \l__exsheets_include_random_bool
+ {
+ \prop_length:NN \g__exsheets_selected_questions_prop \l__exsheets_tmpa_int
+ \int_compare:nTF { \l__exsheets_include_random_int > \l__exsheets_tmpa_int }
+ {
+ \msg_warning:nnxxx { exsheets } { random }
+ { \int_use:N \l__exsheets_include_random_int }
+ { #1 }
+ { \int_use:N \l__exsheets_tmpa_int }
+ \bool_set_true:N \l__exsheets_include_all_bool
+ }
+ {
+ \group_begin:
+ \WarningsOff[lcg]
+ \tl_set:Nx \l__exsheets_tmpa_tl { \int_use:N \l__exsheets_tmpa_int }
+ \reinitrand
+ [
+ first = 1 ,
+ last = \l__exsheets_tmpa_tl ,
+ counter = exsheets@include@random ,
+ seed = \l__exsheets_random_seed_tl ,
+ quiet = y
+ ]
+ \int_zero:N \l__exsheets_tmpa_int
+ \int_do_while:nNnn \l__exsheets_tmpa_int < \l__exsheets_include_random_int
+ {
+ \rand
+ \int_zero:N \l__exsheets_tmpb_int
+ \prop_map_inline:Nn \g__exsheets_selected_questions_prop
+ {
+ \int_incr:N \l__exsheets_tmpb_int
+ \int_compare:nT
+ { \l__exsheets_tmpb_int = \value{exsheets@include@random} }
+ {
+ \tl_set_rescan:Nnn \l__exsheets_tmpa_tl {} { ##1 }
+ \clist_if_in:NVTF \l__exsheets_include_id_clist \l__exsheets_tmpa_tl
+ { \int_decr:N \l__exsheets_tmpb_int }
+ {
+ \clist_gput_right:NV \l__exsheets_include_id_clist
+ \l__exsheets_tmpa_tl
+ \prop_map_break:
+ }
+ }
+ }
+ \clist_remove_duplicates:N \l__exsheets_include_id_clist
+ \int_set:Nn \l__exsheets_tmpa_int
+ { \clist_count:N \l__exsheets_include_id_clist }
+ }
+ \WarningsOn[lcg]
+ \group_end:
+ }
+ }
+ }
+
+\NewDocumentCommand \PrintIfIncludeActiveTF { mm }
+ { \bool_if:NTF \l__exsheets_questions_deactivate_bool { #2 } { #1 } }
+
+\NewDocumentCommand \PrintIfIncludeActiveT { }
+ { \bool_if:NF \l__exsheets_questions_deactivate_bool }
+
+\NewDocumentCommand \PrintIfIncludeActiveF { }
+ { \bool_if:NT \l__exsheets_questions_deactivate_bool }
+
+% ----------------------------------------------------------------------------
+% die 'solution' Umgebung:
+\bool_new:N \l__exsheets_solutions_print_bool
+\bool_set_false:N \l__exsheets_solutions_print_bool
+\bool_new:N \l__exsheets_solutions_print_here_bool
+\bool_set_false:N \l__exsheets_solutions_print_here_bool
+\bool_new:N \l__exsheets_solutions_print_section_bool
+\bool_set_false:N \l__exsheets_solutions_print_section_bool
+\bool_new:N \l__exsheets_solutions_print_chapter_bool
+\bool_set_false:N \l__exsheets_solutions_print_chapter_bool
+\bool_new:N \l__exsheets_solutions_print_all_bool
+\bool_set_false:N \l__exsheets_solutions_print_all_bool
+
+% \prop_new:N \g__exsheets_question_number_prop
+\prop_new:N \g__exsheets_solutions_content_prop
+\prop_new:N \g__exsheets_solutions_questions_id_prop
+\prop_new:N \g__exsheets_solutions_names_prop
+
+\tl_new:N \l__exsheets_solutions_name_tl
+\tl_set:Nn \l__exsheets_solutions_name_tl { Solution }
+
+\cs_new:Npn \__exsheets_save_solution:n #1
+ {
+ % save for later use
+ \prop_gput:Nff \g__exsheets_solutions_content_prop
+ { \int_use:N \g__exsheets_questions_id_int }
+ { #1 }
+ \prop_gput:Nff \g__exsheets_solutions_questions_id_prop
+ { \int_use:N \g__exsheets_questions_id_int }
+ { \tl_use:N \g__exsheets_questions_current_id_tl }
+ \prop_gput:Nff \g__exsheets_solutions_names_prop
+ { \int_use:N \g__exsheets_questions_id_int }
+ { \tl_use:N \l__exsheets_solutions_name_tl }
+ % print here
+ \bool_if:NT \l__exsheets_solutions_print_here_bool
+ {
+ \int_set:Nn \l__exsheets_counter_qu_int { \arabic{question} }
+ \__exsheets_solutions_name:VV
+ \l__exsheets_qu_counter_interpretation_tl
+ \l__exsheets_solutions_name_tl
+ \use:n { #1 } \par
+ \dim_compare:nNnT { \parskip } = { 0pt }
+ { \exsheets_glue:N \l__exsheets_solutions_skip_below_dim }
+ }
+ }
+\cs_generate_variant:Nn \prop_gput:Nnn { Nff,Nfx,Nfn,Nxx }
+\cs_generate_variant:Nn \__exsheets_save_solution:n { V }
+
+\NewEnviron { __exsheets_solution_int: }
+ {
+ \bool_if:nT { \g__exsheets_questions_use_bool && \l__exsheets_solutions_use_bool }
+ {
+ \cspreto { BODY } { \ifhmode \fi }% what's that good for?
+ \__exsheets_save_solution:V \BODY
+ }
+ }
+
+\bool_new:N \l__exsheets_inside_solution_bool
+\bool_set_false:N \l__exsheets_inside_solution_bool
+
+\NewDocumentEnvironment { solution } { o }
+ {
+ \__exsheets_solutions_use_classes:
+ \__exsheets_solutions_use_topics:
+ \bool_if:NT \l__exsheets_questions_deactivate_bool
+ { \bool_set_false:N \l__exsheets_solutions_use_bool }
+ \bool_if:NT \l__exsheets_solutions_use_bool
+ {
+ \bool_set_true:N \l__exsheets_inside_solution_bool
+ \IfNoValueF { #1 } { \keys_set:nn { exsheets / solution } { #1 } }
+ }
+ \__exsheets_solution_int:
+ }
+ { \end__exsheets_solution_int: }
+
+\bool_new:N \l__exsheets_solutions_runin_bool
+\bool_set_false:N \l__exsheets_solutions_runin_bool
+
+\cs_new_nopar:Npn \__exsheets_solutions_name:nn #1#2
+ {
+ \__exsheets_use_heading:Vnnnn
+ \l__exsheets_heading_instance_tl
+ { #2 } { #1 } { 0 } { 0 }
+ }
+\cs_generate_variant:Nn \__exsheets_solutions_name:nn { VV }
+
+\tl_new:N \l__exsheets_solutions_name_style_tl
+\tl_set:Nn \l__exsheets_solutions_name_style_tl { \normalsize \bfseries }
+
+\cs_new:Npn \exsheets_solutions_name_style:n #1
+ { \l__exsheets_solutions_name_style_tl #1 }
+
+% ----------------------------------------------------------------------------
+% print solutions:
+% save section / chapter counter:
+\cs_new:Npn \__exsheets_exlabel:n #1
+ {
+ \@bsphack
+ \iow_now:Nx \@auxout
+ {
+ \token_to_str:N \newlabel { exse:#1 }
+ { { \arabic { section } } { \thepage } }
+ }
+ \cs_if_exist:NT \thechapter
+ {
+ \iow_now:Nx \@auxout
+ {
+ \token_to_str:N \newlabel { exch:#1 }
+ { { \arabic { chapter } } { \thepage } }
+ }
+ }
+ \@esphack
+ }
+
+% user command:
+\cs_new_eq:NN \exlabel \__exsheets_exlabel:n
+
+% adapt \label, maybe do this _after_ BeginDocument:
+\bool_if:NT \l__exsheets_solutions_by_ref_bool
+ {
+ \cs_new_eq:NN \__exsheets_saved_label:n \label
+ \cs_set:Npn \label #1
+ { \__exsheets_saved_label:n { #1 } \__exsheets_exlabel:n { #1 } }
+ }
+
+% this is like \ref from latex.ltx
+\cs_new:Npn \__exsheets_ref:n #1
+ {
+ \cs_if_exist:cTF { r@#1 }
+ { \__exsheets_ref_aux:n { #1 } }
+ {
+ \protect\G@refundefinedtrue
+ 1
+ \@latex@warning{exlabel `#1' on page \thepage \space undefined}%
+ }
+ }
+
+\cs_new:Npn \__exsheets_ref_aux:n #1
+ { \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn \cs:w r@#1 \cs_end: }
+
+\cs_new_eq:NN \exref \__exsheets_ref:n
+
+% user command:
+\NewDocumentCommand \printsolutions { O{all} }
+ { \exsheets_print_solutions:n { #1 } }
+
+% internal command:
+\cs_new:Npn \exsheets_print_solutions:n #1
+ {
+ \group_begin:
+ \bool_set_true:N \l__exsheets_solutions_print_bool
+ \bool_set_true:N \l__exsheets_inside_solution_bool
+ \cs_set:Npn \S ##1 { \exref { exse:##1 } }
+ \cs_set:Npn \C ##1 { \exref { exch:##1 } }
+ \keys_set:nn { exsheets / exsheets_print_solutions } { #1 }
+ \group_end:
+ }
+
+\keys_define:nn { exsheets }
+ {
+ exsheets_print_solutions .choice: ,
+ exsheets_print_solutions / section .code:n =
+ { \exsheets_print_solutions_section:n { #1 } } ,
+ exsheets_print_solutions / chapter .code:n =
+ { \exsheets_print_solutions_chapter:n { #1 } } ,
+ exsheets_print_solutions / all .code:n =
+ { \exsheets_print_solutions_all: } ,
+ exsheets_print_solutions / byID .code:n =
+ { \exsheets_print_solutions_byID:n { #1 } }
+ }
+
+\int_new:N \l__exsheets_counter_ch_int
+\int_new:N \l__exsheets_counter_sec_int
+\int_new:N \l__exsheets_counter_qu_int
+
+\cs_new:Npn \__exsheets_print_solution_if:nn #1#2
+ {
+ \exp_args:No \int_compare:nT { #2 }
+ {
+ \prop_get:NnN \g__exsheets_solutions_names_prop
+ { #1 } \l__exsheets_tmpa_tl
+ \prop_get:NnN \g__exsheets_solutions_content_prop
+ { #1 } \l__exsheets_tmpb_tl
+ \eSaveCounterPatternFrom [ exsheets ]
+ \l__exsheets_current_pattern_interpretation_tl
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_qu_counter_pattern_tl
+ \exsheets_solutions_print_name:VV
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_tmpa_tl
+ \tl_use:N \l__exsheets_tmpb_tl \par
+ \dim_compare:nNnT { \parskip } = { 0pt }
+ { \exsheets_glue:N \l__exsheets_solutions_skip_below_dim }
+ }
+ }
+
+% print by section:
+\cs_new:Npn \exsheets_print_solutions_section:n #1
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ {
+ \__exsheets_print_solutions_section:nnn { ##1 } { ##2 }
+ { \arabic{section} }
+ }
+ }
+ }
+ {
+ \clist_map_inline:nn { #1 }
+ { \__exsheets_print_solutions_by_section:w ##1-- \q_stop }
+ }
+ }
+
+\cs_new:Npn \__exsheets_print_solutions_by_section:w #1-#2-#3 \q_stop
+ {
+ % wenn #3=-, dann range-Input
+ \tl_if_eq:nnTF { #3 } { - }
+ {
+ \int_zero:N \l__exsheets_tmpa_int
+ \int_set_eq:NN \l__exsheets_tmpb_int \c_ten_thousand
+ \tl_if_blank:nF { #1 } { \int_set:Nn \l__exsheets_tmpa_int { #1 } }
+ \tl_if_blank:nF { #2 } { \int_set:Nn \l__exsheets_tmpb_int { #2 } }
+ \int_do_while:nn { \l__exsheets_tmpa_int <= \l__exsheets_tmpb_int }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ {
+ \__exsheets_print_solutions_section:nnn
+ { ##1 } { ##2 } { \l__exsheets_tmpa_int }
+ }
+ }
+ \int_incr:N \l__exsheets_tmpa_int
+ }
+ }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ { \__exsheets_print_solutions_section:nnn { ##1 } { ##2 } { #1 } }
+ }
+ }
+ }
+
+\cs_new:Npn \__exsheets_print_solutions_section:nnn #1#2#3
+ {
+ \__exsheets_read_number:w #2 \q_stop
+ \__exsheets_print_solution_if:nn { #1 }
+ { \l__exsheets_counter_sec_int = #3 }
+ }
+
+% print by chapter:
+\cs_new:Npn \exsheets_print_solutions_chapter:n #1
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ {
+ \__exsheets_print_solutions_chapter:nnn { ##1 } { ##2 }
+ { \arabic{chapter} }
+ }
+ }
+ }
+ {
+ \clist_map_inline:nn { #1 }
+ { \__exsheets_print_solutions_by_chapter:w ##1-- \q_stop }
+ }
+ }
+
+\cs_new:Npn \__exsheets_print_solutions_by_chapter:w #1-#2-#3 \q_stop
+ {
+ % wenn #3=-, dann range-Input
+ \tl_if_eq:nnTF { #3 } { - }
+ {
+ \int_zero:N \l__exsheets_tmpa_int
+ \int_set_eq:NN \l__exsheets_tmpb_int \c_ten_thousand
+ \tl_if_blank:nF { #1 } { \int_set:Nn \l__exsheets_tmpa_int { #1 } }
+ \tl_if_blank:nF { #2 } { \int_set:Nn \l__exsheets_tmpb_int { #2 } }
+ \int_do_while:nn { \l__exsheets_tmpa_int <= \l__exsheets_tmpb_int }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ {
+ \__exsheets_print_solutions_chapter:nnn
+ { ##1 } { ##2 } { \l__exsheets_tmpa_int }
+ }
+ }
+ \int_incr:N \l__exsheets_tmpa_int
+ }
+ }
+ {
+ \prop_map_inline:Nn \g__exsheets_question_number_prop
+ {
+ \prop_if_in:NnT \g__exsheets_solutions_names_prop { ##1 }
+ { \__exsheets_print_solutions_chapter:nnn { ##1 } { ##2 } { #1 } }
+ }
+ }
+ }
+
+\cs_new:Npn \__exsheets_print_solutions_chapter:nnn #1#2#3
+ {
+ \__exsheets_read_number:w #2 \q_stop
+ \__exsheets_print_solution_if:nn { #1 }
+ { \l__exsheets_counter_ch_int = #3 }
+ }
+
+% print all:
+\cs_new:Npn \exsheets_print_solutions_all:
+ {
+ \prop_map_function:NN \g__exsheets_question_number_prop
+ \__exsheets_print_solutions_all:nn
+ }
+
+\cs_new:Npn \__exsheets_print_solutions_all:nn #1#2
+ {
+ \__exsheets_read_number:w #2 \q_stop
+ \prop_get:NnNT \g__exsheets_solutions_names_prop
+ { #1 } \l__exsheets_tmpa_tl
+ {
+ \tl_set_eq:NN \l__exsheets_solutions_name_tl \l__exsheets_tmpa_tl
+ \prop_get:NnN \g__exsheets_solutions_content_prop
+ { #1 } \l__exsheets_tmpb_tl
+ \eSaveCounterPatternFrom [ exsheets ]
+ \l__exsheets_current_pattern_interpretation_tl
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_qu_counter_pattern_tl
+ \exsheets_solutions_print_name:VV
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_tmpa_tl
+ \tl_use:N \l__exsheets_tmpb_tl \par
+ \dim_compare:nNnT { \parskip } = { 0pt }
+ { \exsheets_glue:N \l__exsheets_solutions_skip_below_dim }
+ }
+ }
+
+% print by ID:
+\seq_new:N \l__exsheets_solutions_byID_seq
+\cs_new:Npn \exsheets_print_solutions_byID:n #1
+ {
+ \seq_set_split:Nnn \l__exsheets_solutions_byID_seq { , } { #1 }
+ \seq_clear:N \l__exsheets_tmpa_seq
+ \seq_map_inline:Nn \l__exsheets_solutions_byID_seq
+ {
+ \prop_get:NnN \g__exsheets_questions_id_prop
+ { ##1 } \l__exsheets_tmpa_tl
+ \seq_put_right:NV \l__exsheets_tmpa_seq \l__exsheets_tmpa_tl
+ }
+ \bool_if:NT \l__exsheets_print_byID_sorted_bool
+ {
+ \seq_sort:Nn \l__exsheets_tmpa_seq
+ {
+ \int_compare:nNnTF { ##1 } > { ##2 }
+ { \sort_reversed: }
+ { \sort_ordered: }
+ }
+ }
+ \seq_map_inline:Nn \l__exsheets_tmpa_seq
+ {
+ \group_begin:
+ \tl_if_eq:nnF { ##1 } { \q_no_value }
+ {
+ \prop_get:NnNT \g__exsheets_solutions_names_prop
+ { ##1 } \l__exsheets_tmpa_tl
+ {
+ \prop_get:NnN \g__exsheets_solutions_content_prop
+ { ##1 } \l__exsheets_tmpb_tl
+ \__exsheets_restore_number_from_and_do:Nnn
+ \g__exsheets_question_number_prop
+ { ##1 }
+ {
+ \eSaveCounterPatternFrom [ exsheets ]
+ \l__exsheets_current_pattern_interpretation_tl
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_qu_counter_pattern_tl
+ \exsheets_solutions_print_name:VV
+ \l__exsheets_current_pattern_tl
+ \l__exsheets_tmpa_tl
+ \tl_use:N \l__exsheets_tmpb_tl \par
+ \dim_compare:nNnT { \parskip } = { 0pt }
+ { \exsheets_glue:N \l__exsheets_solutions_skip_below_dim }
+ }
+ }
+ }
+ \group_end:
+ }
+ }
+
+\cs_new_nopar:Npn \__exsheets_read_number:w #1-#2-#3 \q_stop
+ {
+ \int_zero:N \l__exsheets_counter_ch_int
+ \int_zero:N \l__exsheets_counter_sec_int
+ \int_zero:N \l__exsheets_counter_qu_int
+ \tl_if_in:nnF { #1 } { @@@ }
+ {
+ \tl_if_blank:nF { #1 }
+ { \int_set:Nn \l__exsheets_counter_ch_int { #1 } }
+ }
+ \int_set:Nn \l__exsheets_counter_sec_int { #2 }
+ \int_set:Nn \l__exsheets_counter_qu_int { #3 }
+ }
+
+\cs_new_nopar:Npn \exsheets_solutions_print_name:nn #1#2
+ {
+ \tl_set_rescan:Nnn \l__exsheets_tmpa_tl
+ { \char_set_catcode_letter:N \@ } { #1 }
+ \tl_if_in:nnTF { #1 } { @@@ }
+ { \__exsheets_solutions_name:nn { } { #2 } }
+ { \__exsheets_solutions_name:nn { #1 } { #2 } }
+ \tex_penalty:D \c_ten_thousand
+ }
+\cs_generate_variant:Nn \exsheets_solutions_print_name:nn { VV }
+
+\cs_new:Npn \PrintSolutionsTF
+ { \bool_if:NTF \l__exsheets_solutions_print_bool }
+\cs_new:Npn \PrintSolutionsT
+ { \bool_if:NT \l__exsheets_solutions_print_bool }
+\cs_new:Npn \PrintSolutionsF
+ { \bool_if:NF \l__exsheets_solutions_print_bool }
+
+\bool_new:N \l__exsheets_print_byID_sorted_bool
+\bool_set_true:N \l__exsheets_print_byID_sorted_bool
+
+\keys_define:nn { exsheets / solution }
+ {
+ print .choice: ,
+ print / true .code:n =
+ {
+ \bool_set_true:N \l__exsheets_solutions_print_bool
+ \bool_set_true:N \l__exsheets_solutions_print_here_bool
+ \bool_set_false:N \l__exsheets_solutions_print_section_bool
+ \bool_set_false:N \l__exsheets_solutions_print_chapter_bool
+ \bool_set_false:N \l__exsheets_solutions_print_all_bool
+ } ,
+ print / false .code:n =
+ {
+ \bool_set_false:N \l__exsheets_solutions_print_bool
+ } ,
+ print .default:n = true ,
+ name .tl_set:N = \l__exsheets_solutions_name_tl ,
+ sorted .bool_set:N = \l__exsheets_print_byID_sorted_bool ,
+ skip-below .dim_set:N = \l__exsheets_solutions_skip_below_dim
+ }
+
+% ----------------------------------------------------------------------------
+% the `tasks' list
+\input { exsheets_tasks.def }
+\bool_if:NT \l__exsheets_load_tasks_bool
+ {
+ \RequirePackage { amssymb }
+ \input { exsheets_tasks.cfg }
+ }
+
+% ----------------------------------------------------------------------------
+% the \blank{<words>} command
+\RequirePackage { ulem } \normalem
+\dim_new:N \l__exsheets_blank_dim
+\box_new:N \l__exsheets_blank_box
+\bool_new:N \l__exsheets_blank_width_bool
+
+\cs_new_nopar:Npn \exsheets_write_blank:n #1 { #1 }
+\cs_set_eq:NN \exsheets_write_blank:n \uline
+
+\keys_define:nn { exsheets / blank }
+ {
+ style .choice: ,
+ style / line .code:n =
+ { \cs_set_eq:NN \exsheets_write_blank:n \uline } ,
+ style / wave .code:n =
+ { \cs_set_eq:NN \exsheets_write_blank:n \uwave } ,
+ style / dline .code:n =
+ { \cs_set_eq:NN \exsheets_write_blank:n \uuline } ,
+ style / dotted .code:n =
+ { \cs_set_eq:NN \exsheets_write_blank:n \dotuline } ,
+ style / dashed .code:n =
+ { \cs_set_eq:NN \exsheets_write_blank:n \dashuline } ,
+ width .code:n =
+ {
+ \bool_set_true:N \l__exsheets_blank_width_bool
+ \dim_set:Nn \l__exsheets_blank_dim { #1 }
+ }
+ }
+
+\NewDocumentCommand \blank { o m }
+ {
+ \group_begin:
+ \IfNoValueF { #1 } { \keys_set:nn { exsheets / blank } { #1 } }
+ \exsheets_blank:n { #2 }
+ \group_end:
+ }
+
+\cs_new:Npn \exsheets_blank:n #1
+ {
+ \box_clear:N \l__exsheets_blank_box
+ \hbox_set:Nn \l__exsheets_blank_box { #1 }
+ \bool_if:NTF \l__exsheets_inside_solution_bool
+ { \exsheets_write_blank:n { #1 } }
+ {
+ \bool_if:NTF \l__exsheets_blank_width_bool
+ { \__exsheets_blank_skip:N \l__exsheets_blank_dim }
+ { \__exsheets_blank_skip:n { \box_wd:N \l__exsheets_blank_box } }
+ }
+ }
+
+\cs_new:Npn \__exsheets_blank_skip:N #1
+ {
+ \dim_set:Nn \l__exsheets_tmpa_dim { #1 }
+ \dim_compare:nTF { \l__exsheets_tmpa_dim > 2em }
+ {
+ \exsheets_write_blank:n { \skip_horizontal:n { 1em } }
+ \dim_sub:Nn \l__exsheets_tmpa_dim { 2em }
+ \dim_do_while:nn { \l__exsheets_tmpa_dim > \c_zero_dim }
+ {
+ \tex_penalty:D \hyphenpenalty
+ \dim_compare:nTF { \l__exsheets_tmpa_dim < 1pt }
+ { \exsheets_write_blank:n { \skip_horizontal:N \l__exsheets_tmpa_dim } }
+ { \exsheets_write_blank:n { \skip_horizontal:n { 1pt } } }
+ \dim_sub:Nn \l__exsheets_tmpa_dim { 1pt }
+ }
+ \exsheets_write_blank:n { \skip_horizontal:n { 1em } }
+ }
+ { \exsheets_write_blank:n { \skip_horizontal:N \l__exsheets_tmpa_dim } }
+ }
+\cs_generate_variant:Nn \__exsheets_blank_skip:N { n }
+
+% the following code from Heiko Oberdieck in d.c.t.t served as inspiration
+% and basis for the \blank command:
+%
+% \makeatletter
+% \newcommand*{\luecke}{%
+% \begingroup
+% \setlength{\dimen@}{6cm}%
+% \ifdim\dimen@>2em %
+% \underline{\hspace{1em}}%
+% \advance\dimen@ by -2em\relax
+% \@whiledim\dimen@>0pt\do{%
+% \penalty\hyphenpenalty
+% \ifdim\dimen@<1pt %
+% \underline{\hspace{\dimen@}}%
+% \else
+% \underline{\hspace{1pt}}%
+% \fi
+% \advance\dimen@ by -1pt %
+% }%
+% \underline{\hspace{1em}}%
+% \else
+% \underline{\hspace{\dimen@}}%
+% \fi
+% \endgroup
+% \xspace
+% }
+% \makeatother
+
+% ----------------------------------------------------------------------------
+% SETUP
+\NewDocumentCommand \SetupExSheets { o m }
+ {
+ \IfNoValueTF { #1 }
+ { \keys_set:nn { exsheets } { #2 } }
+ { \keys_set:nn { exsheets / #1 } { #2 } }
+ }
+
+% ----------------------------------------------------------------------------
+% Sprachanpassungen
+\file_if_exist:nT { translations.sty }
+ {
+ \RequirePackage { translations }
+ % translation for the exercises
+ \DeclareTranslation { English } { exsheets-exercise-name } { Exercise }
+ \DeclareTranslation { British } { exsheets-exercise-name } { Exercise }
+ \DeclareTranslation { American } { exsheets-exercise-name } { Exercise }
+ \DeclareTranslation { French } { exsheets-exercise-name } { Exercise }
+ \DeclareTranslation { German } { exsheets-exercise-name } { \"Ubung }
+ \DeclareTranslation { Italian } { exsheets-exercise-name } { Esercizio }
+ \DeclareTranslation { Spanish } { exsheets-exercise-name } { Ejercicio }
+ \DeclareTranslation { Catalan } { exsheets-exercise-name } { Exercir }
+ \DeclareTranslation { Turkish } { exsheets-exercise-name } { Egzersiz }
+ % translation for the question
+ \DeclareTranslation { English } { exsheets-question-name } { Question }
+ \DeclareTranslation { British } { exsheets-question-name } { Question }
+ \DeclareTranslation { American } { exsheets-question-name } { Question }
+ \DeclareTranslation { French } { exsheets-question-name } { Question }
+ \DeclareTranslation { German } { exsheets-question-name } { Aufgabe }
+ \DeclareTranslation { Italian } { exsheets-question-name } { Questione }
+ \DeclareTranslation { Spanish } { exsheets-question-name } { Pregunta }
+ \DeclareTranslation { Catalan } { exsheets-question-name } { Q\"uesti\'o }
+ \DeclareTranslation { Turkish } { exsheets-question-name } { Soru }
+ % translation for the solutions
+ \DeclareTranslation { English } { exsheets-solution-name } { Solution }
+ \DeclareTranslation { British } { exsheets-solution-name } { Solution }
+ \DeclareTranslation { American } { exsheets-solution-name } { Solution }
+ \DeclareTranslation { French } { exsheets-solution-name } { Solution }
+ \DeclareTranslation { German } { exsheets-solution-name } { L\"osung }
+ \DeclareTranslation { Italian } { exsheets-solution-name } { Soluzione }
+ \DeclareTranslation { Spanish } { exsheets-solution-name } { Soluci\'on }
+ \DeclareTranslation { Catalan } { exsheets-solution-name } { Soluci\'o }
+ \DeclareTranslation { Turkish } { exsheets-solution-name } { \c C\"oz\"um }
+ % the actual translating
+ \tl_set:Nn \l__exsheets_exsheets_name_tl
+ { \GetTranslation { exsheets-exercise-name } }
+ \tl_set:Nn \l__exsheets_questions_name_tl
+ { \GetTranslation { exsheets-question-name } }
+ \tl_set:Nn \l__exsheets_solutions_name_tl
+ { \GetTranslation { exsheets-solution-name } }
+ }
+
+% ----------------------------------------------------------------------------
+% save total points in .aux file to make it available for \allpoints anywhere
+\AtEndDocument
+ {
+ \iow_now:Nx \@auxout
+ {
+ \exp_not:N \exsheets@sum@of@points
+ { \fp_eval:n { \g__exsheets_points_sum_fp } }
+ \exp_not:N \exsheets@sum@of@bonus
+ { \fp_eval:n { \g__exsheets_bonus_sum_fp } }
+ }
+ }
+
+% ----------------------------------------------------------------------------
+% load custom configuration
+\file_if_exist:nT { exsheets_configurations.cfg }
+ {
+ \AtBeginDocument
+ {
+ \msg_info:nn { exsheets } { loading-configurations }
+ \file_input:n { exsheets_configurations.cfg }
+ }
+ }
+
+\tex_endinput:D
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+HISTORY:
+2011/11/23 v0.1pre - first upload to bitbucket and all changes until
+ considered stable enough/ready to be called 0.1alpha.
+ There'll be no further descriptions until then.
+2012/06/08 v0.1alpha - first hopefully stable version
+2012/06/11 v0.1alpha-a - added headings instances, slightly rewritten
+ `exercises-tasks' object and `tasks' environment
+2012/06/11 v0.1alpha-b - added `multiplechoice' instance and `load-tasks' option
+2012/06/12 v0.1alpha-c - renamed from `exercises' into `ExSheets'
+2012/06/15 v0.1alpha-d - added more flexible solution printing method
+2012/06/15 v0.1beta - filled in some blanks in the documentation, now we need
+ some testing!
+2012/09/07 v0.1beta-a - adjustments to the updated l3kernel
+2012/09/08 v0.1beta-b - sort solutions printed with the `byID' key
+2012/09/16 v0.1beta-c - renamed option `questions-counter-format' into
+ `counter-format'
+2012/09/19 v0.1beta-d - added `topic' key, provide \includequestions with options
+ `all' and `IDs'
+2012/09/24 v0.1beta-e - added question properties and improved random question
+ selection
+2012/09/27 v0.1 - added two headings instances, new option `headings-format'
+ - small changes in the definition of the `exsheets-headings'
+ object
+ - preliminary version of totoc options. Unfortunatly
+ \exsheets@recover@number is not expandable => no
+ hyperref support
+2012/09/30 v0.2beta - version numbering gone crazy! this will now stay 0.2beta
+ until upload to CTAN (v0.2)
+ - integrated packages `translations' and `cntformats':
+ trnslt: provide expandable version of `translator's
+ \translate
+ cntfmts: outsourced previous counter formatting commands;
+ should now be usable in other packages, too, and
+ simplified definitions in `ExSheets'
+ - thanks to `translations' and `cntformats' the `totoc'
+ option now works with `hyperref'
+2012/10/05 v0.2 - removed \sumpoints and moved the functionality to
+ \totalpoints*
+ - changed meaning of \addpoints* and moved former
+ functionality to \points
+ - added bonus point functionality including \addbonus,
+ \bonus, \bonussum, \pointssum, \currentpointssum,
+ \currentbonussum
+ - added grades distribution
+ - `translations' got \LoadDictionary and \LoadDictionaryFor
+ added and loads of languages defined.
+2012/10/05 v0.2a - resolved bug in saving and recovering question number
+ using \exsheets@save@number and \QuestionNumber
+2012/10/08 v0.2b - improved the reference to chapter/solution numbers
+ in \printsolutions
+ - resolved bug in \printsolutions introduced in the last
+ update
+ - upload to CTAN
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% TODO:
+- points/decimal-marker, points/frac (?), points/format (?,im interface) \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets_configurations.cfg b/Master/texmf-dist/tex/latex/exsheets/exsheets_configurations.cfg
new file mode 100644
index 00000000000..3c64153c7ca
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets_configurations.cfg
@@ -0,0 +1,5 @@
+\ProvidesFile{exsheets_configurations.cfg}
+
+% Put your definitions and configurations here.
+
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.cfg b/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.cfg
new file mode 100644
index 00000000000..3ec2ae06bf5
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.cfg
@@ -0,0 +1,302 @@
+% --------------------------------------------------------------------------
+% the EXSHEETS package
+%
+% Yet another package for the creation of exercise sheets
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011-2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The exsheets package consists of the files
+% - exsheets.sty, exsheets_headings.def, exsheets_headings.cfg,
+% exsheets_tasks.def, exsheets_tasks.cfg, exsheets_configurations.cfg,
+% - exsheets_en.tex, exsheets_en.pdf,
+% - README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+% HEADINGS FOR QUESTIONS AND SOLUTIONS
+\ProvidesFile{exsheets_headings.cfg}
+ [\exsheets@date\space v\exsheets@version\space ExSheets headings instances]
+
+% SIMPLE:
+\DeclareInstance { exsheets-heading } { simple } { default }
+ {
+ title-format = \normalsize ,
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ attach = { main[l,t] number[l,t] (0pt,0pt) } ,
+ join =
+ {
+ number[r,b] title[l,b] (1ex,0pt) ;
+ main[l,b] points[l,t] (1em,0pt)
+ }
+ }
+
+% BLOCK, REVERSED:
+\DeclareInstance { exsheets-heading } { block-rev } { default }
+ {
+ toc-reversed = true ,
+ join = { number[r,B] title[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[l,vc] number[l,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% BLOCK, POINTS WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { block-wp } { default }
+ {
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ join =
+ {
+ title[r,B] number[l,B] (1ex,0pt) ;
+ title[r,B] points[l,B] (1ex,0pt)
+ } ,
+ attach = { main[l,vc] title[l,vc] (0pt,0pt) }
+ }
+
+% BLOCK, POINTS WITH THE TITLE, REVERSED:
+\DeclareInstance { exsheets-heading } { block-wp-rev } { default }
+ {
+ toc-reversed = true ,
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ join =
+ {
+ number[r,B] title[l,B] (1ex,0pt) ;
+ number[r,B] points[l,B] (1ex,0pt)
+ } ,
+ attach = { main[l,vc] number[l,vc] (0pt,0pt) }
+ }
+
+% BLOCK WITH NO TITLE:
+\DeclareInstance { exsheets-heading } { block-nr } { default }
+ {
+ attach =
+ {
+ main[l,vc] number[l,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% BLOCK WITH NO TITLE, NUMBER WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { block-nr-wp } { default }
+ {
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ join = { number[r,vc] points[l,vc] (1ex,0pt) } ,
+ attach = { main[l,vc] number[l,vc] (0pt,0pt) }
+ }
+
+% RUNIN, REVERSED:
+\DeclareInstance { exsheets-heading } { runin-rev } { default }
+ {
+ toc-reversed = true ,
+ runin = true ,
+ title-post-code = \c_space_tl ,
+ attach =
+ { main[l,vc] points[l,vc] (\linewidth + \marginparsep,0pt) } ,
+ join =
+ {
+ main[r,vc] number[r,vc] (0pt,0pt) ;
+ main[r,vc] title[l,vc] (1ex,0pt)
+ }
+ }
+
+% RUNIN, POINTS WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { runin-wp } { default }
+ {
+ runin = true ,
+ points-pre-code = ( ,
+ points-post-code = ) \c_space_tl ,
+ join =
+ {
+ main[r,vc] title[r,vc] (0pt,0pt) ;
+ main[r,vc] number[l,vc] (1ex,0pt) ;
+ main[r,vc] points[l,vc] (1ex,0pt)
+ }
+ }
+
+% RUNIN, POINTS WITH THE TITLE, REVERSED:
+\DeclareInstance { exsheets-heading } { runin-wp-rev } { default }
+ {
+ toc-reversed = true ,
+ runin = true ,
+ points-pre-code = ( ,
+ points-post-code = ) \c_space_tl ,
+ join =
+ {
+ main[r,vc] number[r,vc] (0pt,0pt) ;
+ main[r,vc] title[l,vc] (1ex,0pt) ;
+ main[r,vc] points[l,vc] (1ex,0pt)
+ }
+ }
+
+% RUNIN WITH NO TITLE:
+\DeclareInstance { exsheets-heading } { runin-nr } { default }
+ {
+ runin = true ,
+ number-post-code = \c_space_tl ,
+ attach =
+ { main[l,vc] points[l,vc] (\linewidth + \marginparsep,0pt) } ,
+ join = { main[r,vc] number[l,vc] (0pt,0pt) }
+ }
+
+% RUNIN WITH NO TITLE, POINTS WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { runin-nr-wp } { default }
+ {
+ runin = true ,
+ points-pre-code = ( ,
+ points-post-code = ) \c_space_tl ,
+ join =
+ {
+ main[r,vc] number[l,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (1ex,0pt)
+ }
+ }
+
+% RUNIN WITH NO TITLE, FIXED WIDTH OF NUMBER
+\DeclareInstance { exsheets-heading } { runin-fixed-nr } { default }
+ {
+ runin = true ,
+ number-pre-code = \hbox to 2em \bgroup ,
+ number-post-code = \hfil\egroup ,
+ attach =
+ { main[l,vc]points[l,vc](\linewidth+\marginparsep,0pt) } ,
+ join = { main[r,vc]number[l,vc](0pt,0pt) }
+ }
+
+% CENTERED:
+\DeclareInstance { exsheets-heading } { centered } { default }
+ {
+ join = { title[r,B] number[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[hc,vc] title[hc,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% CENTERED, POINTS WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { centered-wp } { default }
+ {
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ join =
+ {
+ title[r,B] number[l,B] (1ex,0pt) ;
+ title[r,B] points[l,B] (1ex,0pt)
+ } ,
+ attach = { main[hc,vc] title[hc,vc] (0pt,0pt) }
+ }
+
+% MARGIN:
+\DeclareInstance { exsheets-heading } { margin } { default }
+ {
+ runin = true ,
+ number-post-code = \c_space_tl ,
+ points-pre-code = ( ,
+ points-post-code = ) \c_space_tl ,
+ join = { title[r,b] number[l,b] (1ex,0pt) } ,
+ attach =
+ {
+ main[l,vc] title[r,vc] (0pt,0pt) ;
+ main[l,b] points[r,t] (0pt,0pt)
+ }
+ }
+
+% MARGIN WITH NO TITLE
+\DeclareInstance { exsheets-heading } { margin-nr } { default }
+ {
+ runin = true ,
+ attach =
+ {
+ main[l,vc]number[r,vc](-1ex,0pt) ;
+ main[r,vc]points[l,vc](\linewidth+\marginparsep,0pt)
+ }
+ }
+
+% RIGHT-ALIGNED:
+\DeclareInstance { exsheets-heading } { raggedleft } { default }
+ {
+ join = { title[r,B] number[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[r,vc] title[r,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% MIMICKING KOMA-SECTION:
+\DeclareInstance { exsheets-heading } { koma-section } { default }
+ {
+ vscale = 2 ,
+ title-format = \Large\bfseries\sffamily ,
+ join = { title[r,B] number[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[l,vc] title[l,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% FANCY:
+\DeclareInstance { exsheets-heading } { fancy } { default }
+ {
+ toc-reversed = true ,
+ indent-first = true ,
+ vscale = 2 ,
+ pre-code = \rule{\linewidth}{1pt} ,
+ post-code = \rule{\linewidth}{1pt} ,
+ title-format = \large\scshape\color{exsheetsred} ,
+ number-format = \large\bfseries\color{exsheetsblue} ,
+ points-format = \itshape ,
+ join = { number[r,B] title[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[hc,vc] number[hc,vc] (0pt,0pt) ;
+ main[l,vc] points[r,vc] (-\marginparsep,0pt)
+ }
+ }
+
+% FANCY, POINTS WITH THE TITLE:
+\DeclareInstance { exsheets-heading } { fancy-wp } { default }
+ {
+ toc-reversed = true ,
+ indent-first = true ,
+ vscale = 2 ,
+ pre-code = \rule{\linewidth}{1pt} ,
+ post-code = \rule{\linewidth}{1pt} ,
+ title-format = \large\scshape\color{exsheetsred} ,
+ number-format = \large\bfseries\color{exsheetsblue} ,
+ points-format = \itshape ,
+ points-pre-code = ( ,
+ points-post-code = ) ,
+ join =
+ {
+ number[r,B] title[l,B] (1ex,0pt) ;
+ number[r,B] points[l,B] (1ex,0pt)
+ } ,
+ attach = { main[hc,vc] number[hc,vc] (0pt,0pt) }
+ }
+
+\tex_endinput:D \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.def b/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.def
new file mode 100644
index 00000000000..c5e9eeebe4d
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets_headings.def
@@ -0,0 +1,371 @@
+% --------------------------------------------------------------------------
+% the EXSHEETS package
+%
+% Yet another package for the creation of exercise sheets
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011-2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The exsheets package consists of the files
+% - exsheets.sty, exsheets_headings.def, exsheets_headings.cfg,
+% exsheets_tasks.def, exsheets_tasks.cfg, exsheets_configurations.cfg,
+% - exsheets_en.tex, exsheets_en.pdf,
+% - README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+% HEADINGS FOR QUESTIONS AND SOLUTIONS
+% the 6 base coffins:
+\ProvidesFile{exsheets_headings.def}
+ [\exsheets@date\space v\exsheets@version\space ExSheets headings object]
+
+\coffin_new:N \l__exsheets_heading_main_coffin
+\coffin_new:N \l__exsheets_heading_pre_coffin
+\coffin_new:N \l__exsheets_heading_post_coffin
+\coffin_new:N \l__exsheets_heading_title_coffin
+\coffin_new:N \l__exsheets_heading_number_coffin
+\coffin_new:N \l__exsheets_heading_points_coffin
+
+% the object varaibles:
+\bool_new:N \l__exsheets_heading_runin_bool
+\bool_new:N \l__exsheets_heading_indent_first_bool
+\bool_new:N \l__exsheets_heading_toc_reversed_bool
+
+\dim_new:N \l__exsheets_heading_above_dim
+\dim_new:N \l__exsheets_heading_below_dim
+\fp_new:N \l__exsheets_heading_scale_fp
+
+\tl_new:N \l__exsheets_heading_main_tl
+\tl_new:N \l__exsheets_heading_pre_code_tl
+\tl_new:N \l__exsheets_heading_post_code_tl
+
+\tl_new:N \l__exsheets_heading_title_format_tl
+\tl_new:N \l__exsheets_heading_title_pre_code_tl
+\tl_new:N \l__exsheets_heading_title_post_code_tl
+
+\tl_new:N \l__exsheets_heading_number_format_tl
+\tl_new:N \l__exsheets_heading_number_pre_code_tl
+\tl_new:N \l__exsheets_heading_number_post_code_tl
+
+\tl_new:N \l__exsheets_heading_points_format_tl
+\tl_new:N \l__exsheets_heading_points_pre_code_tl
+\tl_new:N \l__exsheets_heading_points_post_code_tl
+
+\tl_new:N \l__exsheets_heading_joined_coffins_tl
+\tl_new:N \l__exsheets_heading_attached_coffins_tl
+\seq_new:N \l__exsheets_heading_joined_coffins_seq
+\seq_new:N \l__exsheets_heading_attached_coffins_seq
+
+% internal object functions:
+% the following is shamelessly adapted from the `needspace' package by
+% Peter Wilson and Herries Press
+\cs_new:Npn \exsheets_needspace:n #1
+ {
+ \group_begin:
+ \dim_set:Nn \l__exsheets_tmpa_dim { #1 }
+ \skip_vertical:n { \c_zero_dim + \l__exsheets_tmpa_dim }
+ \tex_penalty:D -100
+ \skip_vertical:n { \c_zero_dim - \l__exsheets_tmpa_dim }
+ \skip_vertical:N \l__exsheets_tmpa_dim
+ \tex_penalty:D 9999
+ \skip_vertical:n { - \l__exsheets_tmpa_dim }
+ \skip_vertical:N \c_zero_dim
+ \group_end:
+ }
+
+\AtBeginDocument
+ {
+ \cs_if_exist:NF \needspace
+ { \cs_set_eq:NN \needspace \exsheets_needspace:n }
+ }
+
+\cs_generate_variant:Nn \seq_set_split:Nnn { NnV }
+
+\cs_new:Npn \__exsheets_join:N #1
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_if_blank:nF { ##1 }
+ { \exp_after:wN \__exsheets_join_coffin_sequence:w ##1 }
+ }
+ }
+\cs_new:Npn \__exsheets_join_coffin_sequence:w #1[#2,#3] #4[#5,#6] (#7,#8)
+ { \__exsheets_join_coffins:nnnnnnnn {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8} }
+
+\cs_new:Npn \__exsheets_join_coffins:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \coffin_join:cnncnnnn
+ { l__exsheets_heading_#1_coffin } { #2 } { #3 }
+ { l__exsheets_heading_#4_coffin } { #5 } { #6 }
+ { #7 } { #8 }
+ }
+\cs_new:Npn \__exsheets_attach:N #1
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_if_blank:nF { ##1 }
+ { \exp_after:wN \__exsheets_attach_coffin_sequence:w ##1 }
+ }
+ }
+\cs_new:Npn \__exsheets_attach_coffin_sequence:w #1[#2,#3]#4[#5,#6](#7,#8)
+ { \__exsheets_attach_coffins:nnnnnnnn {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8} }
+
+\cs_new:Npn \__exsheets_attach_coffins:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \coffin_attach:cnncnnnn
+ { l__exsheets_heading_#1_coffin } { #2 } { #3 }
+ { l__exsheets_heading_#4_coffin } { #5 } { #6 }
+ { #7 } { #8 }
+ }
+
+% the `exsheets-heading' object:
+% #1 = title,
+% #2 = number,
+% #3 = points
+% #4 = bonus
+\DeclareObjectType { exsheets-heading } { 4 }
+
+% the `default' template interface:
+\DeclareTemplateInterface { exsheets-heading } { default } { 4 }
+ {
+ runin : boolean = false ,
+ indent-first : boolean = false ,
+ toc-reversed : boolean = false ,
+ vscale : real = 1 ,
+ above : length = 2pt ,
+ below : length = 2pt ,
+ main : tokenlist = ,
+ pre-code : tokenlist = ,
+ post-code : tokenlist = ,
+ title-format : tokenlist = ,
+ title-pre-code : tokenlist = ,
+ title-post-code : tokenlist = ,
+ number-format : tokenlist = ,
+ number-pre-code : tokenlist = ,
+ number-post-code : tokenlist = ,
+ points-format : tokenlist = ,
+ points-pre-code : tokenlist = ,
+ points-post-code : tokenlist = ,
+ join : tokenlist = ,
+ attach : tokenlist =
+ }
+
+% the `default' template code:
+\DeclareTemplateCode { exsheets-heading } { default } { 4 }
+ {
+ runin = \l__exsheets_heading_runin_bool ,
+ indent-first = \l__exsheets_heading_indent_first_bool ,
+ toc-reversed = \l__exsheets_heading_toc_reversed_bool ,
+ vscale = \l__exsheets_heading_scale_fp ,
+ above = \l__exsheets_heading_above_dim ,
+ below = \l__exsheets_heading_below_dim ,
+ main = \l__exsheets_heading_main_tl ,
+ pre-code = \l__exsheets_heading_pre_code_tl ,
+ post-code = \l__exsheets_heading_post_code_tl ,
+ title-format = \l__exsheets_heading_title_format_tl ,
+ title-pre-code = \l__exsheets_heading_title_pre_code_tl ,
+ title-post-code = \l__exsheets_heading_title_post_code_tl ,
+ number-format = \l__exsheets_heading_number_format_tl ,
+ number-pre-code = \l__exsheets_heading_number_pre_code_tl ,
+ number-post-code = \l__exsheets_heading_number_post_code_tl ,
+ points-format = \l__exsheets_heading_points_format_tl ,
+ points-pre-code = \l__exsheets_heading_points_pre_code_tl ,
+ points-post-code = \l__exsheets_heading_points_post_code_tl ,
+ join = \l__exsheets_heading_joined_coffins_tl ,
+ attach = \l__exsheets_heading_attached_coffins_tl
+ }
+ {
+ \AssignTemplateKeys
+ \bool_if:nT
+ { \l__exsheets_questions_totoc_bool && \l__exsheets_inside_question_bool }
+ {
+ \phantomsection
+ \addcontentsline { toc } { \l__exsheets_questions_toclevel_tl }
+ {
+ \bool_if:NTF \l__exsheets_heading_toc_reversed_bool
+ { #2 \ #1 }
+ { #1\ #2 }
+ }
+ }
+ \bool_if:nT
+ { \l__exsheets_solutions_totoc_bool && !\l__exsheets_inside_question_bool }
+ {
+ \phantomsection
+ \addcontentsline { toc } { \l__exsheets_solutions_toclevel_tl }
+ {
+ \bool_if:NTF \l__exsheets_heading_toc_reversed_bool
+ { #2 \ #1 }
+ { #1\ #2 }
+ }
+ }
+ \seq_set_split:NnV \l__exsheets_heading_joined_coffins_seq { ; }
+ \l__exsheets_heading_joined_coffins_tl
+ \seq_set_split:NnV \l__exsheets_heading_attached_coffins_seq { ; }
+ \l__exsheets_heading_attached_coffins_tl
+ \bool_if:NTF \l__exsheets_heading_runin_bool
+ {
+ \hcoffin_set:Nn \l__exsheets_heading_main_coffin
+ {
+ \tl_if_blank:VTF \l__exsheets_heading_main_tl
+ { \tl_use:N \l__exsheets_heading_title_format_tl \strut }
+ { \tl_use:N \l__exsheets_heading_main_tl }
+ }
+ }
+ {
+ \hcoffin_set:Nn \l__exsheets_heading_main_coffin
+ {
+ \parbox { \linewidth }
+ {
+ \tl_if_blank:VTF \l__exsheets_heading_main_tl
+ { \tl_use:N \l__exsheets_heading_title_format_tl \strut }
+ { \tl_use:N \l__exsheets_heading_main_tl }
+ }
+ }
+ }
+ \hcoffin_set:Nn \l__exsheets_heading_pre_coffin
+ { \tl_use:N \l__exsheets_heading_pre_code_tl }
+ \hcoffin_set:Nn \l__exsheets_heading_post_coffin
+ { \tl_use:N \l__exsheets_heading_post_code_tl }
+ \coffin_join:NnnNnnnn
+ \l__exsheets_heading_main_coffin { l } { t }
+ \l__exsheets_heading_pre_coffin { l } { b } { 0pt } { 0pt }
+ \coffin_join:NnnNnnnn
+ \l__exsheets_heading_main_coffin { l } { b }
+ \l__exsheets_heading_post_coffin { l } { t } { 0pt } { 0pt }
+ \hcoffin_set:Nn \l__exsheets_heading_title_coffin
+ {
+ \tl_use:N \l__exsheets_heading_title_format_tl
+ \strut
+ \exsheets_questions_debug:
+ \tl_use:N \l__exsheets_heading_title_pre_code_tl
+ { \tl_use:N \l__exsheets_heading_title_user_format_tl #1 }
+ \tl_use:N \l__exsheets_heading_title_post_code_tl
+ }
+ \hcoffin_set:Nn \l__exsheets_heading_number_coffin
+ {
+ \tl_if_blank:VTF \l__exsheets_heading_number_format_tl
+ { \tl_use:N \l__exsheets_heading_title_format_tl }
+ { \tl_use:N \l__exsheets_heading_number_format_tl }
+ \strut
+ \tl_use:N \l__exsheets_heading_number_pre_code_tl
+ { \tl_use:N \l__exsheets_heading_title_user_format_tl #2 }
+ \tl_use:N \l__exsheets_heading_number_post_code_tl
+ }
+ \hcoffin_set:Nn \l__exsheets_heading_points_coffin
+ {
+ \bool_if:nF { \fp_compare_p:n { #3 = 0 } && \fp_compare_p:n { #4 = 0 } }
+ {
+ \tl_use:N \l__exsheets_heading_points_format_tl
+ \group_begin:
+ \tl_use:N \l__exsheets_heading_title_format_tl \strut
+ \group_end:
+ \tl_use:N \l__exsheets_heading_points_pre_code_tl
+ {
+ % TODO: \l__exsheets_points_separate_bonus_bool beachten
+ \fp_compare:nF { #3 = 0 }
+ {
+ \bool_if:nTF
+ {
+ \l__exsheets_points_separate_bonus_bool ||
+ \fp_compare_p:n { #4 = 0 }
+ }
+ { \exsheets_print_points:n { #3 } }
+ { \exsheets_parse_points:n { #3 } }
+ }
+ \bool_if:nT { !\fp_compare_p:n { #3 = 0 } && !\fp_compare_p:n { #4 = 0 } }
+ { ~ }
+ \fp_compare:nF { #4 = 0 }
+ {
+ \tl_use:N \l__exsheets_points_pre_bonus_marker_tl
+ \bool_if:nTF
+ {
+ \l__exsheets_points_separate_bonus_bool ||
+ \fp_compare_p:n { #3 = 0 }
+ }
+ {
+ \exsheets_print_bonus:n { #4 }
+ \tl_use:N \l__exsheets_points_post_bonus_marker_tl
+ }
+ {
+ \exsheets_parse_bonus:n { #4 }
+ \tl_use:N \l__exsheets_points_post_bonus_marker_tl
+ \exsheets_points_name:n { #3 + #4 }
+ }
+ }
+ }
+ \tl_use:N \l__exsheets_heading_points_post_code_tl
+ }
+ }
+ \bool_if:NF \l__exsheets_heading_runin_bool
+ {
+ \coffin_resize:Nnn \l__exsheets_heading_main_coffin { \linewidth }
+ {
+ \fp_to_decimal:N \l__exsheets_heading_scale_fp
+ \coffin_ht:N \l__exsheets_heading_main_coffin +
+ \l__exsheets_heading_below_dim
+ }
+ }
+ \__exsheets_join:N \l__exsheets_heading_joined_coffins_seq
+ \__exsheets_attach:N \l__exsheets_heading_attached_coffins_seq
+ \skip_vertical:N \l__exsheets_heading_above_dim
+ \exsheets_needspace:n
+ {
+ \coffin_ht:N \l__exsheets_heading_main_coffin +
+ \coffin_dp:N \l__exsheets_heading_main_coffin +
+ \l__exsheets_heading_below_dim +
+ \baselineskip
+ }
+ \noindent
+ \coffin_typeset:Nnnnn \l__exsheets_heading_main_coffin
+ { H } { l } { 0pt }{ 0pt }
+ \bool_if:NF \l__exsheets_heading_runin_bool
+ {
+ \skip_vertical:N \l__exsheets_heading_below_dim
+ \bool_if:NF \l__exsheets_heading_indent_first_bool { \noindent }
+ }
+ }
+
+% the two basic instances:
+% BLOCK:
+\DeclareInstance { exsheets-heading } { block } { default }
+ {
+ join = { title[r,B] number[l,B] (1ex,0pt) } ,
+ attach =
+ {
+ main[l,vc] title[l,vc] (0pt,0pt) ;
+ main[r,vc] points[l,vc] (\marginparsep,0pt)
+ }
+ }
+
+% RUNIN:
+\DeclareInstance { exsheets-heading } { runin } { default }
+ {
+ runin = true ,
+ number-post-code = \c_space_tl ,
+ attach =
+ { main[l,vc] points[l,vc] (\linewidth + \marginparsep,0pt) } ,
+ join =
+ {
+ main[r,vc] title[r,vc] (0pt,0pt) ;
+ main[r,vc] number[l,vc] (1ex,0pt)
+ }
+ }
+
+\tex_endinput:D \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.cfg b/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.cfg
new file mode 100644
index 00000000000..54de030795b
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.cfg
@@ -0,0 +1,56 @@
+% --------------------------------------------------------------------------
+% the EXSHEETS package
+%
+% Yet another package for the creation of exercise sheets
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011-2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The exsheets package consists of the files
+% - exsheets.sty, exsheets_headings.def, exsheets_headings.cfg,
+% exsheets_tasks.def, exsheets_tasks.cfg, exsheets_configurations.cfg,
+% - exsheets_en.tex, exsheets_en.pdf,
+% - README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+% further instances for the `tasks' environment
+\ProvidesFile{exsheets_tasks.cfg}
+ [\exsheets@date\space v\exsheets@version\space ExSheets tasks instances]
+
+% ITEMIZE:
+\DeclareInstance { exsheets-tasks } { itemize } { default }
+ {
+ enumerate = false ,
+ label-width = 2.25ex
+ }
+
+% ENUMERATE:
+\DeclareInstance { exsheets-tasks } { enumerate } { default }
+ { label-format = tsk. }
+
+% MULTIPLECHOICE
+\DeclareInstance { exsheets-tasks } { multiplechoice } { default }
+ {
+ enumerate = false ,
+ label = \choicebox
+ }
+
+\tex_endinput:D \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.def b/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.def
new file mode 100644
index 00000000000..8ff8c581753
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/exsheets_tasks.def
@@ -0,0 +1,334 @@
+% --------------------------------------------------------------------------
+% the EXSHEETS package
+%
+% Yet another package for the creation of exercise sheets
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011-2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The exsheets package consists of the files
+% - exsheets.sty, exsheets_headings.def, exsheets_headings.cfg,
+% exsheets_tasks.def, exsheets_tasks.cfg, exsheets_configurations.cfg,
+% - exsheets_en.tex, exsheets_en.pdf,
+% - README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+% TASKS: LIST-LIKE ENVIRONMENT
+\ProvidesFile{exsheets_tasks.def}
+ [\exsheets@date\space v\exsheets@version\space ExSheets tasks object]
+
+\RequirePackage { epic }
+
+% variables:
+\seq_new:N \l__exsheets_tasks_seq
+\int_new:N \l__exsheets_tasks_depth_int
+\int_new:N \l__exsheets_tasks_int
+\int_new:N \l__exsheets_tasks_total_items_int
+\int_new:N \l__exsheets_tasks_columns_int
+\int_new:N \l__exsheets_tasks_rows_int
+\bool_new:N \l__exsheets_tasks_enumerate_bool
+\tl_new:N \l__exsheets_tasks_instance_tl
+\tl_new:N \l__exsheets_tasks_label_tl
+\tl_new:N \l__exsheets_tasks_label_pattern_tl
+\tl_new:N \l__exsheets_tasks_custom_label_format_tl
+\dim_new:N \l__exsheets_tasks_item_indent_dim
+\dim_new:N \l__exsheets_tasks_after_item_skip_dim
+\dim_new:N \l__exsheets_tasks_item_width_dim
+\dim_new:N \l__exsheets_tasks_label_width_dim
+\dim_new:N \l__exsheets_tasks_default_label_width_dim
+\skip_new:N \l__exsheets_tasks_before_list_skip
+\skip_set:Nn \l__exsheets_tasks_before_list_skip { .33\baselineskip }
+\skip_new:N \l__exsheets_tasks_after_list_skip
+\skip_new:N \l__exsheets_tasks_after_list_default_skip
+\skip_set:Nn \l__exsheets_tasks_after_list_default_skip { .33\baselineskip }
+
+\NewCounterPattern* [ exsheets ] { task } { tsk }
+\ReadCounterFrom [ exsheets ] { task } \l__exsheets_tasks_int
+
+% scratch coffins:
+\cs_if_exist:NF \l__exsheets_tmpa_coffin { \coffin_new:N \l__exsheets_tmpa_coffin }
+\cs_if_exist:NF \l__exsheets_tmpb_coffin { \coffin_new:N \l__exsheets_tmpb_coffin }
+\cs_if_exist:NF \l__exsheets_tmpc_coffin { \coffin_new:N \l__exsheets_tmpc_coffin }
+
+% collect the tasks:
+% #1: instance
+% #2: number of columns
+% #3: environment body
+\cs_new:Npn \__exsheets_tasks:nnw #1#2#3 \end
+ {
+ \par \addvspace { \l__exsheets_tasks_before_list_skip }
+ \seq_set_split:Nnn \l__exsheets_tasks_seq { ; } { #3 }
+ % remove the last (empty) item:
+ \seq_pop_right:NN \l__exsheets_tasks_seq \l__exsheets_tmpa_tl
+ \tl_if_blank:VF \l__exsheets_tmpa_tl
+ { % TODO ERROR
+ }
+ \int_set:Nn \l__exsheets_tasks_total_items_int
+ { \seq_length:N \l__exsheets_tasks_seq }
+ \UseInstance { exsheets-tasks } { #1 }
+ { \l__exsheets_tasks_total_items_int }
+ { #2 }
+ { \l__exsheets_tasks_custom_label_format_tl }
+ % just to be sure:
+ \seq_clear:N \l__exsheets_tasks_seq
+ \par \skip_vertical:N \l__exsheets_tasks_after_list_skip
+ % we gobbled this from the input stream, let's put it back:
+ \end
+ }
+\cs_generate_variant:Nn \__exsheets_tasks:nnw { V }
+
+\cs_new:Npn \__exsheets_task:nnw #1#2[#3,#4][#5,#6](#7,#8)
+ {
+ \dim_set:Nn \l__exsheets_tasks_item_width_dim
+ {
+ \linewidth / \l__exsheets_tasks_columns_int -
+ \l__exsheets_tasks_depth_int\l__exsheets_tasks_item_indent_dim
+ }
+ \int_incr:N \l__exsheets_tmpa_int
+ \__exsheets_tasks_set_rows_num:NN
+ \l__exsheets_tasks_total_items_int
+ \l__exsheets_tasks_columns_int
+ \int_compare:nT { \l__exsheets_tmpa_int > \l__exsheets_tasks_columns_int }
+ { \int_set:Nn \l__exsheets_tmpa_int { 1 } }
+ % the item:
+ \hcoffin_set:Nn \l__exsheets_tmpa_coffin
+ {
+ \vcoffin_set:Nnn \l__exsheets_tmpc_coffin
+ { \l__exsheets_tasks_item_width_dim }
+ { \__exsheets_tasks_setup: #2 }
+ \coffin_typeset:Nnnnn \l__exsheets_tmpc_coffin
+ { l } { b } { 0pt } { 0pt }
+ }
+ % the label:
+ \hcoffin_set:Nn \l__exsheets_tmpb_coffin { \strut #1 }
+ \coffin_attach:NnnNnnnn
+ \l__exsheets_tmpa_coffin { l } { t }
+ \l__exsheets_tmpb_coffin { l } { t } { -\l__exsheets_tasks_label_width_dim } { 0pt }
+ % typeset label & item:
+ % need this when a new row starts:
+ \int_compare:nT { \l__exsheets_tmpa_int = 1 } { \par\noindent }
+ \skip_horizontal:N \l__exsheets_tasks_item_indent_dim
+ \coffin_typeset:Nnnnn \l__exsheets_tmpa_coffin { l } { T } { 0pt } { 0pt }
+ % need this before a new row starts:
+ \int_compare:nT { \l__exsheets_tmpa_int = \l__exsheets_tasks_columns_int }
+ { \skip_vertical:N \l__exsheets_tasks_after_item_skip_dim }
+ \coffin_clear:N \l__exsheets_tmpa_coffin
+ \coffin_clear:N \l__exsheets_tmpb_coffin
+ \coffin_clear:N \l__exsheets_tmpc_coffin
+ }
+\cs_generate_variant:Nn \__exsheets_task:nnw { VV }
+
+\cs_new:Npn \__exsheets_tasks_setup:
+ {
+ \dim_set:Nn \parskip { 0pt }
+ \noindent
+ \dim_set_eq:NN \parskip \parsep
+ \dim_set_eq:NN \parindent \listparindent
+ \strut
+ }
+
+\cs_new:Npn \__exsheets_tasks_set_rows_num:NN #1#2
+ {
+ \int_set:Nn \l__exsheets_tasks_rows_int { \int_div_truncate:nn { #1 } { #2 } }
+ \int_compare:nNnT { \int_mod:nn { #1 } { #2 } } > { 0 }
+ { \int_incr:N \l__exsheets_tasks_rows_int }
+ }
+
+% the `exsheets-tasks' object:
+% #1: number of items
+% #2: number of columns
+% #3: label-format
+\DeclareObjectType { exsheets-tasks } { 3 }
+% the `default' template interface:
+\DeclareTemplateInterface { exsheets-tasks } { default } { 3 }
+ {
+ enumerate : boolean = true ,
+ label : tokenlist ,
+ indent : length = 2.5em ,
+ label-format : tokenlist = tsk[a]) ,
+ label-width : length = 3ex ,
+ after-item-skip : length = 2ex
+ }
+% the `default' template code:
+\DeclareTemplateCode { exsheets-tasks } { default } { 3 }
+ {
+ enumerate = \l__exsheets_tasks_enumerate_bool ,
+ label = \l__exsheets_tasks_label_tl ,
+ indent = \l__exsheets_tasks_item_indent_dim ,
+ label-format = \l__exsheets_tasks_label_pattern_tl ,
+ label-width = \l__exsheets_tasks_default_label_width_dim ,
+ after-item-skip = \l__exsheets_tasks_after_item_skip_dim
+ }
+ {
+ \AssignTemplateKeys
+ \skip_set:Nn \l__exsheets_tasks_after_list_skip
+ {
+ \l__exsheets_tasks_after_list_default_skip -
+ \l__exsheets_tasks_after_item_skip_dim
+ }
+ \dim_compare:nT { \l__exsheets_tasks_label_width_dim = 0pt }
+ {
+ \dim_set_eq:NN
+ \l__exsheets_tasks_label_width_dim
+ \l__exsheets_tasks_default_label_width_dim
+ }
+ % need this for enumerate list:
+ \int_zero:N \l__exsheets_tasks_int
+ \int_set:Nn \l__exsheets_tasks_columns_int { #2 }
+ % set all the items in their own coffins and join with the ground:
+ \int_zero:N \l__exsheets_tmpa_int
+ \tl_if_blank:VF \l__exsheets_tasks_custom_label_format_tl
+ {
+ \tl_set_eq:NN
+ \l__exsheets_tasks_label_pattern_tl
+ \l__exsheets_tasks_custom_label_format_tl
+ }
+ \seq_map_inline:Nn \l__exsheets_tasks_seq
+ {
+ \__exsheets_read_item:w ##1\task{}{}\q_stop
+ \bool_if:NTF \l__exsheets_tasks_enumerate_bool
+ {
+ \int_incr:N \l__exsheets_tasks_int
+ \tl_if_blank:VT \l__exsheets_tasks_label_tl
+ {
+ \tl_set:Nn \l__exsheets_tasks_label_tl
+ {
+ \ReadCounterPatternFrom [ exsheets ]
+ \l__exsheets_tasks_label_pattern_tl
+ }
+ }
+ }
+ {
+ \tl_if_blank:VT \l__exsheets_tasks_label_tl
+ { \tl_set_eq:NN \l__exsheets_tasks_label_tl \labelitemi }
+ }
+ \tl_if_blank:VTF \l__exsheets_tasks_tmp_label_tl
+ {
+ \__exsheets_task:VVw
+ \l__exsheets_tasks_label_tl
+ \l__exsheets_tasks_item_tl
+ [ l , b ] [ l , t ] ( 0pt , 0pt )
+ }
+ {
+ \__exsheets_task:VVw
+ \l__exsheets_tasks_tmp_label_tl
+ \l__exsheets_tasks_item_tl
+ [ l , b ] [ l , t ] ( 0pt , 0pt )
+ \tl_clear:N \l__exsheets_tasks_tmp_label_tl
+ }
+ }
+ }
+
+\tl_new:N \task
+\tl_new:N \l__exsheets_tasks_item_tl
+\tl_new:N \l__exsheets_tasks_tmp_label_tl
+
+\cs_new:Npn \__exsheets_read_item:w #1 \task #2#3 \q_stop
+ {
+ \tl_set:Nn \l__exsheets_tmpa_tl { #1 }
+ \tl_set:Nn \l__exsheets_tmpb_tl { #2 }
+ \tl_set:Nn \l__exsheets_tmpc_tl { #3 }
+ \tl_if_blank:VTF \l__exsheets_tmpa_tl
+ {
+ \tl_set_eq:NN \l__exsheets_tasks_item_tl \l__exsheets_tmpc_tl
+ \tl_set_eq:NN \l__exsheets_tasks_tmp_label_tl \l__exsheets_tmpb_tl
+ }
+ { \tl_set_eq:NN \l__exsheets_tasks_item_tl \l__exsheets_tmpa_tl }
+ }
+
+% choice box:
+\bool_new:N \l__exsheets_choice_checked_bool
+\dim_new:N \l__exsheets_choice_width_dim
+\dim_set:Nn \l__exsheets_choice_width_dim { 1.25ex }
+\dim_new:N \l__exsheets_choice_linewidth_dim
+\dim_set:Nn \l__exsheets_choice_linewidth_dim { .3pt }
+\dim_new:N \l__exsheets_choice_checkwidth_dim
+\dim_set:Nn \l__exsheets_choice_checkwidth_dim { .5pt }
+\dim_new:N \l__exsheets_choice_raise_dim
+\dim_set:Nn \l__exsheets_choice_raise_dim { .1ex }
+
+\cs_new:Npn \exsheets_choice:
+ {
+ \leavevmode
+ \bool_set_false:N \l__exsheets_choice_checked_bool
+ \box_move_up:nn
+ { \l__exsheets_choice_raise_dim }
+ { \hbox:n { \__exsheets_choice: } }
+ }
+
+\cs_new:Npn \exsheets_choice_checked:
+ {
+ \leavevmode
+ \bool_set_true:N \l__exsheets_choice_checked_bool
+ \box_move_up:nn
+ { \l__exsheets_choice_raise_dim }
+ { \hbox:n { \__exsheets_choice: } }
+ }
+
+\cs_new:Npn \__exsheets_choice:
+ {%
+ \dim_set:Nn \unitlength { .1\l__exsheets_choice_width_dim }
+ \begin{picture}(10,0)
+ \linethickness \l__exsheets_choice_linewidth_dim
+ \drawline(0,0)(0,10)(10,10)(10,0)(0,0)
+ \linethickness \l__exsheets_choice_checkwidth_dim
+ \bool_if:NT \l__exsheets_choice_checked_bool
+ {
+ \drawline(2,2)(8,8)
+ \drawline(2,8)(8,2)
+ }
+ \end{picture}%
+ }
+
+\cs_if_exist:NF \choicebox
+ { \cs_new:Npn \choicebox { \exsheets_choice: } }
+\cs_if_exist:NF \ckeckedchoicebox
+ { \cs_new:Npn \ckeckedchoicebox { \exsheets_choice_checked: } }
+
+% base instance:
+% ALPHABETIZE: a) b) c)
+\DeclareInstance { exsheets-tasks } { alphabetize } { default } { }
+
+\keys_define:nn { exsheets / tasks }
+ {
+ style .tl_set:N = \l__exsheets_tasks_instance_tl ,
+ label .tl_set:N = \l__exsheets_tasks_custom_label_format_tl ,
+ label-width .dim_set:N = \l__exsheets_tasks_label_width_dim ,
+ before-skip .skip_set:N = \l__exsheets_tasks_before_list_skip ,
+ after-skip .skip_set:N = \l__exsheets_tasks_after_list_skip
+ }
+
+% the user environment:
+\NewDocumentEnvironment { tasks } { oG{1} }
+ {
+ \IfNoValueTF { #1 }
+ { \keys_set:nn { exsheets / tasks } { style = alphabetize } }
+ {
+ \keys_set:nn { exsheets / tasks } { #1 }
+ \tl_if_blank:VT \l__exsheets_tasks_instance_tl
+ { \keys_set:nn { exsheets / tasks } { style = alphabetize } }
+ }
+ \int_incr:N \l__exsheets_tasks_depth_int
+ \__exsheets_tasks:Vnw \l__exsheets_tasks_instance_tl { #2 }
+ }
+ { }
+
+\tex_endinput:D \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/exsheets/translations.sty b/Master/texmf-dist/tex/latex/exsheets/translations.sty
new file mode 100644
index 00000000000..208bc7295c1
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/exsheets/translations.sty
@@ -0,0 +1,311 @@
+% --------------------------------------------------------------------------
+% the TRANSLATIONS package
+%
+% a simple translator
+%
+% This package is part of the exsheets bundle
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/exsheets/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The translations package consists of the files
+% - translations.sty
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\def\@trnslt@date{2012/10/08}
+\def\@trnslt@version{v0.2b}
+
+\ProvidesPackage{translations}[\@trnslt@date\space \@trnslt@version\space a simple translator]
+\RequirePackage{etoolbox}
+
+% --------------------------------------------------------------------------
+% message handling
+\def\@trnslt@error@message{%
+ For details have a look at the `exsheets' manual.}
+
+\def\@trnslt@create@message#1{%
+ \ifstrequal{#1}{Error}
+ {%
+ \lowercase{\csdef{@trnslt@#1}}##1{%
+ \csuse{Package#1}{translations}{##1}{\@trnslt@error@message}}%
+ }{%
+ \lowercase{\csdef{@trnslt@#1}}##1{%
+ \csuse{Package#1}{translations}{##1}}%
+ }}
+\@trnslt@create@message{Error}
+\@trnslt@create@message{Warning}
+\@trnslt@create@message{WarningNoLine}
+\@trnslt@create@message{Info}
+
+\def\@trnslt@err@unknown@lang#1{%
+ \@trnslt@error{Unknown language `#1'}}
+
+\def\@trnslt@warn@unknown@lang#1{%
+ \@trnslt@warning{Unknown language `#1'}}
+
+\def\@trnslt@err@already@defined#1#2{%
+ \@trnslt@error{The #2 translation for `#1' is already defined.}}
+
+\def\@trnslt@err@not@defined#1#2{%
+ \@trnslt@error{The \@trnslt@language{#2} translation for `#1' is not defined yet.}}
+
+% --------------------------------------------------------------------------
+% check if babel or polyglossia is used
+\AtEndPreamble{
+ \@ifpackageloaded{babel}{}{
+ \@ifpackageloaded{polyglossia}{}
+ {\@trnslt@warning{No language package found. I am going to use `english'
+ as default language.}}
+ }
+ \ifdef\languagename{}
+ {\def\languagename{english}}
+ \def\@trnslt@current@language{\languagename}
+ \ifdef\bbl@afterfi{}
+ {\long\def\bbl@afterfi#1\fi{\fi#1}}
+}
+
+% --------------------------------------------------------------------------
+% \DeclareLanguage and \DeclareLanguageAlias
+% #1: language
+\newrobustcmd*\DeclareLanguage[1]{%
+ \@trnslt@declare@language{#1}}
+\@onlypreamble\DeclareLanguage
+
+\def\@trnslt@declare@language#1{%
+ \csdef{@trnslt@language@#1}{#1}}
+
+% #1: alias
+% #2: language
+\newrobustcmd*\DeclareLanguageAlias[2]{%
+ \@trnslt@declare@languagealias{#1}{#2}}
+\@onlypreamble\DeclareLanguageAlias
+
+\def\@trnslt@declare@languagealias#1#2{%
+ \ifcsdef{@trnslt@language@#2}
+ {}{%
+ \@trnslt@warn@unknown@lang{#2}%
+ \@trnslt@declare@language{#2}%
+ }%
+ \csletcs{@trnslt@language@#1}{@trnslt@language@#2}}
+
+\def\@trnslt@language#1{%
+ \csuse{@trnslt@language@#1}}
+
+% --------------------------------------------------------------------------
+% \DeclareTranslation, \NewTranslation and \RenewTranslation
+% #1: language
+% #2: word
+% #3: replacement
+\newrobustcmd*\DeclareTranslation[3]{%
+ \@trnslt@declare@translation{#2}{#1}{#3}}
+\@onlypreamble\DeclareTranslation
+
+\def\@trnslt@declare@translation#1#2#3{%
+ \ifcsdef{@trnslt@language@#2}
+ {%
+ \csdef{@trnslt@word@#1@\@trnslt@language{#2}}{#3}%
+ \csdef{@trnslt@word@#1@literal}{#1}%
+ }
+ {\@trnslt@err@unknown@lang{#2}}}
+
+\def\@trnslt@if@translation#1#2{%
+ \ifcsdef{@trnslt@word@#1@\@trnslt@language{#2}}
+ {\expandafter\@firstoftwo}
+ {\expandafter\@secondoftwo}}
+
+\newrobustcmd*\NewTranslation[3]{%
+ \@trnslt@new@translation{#2}{#1}{#3}}
+\@onlypreamble\NewTranslation
+
+\def\@trnslt@new@translation#1#2#3{%
+ \@trnslt@if@translation{#1}{#2}
+ {\@trnslt@err@already@defined{#1}{#2}}
+ {\@trnslt@declare@translation{#1}{#2}{#3}}}
+
+\newrobustcmd*\RenewTranslation[3]{%
+ \@trnslt@renew@translation{#2}{#1}{#3}}
+\@onlypreamble\RenewTranslation
+
+\def\@trnslt@renew@translation#1#2#3{%
+ \@trnslt@if@translation{#1}{#2}
+ {\@trnslt@declare@translation{#1}{#2}{#3}}
+ {\@trnslt@err@not@defined{#1}{#2}}}
+
+% --------------------------------------------------------------------------
+% \GetTranslationFor and \GetTranslation
+% these need to be expandable!
+% #1: language
+% #2: word
+\newcommand*\GetTranslationFor[2]{%
+ \@trnslt@get@translation@for{#2}{#1}}
+
+\newcommand*\GetTranslation[1]{%
+ \@trnslt@get@translation@for{#1}{\@trnslt@current@language}}
+
+% #1: word #2: language
+\def\@trnslt@get@translation@for#1#2{%
+ \@trnslt@if@translation{#1}{#2}
+ {\csuse{@trnslt@word@#1@\@trnslt@language{#2}}}
+ {%
+ \@trnslt@warning{Translation for `#1' in #2 unknown.}%
+ \csuse{@trnslt@word@#1@literal}%
+ }}
+
+% --------------------------------------------------------------------------
+% \SaveTranslationFor and \SaveTranslation
+\newrobustcmd*\SaveTranslationFor[3]{%
+ \@trnslt@save@translation@for{#1}{#3}{#2}}
+
+\newrobustcmd*\SaveTranslation[2]{%
+ \@trnslt@save@translation@for{#1}{#2}{\@trnslt@current@language}}
+
+\def\@trnslt@save@translation@for#1#2#3{%
+ \edef#1{%
+ \@trnslt@if@translation{#2}{#3}
+ {\csuse{@trnslt@word@#2@\@trnslt@language{#3}}}
+ {}%
+ }}
+
+% --------------------------------------------------------------------------
+% \LoadDictionary and \LoadDictionaryFor
+\newrobustcmd*\LoadDictionary[1]{%
+ \@trnslt@load@dictionary@for{#1}{\@trnslt@current@language}}
+\@onlypreamble\LoadDictionary
+
+\newrobustcmd*\LoadDictionaryFor[2]{%
+ \@trnslt@load@dictionary@for{#1}{#2}}
+\@onlypreamble\LoadDictionaryFor
+
+\def\@trnslt@load@dictionary@for#1#2{%
+ \AtBeginDocument{%
+ \InputIfFileExists{#1-\@trnslt@language{#2}.trsl}
+ {\@trnslt@info{loading dictionary `#1' for `#2'.}}
+ {\@trnslt@warning{File `#1-\@trnslt@language{#2}.trsl' not found.}}%
+ }}
+
+\newrobustcmd*\ProvideDictionaryFor[2]{%
+ \@trnslt@provide@dictionary@for{#1}{#2}}
+\@onlypreamble\ProvideDictionaryFor
+
+\def\@trnslt@provide@dictionary@for#1#2{%
+ \def\@trnslt@dictionary@name{#2}%
+ \def\@trnslt@dictionary@lang{#1}%
+ \@ifnextchar[
+ {\@trnslt@provide@dictionary@version}
+ {\ProvidesFile{#2-#1.trsl}[(#1 translation file `#2')]}}
+
+\def\@trnslt@provide@dictionary@version[#1]{%
+ \ProvidesFile
+ {\@trnslt@dictionary@name-\@trnslt@dictionary@lang.trsl}%
+ [(\@trnslt@dictionary@lang\space translation file `\@trnslt@dictionary@name') #1]}
+
+% --------------------------------------------------------------------------
+% predefined languages
+\DeclareLanguage{albanian}
+\DeclareLanguage{bulgarian}
+\DeclareLanguage{catalan}
+\DeclareLanguage{croatian}
+\DeclareLanguage{czech}
+\DeclareLanguage{danish}
+\DeclareLanguage{dutch}
+\DeclareLanguage{english}
+\DeclareLanguage{finnish}
+\DeclareLanguage{french}
+\DeclareLanguage{german}
+\DeclareLanguage{greek}
+\DeclareLanguage{hebrew}
+\DeclareLanguage{hungarian}
+\DeclareLanguage{icelandic}
+\DeclareLanguage{italian}
+\DeclareLanguage{norwegian}
+\DeclareLanguage{polish}
+\DeclareLanguage{portuges}
+\DeclareLanguage{romanian}
+\DeclareLanguage{russian}
+\DeclareLanguage{serbocroatian}
+\DeclareLanguage{slovak}
+\DeclareLanguage{slovenian}
+\DeclareLanguage{spanish}
+\DeclareLanguage{swedish}
+\DeclareLanguage{turkish}
+\DeclareLanguage{ukrainian}
+
+\DeclareLanguageAlias{Albanian}{albanian}
+\DeclareLanguageAlias{Bulgarian}{bulgarian}
+\DeclareLanguageAlias{Catalan}{catalan}
+\DeclareLanguageAlias{Croatian}{croatian}
+\DeclareLanguageAlias{Czech}{czech}
+\DeclareLanguageAlias{Danish}{danish}
+\DeclareLanguageAlias{Dutch}{dutch}
+\DeclareLanguageAlias{Finnish}{finnish}
+\DeclareLanguageAlias{francais}{french}
+\DeclareLanguageAlias{Francais}{francais}
+\DeclareLanguageAlias{canadien}{french}
+\DeclareLanguageAlias{Canadien}{canadien}
+\DeclareLanguageAlias{French}{french}
+\DeclareLanguageAlias{american}{english}
+\DeclareLanguageAlias{American}{american}
+\DeclareLanguageAlias{australian}{english}
+\DeclareLanguageAlias{Australian}{australian}
+\DeclareLanguageAlias{british}{english}
+\DeclareLanguageAlias{British}{british}
+\DeclareLanguageAlias{canadian}{english}
+\DeclareLanguageAlias{Canadian}{canadian}
+\DeclareLanguageAlias{English}{english}
+\DeclareLanguageAlias{UKenglish}{english}
+\DeclareLanguageAlias{USenglish}{english}
+\DeclareLanguageAlias{austrian}{german}
+\DeclareLanguageAlias{Austrian}{austrian}
+\DeclareLanguageAlias{German}{german}
+\DeclareLanguageAlias{germanb}{german}
+\DeclareLanguageAlias{naustrian}{austrian}
+\DeclareLanguageAlias{ngerman}{german}
+\DeclareLanguageAlias{Greek}{greek}
+\DeclareLanguageAlias{polutonikogreek}{greek}
+\DeclareLanguageAlias{Hebrew}{hebrew}
+\DeclareLanguageAlias{Hungarian}{hungarian}
+\DeclareLanguageAlias{magyar}{hungarian}
+\DeclareLanguageAlias{Magyar}{magyar}
+\DeclareLanguageAlias{Icelandic}{icelandic}
+\DeclareLanguageAlias{Italian}{italian}
+\DeclareLanguageAlias{norsk}{norwegian}
+\DeclareLanguageAlias{Norsk}{norsk}
+\DeclareLanguageAlias{Norwegian}{norwegian}
+\DeclareLanguageAlias{nynorsk}{norwegian}
+\DeclareLanguageAlias{Nynorsk}{nynorsk}
+\DeclareLanguageAlias{Polish}{polish}
+\DeclareLanguageAlias{brazil}{portuges}
+\DeclareLanguageAlias{Brazil}{brazil}
+\DeclareLanguageAlias{brazilian}{portuges}
+\DeclareLanguageAlias{Brazilian}{brazilian}
+\DeclareLanguageAlias{Portuges}{portuges}
+\DeclareLanguageAlias{portuguese}{portuges}
+\DeclareLanguageAlias{Portuguese}{portuguese}
+\DeclareLanguageAlias{Romanian}{romanian}
+\DeclareLanguageAlias{Russian}{russian}
+\DeclareLanguageAlias{Serbocroatian}{serbocroatian}
+\DeclareLanguageAlias{Slovak}{slovak}
+\DeclareLanguageAlias{Slovenian}{slovenian}
+\DeclareLanguageAlias{Spanish}{spanish}
+\DeclareLanguageAlias{Swedish}{swedish}
+\DeclareLanguageAlias{Turkish}{turkish}
+\DeclareLanguageAlias{Ukrainian}{ukrainian}
+
+\endinput \ No newline at end of file