diff options
author | Karl Berry <karl@freefriends.org> | 2020-02-23 00:33:45 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-02-23 00:33:45 +0000 |
commit | db10f49b4b535c1b6752e68a4ba6b0088a621067 (patch) | |
tree | fb81b92a2d0d5e7e0ab8013f65d864d85009f2ee /Master/texmf-dist/tex | |
parent | 4275fd1f5f1c2cff545b6cb0d09b72312eef0d28 (diff) |
xsim (22feb20)
git-svn-id: svn://tug.org/texlive/trunk@53877 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
15 files changed, 347 insertions, 116 deletions
diff --git a/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls b/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls index 6e1359c0b14..3fa56cc833b 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls +++ b/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls @@ -522,6 +522,7 @@ \XSIMfilewritestart*{\jobname.tmp}% }% \endgroup + \def\xsimman@read@options@[#1]{\pgfqkeys{/cnltx}{#1}} \RenewDocumentEnvironment{sourcecode}{} @@ -565,6 +566,7 @@ } {% \XSIMfilewritestop + \catcode`\^^M=5 \ifbool{cnltx@sidebyside} {% \cnltxcode @@ -865,6 +867,16 @@ % ---------------------------------------------------------------------------- % versions: +\xsim@add@version{0.0} {2017-02-09} +\xsim@add@version{0.1} {2017-03-19} +\xsim@add@version{0.2} {2017-03-21} +\xsim@add@version{0.4} {2017-03-24} +\xsim@add@version{0.5} {2017-03-30} +\xsim@add@version{0.5a} {2017-04-15} +\xsim@add@version{0.5b} {2017-04-16} +\xsim@add@version{0.6} {2017-04-27} +\xsim@add@version{0.6a} {2017-04-28} +\xsim@add@version{0.7} {2017-05-09} \xsim@add@version{0.8} {2017-05-18} \xsim@add@version{0.8a} {2017-05-19} \xsim@add@version{0.8b} {2017-05-23} @@ -875,8 +887,11 @@ \xsim@add@version{0.12} {2019-09-26} \xsim@add@version{0.13} {2019-10-06} \xsim@add@version{0.14} {2019-10-13} +\xsim@add@version{0.14a} {2019-10-19} \xsim@add@version{0.15} {2019-11-02} \xsim@add@version{0.16} {2019-11-10} +\xsim@add@version{0.16a} {2020-01-16} +\xsim@add@version{0.17} {2020-02-21} % ---------------------------------------------------------------------------- \newrobustcmd*\xsimauxfileinfo{% diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex index 69e5a9a6183..4fa95620a35 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex @@ -49,10 +49,10 @@ \cs_new_protected:Npn \XSIM #1 { \use:c {XSIMaux#1} } -\cs_new_protected:Npn \xsim_new_aux_cs:cpn #1 +\cs_new_protected:Npn \xsim_new_aux_property:cpn #1 { \cs_new_protected:cpn {XSIMaux#1} } -\cs_new_protected:Npn \xsim_add_cs_to_aux:nn #1#2 +\cs_new_protected:Npn \xsim_add_property_to_aux:nn #1#2 { \xsim_verbose:n { Writing~ command~ \XSIM {#1}~ to~ aux~ file } \xsim_write_to_aux:x { \token_to_str:N \XSIM {#1} #2 } @@ -83,8 +83,11 @@ } } -\xsim_new_aux_cs:cpn {readaux} - { \file_input:n { \c_sys_jobname_str .xsim } } +\xsim_new_aux_property:cpn {readaux} + { + \file_if_exist:nT { \c_sys_jobname_str .xsim } + { \file_input:n { \c_sys_jobname_str .xsim } } + } % ---------------------------------------------------------------------------- % list for recording values that need to be written to the aux file and @@ -105,7 +108,7 @@ \prop_new:c {g__xsim_list_#1_prop} \seq_new:c {g__xsim_list_#1_seq} \seq_new:c {g__xsim_list_recorded_#1_seq} - \xsim_new_aux_cs:cpn {#1} ##1 + \xsim_new_aux_property:cpn {#1} ##1 { \prop_gclear:c {g__xsim_list_#1_prop} \tl_if_blank:nF {##1} @@ -193,7 +196,7 @@ { \xsim_rerun: } \bool_if:NF \l__xsim_empty_lists_bool { - \xsim_add_cs_to_aux:nn {#1} + \xsim_add_property_to_aux:nn {#1} { { \seq_use:cV {g__xsim_list_#1_seq} \l__xsim_split_aux_lists_str } } } } diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex index 3eb336e3a3f..fbaf246c0f5 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex @@ -124,14 +124,21 @@ \prg_new_conditional:Npnn \xsim_if_final: {p,T,F,TF} { - \bool_if:NTF \g_xsim_final_bool + \bool_if:NTF \g__xsim_final_bool { \prg_return_true: } { \prg_return_false: } } \prg_new_conditional:Npnn \xsim_if_verbose: {p,T,F,TF} { - \bool_if:NTF \g_xsim_verbose_bool + \bool_if:NTF \g__xsim_verbose_bool + { \prg_return_true: } + { \prg_return_false: } + } + +\prg_new_conditional:Npnn \xsim_if_package_blank: {p,T,F,TF} + { + \bool_if:NTF \g__xsim_blank_bool { \prg_return_true: } { \prg_return_false: } } @@ -170,8 +177,9 @@ \prg_new_conditional:Npnn \xsim_if_chapter: {p,T,F,TF} { - \bool_if:nTF - { \cs_if_exist_p:N \chapter && \cs_if_exist_p:N \c@chapter } + \bool_lazy_and:nnTF + { \cs_if_exist_p:N \chapter } + { \cs_if_exist_p:N \c@chapter } { \prg_return_true: } { \prg_return_false: } } diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex index 70c4440537f..e2cc6c584ce 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex @@ -78,8 +78,9 @@ \mode_if_math:TF { \hbox_set:Nn \l__xsim_blank_box { $ \m@th \mathpalette{}{#1} $ } } { \hbox_set:Nn \l__xsim_blank_box {#1} } - \bool_if:nTF - { \xsim_if_inside_solution_p: || \l__xsim_fill_blank_bool } + \bool_lazy_or:nnTF + { \xsim_if_inside_solution_p: } + { \l__xsim_fill_blank_bool } { \xsim_write_cloze_filled:n {#1} } { \bool_if:NTF \l__xsim_blank_width_bool diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex index eba9940e239..b85ffa2a156 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex @@ -351,11 +351,9 @@ { \prop_if_in:NnTF \g__xsim_collections_prop {#1} { - \bool_if:nTF - { - !\str_if_eq_p:en {#1} {all~ exercises} && - \prop_item:Nn \g__xsim_collections_prop {#1} - } + \bool_lazy_and:nnTF + { !\str_if_eq_p:en {#1} {all~ exercises} } + { \prop_item:Nn \g__xsim_collections_prop {#1} } { \prg_return_true: } { \prg_return_false: } } diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex index c6fa9bd0113..5b87fb0f4f8 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex @@ -59,6 +59,7 @@ \DeclareExerciseProperty * {use} \DeclareExerciseProperty * {used} \DeclareExerciseProperty *-{use!} +\DeclareExerciseProperty * {solution} \XSIMifchapterT{ \DeclareExerciseProperty {chapter-value} \DeclareExerciseProperty {chapter} @@ -165,18 +166,21 @@ % ---------------------------------------------------------------------------- -\DeclareExerciseType {exercise} { - exercise-env = exercise , - solution-env = solution , - exercise-name = \XSIMtranslate {exercise} , - exercises-name = \XSIMtranslate {exercises} , - solution-name = \XSIMtranslate {solution} , - solutions-name = \XSIMtranslate {solutions} , - exercise-template = default , - solution-template = default , - exercise-heading = \subsection* , - solution-heading = \subsection* -} +\xsim_if_package_blank:F + { + \DeclareExerciseType {exercise} { + exercise-env = exercise , + solution-env = solution , + exercise-name = \XSIMtranslate {exercise} , + exercises-name = \XSIMtranslate {exercises} , + solution-name = \XSIMtranslate {solution} , + solutions-name = \XSIMtranslate {solutions} , + exercise-template = default , + solution-template = default , + exercise-heading = \subsection* , + solution-heading = \subsection* + } + } % ---------------------------------------------------------------------------- @@ -473,4 +477,6 @@ % ---------------------------------------------------------------------------- \file_input_stop: -2019/02/17 fixed error in German translations (issue 39) +2019/02/17 - fix issue #39 (error in German translations) +2020/02/19 - implement issue #33 (solution property) +2020/02/20 - implement issue #31 (blank package option) diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex index 9c0c30111a0..37a3df68e99 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex @@ -48,6 +48,7 @@ \tl_new:N \l__xsim_file_path_and_name_tl \tl_new:N \l__xsim_file_name_tl \tl_new:N \l__xsim_file_extension_tl +\tl_new:N \l__xsim_solution_tl \bool_new:N \l__xsim_options_given_bool \bool_new:N \l__xsim_insert_mode_bool @@ -276,33 +277,51 @@ % #3: exercise|solution \cs_new_protected:Npn \xsim_typeset_environment:nnn #1#2#3 { + \xsim_if_exchange:nnnT {#1} {#2} {#3} + { \__xsim_set_file_signature:nnn {#1} {#2} {exercise} } \xsim_verbose:n { Typesetting~ #3~ environment~ type~ `#1'~ id~ `#2' } - \use:x + \xsim_use_hook:nnn {#1} {#3} {pre} + \xsim_use_template:nx + {begin} + { \xsim_get_parameter:nn {#1} {#3-template} } + \xsim_use_hook:nnn {#1} {#3} {begin} + \xsim_if_write_to_files:TF { - \exp_not:N \par - \xsim_use_hook:nnn {#1} {#3} {pre} - \xsim_use_template:nn - {begin} - { \xsim_get_parameter:nn {#1} {#3-template} } - \xsim_use_hook:nnn {#1} {#3} {begin} - \xsim_if_write_to_files:TF + \file_if_exist:nTF { \exp_not:V \l__xsim_file_path_and_name_tl } + { \file_input:n { \exp_not:V \l__xsim_file_path_and_name_tl } } { - \file_if_exist:nTF { \exp_not:V \l__xsim_file_path_and_name_tl } - { \file_input:n { \exp_not:V \l__xsim_file_path_and_name_tl } } - { - \xsim_verbose:n - { File~ `\l__xsim_file_path_and_name_tl'~ doesn't~ exist. } - } + \xsim_verbose:n + { File~ `\l__xsim_file_path_and_name_tl'~ doesn't~ exist. } } + } + { + \xsim_if_exchange:nnnTF {#1} {#2} {#3} + { \xsim_get_property:nnn {#1} {#2} {exercise-body} } { \xsim_get_property:nnn {#1} {#2} {#3-body} } - \xsim_use_hook:nnn {#1} {#3} {end} - \xsim_use_template:nn - {end} - { \xsim_get_parameter:nn {#1} {#3-template} } - \xsim_use_hook:nnn {#1} {#3} {post} - \exp_not:N \par } + \xsim_synchronize_goals:nn {#1} {#2} + \str_if_eq:nnT {#3} {exercise} + { \xsim_update_goals:nn {#1} {#2} } + \xsim_use_hook:nnn {#1} {#3} {end} + \xsim_use_template:nx + {end} + { \xsim_get_parameter:nn {#1} {#3-template} } + \xsim_use_hook:nnn {#1} {#3} {post} + } + +% #1: type +% #2: id +% #3: exercise|solution +\prg_new_conditional:Npnn \xsim_if_exchange:nnn #1#2#3 {T,F,TF} + { + \str_if_eq:nnTF {#3} {solution} + { + \xsim_if_boolean_property:nnnTF {#1} {#2} {solution} + { \prg_return_true: } + { \prg_return_false: } + } + { \prg_return_false: } } % #1: type @@ -334,7 +353,9 @@ % #4: exercise|solution \cs_new_protected:Npn \xsim_insert:nnnn #1#2#3#4 { - \xsim_if_exist:nnnTF {#1} {#2} {#4} + \xsim_if_exchange:nnnTF {#1} {#2} {#4} + { \xsim_if_exist:nnnTF {#1} {#2} {exercise} } + { \xsim_if_exist:nnnTF {#1} {#2} {#4} } { \xsim_verbose:n { Inserting~ #4~ type~ `#1'~ id~ `#2'. } @@ -355,6 +376,8 @@ section-value = \the\value{section} , section = \thesection } + \xsim_synchronize_goals:nn {#1} {#2} + \xsim_update_goals:nn {#1} {#2} } \xsim_if_property_exist:nT {chapter} { @@ -414,10 +437,16 @@ \group_begin: \xsim_if_write_to_files:TF { - \__xsim_set_file_signature:nnn {#1} {#2} {#3} + \xsim_if_exchange:nnnTF {#1} {#2} {#3} + { \__xsim_set_file_signature:nnn {#1} {#2} {exercise} } + { \__xsim_set_file_signature:nnn {#1} {#2} {#3} } \file_input:n { \l__xsim_file_path_and_name_tl } } - { \xsim_get_property:nnn {#1} {#2} {#3-body} } + { + \xsim_if_exchange:nnnTF {#1} {#2} {#3} + { \xsim_get_property:nnn {#1} {#2} {exercise-body} } + { \xsim_get_property:nnn {#1} {#2} {#3-body} } + } \group_end: } \cs_generate_variant:Nn \xsim_input:nnn {oo} @@ -492,3 +521,8 @@ 2019/02/17 - fix issue #43 2019/10/03 - add possibility to save environment bodies to property list +2020/02/15 - remove spurious \par at the beginning and end of typeset + exercises and solutions +2020/02/19 - implement issue #33 (solution property) +2020/02/20 - fix issue #27 + - implement issue #2 diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex index 6f1503dbc41..2fc9e4d142b 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex @@ -394,35 +394,82 @@ \int_gincr:N \g_xsim_id_int \int_compare:nF { \g_xsim_max_id_int > \g_xsim_id_int } { \int_gset_eq:NN \g_xsim_max_id_int \g_xsim_id_int } - \xsim_set_properties:nxx {#1} { \int_use:N \g_xsim_id_int } + \tl_gset:Nx \g_xsim_exercise_id_tl { \int_use:N \g_xsim_id_int } + % save the goal values from the auxiliary files: + \xsim_foreach_goal:n { + \xsim_temporary_goal_new:nVn {#1} \g_xsim_exercise_id_tl {##1} + \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1} + { + \xsim_temporary_goal_set:nVnn + {#1} + \g_xsim_exercise_id_tl + {##1} + { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} } + } + } + \xsim_set_properties:nVx {#1} \g_xsim_exercise_id_tl + { + % preset options so the user doesn't has to: print = true , use = true , + % options set by the user: \exp_not:n {#2} , - id = \int_use:N \g_xsim_id_int , + % options which need to have certain values: + id = \g_xsim_exercise_id_tl , section-value = \arabic{section} , section = \thesection , page-value = \arabic{page} , sectioning = - { \cs_if_exist:NTF \chapter { \arabic{chapter} } {0} } + { \cs_if_exist:NTF \thechapter { \arabic {chapter} } {0} } { \arabic {section} } { \arabic {subsection} } { \arabic {subsubsection} } { \arabic {paragraph} } , page = \thepage , + % this cannot yet be set (see below): used = false } + % temporary goal now: either 0 or equal the complete property + % property: equal to the given value + \xsim_foreach_goal:n + { + \fp_set:Nn \l__xsim_tmpa_fp + { \xsim_temporary_goal_get:nVn {#1} \g_xsim_exercise_id_tl {##1} } + % set temporary goal to given property: + \xsim_if_property_given:nTF {##1} + { + \xsim_temporary_goal_set:nVnn + {#1} + \g_xsim_exercise_id_tl + {##1} + { \xsim_get_property:nVn {#1} \g_xsim_exercise_id_tl {##1} } + } + { + \xsim_temporary_goal_set:nVnn + {#1} + \g_xsim_exercise_id_tl + {##1} + {0} + } + % update to property to complete value: + \xsim_if_property_set:nVnT {#1} \g_xsim_exercise_id_tl {##1} + { + \xsim_set_property:nVnx {#1} \g_xsim_exercise_id_tl {##1} + { \fp_to_decimal:N \l__xsim_tmpa_fp } + } + } \xsim_if_property_exist:nT {chapter} { - \xsim_set_properties:nxx {#1} { \int_use:N \g_xsim_id_int } + \xsim_set_properties:nVx {#1} \g_xsim_exercise_id_tl { chapter-value = \arabic{chapter} , chapter = \thechapter } } - \tl_gclear:N \g_xsim_exercise_id_tl - \xsim_gsave_property:nxnN {#1} { \int_use:N \g_xsim_id_int } {id} - \g_xsim_exercise_id_tl + % \tl_gclear:N \g_xsim_exercise_id_tl + % \xsim_gsave_property:nVnN {#1} \l__xsim_tmpa_tl {id} + % \g_xsim_exercise_id_tl \tl_gset_eq:NN \ExerciseID \g_xsim_exercise_id_tl \tl_gset:Nn \ExerciseType {#1} \xsim_verbose:x @@ -449,7 +496,6 @@ \xsim_set_property:nVnn {#1} \g_xsim_exercise_id_tl {use} {true} - \xsim_update_goals:nV {#1} \g_xsim_exercise_id_tl } { \xsim_set_properties:nVn {#1} \g_xsim_exercise_id_tl @@ -524,7 +570,7 @@ % ---------------------------------------------------------------------------- -\xsim_new_aux_cs:cpn {total-number} #1 +\xsim_new_aux_property:cpn {total-number} #1 { \int_gset:Nn \g_xsim_max_id_int {#1} } \RequirePackage {etoolbox} @@ -535,7 +581,7 @@ { \tl_new:c { number of #1 s } \tl_set:cn { number of #1 s } {0} - \xsim_new_aux_cs:cpn {#1} ##1 + \xsim_new_aux_property:cpn {#1} ##1 { \tl_gset:cn { number of #1 s } {##1} } } } @@ -556,10 +602,10 @@ \int_compare:nNnF { \g_xsim_max_id_int } = { \g_xsim_id_int } { \xsim_empty_lists: } } - \xsim_add_cs_to_aux:nn {total-number} { { \int_use:N \g_xsim_id_int } } + \xsim_add_property_to_aux:nn {total-number} { { \int_use:N \g_xsim_id_int } } \xsim_foreach_exercise_type:n { - \xsim_add_cs_to_aux:nn {#1} + \xsim_add_property_to_aux:nn {#1} { { \arabic { \xsim_get_parameter:nn {#1} {number} } } } } \xsim_update_list:n {types} @@ -567,3 +613,5 @@ % ---------------------------------------------------------------------------- \file_input_stop: + +2020/02/21 - implement issue #2 diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex index cf7975c4bd0..6b17d2bc3f5 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex @@ -49,6 +49,7 @@ {#1} \seq_put_right:Nn \l__xsim_goals_seq {#1} \fp_gzero_new:c {g__xsim_goal_#1_fp} + \bool_new:c {l__xsim_goal_#1_given_bool} \fp_gzero_new:c {l__xsim_current_goal_#1_fp} \fp_if_exist:cF {g__xsim_total_goal_#1_fp} { \fp_new:c {g__xsim_total_goal_#1_fp} } @@ -73,6 +74,16 @@ { \prg_return_false: } } +\prg_new_conditional:Npnn \xsim_if_goal_given:n #1 {p,T,F,TF} + { + \bool_if:cTF {l__xsim_goal_#1_given_bool} + { \prg_return_true: } + { \prg_return_false: } + } + +\cs_new_protected:Npn \xsim_goal_given:n #1 + { \bool_set_true:c {l__xsim_goal_#1_given_bool} } + % #1: exercise type % #2: id % #3: goal @@ -99,6 +110,28 @@ \cs_new_protected:Npn \xsim_foreach_goal:n #1 { \seq_map_inline:Nn \l__xsim_goals_seq {#1} } +% #1: type +% #2: id +\cs_new_protected:Npn \xsim_synchronize_goals:nn #1#2 + { + \xsim_foreach_goal:n + { + \xsim_if_property_set:nnnTF {#1} {#2} {##1} + { + \xsim_set_property:nnnx {#1} {#2} {##1} + { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} } + } + { + \fp_compare:nNnT + { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} } > {0} + { + \xsim_set_property:nnnx {#1} {#2} {##1} + { \xsim_temporary_goal_get:nnn {#1} {#2} {##1} } + } + } + } + } + % #1: exercise type % #2: id % #3: goal @@ -108,9 +141,10 @@ \xsim_if_goal_exist:nT {#3} { \xsim_verbose:n { Adding~ `#4'~ to~ `#3'~ goal~ of~ #1~ #2 } - \fp_gadd:cn {g__xsim_goal_#3_fp} {#4} - \fp_gadd:cn {g__xsim_#1_goal_#3_fp} {#4} - \fp_add:cn {l__xsim_current_goal_#3_fp} {#4} + % \fp_gadd:cn {g__xsim_goal_#3_fp} {#4} + % \fp_gadd:cn {g__xsim_#1_goal_#3_fp} {#4} + % \fp_add:cn {l__xsim_current_goal_#3_fp} {#4} + \xsim_temporary_goal_add:nnnn {#1} {#2} {#3} {#4} } } \cs_generate_variant:Nn \xsim_addto_goal:nnnn {xx,nVnx} @@ -129,6 +163,46 @@ \cs_generate_variant:Nn \xsim_if_goal_value:nnnnTF {xx} % ---------------------------------------------------------------------------- +% we need some kind of temporary variable to be able to set goals both as +% option to exercises and within the exercise body + +% #1: type +% #2: id +% #3: goal +\cs_new_protected:Npn \xsim_temporary_goal_new:nnn #1#2#3 + { \fp_new:c {g__xsim_goal_#3_#1_#2_fp} } +\cs_generate_variant:Nn \xsim_temporary_goal_new:nnn {nV} + +% #1: type +% #2: id +% #3: goal +% #4: value +\cs_new_protected:Npn \xsim_temporary_goal_set:nnnn #1#2#3#4 + { \fp_gset:cn {g__xsim_goal_#3_#1_#2_fp} {#4} } +\cs_generate_variant:Nn \xsim_temporary_goal_set:nnnn {nV} + +% #1: type +% #2: id +% #3: goal +% #4: value +\cs_new_protected:Npn \xsim_temporary_goal_add:nnnn #1#2#3#4 + { \fp_gadd:cn {g__xsim_goal_#3_#1_#2_fp} {#4} } +\cs_generate_variant:Nn \xsim_temporary_goal_add:nnnn {nV} + +% #1: type +% #2: id +% #3: goal +\cs_new:Npn \xsim_temporary_goal_get:nnn #1#2#3 + { \fp_to_decimal:c {g__xsim_goal_#3_#1_#2_fp} } +\cs_generate_variant:Nn \xsim_temporary_goal_get:nnn {nV} + +% #1: type +% #2: id +% #3: goal +\cs_new_protected:Npn \__xsim_temporary_goal_show:nnn #1#2#3 + { \fp_show:c {g__xsim_goal_#3_#1_#2_fp} } + +% ---------------------------------------------------------------------------- % a function which can be used to modify how the numbers of a goal are % printed: \cs_new_protected:Npn \__xsim_print_goal:n #1 {#1} @@ -254,12 +328,12 @@ % #1: exercise type % #2: goal % #3: value -\xsim_new_aux_cs:cpn {goal} #1#2#3 +\xsim_new_aux_property:cpn {goal} #1#2#3 { \fp_gset:cn {g__xsim_total_#1_goal_#2_fp} {#3} } % #1: goal % #2: value -\xsim_new_aux_cs:cpn {totalgoal} #1#2 +\xsim_new_aux_property:cpn {totalgoal} #1#2 { \fp_gset:cn {g__xsim_total_goal_#1_fp} {#2} } \xsim_at_begin_document:n @@ -278,7 +352,7 @@ { \xsim_foreach_exercise_type:n { - \xsim_add_cs_to_aux:nn {goal} + \xsim_add_property_to_aux:nn {goal} { {##1} {#1} { \fp_to_decimal:c {g__xsim_##1_goal_#1_fp} } } } \tl_set:Nx \l__xsim_tmpa_tl @@ -286,7 +360,7 @@ \tl_set:Nx \l__xsim_tmpb_tl { \fp_to_decimal:c {g__xsim_total_goal_recorded_#1_fp} } \tl_if_eq:NNF \l__xsim_tmpa_tl \l__xsim_tmpb_tl { \xsim_rerun: } - \xsim_add_cs_to_aux:nn {totalgoal} + \xsim_add_property_to_aux:nn {totalgoal} { {#1} { \fp_to_decimal:c {g__xsim_goal_#1_fp} } } } } @@ -306,4 +380,6 @@ % ---------------------------------------------------------------------------- \file_input_stop: -2019/01/30 bug fix (cf. https://texwelt.de/wissen/fragen/24101/) +2019/01/30 - bug fix (cf. https://texwelt.de/wissen/fragen/24101/) +2020/02/20 - add temporary variables for the whole subpoint thing + (cf. issue #2) diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex index add24310181..825b8f25176 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex @@ -54,6 +54,7 @@ \seq_new:N \l__xsim_boolean_properties_seq \seq_new:N \l__xsim_unique_properties_seq \seq_new:N \l__xsim_noupdate_properties_seq +\seq_new:N \l__xsim_given_properties_seq \prop_new:N \g__xsim_properties_prop % new property: @@ -131,6 +132,15 @@ { \prg_return_false: } } +% true if property #1 has been set in the /last/ call of +% \xsim_set_properties:nnn +\prg_new_conditional:Npnn \xsim_if_property_given:n #1 {p,T,F,TF} + { + \seq_if_in:NnTF \l__xsim_given_properties_seq {#1} + { \prg_return_true: } + { \prg_return_false: } + } + % #1: property % #2: value \prg_new_conditional:Npnn \xsim_if_property_unique_value:nn #1#2 {p,T,F,TF} @@ -178,8 +188,12 @@ } { \msg_error:nnn {xsim} {unknown-property} {#3} } } -\cs_generate_variant:Nn \xsim_set_property:nnnn {nnxx,nnnV,nV,nVnx,nnnx,xx,xxnx} +\cs_generate_variant:Nn \xsim_set_property:nnnn {nnxx,nnnV,nV,nVnx,nnnx,xx,xxnx,nxnx} +% #1: type +% #2: id +% #3: property +% #4: value \cs_new_protected:Npn \__xsim_set_boolean_property:nnnn #1#2#3#4 { \str_case_e:nnTF { \str_lowercase:n {#4} } @@ -191,6 +205,10 @@ { \__xsim_set_property:nnnn {#1} {#2} {#3} {false} } } +% #1: type +% #2: id +% #3: property +% #4: value \cs_new_protected:Npn \__xsim_set_unique_property:nnnn #1#2#3#4 { \__xsim_set_property:nnnn {#1} {#2} {#3} {#4} @@ -309,6 +327,7 @@ % #3: csv list of properties \cs_new_protected:Npn \xsim_set_properties:nnn #1#2#3 { + \seq_clear:N \l__xsim_given_properties_seq \clist_map_inline:nn {#3} { \seq_set_split:Nnx \l__xsim_tmpa_seq {=} { \tl_trim_spaces:n {##1} } @@ -317,6 +336,8 @@ {#2} { \seq_item:Nn \l__xsim_tmpa_seq {1} } { \seq_item:Nn \l__xsim_tmpa_seq {2} } + \seq_put_right:Nx \l__xsim_given_properties_seq + { \seq_item:Nn \l__xsim_tmpa_seq {1} } } \xsim_property_set_aliases:nn {#1} {#2} } @@ -326,16 +347,15 @@ % #1: type % #2: id % #3: property -\prg_new_protected_conditional:Npnn \xsim_if_property_set:nnn #1#2#3 {T,F,TF} +\prg_new_conditional:Npnn \xsim_if_property_set:nnn #1#2#3 {T,F,TF} { - \prop_if_in:NxTF \g__xsim_properties_prop - { #2 ! #1 ! #3 } + \prop_if_in:NnTF \g__xsim_properties_prop {#2!#1!#3} { \prg_return_true: } { \prg_return_false: } } -\cs_generate_variant:Nn \xsim_if_property_set:nnnTF {nnx,xx,nV} -\cs_generate_variant:Nn \xsim_if_property_set:nnnF {nx,nnx,xx} -\cs_generate_variant:Nn \xsim_if_property_set:nnnT {nnx,xx} +\prg_generate_conditional_variant:Nnn \xsim_if_property_set:nnn + {nx,nnx,xx,nV} + {T,F,TF} % ---------------------------------------------------------------------------- @@ -414,7 +434,7 @@ % #3: property \cs_new:Npn \xsim_get_property:nnn #1#2#3 { \prop_item:Nn \g__xsim_properties_prop { #2 ! #1 ! #3 } } -\cs_generate_variant:Nn \xsim_get_property:nnn {nx,xx,oo,no,nnf,nf,oof,nV} +\cs_generate_variant:Nn \xsim_get_property:nnn {nx,ne,xx,oo,no,nnf,nf,oof,nV} % #1: property % #2: value @@ -482,7 +502,7 @@ \cs_generate_variant:Nn \xsim_if_boolean_property:nnnF {nV} \cs_new_protected:Npn \xsim_save_property:nnnN #1#2#3#4 - { \prop_get:NnN \g__xsim_properties_prop { #2 ! #1 ! #3 } #4 } + { \prop_get:NnN \g__xsim_properties_prop {#2!#1!#3} #4 } \cs_generate_variant:Nn \xsim_save_property:nnnN {nx,xx} \cs_new_protected:Npn \xsim_gsave_property:nnnN #1#2#3#4 @@ -490,7 +510,7 @@ \xsim_save_property:nnnN {#1} {#2} {#3} #4 \tl_gset:NV #4 #4 } -\cs_generate_variant:Nn \xsim_gsave_property:nnnN {nx,xx} +\cs_generate_variant:Nn \xsim_gsave_property:nnnN {nx,xx,nV} % ---------------------------------------------------------------------------- \file_input_stop: diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex index 2444ef17453..2087adf9de3 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex @@ -52,7 +52,7 @@ % #1: random list id % #2: csv list of integers -\xsim_new_aux_cs:cpn {random} #1#2 +\xsim_new_aux_property:cpn {random} #1#2 { \xsim_random_list_if_exist:nF {#1} { \xsim_new_random_list:n {#1} } @@ -100,7 +100,7 @@ \xsim_random_list_if_empty:nT {#1} { \xsim_set_random_list_from_seq:nN {#1} #2 } \xsim_verbose:n {Saving~ random~ list~ `#1'} - \xsim_add_cs_to_aux:nn {random} + \xsim_add_property_to_aux:nn {random} { {#1} { \xsim_use_random_list:nn {#1} {,} } } } @@ -165,12 +165,9 @@ % #4: seq variable \cs_new_protected:Npn \xsim_generate_random_list:nnnN #1#2#3#4 { - \bool_if:nT - { - !\xsim_random_list_if_exist_p:n {#1} - || - \xsim_random_list_if_empty_p:n {#1} - } + \bool_lazy_or:nnT + { !\xsim_random_list_if_exist_p:n {#1} } + { \xsim_random_list_if_empty_p:n {#1} } { \xsim_verbose:n {Generating~ random~ list~ `#1'~ with~ #3~ out~ of~ #2~ items} @@ -199,12 +196,9 @@ % #2: random list id \cs_new_protected:Npn \xsim_print_random_exercises:Nn #1#2 { - \bool_if:nT - { - \xsim_random_list_if_exist_p:n {#2} - && - !\xsim_random_list_if_empty_p:n {#2} - } + \bool_lazy_and:nnT + { \xsim_random_list_if_exist_p:n {#2} } + { !\xsim_random_list_if_empty_p:n {#2} } { \xsim_verbose:x { @@ -220,12 +214,13 @@ { \seq_item:Nn #1 {##1} } \tl_set:Nx \l__xsim_tmpb_tl { \xsim_get_type_for_property:nV {id} \l__xsim_tmpa_tl } - \bool_if:nT + \bool_lazy_or:nnT { \tl_if_eq_p:NN \l__xsim_print_random_choice_tl \c__xsim_print_random_both_tl - || + } + { \tl_if_eq_p:NN \l__xsim_print_random_choice_tl \c__xsim_print_random_exercise_tl @@ -242,12 +237,13 @@ {exercise} } } - \bool_if:nT + \bool_lazy_or:nnT { \tl_if_eq_p:NN \l__xsim_print_random_choice_tl \c__xsim_print_random_both_tl - || + } + { \tl_if_eq_p:NN \l__xsim_print_random_choice_tl \c__xsim_print_random_solution_tl diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex index eddeaa911f8..902f377864f 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex @@ -82,7 +82,9 @@ % #2: id \prg_new_protected_conditional:Npnn \xsim_if_solution_exist:nn #1#2 {T,F,TF} { - \xsim_if_exist:nnnTF {#1} {#2} {solution} + \xsim_if_boolean_property:nnnTF {#1} {#2} {solution} + { \xsim_if_exist:nnnTF {#1} {#2} {exercise} } + { \xsim_if_exist:nnnTF {#1} {#2} {solution} } { \prg_return_true: } { \prg_return_false: } } diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.sty b/Master/texmf-dist/tex/latex/xsim/xsim.sty index a6a5538c67a..0939f4796a2 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.sty +++ b/Master/texmf-dist/tex/latex/xsim/xsim.sty @@ -29,9 +29,9 @@ \ExplSyntaxOn -\tl_const:Nn \c_xsim_date_tl {2020/01/16} +\tl_const:Nn \c_xsim_date_tl {2020/02/21} \tl_const:Nn \c_xsim_version_major_number_tl {0} -\tl_const:Nn \c_xsim_version_minor_number_tl {16a} +\tl_const:Nn \c_xsim_version_minor_number_tl {17} \tl_const:Nn \c_xsim_version_subrelease_tl {} \tl_const:Nx \c_xsim_version_number_tl { @@ -55,29 +55,49 @@ % options, information -\bool_new:N \g_xsim_final_bool -\bool_new:N \g_xsim_verbose_bool +\bool_new:N \g__xsim_final_bool +\bool_new:N \g__xsim_verbose_bool \bool_new:N \g_xsim_clear_aux_bool \bool_new:N \g__xsim_write_to_file_bool \bool_new:N \g_xsim_use_aux_bool \bool_new:N \g__xsim_rerun_bool +\bool_new:N \g__xsim_blank_bool \keys_define:nn {xsim/package} { - final .bool_gset:N = \g_xsim_final_bool , - verbose .bool_gset:N = \g_xsim_verbose_bool , + final .bool_gset:N = \g__xsim_final_bool , + verbose .bool_gset:N = \g__xsim_verbose_bool , clear-aux .bool_gset:N = \g_xsim_clear_aux_bool , no-files .bool_gset_inverse:N = \g__xsim_write_to_file_bool , no-files .initial:n = false , use-aux .bool_gset:N = \g_xsim_use_aux_bool , - use-aux .initial:n = false + use-aux .initial:n = false , + blank .bool_gset:N = \g__xsim_blank_bool , + blank .initial:n = false } \ProcessKeysPackageOptions {xsim/package} +\keys_define:nn {xsim/package} + { + final .code:n = \msg_error:nnn {xsim} {load-time-option} {final} , + verbose .code:n = \msg_error:nnn {xsim} {load-time-option} {verbose} , + clear-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {clear-aux} , + no-files .code:n = \msg_error:nnn {xsim} {load-time-option} {no-files} , + use-aux .code:n = \msg_error:nnn {xsim} {load-time-option} {use-aux} , + blank .code:n = \msg_error:nnn {xsim} {load-time-option} {blank} + } + % -------------------------------------------------------------------------- % messages: +\msg_new:nnn {xsim} {load-time-option} + { + `#1'~ is~ a~ load-time~ option! \\ + You~ cannot~ set~ it~ with~ \token_to_str:N \xsimsetup ! \\ + You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {xsim} . + } + \msg_new:nnn {xsim} {rerun} { Exercise~ properties~ may~ have~ changed.~ Rerun~ to~ get~ them~ @@ -105,5 +125,9 @@ \xsim_do_rerun: \xsim_close_aux: } - + +% -------------------------------------------------------------------------- \file_input_stop: + +2020/02/20 - implement issue #31 (blank package option) +2020/02/21 - don't allow package options to be set with \xsimsetup diff --git a/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex b/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex index 5d87f7c750a..e43c30d34d7 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex +++ b/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex @@ -52,11 +52,11 @@ \file_if_exist:nTF {#2} { \xsim_if_final:F { \iow_open:Nn #1 {#2} } } { - % \g_xsim_final_bool is a global variable; however, if it is true and + % \g__xsim_final_bool is a global variable; however, if it is true and % the exercise file doesn't exist, yet, we need to set it locally to % false in order to ensure that the file is correctly written and the % stream closed afterwards - \bool_set_false:N \g_xsim_final_bool + \bool_set_false:N \g__xsim_final_bool \iow_open:Nn #1 {#2} } } diff --git a/Master/texmf-dist/tex/latex/xsim/xsimverb.sty b/Master/texmf-dist/tex/latex/xsim/xsimverb.sty index a7cbd0706be..90373e9021d 100644 --- a/Master/texmf-dist/tex/latex/xsim/xsimverb.sty +++ b/Master/texmf-dist/tex/latex/xsim/xsimverb.sty @@ -59,8 +59,8 @@ \cs_new_protected:Npn \xsimverb_bool_provide:N #1 { \bool_if_exist:NF #1 { \bool_new:N #1 } } -\xsimverb_bool_provide:N \g_xsim_final_bool -\xsimverb_bool_provide:N \g_xsim_verbose_bool +\xsimverb_bool_provide:N \g__xsim_final_bool +\xsimverb_bool_provide:N \g__xsim_verbose_bool \xsimverb_bool_provide:N \g_xsim_clear_aux_bool \xsimverb_bool_provide:N \g__xsim_write_to_file_bool \xsimverb_bool_provide:N \g_xsim_use_aux_bool @@ -68,8 +68,8 @@ \keys_define:nn {xsimverb} { - final .bool_gset:N = \g_xsim_final_bool , - verbose .bool_gset:N = \g_xsim_verbose_bool , + final .bool_gset:N = \g__xsim_final_bool , + verbose .bool_gset:N = \g__xsim_verbose_bool , clear-aux .bool_gset:N = \g_xsim_clear_aux_bool , no-files .bool_gset_inverse:N = \g__xsim_write_to_file_bool , no-files .initial:n = false , |