summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/xsim/code
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-02-23 03:01:01 +0000
committerNorbert Preining <norbert@preining.info>2020-02-23 03:01:01 +0000
commit0908ef0004729f1b45b8d9687656f2f92fc122ae (patch)
treeaa4649a4452d4556370dc1d72c01f5d872a7c159 /macros/latex/contrib/xsim/code
parent3549e67b13c8460a73d122fbc2eef8badd816636 (diff)
CTAN sync 202002230301
Diffstat (limited to 'macros/latex/contrib/xsim/code')
-rw-r--r--macros/latex/contrib/xsim/code/xsim.auxfile.code.tex15
-rw-r--r--macros/latex/contrib/xsim/code/xsim.base.code.tex16
-rw-r--r--macros/latex/contrib/xsim/code/xsim.blanks.code.tex5
-rw-r--r--macros/latex/contrib/xsim/code/xsim.collections.code.tex8
-rw-r--r--macros/latex/contrib/xsim/code/xsim.definitions.code.tex32
-rw-r--r--macros/latex/contrib/xsim/code/xsim.environments.code.tex80
-rw-r--r--macros/latex/contrib/xsim/code/xsim.exercises.code.tex72
-rw-r--r--macros/latex/contrib/xsim/code/xsim.goals.code.tex92
-rw-r--r--macros/latex/contrib/xsim/code/xsim.properties.code.tex40
-rw-r--r--macros/latex/contrib/xsim/code/xsim.random.code.tex32
-rw-r--r--macros/latex/contrib/xsim/code/xsim.solutions.code.tex4
-rw-r--r--macros/latex/contrib/xsim/code/xsim.sty40
-rw-r--r--macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex4
-rw-r--r--macros/latex/contrib/xsim/code/xsimverb.sty8
14 files changed, 332 insertions, 116 deletions
diff --git a/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex b/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex
index 69e5a9a618..4fa95620a3 100644
--- a/macros/latex/contrib/xsim/code/xsim.auxfile.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.base.code.tex b/macros/latex/contrib/xsim/code/xsim.base.code.tex
index 3eb336e3a3..fbaf246c0f 100644
--- a/macros/latex/contrib/xsim/code/xsim.base.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.blanks.code.tex b/macros/latex/contrib/xsim/code/xsim.blanks.code.tex
index 70c4440537..e2cc6c584c 100644
--- a/macros/latex/contrib/xsim/code/xsim.blanks.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.collections.code.tex b/macros/latex/contrib/xsim/code/xsim.collections.code.tex
index eba9940e23..b85ffa2a15 100644
--- a/macros/latex/contrib/xsim/code/xsim.collections.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.definitions.code.tex b/macros/latex/contrib/xsim/code/xsim.definitions.code.tex
index c6fa9bd011..5b87fb0f4f 100644
--- a/macros/latex/contrib/xsim/code/xsim.definitions.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.environments.code.tex b/macros/latex/contrib/xsim/code/xsim.environments.code.tex
index 9c0c30111a..37a3df68e9 100644
--- a/macros/latex/contrib/xsim/code/xsim.environments.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.exercises.code.tex b/macros/latex/contrib/xsim/code/xsim.exercises.code.tex
index 6f1503dbc4..2fc9e4d142 100644
--- a/macros/latex/contrib/xsim/code/xsim.exercises.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.goals.code.tex b/macros/latex/contrib/xsim/code/xsim.goals.code.tex
index cf7975c4bd..6b17d2bc3f 100644
--- a/macros/latex/contrib/xsim/code/xsim.goals.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.properties.code.tex b/macros/latex/contrib/xsim/code/xsim.properties.code.tex
index add2431018..825b8f2517 100644
--- a/macros/latex/contrib/xsim/code/xsim.properties.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.random.code.tex b/macros/latex/contrib/xsim/code/xsim.random.code.tex
index 2444ef1745..2087adf9de 100644
--- a/macros/latex/contrib/xsim/code/xsim.random.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.solutions.code.tex b/macros/latex/contrib/xsim/code/xsim.solutions.code.tex
index eddeaa911f..902f377864 100644
--- a/macros/latex/contrib/xsim/code/xsim.solutions.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.sty b/macros/latex/contrib/xsim/code/xsim.sty
index a6a5538c67..0939f4796a 100644
--- a/macros/latex/contrib/xsim/code/xsim.sty
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex b/macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex
index 5d87f7c750..e43c30d34d 100644
--- a/macros/latex/contrib/xsim/code/xsim.verbwrite.code.tex
+++ b/macros/latex/contrib/xsim/code/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/macros/latex/contrib/xsim/code/xsimverb.sty b/macros/latex/contrib/xsim/code/xsimverb.sty
index a7cbd0706b..90373e9021 100644
--- a/macros/latex/contrib/xsim/code/xsimverb.sty
+++ b/macros/latex/contrib/xsim/code/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 ,