From 0e871146bcb1bf041dac127d5b76011aa31e28aa Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 20 Jul 2014 22:05:15 +0000 Subject: exsheets (20jul14) git-svn-id: svn://tug.org/texlive/trunk@34665 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/exsheets/exsheets.sty | 585 +++++++++++----------- 1 file changed, 300 insertions(+), 285 deletions(-) (limited to 'Master/texmf-dist/tex/latex/exsheets/exsheets.sty') diff --git a/Master/texmf-dist/tex/latex/exsheets/exsheets.sty b/Master/texmf-dist/tex/latex/exsheets/exsheets.sty index f6425d9bb7d..4e628c964af 100644 --- a/Master/texmf-dist/tex/latex/exsheets/exsheets.sty +++ b/Master/texmf-dist/tex/latex/exsheets/exsheets.sty @@ -25,8 +25,8 @@ % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % ---------------------------------------------------------------------------- -\def\exsheets@date{2014/06/28} -\def\exsheets@version{0.14} +\def\exsheets@date{2014/07/20} +\def\exsheets@version{0.15} \RequirePackage { expl3 , xparse } \ProvidesExplPackage @@ -37,10 +37,10 @@ % -------------------------------------------------------------------------- % check expl3 version: -\@ifpackagelater { expl3 } { 2012/11/21 } +\@ifpackagelater {expl3} {2014/01/01} { } { - \PackageError { exsheets } { Support~package~expl3~too~old } + \PackageError {exsheets} {Support~package~expl3~too~old} { You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ 'l3packages'.\MessageBreak @@ -78,19 +78,19 @@ % ---------------------------------------------------------------------------- % messages -\msg_new:nnn { exsheets} { totalpoints } +\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} { parse-points } +\msg_new:nnn {exsheets} {parse-points} { You~need~to~activate~`points/parse'~if~you~want~to~use~ \token_to_str:N #1 .~I~will~do~nothing~instead. } -\msg_new:nnn { exsheets} { headings } +\msg_new:nnn {exsheets} {headings} { You~requested~the~headings~instance~`#1'~\msg_line_context: \c_space_tl which~is~not~defined.~Did~you~forget~to~use~the~package~option~ @@ -98,52 +98,52 @@ pretend~nothing~happened. } -\msg_new:nnn { exsheets } { random-file } +\msg_new:nnn {exsheets} {random-file} { You~asked~me~to~select~#1~questions~from~file~#2~which~contains~#3~questions.~ I'll~select~all~of~them. } -\msg_new:nnn { exsheets } { random-selectable } +\msg_new:nnn {exsheets} {random-selectable} { You~asked~me~to~select~#1~questions~from~file~#2~which~contains~#3~questions.~ #4~of~these~are~selectable,~so~I'll~select~all~of~them. } -\msg_new:nnn { exsheets } { only-inside-question } +\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 } +\msg_new:nnn {exsheets} {loading-configurations} { Loading~custom~configurations~file~`exsheets_configurations.cgf'. } -\msg_new:nnn { exsheets } { deprecated-command } +\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 } { dropped-option } +\msg_new:nnn {exsheets} {dropped-option} { The~option~`#1'~has~been~dropped. } -\msg_new:nnn { exsheets } { grade-missing } +\msg_new:nnn {exsheets} {grade-missing} { The~grade~`#1'~has~never~been~declared. } -\msg_new:nnn { exsheets } { grade-parse } +\msg_new:nnn {exsheets} {grade-parse} { I~cannot~calculate~the~points~for~grade~`#1'~since~you're~using~the~option~ `points/parse=false'. } -\msg_new:nnn { exsheets } { variations } +\msg_new:nnn {exsheets} {variations} { The~number~of~variations~must~at~least~be~`2'.~You~chose~`#1'~hence~I'm~ doing~nothing. } -\msg_new:nnn { exsheets } { variant } +\msg_new:nnn {exsheets} {variant} { You~must~choose~an~integer~between~`1'~and~`#1'.~You~chose~`#2'~hence~ I'm~doing~nothing. @@ -152,11 +152,11 @@ \cs_new_protected:Npn \exsheets_depr_cmd:nn #1#2 { \cs_new:Npn #1 - { \msg_warning:nnnn { exsheets } { deprecated-command } { #1 } { #2 } #2 } + { \msg_warning:nnnn {exsheets} { deprecated-command } {#1} {#2} #2 } } \cs_new_protected:Npn \exsheets_option_dropped:n #1 - { \msg_warning:nnn { exsheets } { dropped-option } { #1 } } + { \msg_warning:nnn {exsheets} { dropped-option } {#1} } % ---------------------------------------------------------------------------- \RequirePackage @@ -172,7 +172,7 @@ % ---------------------------------------------------------------------------- % write to aux file: \cs_new_protected:Npn \exsheets_write_to_aux_x:n #1 - { \if@filesw \iow_now:Nx \@auxout { #1 } \fi } + { \if@filesw \iow_now:Nx \@auxout {#1} \fi } % prevent compilatin errors when exsheets is removed from a document: \AtBeginDocument{ @@ -215,8 +215,6 @@ % ---------------------------------------------------------------------------- % (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 @@ -237,28 +235,27 @@ \tl_new:N \l__exsheets_solutions_pre_hook_tl \tl_new:N \l__exsheets_solutions_post_hook_tl -\AtBeginDocument{ - \cs_if_exist:NF \phantomsection - { \cs_new:Npn \phantomsection {} } -} -\keys_define:nn { exsheets } +\keys_define:nn {exsheets} { color .code:n = - \exsheets_option_dropped:n { color } , + \exsheets_option_dropped:n {color} , counter-format .code:n = \SaveCounterPattern [ exsheets ] \l__exsheets_qu_counter_pattern_tl \l__exsheets_qu_counter_interpretation_tl - { #1 } , + {#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 , + load-headings .code:n = + \exsheets_option_dropped:n {load-headings} , +% .bool_set:N = \l__exsheets_load_headings_bool , headings-format .tl_set:N = \l_exsheets_heading_title_user_format_tl , subtitle-format .tl_set:N = \l_heading_exsheets_subtitle_user_format_tl , - load-tasks .bool_set:N = \l__exsheets_load_tasks_bool , + load-tasks .code:n = + \exsheets_option_dropped:n {load-tasks} , use-ref .bool_set:N = \l__exsheets_solutions_by_ref_bool , totoc .choice: , totoc / true .code:n = @@ -271,16 +268,16 @@ 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 } , + \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 , auto-label .bool_set:N = \l__exsheets_auto_label_bool } -\keys_set:nn { exsheets} { counter-format = qu. } +\keys_set:nn {exsheets} { counter-format = qu. } % process package options: -\ProcessKeysOptions { exsheets } +\ProcessKeysOptions {exsheets} % ---------------------------------------------------------------------------- % points for exercises @@ -322,50 +319,50 @@ \cs_new_protected_nopar:Npn \exsheets_set_points_name:n #1 { - \tl_if_in:nnTF { #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_protected_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_tl {#1} \tl_set:Nn \l__exsheets_points_name_plural_tl { #1#2 } } \cs_new_protected_nopar:Npn \exsheets_set_bonus_name:n #1 { - \tl_if_in:nnTF { #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_protected_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_tl {#1} \tl_set:Nn \l__exsheets_bonus_name_plural_tl { #1#2 } } % FIXME: \fp_add will deprecate! \cs_new_protected_nopar:Npn \exsheets_add_points:n #1 { - \fp_gadd:Nn \g__exsheets_points_sum_fp { #1 } - \fp_gadd:Nn \g__exsheets_this_question_points_fp { #1 } + \fp_gadd:Nn \g__exsheets_points_sum_fp {#1} + \fp_gadd:Nn \g__exsheets_this_question_points_fp {#1} } \cs_generate_variant:Nn \exsheets_add_points:n { V } \cs_new_protected_nopar:Npn \exsheets_add_bonus:n #1 { - \fp_gadd:Nn \g__exsheets_bonus_sum_fp { #1 } - \fp_gadd:Nn \g__exsheets_this_question_bonus_fp { #1 } + \fp_gadd:Nn \g__exsheets_bonus_sum_fp {#1} + \fp_gadd:Nn \g__exsheets_this_question_bonus_fp {#1} } \cs_generate_variant:Nn \exsheets_add_bonus:n { V } \cs_new_protected_nopar:Npn \exsheets@sum@of@points #1 - { \fp_gset:Nn \g_exsheets_total_points_fp { #1 } } + { \fp_gset:Nn \g_exsheets_total_points_fp {#1} } \cs_new_protected_nopar:Npn \exsheets@sum@of@bonus #1 - { \fp_gset:Nn \g_exsheets_total_bonus_fp { #1 } } + { \fp_gset:Nn \g_exsheets_total_bonus_fp {#1} } \cs_new_nopar:Npn \exsheets_parse_points:n #1 { @@ -373,8 +370,8 @@ \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 { #1 } } + { \exsheets_num:n { \fp_to_decimal:n {#1} } } + { \use:n {#1} } } \group_end: } @@ -386,8 +383,8 @@ \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 { #1 } } + { \exsheets_num:n { \fp_to_decimal:n {#1} } } + { \use:n {#1} } } \group_end: } @@ -396,7 +393,7 @@ \cs_new_protected_nopar:Npn \exsheets_num:n #1 { \group_begin: - \fp_set:Nn \l__exsheets_tmpa_tl { #1 } + \fp_set:Nn \l__exsheets_tmpa_tl {#1} \fp_to_tl:N \l__exsheets_tmpa_tl \group_end: } @@ -411,7 +408,7 @@ { \bool_if:NTF \l__exsheets_parse_points_bool { - \tl_if_eq:nnTF { #1 } { ?? } + \tl_if_eq:nnTF {#1} { ?? } { \tl_use:N \l__exsheets_points_name_plural_tl } { \fp_compare:nTF { #1 <= 1 } @@ -434,7 +431,7 @@ { \bool_if:NTF \l__exsheets_parse_points_bool { - \tl_if_eq:nnTF { #1 } { ?? } + \tl_if_eq:nnTF {#1} { ?? } { \tl_use:N \l__exsheets_bonus_name_plural_tl } { \fp_compare:nTF { #1 <= 1 } @@ -452,34 +449,34 @@ { \bool_if:NTF \l__exsheets_inside_question_bool { - \exsheets_add_points:n { #2 } - \IfBooleanF { #1 } { \exsheets_print_points:n { #2 } } + \exsheets_add_points:n {#2} + \IfBooleanF {#1} { \exsheets_print_points:n {#2} } } - { \msg_error:nnn { exsheets } { only-inside-question } { \addpoints } } + { \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 } } + \exsheets_add_bonus:n {#2} + \IfBooleanF {#1} { \exsheets_print_bonus:n {#2} } } - { \msg_error:nnn { exsheets } { only-inside-question } { \addbonus } } + { \msg_error:nnn {exsheets} {only-inside-question} {\addbonus} } } \NewDocumentCommand \points { sm } { - \IfBooleanTF { #1 } - { \exsheets_parse_points:n { #2 } } - { \exsheets_print_points:n { #2 } } + \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 } } + \IfBooleanTF {#1} + { \exsheets_parse_bonus:n {#2} } + { \exsheets_print_bonus:n {#2} } } \cs_new_protected_nopar:Npn \exsheets_print_points:n #1 @@ -487,8 +484,8 @@ \group_begin: \tl_use:N \l__exsheets_points_format_tl { - \exsheets_parse_points:n { #1 } - \exsheets_points_name:n { #1 } + \exsheets_parse_points:n {#1} + \exsheets_points_name:n {#1} } \group_end: } @@ -496,8 +493,8 @@ \cs_new_protected_nopar:Npn \exsheets_print_bonus:n #1 { - \exsheets_parse_bonus:n { #1 } - \exsheets_bonus_name:n { #1 } + \exsheets_parse_bonus:n {#1} + \exsheets_bonus_name:n {#1} } \cs_generate_variant:Nn \exsheets_print_bonus:n { V } @@ -505,44 +502,44 @@ { \bool_if:NTF \l__exsheets_parse_points_bool { - \IfBooleanTF { #1 } + \IfBooleanTF {#1} { \exsheets_parse_points:n { \g_exsheets_total_points_fp } } { \exsheets_print_points:n { \g_exsheets_total_points_fp } } } - { \msg_warning:nnn { exsheets } { parse-points } { \pointssum } } + { \msg_warning:nnn {exsheets} {parse-points} {\pointssum} } } \NewDocumentCommand \bonussum { s } { \bool_if:NTF \l__exsheets_parse_points_bool { - \IfBooleanTF { #1 } + \IfBooleanTF {#1} { \exsheets_parse_bonus:n { \g_exsheets_total_bonus_fp } } { \exsheets_print_bonus:n { \g_exsheets_total_bonus_fp } } } - { \msg_warning:nnn { exsheets } { parse-points } { \bonussum } } + { \msg_warning:nnn {exsheets} {parse-points} {\bonussum} } } \NewDocumentCommand \currentpointssum { s } { \bool_if:NTF \l__exsheets_parse_points_bool { - \IfBooleanTF { #1 } + \IfBooleanTF {#1} { \exsheets_parse_points:n { \g__exsheets_points_sum_fp } } { \exsheets_print_points:n { \g__exsheets_points_sum_fp } } } - { \msg_warning:nnn { exsheets } { parse-points } { \currentpointssum } } + { \msg_warning:nnn {exsheets} {parse-points} {\currentpointssum} } } \NewDocumentCommand \currentbonussum { s } { \bool_if:NTF \l__exsheets_parse_points_bool { - \IfBooleanTF { #1 } + \IfBooleanTF {#1} { \exsheets_parse_bonus:n { \g__exsheets_bonus_sum_fp } } { \exsheets_print_bonus:n { \g__exsheets_bonus_sum_fp } } } - { \msg_warning:nnn { exsheets } { parse-points } { \currentbonussum } } + { \msg_warning:nnn {exsheets} {parse-points} {\currentbonussum} } } \NewDocumentCommand \totalpoints { s } @@ -551,7 +548,7 @@ \tl_use:N \l__exsheets_points_format_tl { \exsheets_totalpoints: - \IfBooleanF { #1 } + \IfBooleanF {#1} { \bool_if:nT { @@ -561,7 +558,7 @@ { \exsheets_points_name:n { \g_exsheets_total_points_fp } } } \exsheets_totalbonus: - \IfBooleanF { #1 } + \IfBooleanF {#1} { \fp_compare:nF { \g_exsheets_total_bonus_fp = 0 } { @@ -590,7 +587,7 @@ { \g_exsheets_total_points_fp } } } - { \msg_warning:nn { exsheets } { totalpoints } } + { \msg_warning:nn {exsheets} {totalpoints} } } \cs_new_nopar:Npn \exsheets_totalbonus: @@ -610,12 +607,12 @@ \keys_define:nn { exsheets / points } { name .code:n = - \exsheets_set_points_name:n { #1 } - \exsheets_set_bonus_name:n { #1 } , + \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 } , + \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 , @@ -634,10 +631,10 @@ \cs_new_protected:Npn \exsheets_set_variations:n #1 { - \int_compare:nNnTF { #1 } < { 2 } - { \msg_warning:nnn { exsheets } { variations } { #1 } } + \int_compare:nNnTF {#1} < { 2 } + { \msg_warning:nnn {exsheets} {variations} {#1} } { - \int_set:Nn \l__exsheets_variations_int { #1 } + \int_set:Nn \l__exsheets_variations_int {#1} \int_zero:N \l__exsheets_tmpa_int \int_do_while:nNnn { \l__exsheets_tmpa_int } < { \l__exsheets_variations_int } @@ -658,8 +655,8 @@ { \bool_if:nTF { - \int_compare_p:nNn { #1 } > { 0 } && - \int_compare_p:nNn { #1 } < { \l__exsheets_variations_int + 1 } + \int_compare_p:nNn {#1} > { 0 } && + \int_compare_p:nNn {#1} < { \l__exsheets_variations_int + 1 } } { \int_zero:N \l__exsheets_tmpa_int @@ -670,7 +667,7 @@ \__exsheets_reset_variation_auxiliary:x { \int_use:N \l__exsheets_tmpa_int } } - \cs_set:cpn { __exsheets_variation_ \int_to_roman:n { #1 } :n } ##1 + \cs_set:cpn { __exsheets_variation_ \int_to_roman:n {#1} :n } ##1 { ##1 \cs_set:Npn \exsheets_last_variant: { ##1 } @@ -678,8 +675,8 @@ } } { - \msg_warning:nnxx { exsheets } { variant } - { \int_use:N \l__exsheets_variations_int } { #1 } + \msg_warning:nnxx {exsheets} {variant} + { \int_use:N \l__exsheets_variations_int } {#1} } } @@ -690,23 +687,23 @@ \cs_new_protected:Npn \__exsheets_generate_variation_auxiliary:n #1 { - \cs_if_exist:cTF { __exsheets_variation_ \int_to_roman:n { #1 } :n } - { \cs_set:cpn { __exsheets_variation_ \int_to_roman:n { #1 } :n } { } } - { \cs_new:cpn { __exsheets_variation_ \int_to_roman:n { #1 } :n } { } } + \cs_if_exist:cTF { __exsheets_variation_ \int_to_roman:n {#1} :n } + { \cs_set:cpn { __exsheets_variation_ \int_to_roman:n {#1} :n } { } } + { \cs_new:cpn { __exsheets_variation_ \int_to_roman:n {#1} :n } { } } } \cs_new_protected:Npn \__exsheets_reset_variation_auxiliary:n #1 { - \cs_set:cpn { __exsheets_variation_ \int_to_roman:n { #1 } :n } ##1 + \cs_set:cpn { __exsheets_variation_ \int_to_roman:n {#1} :n } ##1 { \use:c { __exsheets_variation_ \int_to_roman:n { #1 + 1 } :n } } } \cs_generate_variant:Nn \__exsheets_reset_variation_auxiliary:n { x } \NewDocumentCommand \SetVariations { m } - { \exsheets_set_variations:n { #1 } } + { \exsheets_set_variations:n {#1} } \NewDocumentCommand \variant { m } - { \exsheets_variant:n { #1 } } + { \exsheets_variant:n {#1} } \NewDocumentCommand \vary { } { \exsheets_vary:w } @@ -742,19 +739,19 @@ \cs_new:Npn \exsheets_strip_braces:N #1 { \exp_after:wN \__exsheets_strip_braces:w \exp_after:wN #1#1 \q_stop } \cs_new_protected:Npn \__exsheets_strip_braces:w #1#2 \q_stop - { \tl_set:Nn #1 { #2 } } + { \tl_set:Nn #1 {#2} } \cs_new_protected:Npn \__exsheets_declare_relgrades:n #1 { - \clist_set:Nn \l__exsheets_tmpa_clist { #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_protected: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_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 @@ -765,12 +762,12 @@ } \NewDocumentCommand \DeclareRelGrades { m } - { \__exsheets_declare_relgrades:n { #1 } } + { \__exsheets_declare_relgrades:n {#1} } \@onlypreamble \DeclareRelGrades \cs_new_protected:Npn \__exsheets_grade:nn #1#2 { - \prop_get:NnNTF \l__exsheets_relgrades_prop { #2 } \l__exsheets_tmpa_fp + \prop_get:NnNTF \l__exsheets_relgrades_prop {#2} \l__exsheets_tmpa_fp { \bool_if:NTF \l__exsheets_parse_points_bool { @@ -782,16 +779,16 @@ { min( \__exsheets_grade_rounded: , \g_exsheets_total_points_fp ) } } } - { \msg_warning:nnn { exsheets } { grade-parse } { #1 } \textbf{??} } + { \msg_warning:nnn {exsheets} {grade-parse} {#1} \textbf{??} } } - { \msg_warning:nnn { exsheets } { grade-missing } { #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 } } + \IfBooleanTF {#1} + { \__exsheets_grade:nn { 0 } {#2} } + { \__exsheets_grade:nn { 1 } {#2} } } \keys_define:nn { exsheets / grades } @@ -821,11 +818,11 @@ \cs_new_nopar:Npn \exsheets_glue:N #1 { \cleaders \vbox:n {} \skip_vertical:N #1 } -\keys_define:nn { exsheets } +\keys_define:nn {exsheets} { skip-below .code:n = - \dim_set:Nn \l__exsheets_questions_skip_below_dim { #1 } - \dim_set:Nn \l__exsheets_solutions_skip_below_dim { #1 } + \dim_set:Nn \l__exsheets_questions_skip_below_dim {#1} + \dim_set:Nn \l__exsheets_solutions_skip_below_dim {#1} } % Einteilung in Klassen, Themen und andere Gruppierungen: @@ -835,7 +832,7 @@ \cs_new_protected:Npn \exsheets_new_question_class:nn #1#2 { - \prop_put:Nnn \l__exsheets_class_prop { #2 } { #1 } + \prop_put:Nnn \l__exsheets_class_prop {#2} {#1} \prop_new:c { g__exsheets_questions_#1_prop } \prop_new:c { g__exsheets_#2_prop } \prop_new:c { g__exsheets_#2_active_prop } @@ -843,7 +840,7 @@ \bool_new:c { g__exsheets_use_#2_bool } \bool_new:c { l__exsheets_#1_active_bool } \tl_new:c { l__exsheets_questions_#1_tl } - \keys_define:nn { exsheets } + \keys_define:nn {exsheets} { use-#2 .code:n = { @@ -926,13 +923,13 @@ \cs_new_protected:Npn \exsheets_declare_question_class:nn #1#2 { - \prop_if_in:NnTF \l__exsheets_class_prop { #2 } + \prop_if_in:NnTF \l__exsheets_class_prop {#2} {} - { \exsheets_new_question_class:nn { #1 } { #2 } } + { \exsheets_new_question_class:nn {#1} {#2} } } \NewDocumentCommand \DeclareQuestionClass { mm } - { \exsheets_declare_question_class:nn { #1 } { #2 } } + { \exsheets_declare_question_class:nn {#1} {#2} } \@onlypreamble \DeclareQuestionClass \cs_new:Npn \exsheets_get_question_class:n #1 @@ -942,28 +939,28 @@ } \DeclareExpandableDocumentCommand \GetQuestionClass { m } - { \exsheets_get_question_class:n { #1 } } + { \exsheets_get_question_class:n {#1} } \cs_new_protected:Npn \exsheets_print_question_class:nTF #1#2#3 { \group_begin: \tl_set:Nx \l__exsheets_tmpa_tl - { \exsheets_get_question_class:n { #1 } } + { \exsheets_get_question_class:n {#1} } \tl_if_blank:VTF \l__exsheets_tmpa_tl - { #3 } + {#3} { - \cs_set_protected:Npn \__exsheets_print_question_class:n ##1 { #2 } + \cs_set_protected:Npn \__exsheets_print_question_class:n ##1 {#2} \__exsheets_print_question_class:n - { \exsheets_get_question_class:n { #1 } } + { \exsheets_get_question_class:n {#1} } } \group_end: } \NewDocumentCommand \PrintQuestionClassTF { mmm } - { \exsheets_print_question_class:nTF { #1 } { #2 } { #3 } } + { \exsheets_print_question_class:nTF {#1} {#2} {#3} } \NewDocumentCommand \PrintQuestionClassT { mm } - { \exsheets_print_question_class:nTF { #1 } { #2 } { } } + { \exsheets_print_question_class:nTF {#1} {#2} { } } \NewDocumentCommand \PrintQuestionClassF { mm } - { \exsheets_print_question_class:nTF { #1 } { } { #2 } } + { \exsheets_print_question_class:nTF {#1} { } {#2} } % ---------------------------------------------------------------------------- % die 'question' Umgebung @@ -1089,10 +1086,10 @@ \cs_new_protected:Npn \__exsheets_read_points:w #1 ! #2 ! #3 \q_stop { - \tl_if_blank:nTF { #1 } + \tl_if_blank:nTF {#1} { \bool_set_true:N \l__exsheets_only_print_points_bool - \tl_set:Nn \l__exsheets_questions_points_tl { #2 } + \tl_set:Nn \l__exsheets_questions_points_tl {#2} } { \bool_set_false:N \l__exsheets_only_print_points_bool @@ -1102,22 +1099,22 @@ \cs_new_protected:Npn \__exsheets_read_points_aux:w #1+#2+#3 \q_stop { - \tl_if_blank:nTF { #1 } + \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_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 } + \tl_if_blank:nTF {#3} { \fp_zero:N \l__exsheets_question_bonus_fp } - { \fp_set:Nn \l__exsheets_question_bonus_fp { #2 } } + { \fp_set:Nn \l__exsheets_question_bonus_fp {#2} } } } \cs_new_protected:Npn \__exsheets_read_points:n #1 { \bool_if:NTF \l__exsheets_parse_points_bool { \__exsheets_read_points:w #1!! \q_stop } - { \tl_set:Nn \l__exsheets_questions_points_tl { #1 } } + { \tl_set:Nn \l__exsheets_questions_points_tl {#1} } } \cs_new:Npn \exsheets_label_format:n #1 { qu:#1 } @@ -1132,7 +1129,7 @@ \cs_new_protected:Npn \exsheets_update_referencing_command:NN #1#2 { \cs_set:Npx #1 ##1 - { \exp_not:o { #2 } { \exsheets_label_format:n { ##1 } } } + { \exp_not:o {#2} { \exsheets_label_format:n { ##1 } } } } \cs_new_protected:Npn \exsheets_update_referencing_commands: @@ -1146,25 +1143,25 @@ { \exsheets_set_question_properties:x { - ref = \exp_not:o { \exsheets_ref:n { #1 } } , - pageref = \exp_not:o { \exsheets_pageref:n { #1 } } + ref = \exp_not:o { \exsheets_ref:n {#1} } , + pageref = \exp_not:o { \exsheets_pageref:n {#1} } } } \cs_generate_variant:Nn \exsheets_set_ref_properties:n { V } -\keys_define:nn { exsheets } +\keys_define:nn {exsheets} { label-format .code:n = - \cs_set:Npn \exsheets_label_format:n ##1 { #1 } + \cs_set:Npn \exsheets_label_format:n ##1 {#1} \exsheets_update_referencing_commands: , label-cmd .code:n = - \cs_set:Npn \__exsheets_label:n { #1 } + \cs_set:Npn \__exsheets_label:n {#1} \exsheets_update_referencing_commands: , ref-cmd .code:n = - \cs_set:Npn \__exsheets_ref:n { #1 } + \cs_set:Npn \__exsheets_ref:n {#1} \exsheets_update_referencing_commands: , page-ref-cmd .code:n = - \cs_set:Npn \__exsheets_pageref:n { #1 } + \cs_set:Npn \__exsheets_pageref:n {#1} \exsheets_update_referencing_commands: } @@ -1176,7 +1173,7 @@ \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 } } + \IfNoValueF {#1} { \keys_set:nn { exsheets / question } {#1} } % ID: \bool_if:nT { @@ -1221,7 +1218,7 @@ % Punktevergabe: \fp_gzero:N \g__exsheets_this_question_points_fp \fp_gzero:N \g__exsheets_this_question_bonus_fp - \IfNoValueTF { #2 } + \IfNoValueTF {#2} { \__exsheets_read_points:n { 0 } \bool_if:NT \l__exsheets_points_questions_default_bool @@ -1241,7 +1238,7 @@ \fp_gset_eq:NN \g__exsheets_this_question_bonus_fp \l__exsheets_question_bonus_fp - \__exsheets_read_points:n { #2 } + \__exsheets_read_points:n {#2} % check if moving this to a later point has negative effects... % \exsheets_set_question_properties:n { points = #2 } } @@ -1374,8 +1371,8 @@ \cs_new_protected:Npn \__exsheets_save_number_in_aux_x:Nnn #1#2#3 { - \prop_gput:Nfx #1 { #2 } { #3 } - \exsheets_write_to_aux_x:n { \exsheets@save@number { #2 } { #3 } } + \prop_gput:Nfx #1 {#2} {#3} + \exsheets_write_to_aux_x:n { \exsheets@save@number {#2} {#3} } } \cs_new_protected:Npn \__exsheets_save_number_in:N #1 @@ -1411,7 +1408,7 @@ \cs_new_protected:Npn \__exsheets_restore_number_from_and_do:Nnn #1#2#3 { - \prop_get:NnN #1 { #2 } \l__exsheets_tmpc_tl + \prop_get:NnN #1 {#2} \l__exsheets_tmpc_tl \tl_if_eq:NNF \l__exsheets_tmpc_tl \q_no_value { \exp_after:wN @@ -1424,11 +1421,11 @@ \cs_generate_variant:Nn \__exsheets_restore_number_from_and_do:Nnn { NV } \NewDocumentCommand \QuestionNumber { m } - { \exsheets_question_number:n { #1 } } + { \exsheets_question_number:n {#1} } \cs_new_protected:Npn \exsheets_question_number:n #1 { - \prop_get:NnNTF \g__exsheets_questions_id_prop { #1 } \l__exsheets_tmpa_tl + \prop_get:NnNTF \g__exsheets_questions_id_prop {#1} \l__exsheets_tmpa_tl { \__exsheets_question_number:c { exsheets@question@\l__exsheets_tmpa_tl } } { \textbf{??} } } @@ -1447,9 +1444,9 @@ \cs_new_protected: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 } + { \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} } % map ID's to number of used questions @@ -1465,9 +1462,12 @@ % ---------------------------------------------------------------------------- % title of a question: -\input { exsheets_headings.def } -\bool_if:NT \l__exsheets_load_headings_bool - { \input { exsheets_headings.cfg } } +\cs_if_exist:NF \exsheets_headings_files_loaded: + { + \file_input:n {exsheets_headings.def} + \file_input:n {exsheets_headings.cfg} + } + % #1: instance % #2: title % #3: number @@ -1476,13 +1476,13 @@ % #6: id \cs_new:Npn \exsheets_use_heading:nnnnnn #1#2#3#4#5#6 { - \IfInstanceExistTF { exsheets-heading } { #1 } - { \UseInstance { exsheets-heading } { #1 } } + \IfInstanceExistTF {exsheets-heading} {#1} + { \UseInstance {exsheets-heading} {#1} } { - \msg_warning:nnx { exsheets} { headings } { #1 } - \UseInstance { exsheets-heading } { block } + \msg_warning:nnx {exsheets} {headings} {#1} + \UseInstance {exsheets-heading} {block} } - { #2 } { #3 } { #4 } { #5 } { #6 } + {#2} {#3} {#4} {#5} {#6} } \cs_generate_variant:Nn \exsheets_use_heading:nnnnnn { V , VVVnnV , VVVVnV } @@ -1503,8 +1503,8 @@ type / exercise .code:n = \bool_set_false:N \l__exsheets_exam_bool , name .code:n = - \tl_set:Nn \l__exsheets_exercise_name_tl { #1 } - \tl_set:Nn \l__exsheets_questions_name_tl { #1 } , + \tl_set:Nn \l__exsheets_exercise_name_tl {#1} + \tl_set:Nn \l__exsheets_questions_name_tl {#1} , headings .tl_set:N = \l__exsheets_question_heading_instance_tl , subtitle .tl_set:N = \l__exsheets_questions_subtitle_tl , print .bool_set:N = \l__exsheets_questions_print_bool , @@ -1531,28 +1531,38 @@ { \prop_new:c { g__exsheets_question_property_#1_prop } \keys_define:nn { question / meta } - { #1 .code:n = \__exsheets_question_set_property:nn { #1 } { ##1 } } + { #1 .code:n = \__exsheets_question_set_property:nn {#1} { ##1 } } } \NewDocumentCommand \DeclareQuestionProperty { m } - { \exsheets_declare_question_property:n { #1 } } + { \exsheets_declare_question_property:n {#1} } \@onlypreamble \DeclareQuestionProperty \cs_new_protected: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 } - } + { \keys_set:nn { question / meta } {#1} } + { \msg_error:nnn {exsheets} {only-inside-question} {\SetQuestionProperties} } \@esphack } \cs_generate_variant:Nn \exsheets_set_question_properties:n { x } -\NewDocumentCommand \SetQuestionProperties { m } - { \exsheets_set_question_properties:n { #1 } } +\prg_new_conditional:Npnn \exsheets_if_question_property:nn #1#2 {T,F,TF} + { + \prop_if_in:cnTF { g__exsheets_question_property_#1_prop } {#2} + { \prg_return_true: } + { \prg_return_false: } + } +\DeclareExpandableDocumentCommand \IfQuestionPropertyTF { } + { \exsheets_if_question_property:nnTF } +\DeclareExpandableDocumentCommand \IfQuestionPropertyT { } + { \exsheets_if_question_property:nnT } +\DeclareExpandableDocumentCommand \IfQuestionPropertyF { } + { \exsheets_if_question_property:nnF } + +\NewDocumentCommand \SetQuestionProperties { +m } + { \exsheets_set_question_properties:n {#1} } % #1: ID % #2: property @@ -1560,7 +1570,7 @@ \cs_new:Npn \exsheets@question@property #1#2#3 { \prop_gput:cnn { g__exsheets_question_property_#2_prop } - { #1 } { #3 } + {#1} {#3} } % #1: property @@ -1568,7 +1578,7 @@ \cs_new_protected:Npn \__exsheets_question_set_property:nn #1#2 { \prop_gput:cVn { g__exsheets_question_property_#1_prop } - \CurrentQuestionID { #2 } + \CurrentQuestionID {#2} % watch if this has negativ effects: \exsheets_write_to_aux_x:n { @@ -1582,12 +1592,12 @@ % #1: property % #2: ID \DeclareExpandableDocumentCommand \GetQuestionProperty { mm } - { \exsheets_get_question_property:no { #1 } { #2 } } + { \exsheets_get_question_property:no {#1} {#2} } \cs_new:Npn \exsheets_get_question_property:nn #1#2 { - \prop_if_in:cnTF { g__exsheets_question_property_#1_prop } { #2 } - { \prop_get:cn { g__exsheets_question_property_#1_prop } { #2 } } + \prop_if_in:cnTF { g__exsheets_question_property_#1_prop } {#2} + { \prop_get:cn { g__exsheets_question_property_#1_prop } {#2} } { ?? } } \cs_generate_variant:Nn \exsheets_get_question_property:nn { no } @@ -1632,7 +1642,7 @@ \group_begin: \normalfont\normalsize\normalcolor \colorbox { exsheetsdebugcolor } - { \parbox { \dim_eval:n { #1 - 2 \fboxsep } } { #2 } } + { \parbox { \dim_eval:n { #1 - 2 \fboxsep } } {#2} } \group_end: \par } @@ -1690,7 +1700,7 @@ \int_zero:N \l__exsheets_include_random_int \cs_new:Npn \exsheets_file_input_if_exist:n #1 - { \file_if_exist:nT { #1 } { \file_input:n { #1 } } } + { \file_if_exist:nT {#1} { \file_input:n {#1} } } \cs_new_protected:Npn \exsheets_prop_count:N #1 { @@ -1708,9 +1718,9 @@ \NewDocumentCommand \includequestions { om } { \group_begin: - \IfNoValueF { #1 } - { \keys_set:nn { exsheets / include } { #1 } } - \exsheets_include_questions:n { #2 } + \IfNoValueF {#1} + { \keys_set:nn { exsheets / include } {#1} } + \exsheets_include_questions:n {#2} \group_end: } @@ -1721,7 +1731,7 @@ { \bool_set_true:N \l__exsheets_select_questions_bool \clist_gclear:N \questionsincludedlast - \seq_set_split:Nnn \l__exsheets_tmpa_seq { , } { #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 @@ -1776,7 +1786,7 @@ \bool_set_false:N \l__exsheets_include_all_bool \bool_set_false:N \l__exsheets_include_random_bool \bool_set_true:N \l__exsheets_include_by_id_bool - \clist_set:Nn \l__exsheets_include_id_clist { #1 } , + \clist_set:Nn \l__exsheets_include_id_clist {#1} , % the `exclude' option does _not_ set \l__exsheets_include_random_bool , % \l__exsheets_include_by_id_bool or \l__exsheets_include_all_bool so % it can be combined with the other options: @@ -1785,7 +1795,7 @@ \bool_set_false:N \l__exsheets_include_all_bool \bool_set_true:N \l__exsheets_include_random_bool \bool_set_false:N \l__exsheets_include_by_id_bool - \int_set:Nn \l__exsheets_include_random_int { #1 } + \int_set:Nn \l__exsheets_include_random_int {#1} } \int_new:N \g__exsheets_selection_number_int @@ -1802,11 +1812,11 @@ \bool_if:NTF \l__exsheets_include_random_bool { \prop_gput:Nxn \g__exsheets_included_questions_prop - { \int_use:N \g__exsheets_selection_number_int } { #1 } + { \int_use:N \g__exsheets_selection_number_int } {#1} } { \prop_gput:Nxn \g__exsheets_included_questions_prop - { \int_use:N \g__exsheets_questions_id_int } { #1 } + { \int_use:N \g__exsheets_questions_id_int } {#1} } } } @@ -1841,44 +1851,44 @@ {% parsing list of excluded IDs \clist_if_in:NnTF \l__exsheets_exclude_id_clist - { #1 } + {#1} { \bool_gset_false:N \g__exsheets_questions_use_bool } { \bool_gset_true:N \g__exsheets_questions_use_bool - \clist_gput_right:Nn \questionsincludedlast { #1 } + \clist_gput_right:Nn \questionsincludedlast {#1} \int_gincr:N \g__exsheets_questions_used_int \__exsheets_mark_as_used_x:nn { \int_use:N \g__exsheets_questions_used_int } - { #1 } + {#1} % \prop_gput:NnV \g__exsheets_questions_used_prop - % { #1 } + % {#1} % \g__exsheets_questions_id_int \prop_gput:NnV \g__exsheets_questions_id_prop - { #1 } + {#1} \g__exsheets_questions_id_int } } {% parsing list of included IDs \clist_if_in:NnTF \l__exsheets_include_id_clist - { #1 } + {#1} { \clist_if_in:NnTF \l__exsheets_exclude_id_clist - { #1 } + {#1} { \bool_gset_false:N \g__exsheets_questions_use_bool } { \bool_gset_true:N \g__exsheets_questions_use_bool - \clist_gput_right:Nn \questionsincludedlast { #1 } + \clist_gput_right:Nn \questionsincludedlast {#1} % \prop_gput:NnV \g__exsheets_questions_used_prop - % { #1 } + % {#1} % \g__exsheets_questions_id_int \int_gincr:N \g__exsheets_questions_used_int \__exsheets_mark_as_used_x:nn { \int_use:N \g__exsheets_questions_used_int } - { #1 } + {#1} \prop_gput:NnV \g__exsheets_questions_id_prop - { #1 } + {#1} \g__exsheets_questions_id_int } } @@ -1921,9 +1931,9 @@ \int_compare:nTF { \l__exsheets_include_random_int >= \l__exsheets_tmpa_int } { % not enough questions available: - \msg_warning:nnxxx { exsheets } { random-file } + \msg_warning:nnxxx {exsheets} {random-file} { \int_use:N \l__exsheets_include_random_int } - { #1 } + {#1} { \int_use:N \l__exsheets_tmpa_int } \bool_set_true:N \l__exsheets_include_all_bool } @@ -1937,9 +1947,9 @@ } { % not enough questions selectable: - \msg_warning:nnxxxx { exsheets } { random-selectable } + \msg_warning:nnxxxx {exsheets} {random-selectable} { \int_use:N \l__exsheets_include_random_int } - { #1 } + {#1} { \int_use:N \l__exsheets_tmpa_int } { \int_use:N \l__exsheets_tmpb_int } \bool_set_true:N \l__exsheets_include_all_bool @@ -1989,7 +1999,7 @@ } \NewDocumentCommand \PrintIfIncludeActiveTF { mm } - { \bool_if:NTF \l__exsheets_questions_deactivate_bool { #2 } { #1 } } + { \bool_if:NTF \l__exsheets_questions_deactivate_bool {#2} {#1} } \NewDocumentCommand \PrintIfIncludeActiveT { } { \bool_if:NF \l__exsheets_questions_deactivate_bool } @@ -2027,7 +2037,7 @@ { \int_set_eq:NN \l__exsheets_tmpe_int \g__exsheets_questions_id_int } \prop_gput:Nxn \g__exsheets_solutions_content_prop { \int_use:N \g__exsheets_questions_id_int } - { #1 } + {#1} \prop_gput:NxV \g__exsheets_solutions_questions_id_prop { \int_use:N \g__exsheets_questions_id_int } \g__exsheets_questions_current_id_tl @@ -2046,7 +2056,7 @@ \l__exsheets_qu_counter_interpretation_tl \l__exsheets_solutions_name_tl \g__exsheets_questions_current_id_tl - \use:n { #1 } + \use:n {#1} \exsheets_h_or_vspace:N \l__exsheets_solutions_skip_below_dim } } @@ -2093,7 +2103,7 @@ \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 } } + \IfNoValueF {#1} { \keys_set:nn { exsheets / solution } {#1} } % \tl_use:N \l__exsheets_solutions_pre_hook_tl } \tl_if_blank:VT \l__exsheets_solution_heading_instance_tl @@ -2123,7 +2133,7 @@ } \exsheets_use_heading:Vnnnnn \l__exsheets_solution_heading_instance_tl - { #2 } { #1 } { 0 } { 0 } { #3 } + {#2} {#1} { 0 } { 0 } {#3} } \cs_generate_variant:Nn \__exsheets_solutions_name:nnn { VV , VVV } @@ -2163,14 +2173,14 @@ { \cs_new_eq:NN \__exsheets_saved_label:n \label \cs_set:Npn \label #1 - { \__exsheets_saved_label:n { #1 } \__exsheets_exlabel:n { #1 } } + { \__exsheets_saved_label:n {#1} \__exsheets_exlabel:n {#1} } } % this is like \ref from latex.ltx \cs_new:Npn \__exsheets_exref:n #1 { \cs_if_exist:cTF { r@#1 } - { \__exsheets_exref_aux:n { #1 } } + { \__exsheets_exref_aux:n {#1} } { 1\relax \protect\G@refundefinedtrue @@ -2185,7 +2195,7 @@ % user command: \NewDocumentCommand \printsolutions { O{all} } - { \exsheets_print_solutions:n { #1 } } + { \exsheets_print_solutions:n {#1} } % internal command: \cs_new_protected:Npn \exsheets_print_solutions:n #1 @@ -2195,21 +2205,21 @@ \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 } + \keys_set:nn { exsheets / exsheets_print_solutions } {#1} \group_end: } -\keys_define:nn { exsheets } +\keys_define:nn {exsheets} { exsheets_print_solutions .choice: , exsheets_print_solutions / section .code:n = - { \exsheets_print_solutions_section:n { #1 } } , + { \exsheets_print_solutions_section:n {#1} } , exsheets_print_solutions / chapter .code:n = - { \exsheets_print_solutions_chapter:n { #1 } } , + { \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 } } , + { \exsheets_print_solutions_byID:n {#1} } , chapter-hook .tl_set:N = \l__exsheets_new_chapter_hook_tl , section-hook .tl_set:N = \l__exsheets_new_section_hook_tl } @@ -2230,16 +2240,16 @@ \cs_new_protected:Npn \__exsheets_print_solution_if:nn #1#2 { - \bool_if:nT { #2 } + \bool_if:nT {#2} { \prop_get:NnN \g__exsheets_solutions_names_prop - { #1 } \l__exsheets_tmpa_tl + {#1} \l__exsheets_tmpa_tl \prop_get:NnN \g__exsheets_solutions_content_prop - { #1 } \l__exsheets_tmpb_tl + {#1} \l__exsheets_tmpb_tl \prop_get:NnN \g__exsheets_solutions_questions_id_prop - { #1 } \l__exsheets_tmpc_tl + {#1} \l__exsheets_tmpc_tl \prop_get:NnN \g__exsheets_solutions_counter_prop - { #1 } \l__exsheets_tmpd_tl + {#1} \l__exsheets_tmpd_tl \eSaveCounterPatternFrom [ exsheets ] \l__exsheets_current_pattern_interpretation_tl \l__exsheets_current_pattern_tl @@ -2256,7 +2266,7 @@ % print by section: \cs_new:Npn \exsheets_print_solutions_section:n #1 { - \tl_if_blank:nTF { #1 } + \tl_if_blank:nTF {#1} { \prop_map_inline:Nn \g__exsheets_question_number_prop { @@ -2268,7 +2278,7 @@ } } { - \clist_map_inline:nn { #1 } + \clist_map_inline:nn {#1} { \__exsheets_print_solutions_by_section:w ##1-- \q_stop } } } @@ -2276,12 +2286,12 @@ \cs_new_protected:Npn \__exsheets_print_solutions_by_section:w #1-#2-#3 \q_stop { % wenn #3=-, dann range-Input - \tl_if_eq:nnTF { #3 } { - } + \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 } } + \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 @@ -2299,7 +2309,7 @@ \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 } } + { \__exsheets_print_solutions_section:nnn { ##1 } { ##2 } {#1} } } } } @@ -2307,14 +2317,14 @@ \cs_new:Npn \__exsheets_print_solutions_section:nnn #1#2#3 { \__exsheets_read_number:w #2 \q_stop - \__exsheets_print_solution_if:nn { #1 } + \__exsheets_print_solution_if:nn {#1} { \int_compare_p:n { \l__exsheets_counter_sec_int = #3 } } } % print by chapter: \cs_new:Npn \exsheets_print_solutions_chapter:n #1 { - \tl_if_blank:nTF { #1 } + \tl_if_blank:nTF {#1} { \prop_map_inline:Nn \g__exsheets_question_number_prop { @@ -2326,7 +2336,7 @@ } } { - \clist_map_inline:nn { #1 } + \clist_map_inline:nn {#1} { \__exsheets_print_solutions_by_chapter:w ##1-- \q_stop } } } @@ -2334,12 +2344,12 @@ \cs_new_protected:Npn \__exsheets_print_solutions_by_chapter:w #1-#2-#3 \q_stop { % wenn #3=-, dann range-Input - \tl_if_eq:nnTF { #3 } { - } + \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 } } + \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 @@ -2357,7 +2367,7 @@ \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 } } + { \__exsheets_print_solutions_chapter:nnn { ##1 } { ##2 } {#1} } } } } @@ -2365,7 +2375,7 @@ \cs_new:Npn \__exsheets_print_solutions_chapter:nnn #1#2#3 { \__exsheets_read_number:w #2 \q_stop - \__exsheets_print_solution_if:nn { #1 } + \__exsheets_print_solution_if:nn {#1} { \int_compare_p:n { \l__exsheets_counter_ch_int = #3 } } } @@ -2389,7 +2399,7 @@ !\int_compare_p:n { \use:c { l__exsheets_counter_#1_int } = 0 } } - { #2 } + {#2} } \cs_generate_variant:Nn \__exsheets_sectioning_hook:nn { nV } @@ -2403,15 +2413,15 @@ \l__exsheets_counter_ch_int \__exsheets_read_number:w #2 \q_stop \prop_get:NnNT \g__exsheets_solutions_names_prop - { #1 } \l__exsheets_tmpa_tl + {#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 + {#1} \l__exsheets_tmpb_tl \prop_get:NnN \g__exsheets_solutions_questions_id_prop - { #1 } \l__exsheets_tmpc_tl + {#1} \l__exsheets_tmpc_tl \prop_get:NnN \g__exsheets_solutions_counter_prop - { #1 } \l__exsheets_tmpd_tl + {#1} \l__exsheets_tmpd_tl \group_begin: \tl_set_eq:NN \CurrentQuestionID \l__exsheets_tmpc_tl \__exsheets_sectioning_hook:nV { ch } @@ -2436,7 +2446,7 @@ \seq_new:N \l__exsheets_solutions_byID_seq \cs_new_protected:Npn \exsheets_print_solutions_byID:n #1 { - \seq_set_split:Nnn \l__exsheets_solutions_byID_seq { , } { #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 { @@ -2491,22 +2501,22 @@ \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_in:nnF {#1} { @@@ } { - \tl_if_blank:nF { #1 } - { \int_set:Nn \l__exsheets_counter_ch_int { #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 } + \int_set:Nn \l__exsheets_counter_sec_int {#2} + \int_set:Nn \l__exsheets_counter_qu_int {#3} } \cs_new_protected_nopar:Npn \exsheets_solutions_print_name:nnn #1#2#3 { \tl_set_rescan:Nnn \l__exsheets_tmpa_tl - { \char_set_catcode_letter:N \@ } { #1 } - \tl_if_in:nnTF { #1 } { @@@ } - { \__exsheets_solutions_name:nnn { } { #2 } { #3 } } - { \__exsheets_solutions_name:nnn { #1 } { #2 } { #3 } } + { \char_set_catcode_letter:N \@ } {#1} + \tl_if_in:nnTF {#1} { @@@ } + { \__exsheets_solutions_name:nnn { } {#2} {#3} } + { \__exsheets_solutions_name:nnn {#1} { #2 } {#3} } \tex_penalty:D \c_ten_thousand } \cs_generate_variant:Nn \exsheets_solutions_print_name:nnn { VVV } @@ -2549,43 +2559,42 @@ % create question/solution pairs \cs_new_protected:Npn \__exsheets_new_qu_sol_pair:nnnnnn #1#2#3#4#5#6 { - \NewDocumentEnvironment { #1 } { O{}G{} } - { \keys_set:nn { exsheets } { #3 } \__exsheets_question: {#2,##1} {##2} } + \NewDocumentEnvironment {#1} { O{}G{} } + { \keys_set:nn {exsheets} {#3} \__exsheets_question: {#2,##1} {##2} } { \end__exsheets_question: } - \NewDocumentEnvironment { #4 } { O{} } - { \keys_set:nn { exsheets } { #6 } \__exsheets_solution: {#5,##1} } + \NewDocumentEnvironment {#4} { O{} } + { \keys_set:nn {exsheets} {#6} \__exsheets_solution: {#5,##1} } { \end__exsheets_solution: } } \cs_new_protected:Npn \__exsheets_renew_qu_sol_pair:nnnnnn #1#2#3#4#5#6 { - \RenewDocumentEnvironment { #1 } { O{}G{} } - { \keys_set:nn { exsheets } { #3 } \__exsheets_question: {#2,##1} {##2} } + \RenewDocumentEnvironment {#1} { O{}G{} } + { \keys_set:nn {exsheets} {#3} \__exsheets_question: {#2,##1} {##2} } { \end__exsheets_question: } - \RenewDocumentEnvironment { #4 } { O{} } - { \keys_set:nn { exsheets } { #6 } \__exsheets_solution: {#5,##1} } + \RenewDocumentEnvironment {#4} { O{} } + { \keys_set:nn {exsheets} {#6} \__exsheets_solution: {#5,##1} } { \end__exsheets_solution: } } \NewDocumentCommand \NewQuSolPair { mO{}O{}mO{}O{} } - { \__exsheets_new_qu_sol_pair:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } } + { \__exsheets_new_qu_sol_pair:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} } \@onlypreamble \NewQuSolPair \NewDocumentCommand \RenewQuSolPair { mO{}O{}mO{}O{} } - { \__exsheets_renew_qu_sol_pair:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } } + { \__exsheets_renew_qu_sol_pair:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} } \@onlypreamble \RenewQuSolPair % ---------------------------------------------------------------------------- % the `tasks' list -\bool_if:NTF \l__exsheets_load_tasks_bool - { \RequirePackage [ more ] { tasks } } - { \RequirePackage { tasks } } -\AddCounterPattern* [ tasks ] { question } { qu } -\ReadCounterFrom [ tasks ] { question } \l__exsheets_counter_qu_int +\RequirePackage {tasks} [2014/07/03] +\AddCounterPattern* [tasks] {question} {qu} +\ReadCounterFrom [tasks] {question} \l__exsheets_counter_qu_int % ---------------------------------------------------------------------------- % the \blank{} command -\RequirePackage { ulem } \normalem +\RequirePackage {ulem} \normalem + \dim_new:N \l__exsheets_blank_dim \tl_new:N \l__exsheets_blank_linespread_tl \tl_set:Nn \l__exsheets_blank_linespread_tl { 1 } @@ -2595,7 +2604,7 @@ \bool_new:N \l__exsheets_blank_width_bool \bool_new:N \l__exsheets_blank_linespread_bool -\cs_new:Npn \exsheets_write_blank:n #1 { #1 } +\cs_new:Npn \exsheets_write_blank:n #1 {#1} \cs_set_eq:NN \exsheets_write_blank:n \uline \keys_define:nn { exsheets / blank } @@ -2615,29 +2624,29 @@ width .code:n = { \bool_set_true:N \l__exsheets_blank_width_bool - \dim_set:Nn \l__exsheets_blank_dim { #1 } + \dim_set:Nn \l__exsheets_blank_dim {#1} } , linespread .code:n = \bool_set_true:N \l__exsheets_blank_linespread_bool - \tl_set:Nn \l__exsheets_blank_linespread_tl { #1 } + \tl_set:Nn \l__exsheets_blank_linespread_tl {#1} } \NewDocumentCommand \blank { som } { \group_begin: - \IfNoValueF { #2 } { \keys_set:nn { exsheets / blank } { #2 } } + \IfNoValueF {#2} { \keys_set:nn { exsheets / blank } {#2} } \mode_if_vertical:TF { - \IfBooleanF { #1 } { \noindent } - \exsheets_blank:n { #3 } - \IfBooleanF { #1 } + \IfBooleanF {#1} { \noindent } + \exsheets_blank:n {#3} + \IfBooleanF {#1} { \bool_if:NT \l__exsheets_blank_linespread_bool { \linespread { \l__exsheets_blank_linespread_tl } \selectfont } \par } } - { \exsheets_blank:n { #3 } } + { \exsheets_blank:n {#3} } \group_end: } @@ -2646,9 +2655,9 @@ \box_clear:N \l__exsheets_blank_box \mode_if_math:TF { \hbox_set:Nn \l__exsheets_blank_box { $ \m@th \mathpalette{}{#1} $ } } - { \hbox_set:Nn \l__exsheets_blank_box { #1 } } + { \hbox_set:Nn \l__exsheets_blank_box {#1} } \bool_if:NTF \l__exsheets_inside_solution_bool - { \exsheets_write_blank:n { #1 } } + { \exsheets_write_blank:n {#1} } { \bool_if:NTF \l__exsheets_blank_width_bool { \__exsheets_blank_skip:N \l__exsheets_blank_dim } @@ -2662,10 +2671,10 @@ \cs_new_protected:Npn \__exsheets_blank_skip:N #1 { \bool_if:NTF \l__exsheets_blank_width_bool - { \dim_set:Nn \l__exsheets_tmpa_dim { #1 } } + { \dim_set:Nn \l__exsheets_tmpa_dim {#1} } { \fp_set:Nn \l__exsheets_tmpa_fp - { \dim_to_fp:n { #1 } * \l__exsheets_blank_scale_tl } + { \dim_to_fp:n {#1} * \l__exsheets_blank_scale_tl } \dim_set:Nn \l__exsheets_tmpa_dim { \fp_to_dim:N \l__exsheets_tmpa_fp } } \dim_compare:nTF { \l__exsheets_tmpa_dim > 2em } @@ -2725,13 +2734,13 @@ { \par \tex_penalty:D -100 \scan_stop: - \dim_set:Nn \l__exsheets_tmpa_dim { #2 } + \dim_set:Nn \l__exsheets_tmpa_dim {#2} \dim_set:Nn \l__exsheets_tmpb_dim { \pagegoal - \pagetotal - \baselineskip } \dim_compare:nTF { \l__exsheets_tmpa_dim > \l__exsheets_tmpb_dim } { \dim_compare:nT { \l__exsheets_tmpb_dim > 0pt } { \vfil } \break - \IfBooleanF { #1 } + \IfBooleanF {#1} { \dim_sub:Nn \l__exsheets_tmpa_dim { \l__exsheets_tmpb_dim } \vspace* { \l__exsheets_tmpa_dim } @@ -2740,15 +2749,15 @@ { \skip_vertical:N \l__exsheets_tmpa_dim } } \NewDocumentCommand \examspace { sm } - { \__exsheets_examspace:nn { #1 } { #2 } } + { \__exsheets_examspace:nn {#1} {#2} } % ---------------------------------------------------------------------------- % SETUP \NewDocumentCommand \SetupExSheets { o +m } { - \IfNoValueTF { #1 } - { \keys_set:nn { exsheets } { #2 } } - { \keys_set:nn { exsheets / #1 } { #2 } } + \IfNoValueTF {#1} + { \keys_set:nn {exsheets} {#2} } + { \keys_set:nn { exsheets / #1 } {#2} } } % ---------------------------------------------------------------------------- @@ -2852,12 +2861,12 @@ % ---------------------------------------------------------------------------- % load custom configuration -\file_if_exist:nT { exsheets_configurations.cfg } +\file_if_exist:nT {exsheets_configurations.cfg} { \AtBeginDocument { - \msg_info:nn { exsheets } { loading-configurations } - \file_input:n { exsheets_configurations.cfg } + \msg_info:nn {exsheets} {loading-configurations} + \file_input:n {exsheets_configurations.cfg} } } @@ -3055,6 +3064,12 @@ HISTORY: - \ForEachQuestion, \numberofquestions and \iflastquestion are now available before any questions have been typeset +2014/07/20 v0.15 - remove `tasks' from the bundle and into a package of + its own + - remove `cntformats' from the bundle and into a package of + its own + - drop options `load-headings' and `load-tasks' + - new command \IfQuestionPropertyTF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % TODO: -- cgit v1.2.3