texlive[53877] Master/texmf-dist: xsim (22feb20)

commits+karl at tug.org commits+karl at tug.org
Sun Feb 23 01:33:45 CET 2020


Revision: 53877
          http://tug.org/svn/texlive?view=revision&revision=53877
Author:   karl
Date:     2020-02-23 01:33:45 +0100 (Sun, 23 Feb 2020)
Log Message:
-----------
xsim (22feb20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/xsim/README
    trunk/Master/texmf-dist/doc/latex/xsim/xsim.history
    trunk/Master/texmf-dist/doc/latex/xsim/xsim.ideas
    trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.pdf
    trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.sty
    trunk/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex
    trunk/Master/texmf-dist/tex/latex/xsim/xsimverb.sty

Modified: trunk/Master/texmf-dist/doc/latex/xsim/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/xsim/README	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/doc/latex/xsim/README	2020-02-23 00:33:45 UTC (rev 53877)
@@ -1,5 +1,5 @@
 --------------------------------------------------------------------------
-XSIM     2020/01/16 v0.16a
+XSIM     2020/01/21 v0.17
 XSIMVERB 2019/12/29 v0.1a
 
   eXercise Sheets IMproved
@@ -9,7 +9,7 @@
 Web:    https://github.com/cgnieder/xsim
 E-Mail: contact at mychemistry.eu
 --------------------------------------------------------------------------
-Copyright 2017--2019 Clemens Niederberger
+Copyright 2017--2020 Clemens Niederberger
 
 This work may be distributed and/or modified under the
 conditions of the LaTeX Project Public License, either version 1.3

Modified: trunk/Master/texmf-dist/doc/latex/xsim/xsim.history
===================================================================
--- trunk/Master/texmf-dist/doc/latex/xsim/xsim.history	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/doc/latex/xsim/xsim.history	2020-02-23 00:33:45 UTC (rev 53877)
@@ -113,7 +113,7 @@
                    - \ProvideExerciseTagging
  v0.12  2019/09/30 - add parameter versions for the plural forms of exercise
                      and solution names
-		   - bug fixes (issues 37, 39, 43, 47)
+                   - bug fixes (issues 37, 39, 43, 47)
  v0.13  2019/10/06 - experimental package option `no-files'
  v0.14  2019/10/13 - new exercise parameters `exercise-heading' and
                      `solution-heading'
@@ -133,6 +133,14 @@
                      `use-aux'
  v0.16  2019/11/10 - fix issue due to usage of own auxiliary file
                    - \XSIMatbegindocument and \XSIMatenddocument
-		   - \xprintexercise, \xprintsolution, \xsimprint, \xsimxprint
+                   - \xprintexercise, \xprintsolution, \xsimprint, \xsimxprint
         2019/12/29 - bugfix in `xsimverb'
  v0.16a 2020/01/16 - adapt to renaming of string case changing functions
+ v0.17  2020/02/21 - prefer lazy boolean evaluation if possible
+                   - remove spurious \par at the beginning of typeset
+                     exercises
+                   - add `blank' option, implements issue #31
+                   - add `solution' property, implements issue #33
+                   - fix issue #27
+                   - implement issue #2
+                   - don't allow package options to be set with \xsimsetup

Modified: trunk/Master/texmf-dist/doc/latex/xsim/xsim.ideas
===================================================================
--- trunk/Master/texmf-dist/doc/latex/xsim/xsim.ideas	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/doc/latex/xsim/xsim.ideas	2020-02-23 00:33:45 UTC (rev 53877)
@@ -26,4 +26,3 @@
 
 - a document class `xsim-exam' for creating exams
 - a mechanism for providing variants of an exam
-- some kind of `subexercise' mechanism

Modified: trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/doc/latex/xsim/xsim_manual.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -1,8 +1,8 @@
-% !arara: pdflatex: { action: nonstopmode }
+% !arara: pdflatex: { interaction: nonstopmode }
 % !arara: biber
-% !arara: pdflatex: { action: nonstopmode }
-% arara: pdflatex: { action: nonstopmode }
-% arara: pdflatex: { action: nonstopmode }
+% arara: pdflatex: { interaction: nonstopmode }
+% arara: pdflatex: { interaction: nonstopmode }
+% arara: pdflatex: { interaction: nonstopmode }
 % ----------------------------------------------------------------------------
 % the XSIM package
 % 
@@ -32,8 +32,7 @@
 % ----------------------------------------------------------------------------
 \documentclass{xsim-manual}
 
-\usepackage{filecontents}
-\begin{filecontents*}{\jobname.bib}
+\begin{filecontents*}[overwrite]{\jobname.bib}
 @online{texsx:romannumeral,
   author = {Bruno Le Floch} ,
   title = {Cunning (La)TeX tricks} ,
@@ -44,7 +43,7 @@
   title = {Questions tagged `exsheets'} ,
   author = {various} ,
   url = {http://tex.stackexchange.com/questions/tagged/exsheets} ,
-  urldate = {2017-05-15}
+  urldate = {2020-02-21}
 }
 \end{filecontents*}
 \addbibresource{\jobname.bib}
@@ -76,7 +75,7 @@
 It has been quite a while since I first published
 \pkg{exsheets}~\cite{pkg:exsheets} in June 2012.  Since then it has gained a
 user base and a little bit of popularity as the number of questions on tex.sx
-shows (119~at the time of writing)~\cite{texsx:tagged/exsheets}.  User
+shows (143~at the time of writing)~\cite{texsx:tagged/exsheets}.  User
 questions, bug reports and feature requests improved it over the time.  It
 still has a version number starting with a zero, though, which in my
 versioning system means I still consider it experimental.
@@ -138,21 +137,21 @@
     \sinceversion{0.15}With this option enabled \xsim\ will use the regular
     auxiliary file \cs*{jobname}\code{.aux} instead of its own auxiliary file
     \cs*{jobname}\code{.xsim}.
+  \opt{blank}
+    \sinceversion{0.17}With this option enabled \xsim\ will not define the
+    default environments \env{exercise} and \env{solution}.
 \end{options}
 
-Those options are used the usual way as package option
+Those options are load-time options and are used the usual way as package
+options:
 \begin{sourcecode}
   \usepackage[verbose]{xsim}
 \end{sourcecode}
-or as global option
-\begin{sourcecode}
-  \documentclass[verbose]{article}
-\end{sourcecode}
-or via the setup\changedversion{0.13} command as options belonging to the
-\module{package}, see also section~\vref{sec:setting-options}:
-\begin{sourcecode}
-  \xsimsetup{package/verbose}
-\end{sourcecode}
+\begin{bewareofthedog}
+  Although those options technically belong to the \module{package} module
+  (see also section~\vref{sec:setting-options}) it is \emph{not} possible to
+  set them via \cs{xsimsetup}.
+\end{bewareofthedog}
 
 \subsection{Setting Options}\label{sec:setting-options}
 Apart from the package options already described in
@@ -208,7 +207,8 @@
 \section{Exercises and Solutions}
 
 The two predefined environments for exercises and solutions are the following
-ones:
+ones\footnote{When you load \xsim\ with the \option{blank} those environments
+  will \emph{not} be defined!}:
 \begin{environments}
   \environment{exercise}[\oarg{\acsp*{prop}}]
     Input and typeset an exercise.  See section~\vref{sec:exercise-properties}
@@ -334,15 +334,15 @@
   A lot of the lines \xsim\ writes to the auxiliary file and reads in a
   subsequent run look like this:
 \begin{sourcecode}
-  \XSIM{points}{exercise-2=={4}|exercise-10=={2.5}|problem-11=={5}}
+  \XSIM{points}{exercise-2=={4}||exercise-10=={2.5}||problem-11=={5}}
 \end{sourcecode}
   As you can see different entries of the various properties of exercises are
-  separated with a \code{|}.  This means that you cannot use this symbol
-  inside properties.  This is why \xsim\ provides an option to change this
-  marker.
+  separated with \code{||}.  This means that you cannot use this symbol
+  combination inside properties.  For this reason \xsim\ provides an option to
+  change the marker.
 \end{bewareofthedog}
 \begin{options}
-  \keyval{split-aux-lists}{string}\Default{\code{|}}
+  \keyval{split-aux-lists}{string}\Default{\code{||}}
     Set\sinceversion{0.11} the string that is used to separate the property
     entries in the auxiliary file.
 \end{options}
@@ -515,30 +515,37 @@
     True if an exercise has been used at least once.  For an existing exercise
     this is only false for exercises that have been collected
     (\cf~section~\vref{sec:collecting-exercises}).
+  \propbool{solution}
+    \sinceversion{0.17}Holds the solution boolean of an exercise.  If this is
+    true then a solution has the same text\slash environment body as the
+    corresponding exercise. (This might be useful for multiple choice
+    questions for example.)
   \propval{tags}{csv list of tags}
     Holds the list of tags the exercise should be associated with.
   \propval{topics}{csv list of topics}
     Holds the list of topics the exercise should be associated with.
   \propval{page}{text}
-    Holds the page counter value representation of an exercise (\ie, what you
-    usually know as \cs*{thepage}).
+    Holds the page counter value representation of an exercise \\
+    (\ie, what you usually know as \cs*{thepage}).
   \propval{page-value}{integer}
-    Holds the page counter value of an exercise (\ie, what you usually know as
-    \cs*{the}\cs*{value}\Marg{page}).
+    Holds the page counter value of an exercise \\
+    (\ie, what you usually know as \cs*{the}\cs*{value}\Marg{page}).
   \propval{section}{text}
-    Holds the section counter value representation of an exercise (\ie, what
-    you usually know as \cs*{thesection}).
+    Holds the section counter value representation of an exercise \\
+    (\ie, what you usually know as \cs*{thesection}).
   \propval{section-value}{integer}
-    Holds the section counter value of an exercise (\ie, what you usually know
-    as \cs*{the}\cs*{value}\Marg{section}).
+    Holds the section counter value of an exercise \\
+    (\ie, what you usually know as \cs*{the}\cs*{value}\Marg{section}).
   \propval{chapter}{text}
-    Holds the chapter counter value representation of an exercise (\ie, what
-    you usually know as \cs*{thechapter}).  \emph{Only if a command
-      \cs*{chapter} \emph{and} a counter \code{chapter} exist.}
+    Holds the chapter counter value representation of an exercise \\
+    (\ie, what you usually know as \cs*{thechapter}). \\
+    \emph{Only if a command \cs*{chapter} \emph{and} a counter \code{chapter}
+      exist.}
   \propval{chapter-value}{integer}
-    Holds the chapter counter value of an exercise (\ie, what you usually know
-    as \cs*{the}\cs*{value}\Marg{chapter}).  \emph{Only if a command \cs*{chapter}
-      \emph{and} a counter \code{chapter} exist.}
+    Holds the chapter counter value of an exercise \\
+    (\ie, what you usually know as \cs*{the}\cs*{value}\Marg{chapter}). \\
+    \emph{Only if a command \cs*{chapter} \emph{and} a counter \code{chapter}
+      exist.}
   \propval{sectioning}{section numbers}
     Holds five brace groups which in turn hold the section numbers (integers)
     of the exercise in the order
@@ -594,15 +601,12 @@
 
 This is better demonstrated with an example:
 \begin{example}
-  % \lipsum is provided by package `lipsum'
   \begin{exercise}
-    \lipsum[4]
     \verb+\GetExerciseProperty{id}+: \GetExerciseProperty{id} \par
     \verb+\GetExerciseAliasProperty{ID}+: \GetExerciseAliasProperty{ID} \par
     \verb+\GetExerciseProperty{ID}+: \GetExerciseProperty{ID}
   \end{exercise}
   \begin{exercise}[ID=foo-bar]
-    \lipsum[4]
     \verb+\GetExerciseProperty{id}+: \GetExerciseProperty{id} \par
     \verb+\GetExerciseAliasProperty{ID}+: \GetExerciseAliasProperty{ID} \par
     \verb+\GetExerciseProperty{ID}+: \GetExerciseProperty{ID}

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim-manual.cls	2020-02-23 00:33:45 UTC (rev 53877)
@@ -522,6 +522,7 @@
   \XSIMfilewritestart*{\jobname.tmp}%
 }%
 \endgroup
+
 \def\xsimman at read@options@[#1]{\pgfqkeys{/cnltx}{#1}}
 
 \RenewDocumentEnvironment{sourcecode}{}
@@ -565,6 +566,7 @@
   }
   {%
     \XSIMfilewritestop
+    \catcode`\^^M=5
     \ifbool{cnltx at sidebyside}
       {%
         \cnltxcode
@@ -865,6 +867,16 @@
 % ----------------------------------------------------------------------------
 % versions:
 
+\xsim at add@version{0.0}   {2017-02-09}
+\xsim at add@version{0.1}   {2017-03-19}
+\xsim at add@version{0.2}   {2017-03-21}
+\xsim at add@version{0.4}   {2017-03-24}
+\xsim at add@version{0.5}   {2017-03-30}
+\xsim at add@version{0.5a}  {2017-04-15}
+\xsim at add@version{0.5b}  {2017-04-16}
+\xsim at add@version{0.6}   {2017-04-27}
+\xsim at add@version{0.6a}  {2017-04-28}
+\xsim at add@version{0.7}   {2017-05-09}
 \xsim at add@version{0.8}   {2017-05-18}
 \xsim at add@version{0.8a}  {2017-05-19}
 \xsim at add@version{0.8b}  {2017-05-23}
@@ -875,8 +887,11 @@
 \xsim at add@version{0.12}  {2019-09-26}
 \xsim at add@version{0.13}  {2019-10-06}
 \xsim at add@version{0.14}  {2019-10-13}
+\xsim at add@version{0.14a} {2019-10-19}
 \xsim at add@version{0.15}  {2019-11-02}
 \xsim at add@version{0.16}  {2019-11-10}
+\xsim at add@version{0.16a} {2020-01-16}
+\xsim at add@version{0.17}  {2020-02-21}
 
 % ----------------------------------------------------------------------------
 \newrobustcmd*\xsimauxfileinfo{%

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.auxfile.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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 } }
       }
   }

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.base.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -124,7 +124,7 @@
 
 \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: }
   }
@@ -131,11 +131,18 @@
 
 \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: }
+  }
+
 \prg_new_conditional:Npnn \xsim_if_rerun: {p,T,F,TF}
   {
     \bool_if:NTF \g__xsim_rerun_bool
@@ -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 at chapter }
+    \bool_lazy_and:nnTF
+      { \cs_if_exist_p:N \chapter }
+      { \cs_if_exist_p:N \c at chapter }
       { \prg_return_true: }
       { \prg_return_false: }
   }

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.blanks.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -78,8 +78,9 @@
     \mode_if_math:TF
       { \hbox_set:Nn \l__xsim_blank_box { $ \m at 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

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.collections.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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: }
       }

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.definitions.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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)

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.environments.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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,38 +277,56 @@
 % #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
+% #2: id
+% #3: exercise|solution
 \prg_new_protected_conditional:Npnn \xsim_if_exist:nnn #1#2#3 {T,F,TF}
   {
     \xsim_if_write_to_files:TF
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.exercises.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.goals.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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)

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.properties.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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:

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.random.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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,13 +165,10 @@
 % #4: seq variable
 \cs_new_protected:Npn \xsim_generate_random_list:nnnN #1#2#3#4
   {
-    \bool_if:nT
+    \bool_lazy_or:nnT
+      { !\xsim_random_list_if_exist_p:n {#1} }
+      { \xsim_random_list_if_empty_p:n {#1} }
       {
-        !\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}
         \seq_gclear:N #4
@@ -199,13 +196,10 @@
 % #2: random list id
 \cs_new_protected:Npn \xsim_print_random_exercises:Nn #1#2
   {
-    \bool_if:nT
+    \bool_lazy_and:nnT
+      { \xsim_random_list_if_exist_p:n {#2} }
+      { !\xsim_random_list_if_empty_p:n {#2} }
       {
-        \xsim_random_list_if_exist_p:n {#2}
-        &&
-        !\xsim_random_list_if_empty_p:n {#2}
-      }
-      {
         \xsim_verbose:x
           {
             Printing~
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.solutions.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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: }
   }

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.sty	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.sty	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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:
   
-\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

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsim.verbwrite.code.tex	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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}
       }
   }

Modified: trunk/Master/texmf-dist/tex/latex/xsim/xsimverb.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/xsim/xsimverb.sty	2020-02-23 00:33:25 UTC (rev 53876)
+++ trunk/Master/texmf-dist/tex/latex/xsim/xsimverb.sty	2020-02-23 00:33:45 UTC (rev 53877)
@@ -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 ,



More information about the tex-live-commits mailing list.