diff options
author | Norbert Preining <norbert@preining.info> | 2021-02-01 03:00:47 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-02-01 03:00:47 +0000 |
commit | 87c74b3292e1c3efc4427ae0536a1d30a0dc8e4b (patch) | |
tree | 219447f0cb875a4889a8cac2bea6deb012b7ca7b /macros/latex/contrib/xsim/xsim-manual.tex | |
parent | 8eab566745f1c61319c17e6a1aeea0f18bcfc34c (diff) |
CTAN sync 202102010300
Diffstat (limited to 'macros/latex/contrib/xsim/xsim-manual.tex')
-rw-r--r-- | macros/latex/contrib/xsim/xsim-manual.tex | 2439 |
1 files changed, 2439 insertions, 0 deletions
diff --git a/macros/latex/contrib/xsim/xsim-manual.tex b/macros/latex/contrib/xsim/xsim-manual.tex new file mode 100644 index 0000000000..329f602acf --- /dev/null +++ b/macros/latex/contrib/xsim/xsim-manual.tex @@ -0,0 +1,2439 @@ +% !arara: pdflatex: { interaction: nonstopmode } +% !arara: biber +% arara: pdflatex: { interaction: nonstopmode } +% arara: pdflatex: { interaction: nonstopmode } +% !arara: pdflatex: { interaction: nonstopmode } +% ---------------------------------------------------------------------------- +% the XSIM package +% +% eXercise Sheets IMproved +% +% ---------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://github.com/cgnieder/xsim +% E-Mail: contact@mychemistry.eu +% ---------------------------------------------------------------------------- +% Copyright 2017--2021 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008/05/04 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% ---------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% ---------------------------------------------------------------------------- +\documentclass{xsim-manual} + +\begin{filecontents*}[overwrite]{\jobname.bib} +@online{texsx:tagged/exsheets, + title = {Questions tagged `exsheets'} , + author = {various} , + url = {http://tex.stackexchange.com/questions/tagged/exsheets} , + urldate = {2020-02-21} +} +\end{filecontents*} +\addbibresource{\jobname.bib} + +\begin{document} + +\section{Licence, Requirements and \texorpdfstring{\textsc{readme}}{README}} +\license + +\xsim\ loads the packages \pkg{expl3}~\cite{bnd:l3kernel}, +\pkg{xparse}~\cite{bnd:l3packages}, \pkg{array}~\cite{pkg:array} +\pkg{booktabs}~\cite{pkg:booktabs} and +\pkg{translations}~\cite{pkg:translations}. All of these packages are present +on a modern and up to date \TeX\ distribution such as \TeX~Live or MiK\TeX\ so +no further action should be needed. When you are using \xsim\ you should be +using an up to date \TeX\ distribution, anyway. + +\begin{bewareofthedog} + Please be aware that \xsim\ is in an experimental state and actively + developed. Many aspects may change from one update to another until a + stable version~1 will be reached. However, I will try my best to keep the + interface stable. + + Newer versions of \xsim\ may depend on newer versions of the support + packages. Remember: it is always dangerous to update single packages. + Always update your \TeX\ distribution if you want an up to date version of a + package. Be careful: if you're in the middle of an important project it + might be better to wait with the update until you've finished the project. + Every update might be breaking some things. +\end{bewareofthedog} + +\section{Motivation, Background} + +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 (151~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. + +This is due to several facts. It lacks a few features which I consider +essential for a full version~1. For one thing it is not possible to have +several kinds of exercises numbered independently. Using verbatim material +such as listings inside exercises and solutions is not possible and the +current workaround isn't that ideal either. One request which dates back +quite a while now was to have different types of points to exercises\ldots + +All of those aren't easy to add due to the way \pkg{exsheets} is implemented +right now. As a consequence I wanted to re-implement \pkg{exsheets} for a long +time. This is what lead to \xsim. Internally the package works completely +different. + +\begin{bewareofthedog} + \xsim\ will be the official successor of \pkg{exsheets} which is now + considered obsolete but will stay alive and will still receive bugfix + releases. However, new features will not be added to \pkg{exsheets} any + more. +\end{bewareofthedog} + +\section{How to Read the Manual}\label{sec:how-read-manual} + +\subsection{Nomenclature} + +Throughout this manual certain terms are used. This section explains their +meaning in this manual. + +\acuseall +\printacronyms[heading=none] + +\subsection{Package Options}\label{sec:package-options} +\xsim\ has these package options: +\begin{options} + \opt{verbose} + Writes extensive information about what \xsim\ is doing into the log + file. + \opt{final} + If used the exercise and solution environments will not rewrite the + environment body files. + \opt{clear-aux} + If used every time the total number of exercise changes \xsim\ will write + \emph{less} information to the auxiliary file on the next run and only if + the number of exercises stays stable between compilations the needed + information will be written to the auxiliary file. \emph{This needs more + compilations until everything stabilizes but should reduce the + probability of possibly faulty exercises after changes to the document.} + The \option{final} option automatically disables this option. See also + sections~\vref{sec:how-exerc-envir} and~\vref{sec:resolve-getting}. + \opt{no-files}\Default{true} + \sinceversion{0.13}This option prevents \xsim\ from writing the exercises + and solutions to external files. This will keep your working folder + ``clean'' but will also prevent using verbatim material in exercises and + solutions. + \opt{use-files}\Default{false} + \sinceversion{0.20}This is the opposite of the option \option{no-files}. + \opt{use-aux} + \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 load-time options and are used the usual way as package +options: +\begin{sourcecode} + \usepackage[use-files]{xsim} +\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 +section~\vref{sec:package-options} \xsim\ has further options. All those +options are set using the following command: +\begin{commands} + \command{xsimsetup}[\marg{options}] + Set up \xsim's package options and all other options described at + other places in the manual. +\end{commands} +Options can be \enquote{toplevel} options or options belonging to a module: +\begin{options} + \keyval*{toplevel}{value} + A toplevel option. + \keyval*{sublevel}{value}\Module*{module} + A sublevel option belonging to the module \module*{module} +\end{options} +Both kinds of options are set with the setup command: +\begin{sourcecode} + \xsimsetup{ + toplevel = {value} , + module/sublevel = {value} + } +\end{sourcecode} + +\subsection{Command descriptions} + +Some commands do have a \expandablesymbol\ symbol printed next to their +names. This indicates that the command is expandable, \ie, it is usable in an +\cs*{edef} or \cs*{write} context and will expand according to its +description. All other commands are engine protected, \ie, in the sense of +\eTeX's \cs*{protected}. + +Some command name descriptions end with \code{\TF}. +\begin{commands} + \command*{SomeCommand\TF}[\meta{arguments}\marg{true}\marg{false}] + A command with maybe some arguments and ending with the two arguments + \meta{true} and \meta{false}. +\end{commands} +This means two things: the command is a conditional which tests something and +depending on the outcome of the test leaves either the \meta{true} argument +(\code{T}) or the \meta{false} argument (\code{F}) in the input stream. It +also means two additional commands exist: +\begin{commands} + \command*{SomeCommandT}[\meta{arguments}\marg{true}] + The same as \cs*{SomeCommandTF} but only with the \meta{true} argument and + no \meta{false} argument. + \command*{SomeCommandF}[\meta{arguments}\marg{false}] + The same as \cs*{SomeCommandTF} but only with the \meta{false} argument and + no \meta{true} argument. +\end{commands} + +\section{Exercises and Solutions} + +The two predefined environments for exercises and solutions are the following +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} + for details on exercise \acsp*{prop}. + \environment{solution}[\oarg{options}] + Input and typeset the solution to the exercise of the previous + \env{exercise} environment. See section~\vref{sec:printing-solutions} for + details on options of solutions. +\end{environments} + +\begin{example} + \begin{exercise} + A first example for an exercise. + \end{exercise} + \begin{solution} + A first example for a solution. + \end{solution} +\end{example} + +As can be seen in the example a solution is not printed with the default +setup. This can be changed using the following option. +\begin{options} + \keybool{print}\Module{solution}\Default{false} + Set if solutions are printed or not. +\end{options} + +The option (belonging to the module \module*{solution}) can either be set +locally as option to the \env{solution} environment +\begin{sourcecode} + \begin{solution}[print=true] + A first example for a solution. + \end{solution} +\end{sourcecode} +or with the setup command for all following solutions: +\begin{sourcecode} + \xsimsetup{ + solution/print = true + } +\end{sourcecode} + +There is an completely analoguous option for the \env{exercise} environment: +\begin{options} + \keybool{print}\Module{exercise}\Default{true} + Set if exercises are printed or not. +\end{options} +More details on those two environments can be found in +section~\vref{sec:using-printing}. + +\section{How the Exercise Environments Work}\label{sec:how-exerc-envir} +\sinceversion{0.13}Depending on the options +\option{no-files}/\option{use-files} the bodies of exercises and solutions is +either just another property (see section~\vref{sec:exercise-properties}) -- +this is the default behavior -- or is written to an external file. + +If the option \keyis{no-files}{true} is set the exercise and solution bodies +are saved as properties \property{exercise-body} and +\property{solution-body}. This is the default behavior of \xsim\ since +version~0.20 and should work fine in most cases. One obvious downsise is that +verbatim material cannot be used in exercises and solutions. + +If the option \keyis{use-files}{true} is set both the exercise and the +solution environments write the contents of their bodies verbatim to external +files following a certain naming structure: +\begin{itemize} + \item + \code{\meta{jobname}-\meta{type}-\meta{id}-exercise|solution-body.tex} +\end{itemize} +The name starts with the name of the job (which is the name of the document +itself) followed by type and id of the corresponding exercise and then +followed by the environment type. For example both environments from the first +example have been written to files named +\begin{itemize} + \item \verbcode+xsim-manual-exercise-1-exercise-body.tex+ and + \item \verbcode+xsim-manual-exercise-1-solution-body.tex+, respectively. +\end{itemize} +These external files are input when the respective exercise or solution is +printed. An advantage of using external files is that \emph{verbatim material + is allowed} inside the environments. Details on the \meta{type} of an +exercise will be given in section~\vref{sec:new-exercise-types}. \emph{The + \meta{id} of an exercise is a positive integer unique to each exercise + environment regardless if the exercise is being printed or used at all.} + +Each of those files contains some information about itself and where and why +it was generated\footnote{In this example the sourcecode line number is + misleading as the example where the file was generated itself was an + external file where the \env{exercise} environment indeed \emph{was} on + line~1.}: + +\inputsourcecode{exercises/xsim-manual-exercise-1-exercise-body.tex} + +Arguably one downside of the approach using external files for each exercise +and its solution is that your project folder will be cluttered with files. In +order to deal with this somehow \xsim\ offers the following option: +\begin{options} + \keyval{path}{path name}\Default + With this option a subfolder or path within the main project folder can be + given. Exercises will be written to and included from this path. + \emph{The path must exist on your system before you can use it!} This + document uses \keyis{path}{exercises}. + \keyval{file-extension}{string}\Default{\code{tex}} + \sinceversion{0.10}This option let's you choose the extension of the + external files. +\end{options} + +\begin{bewareofthedog} + Another thing to keep in mind: the environment in many ways works the same + way as the \env{filecontents} environment. \emph{This also means that you + \emph{cannot} have comments or \cs*{label}s or anything else on the first + line of the environments!} +\end{bewareofthedog} +\begin{sourcecode} + \begin{exercise}[points=2] % this comment will cause trouble + Lorem ipsum + \end{exercise} +\end{sourcecode} + +\begin{bewareofthedog} + \xsimauxfileinfo +\end{bewareofthedog} + +\begin{bewareofthedog} + 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}} +\end{sourcecode} + As you can see different entries of the various properties of exercises are + 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{||}} + Set\sinceversion{0.11} the string that is used to separate the property + entries in the auxiliary file. +\end{options} + +\section{New Exercise Types}\label{sec:new-exercise-types} + +It is easy to define new exercise environments together with a corresponding +solution environment using the following command: +\begin{commands} + \command{DeclareExerciseType}[\marg{type}\marg{parameters}] + Declare a new exercise type analoguous to the \env{exercise} and + \env{solution} environments. +\end{commands} +Declaring a new exercise type will also define a new command: +\begin{commands} + \command{numberof\meta{exercise-env}s} + These commands hold the absolut number of used exercises of type + \meta{type}. The meaning of \meta{exercise-env} will become clear below + when the exercise parameters are explained. It is always the same as the + exercise environment name. +\end{commands} +\begin{example} + There are \numberofexercises~exercises and \numberofproblems~problem in this + manual. +\end{example} +\xsim's pre-defined environment pair\changedversion{0.14} has been defined as +follows: +\begin{sourcecode} + \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* + } +\end{sourcecode} + +The above already is an example for almost all parameters that can (and often +must) be set. Here is the complete list: +\begin{parameters} + \paraval{exercise-env}{exercise environment name} + The name for the environment used for the exercises of type \meta{type}. + \emph{This parameter is mandatory.} It can't be changed afterwards. + \paraval{solution-env}{solution environment name} + The name for the environment used for the solutions of type \meta{type}. + \emph{This parameter is mandatory.} It can't be changed afterwards. + \paraval{exercise-name}{exercise name} + The name of the exercises of type \meta{type} -- used for typesetting. + \emph{This parameter is mandatory.} + \paraval{exercises-name}{exercises name} + The\sinceversion{0.12} plural name of the exercises of type \meta{type} -- + used for typesetting. If this is not set explicitly an \code{s} is + appended to the singular name. + \paraval{solution-name}{solution name} + The name of the solutions of type \meta{type} -- used for typesetting. + \emph{This parameter is mandatory.} + \paraval{solutions-name}{solutions name} + The\sinceversion{0.12} plural name of the solutions of type \meta{type} -- + used for typesetting. If this is not set explicitly an \code{s} is + appended to the singular name. + \paraval{exercise-template}{exercise template} + The template used for typesetting the exercises of type \meta{type}. + \emph{This parameter is mandatory.} See + section~\vref{sec:styl-exerc-templ} for details on templates. + \paraval{solution-template}{solution template} + The template used for typesetting the exercises of type \meta{type}. + \emph{This parameter is mandatory.} See + section~\vref{sec:styl-exerc-templ} for details on templates. + \paraval{counter}{counter name} + The counter used for the exercises of type \meta{type}. If not explicitly + set the counter with the same name as \parameter{exercise-env} is used. + Otherwise the specified counter is used. This enables to have different + types of exercises sharing a common counter. \emph{This parameter can't + be changed afterwards.} If the explicit or implicit counter does not + exist, yet, it will be defined. + \paraval{within}{counter name} + \sinceversion{0.20}Adds \parameter{counter} to the reset list of + \meta{counter name} by applying \cs*{counterwithin}. + \paraval{the-counter}{code} + \sinceversion{0.20}Redefines the corresponding representation command + \cs*{the...} of \parameter{counter} to \meta{code}. + \paraval{solution-counter}{counter name} + The counter used for the solutions of type \meta{type}. If not explicitly + set the counter with the same name as \parameter{solution-env} is used. + Otherwise the specified counter is used. This enables to have different + types of solutions sharing a common counter although this doesn't actually + make much sense. But it can be useful to avoid using an already existing + counter. \emph{This parameter can't be changed afterwards.} If the + explicit or implicit counter does not exist, yet, it will be defined. The + sole purpose of this counter is to be able to label solutions so they can + be \cs*{pageref}ed. + \paraval{number}{integer} + An internal parameter that is used to keep track of the number of + exercises of a type. This parameter cannot be set or changed by the + user. + \paraval{exercise-heading}{exercise heading command} + The\sinceversion{0.14} command used for typesetting of the heading of + exercises of type \meta{type} -- used for typesetting with the command + \cs{GetExerciseHeadingF}. + \paraval{solution-heading}{solution heading command} + The\sinceversion{0.14} command used for typesetting of the heading of + solutions of type \meta{type} -- used for typesetting with the command + \cs{GetExerciseHeadingF}. +\end{parameters} + +It is possible to change some of the parameters after an exercise type has +been defined. Those include \parameter{exercise-name}, +\parameter{solution-name}, \parameter{exercise-template}, and +\parameter{solution-template}. It is also possible to define new parameters. +\begin{commands} + \command{DeclareExerciseParameter}[\sarg\marg{parameter}] + Declares the new parameter \meta{parameter}. The optional star declares a + fixed parameter which cannot be changed once it is set. \emph{You + probably will never need this command. Most tasks can be solved using + properties (see section~\vref{sec:exercise-properties}) instead.} + \command{SetExerciseParameter}[\marg{type}\marg{parameter}\marg{value}] + Usable to set a single parameter to a new value. + \command{SetExerciseParameters}[\marg{type}\marg{parameters}] + Set several parameters at once. \meta{parameters} is a csv list of + key/value pairs. +\end{commands} +If you try to set an already set but fixed parameter like +\parameter{exercise-env} a warning will be written to the log file. For all +parameters that can be changed also options exist wich can be set via +\cs{xsimsetup}. They are explained in +section~\vref{sec:environment-options-hooks}. + +\begin{bewareofthedog} + All exercises of a type use the parameters + (\eg, \parameter{exercise-template}) that are \emph{currently active}. If + you want exercises with a different look or different names in the same + document you should use different exercises types. +\end{bewareofthedog} + +\section{Exercise Properties}\label{sec:exercise-properties} + +\subsection{Predefined Properties} + +Exercise like the \env{exercise} environment and possibly others defined with +\cs{DeclareExerciseType} have a number of predefined \acsp*{prop}: +\begin{properties} + \propval{id}{integer} + Holds the internal id of an exercise. \emph{Cannot be set by the user}. + \propval{ID}{text} + Holds the user id of an exercise if defined. Otherwise it is equal to + \property{id}. + \propval{counter}{text} + Holds the counter value representation of an exercise (\ie, what you + usually know as \cs*{the\meta{counter}}). \emph{Cannot be set by the + user}. + \propval{counter-value}{integer} + Holds the counter value of an exercise (\ie, what you usually know as + \cs*{the}\cs*{value}\marg{counter}). \emph{Cannot be set by the user}. + \propval{subtitle}{text} + Holds the subtitle of an exercise. + \propval{points}{number} + Holds the reachable points of an exercise. + \propval{bonus-points}{number} + Holds the reachable bonus-points of an exercise. + \propbool{print} + Holds the print boolean of an exercise. + \propbool{print\bang} + Holds a special print boolean of an exercise, see + page~\pageref{property:print!}. + \propbool{use} + Holds the usage boolean of an exercise. + \propbool{use\bang} + Holds a special usage boolean of an exercise, see + page~\pageref{property:print!}. + \propbool{used} + 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}). + \propval{page-value}{integer} + 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}). + \propval{section-value}{integer} + 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.} + \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.} + \propval{sectioning}{section numbers} + Holds five brace groups which in turn hold the section numbers (integers) + of the exercise in the order + \marg{chapter}\marg{section}\marg{subsection}\marg{subsubsection}\marg{paragraph}. + \propval{exercise-body}{\TeX code} + When\sinceversion{0.13} the package option \option{no-files} is set this + property is defined and holds the environment body of an exercise. + \propval{solution-body}{\TeX code} + When\sinceversion{0.13} the package option \option{no-files} is set this + property is defined and holds the environment body of the corresponding + solution. +\end{properties} + +Some of these \acsp*{prop} are fixed and cannot be set by the user. Those +include \property{id}, \property{counter}, and \property{counter-value}. The +others can be set using the optional argument of the exercise environment. + +\begin{example} + \begin{exercise}[subtitle={This is a subtitle},points=4,bonus-points=1] + An exercise where some properties have been set. + \end{exercise} +\end{example} + +\subsection{Declaring Own Properties} + +\xsim\ offers the possibility to declare additional exercise properties: +\begin{commands} + \command{DeclareExerciseProperty}[\barg\sarg\narg\marg{property}] + Declares the property \meta{property}. + + If used with the optional \barg\ a \textbf{unique property} is defined + which means that each exercise must have a property value distinct from + all other exercises (all means all -- \emph{independent from the exercise + type}). + + If used with the optional \sarg\ a \textbf{boolean property} is defined + which means that it only should get the values \code{true} or \code{false} + and if used without value it gets the value \code{true} instead of an + empty value. If any other value is used the property is set to + \code{false}. A boolean property obviously cannot be unique. The + optional \sarg\ takes precedence over the optional \barg, \ie, if both are + present the property is boolean \emph{but not} unique. + + If used with the optional \narg\ a property is defined which won't get + updated through subsequent compilation runs but is only set when the + exercise is used. + \command{DeclareExercisePropertyAlias}[\marg{property 1}\marg{property 2}] + Declares \meta{property 1} to be an alias of \meta{property 2}. This + means that each time \meta{property 2} is set \meta{property 1} will be + set to the same value \emph{unless} it has been set already. As an + example: property \property{ID} is an alias of property \property{id}. +\end{commands} + +This is better demonstrated with an example: +\begin{example} + \begin{exercise} + \verb+\GetExerciseProperty{id}+: \GetExerciseProperty{id} \par + \verb+\GetExerciseAliasProperty{ID}+: \GetExerciseAliasProperty{ID} \par + \verb+\GetExerciseProperty{ID}+: \GetExerciseProperty{ID} + \end{exercise} + \begin{exercise}[ID=foo-bar] + \verb+\GetExerciseProperty{id}+: \GetExerciseProperty{id} \par + \verb+\GetExerciseAliasProperty{ID}+: \GetExerciseAliasProperty{ID} \par + \verb+\GetExerciseProperty{ID}+: \GetExerciseProperty{ID} + \end{exercise} +\end{example} + +The power of properties will get more clear when reading +section~\vref{sec:styl-exerc-templ} about templates. + +\subsection[Exercise Goals]{A Special Kind of Property: Exercise Goals}\label{sec:goals} + +Exercise goals are a generic concept in \xsim\ for exercise properties like +\property{points} or \property{bonus-points}. Those are properties which can +(only) get a decimal number as value the sum of which is calculated and +available (after a compilation) throughout the document. +\begin{commands} + \command{DeclareExerciseGoal}[\marg{goal}] + Declare a new exercise goal named \meta{goal} and also a property called + \meta{goal}. + \command{TotalExerciseTypeGoal}[\marg{type}\marg{goal}\marg{singular}\marg{plural}] + Get the sum of goal \meta{goal} for all exercises of type \meta{type}. + \meta{singular} and \meta{plural} are placed after the sum in the input + stream depending on whether the sum equals~$1$ or not. + \command{TotalExerciseTypeGoals}[\marg{type}\marg{list of + goals}\marg{singular}\marg{plural}] + Get the sum of goal all goals in \meta{list of goals} for all exercises of + type \meta{type}. The goal names in \meta{list of goals} must be + separated with \code{+}. \meta{singular} and \meta{plural} are placed + after the sum in the input stream depending on whether the sum equals~$1$ + or not. + \command{TotalExerciseGoal}[\marg{goal}\marg{singular}\marg{plural}] + Get the sum of goal \meta{goal} for all exercises. \meta{singular} and + \meta{plural} are placed after the sum in the input stream depending on + whether the sum equals~$1$ or not. + \command{TotalExerciseGoals}[\marg{list of + goals}\marg{singular}\marg{plural}] + Get the sum of goal all goals in \meta{list of goals} for all exercises. + The goal names in \meta{list of goals} must be separated with + \code{+}. \meta{singular} and \meta{plural} are placed after the sum in + the input stream depending on whether the sum equals~$1$ or not. + \command{AddtoExerciseTypeGoal}[\marg{type}\marg{goal}\marg{value}] + Adds \meta{value} to the goal \meta{goal} of exercise type \meta{type}. + \command{AddtoExerciseTypeGoalPrint}[\marg{type}\marg{goal}\marg{value}% + \marg{singular}\marg{plural}] + Adds \meta{value} to the goal \meta{goal} of exercise type \meta{type}. + The value and -- depending on wether the value equals $1$ or not -- + \meta{singular} or \meta{plural} are left in the input stream. + \command{AddtoExerciseGoal}[\marg{goal}\marg{value}] + Adds \meta{value} to the goal \meta{goal} of the current exercise + type. (To be used within exercises.) + \command{AddtoExerciseTypeGoalPrint}[\marg{goal}\marg{value}% + \marg{singular}\marg{plural}] + Adds \meta{value} to the goal \meta{goal} of the current exercise type. + The value and -- depending on wether the value equals $1$ or not -- + \meta{singular} or \meta{plural} are left in the input stream. (To be used + within exercises.) + \command{ExerciseGoalValuePrint}[\marg{value}\marg{singular}\marg{plural}] + Print \meta{value} and -- depending on wether the value equals $1$ or not -- + \meta{singular} or \meta{plural}. + \command{printgoal}[\marg{value}] + Print \meta{value} according to option \option{goal-print}. Defined in + terms of \cs{ExerciseGoalValuePrint}. + \command{printpoints}[\marg{type}] + Print the sum of points for all exercises of type \meta{type} followed by + an appropriate translation of the words \enquote{point} or + \enquote{points}, respectively\footnote{See section~\vref{sec:exerc-transl} + for details on the definition and usage of language dependent words.}. + Defined in terms of \cs{TotalExerciseTypeGoal}. + \command{printtotalpoints} + Print the sum of points for all exercises followed by an appropriate + translation of the words \enquote{point} or \enquote{points}, + respectively. Defined in terms of \cs{TotalExerciseGoal}. + \command{addpoints}[\sarg\marg{value}] + Adds \meta{value} to the points of the current exercise type. (To be used + within exercises.) Prints the value followed by an appropriate + translation of the words \enquote{point} or \enquote{points}, + respectively. The starred version prints nothing. Defined in terms of + \cs{AddtoExerciseGoal} and \cs{AddtoExerciseGoalPrint}. + \command{points}[\marg{value}] + Print \meta{value} followed by an appropriate translation of the words + \enquote{point} or \enquote{points}, respectively. Defined in terms of + \cs{ExerciseGoalValuePrint}. + \command{printbonus}[\marg{type}] + Print the sum of bonus points for all exercises of type \meta{type} + followed by an appropriate translation of the words \enquote{point} or + \enquote{points}, respectively. Defined in terms of + \cs{TotalExerciseTypeGoal}. + \command{printtotalbonus} + Print the sum of bonus points for all exercises followed by an appropriate + translation of the words \enquote{point} or \enquote{points}, + respectively. Defined in terms of \cs{TotalExerciseGoal}. + \command{addbonus}[\sarg\marg{value}] + Adds \meta{value} to the bonus points of the current exercise type. (To be + used within exercises.) Prints the value followed by an appropriate + translation of the words \enquote{point} or \enquote{points}, + respectively. The starred version prints nothing. Defined in terms of + \cs{AddtoExerciseGoal} and \cs{AddtoExerciseGoalPrint}. +\end{commands} + +The two existing goals are defined with +\begin{sourcecode} + \DeclareExerciseGoal{points} + \DeclareExerciseGoal{bonus-points} +\end{sourcecode} + +When goal values are printed the decimal number is fed to a function which can +be changed using the following option: +\begin{options} + \keyval{goal-print}{code}\Default{\#1} + How to format goal values. Use \code{\#1} to refer to the actual number. +\end{options} + +At last some examples for a custom command: let's say you want a command which +prints the complete sum for all exercises of all exercise types of both +\property{points} \emph{and} \property{bonus-points} added up: +\begin{sourcecode} + \NewDocumentCommand\printsumofpointsandbonus{}{% + \TotalExerciseGoals{points+bonus-points} + {\,\XSIMtranslate{point}} + {\,\XSIMtranslate{points}}% + } +\end{sourcecode} +Here is how you could mimick the command \cs*{totalpoints} from +\pkg{exsheets}: +\begin{sourcecode} + \NewDocumentCommand\pointsandbonus{}{% + \TotalExerciseGoal{points}{}{}% + \IfExerciseGoalsSumF{bonus-points}{=0} + {\,(+\,\TotalExerciseGoal{bonus-points}{}{})}% + \,\XSIMtranslate{points}% + } +\end{sourcecode} + + +\subsection[Exercise Tags]{A Special Kind of Property: Exercise Tags}\label{sec:tags} + +Exercise tags are a generic concept in \xsim\ for exercise properties like +\property{tags} or \property{topics}. Those are properties which can (only) +get a csv list of strings as value. Those strings can be used to selectively +use exercises. See section~\vref{sec:using-printing} for details on +\emph{usage} of exercises and the difference to \emph{printing} an exercise +and how to use exercise tags for selection. +\begin{commands} + \command{DeclareExerciseTagging}[\marg{tag}] + This defines an exercise tagging group named \meta{tag}. It also defines a + property named \meta{tag}. In addition two options are defined: an option + named \code{\meta{tag}} which can be used for selection and an boolean + option \code{\meta{tag}/ignore-untagged}. + \command{ProvideExerciseTagging}[\marg{tag}] + The\sinceversion{0.11} same as \cs{DeclareExerciseTagging} but does + nothing when \meta{tag} already exists. +\end{commands} +The two existing tagging groups have been defined and preset with the +following code: +\begin{sourcecode} + \DeclareExerciseTagging{tags} + \DeclareExerciseTagging{topics} + \xsimsetup{tags/ignore-untagged=false} +\end{sourcecode} +This means that these options are available: +\begin{options} + \keyval{tags}{csv list of tags} + Choose the set of tags whose associated exercises should be printed. + \keyval{topics}{csv list of topics} + Choose the set of topics whose associated exercises should be printed. + \keybool{ignore-untagged}\Module{tags}\Default{false} + If set to true exercises with no tags will be printed even if tags have + been chosen with the option \option{tags}. + \keybool{ignore-untagged}\Module{topics}\Default{true} + If set to true exercises with no topics will be printed even if topics + have been chosen with the option \option{topics}. +\end{options} + +It may happen that you choose certain tags for printing and want one or two +exercises to be printed or used even if they don't match the tagging +criteria. For this reason two additional properties exist which can be set to +an exercise:\label{property:print!} +\begin{properties} + \propbool{print\bang} + If set to true the exercise will be printed (and thus used) regardless of + other conditions. + \propbool{use\bang} + If set to true the exercise will be used regardless of other conditions. +\end{properties} + +\section{Using and Printing an Exercise}\label{sec:using-printing} +\subsection{What the Environments do} + +When an exercise is started with \environ{exercise} (or other environments +defined through \cs{DeclareExerciseType}) then three things happen depending +on the setup: +\begin{enumerate} + \item where the environment is placed in the document the \textbf{base + setup} happens: this sets the \property{id} of the exercise and sets the + properties chosen in the optional argument. + \item in the default setting also the \textbf{usage setup} happens: this + increments the counter and sets the counter related properties like + \property{counter}. Also the properties related to section numbers and the + \property{page} are set. + \item in the default setting also the \textbf{print setup} happens: this + mostly does nothing. It initiates recording goals that are set inside of + the exercise body. +\end{enumerate} + +Depending on wether the option \module{exercise}\code{/}\option{use} has been +set to \code{false} or wether the property \property{use} has been set to +\code{false} the \emph{usage setup} can be delayed. The usage the happens +when the exercise is \emph{inserted} the first time elsewhere in the document, +for example as part of a collection, see +section~\vref{sec:collecting-exercises}. + +Depending on wether the option \module{exercise}\code{/}\option{print} has +been set to \code{false} or if the property \property{print} has been set to +\code{false} the \emph{print setup} can be suppressed. It happens each time +an exercise is inserted. + +\begin{example} + \begin{exercise}[print=false,ID=invisible] + This exercise will not be printed but the exercise counter will be + incremented nonetheless. Its solution will be printed in the list of + solutions. + \end{exercise} + \begin{solution} + The solution of the exercise that has not been printed. + \end{solution} +\end{example} + +The schematic structure of an exercise is shown in +figure~\vref{fig:schematic-structure}. + +\begin{figure} + \centering + \begin{tikzpicture} + \node[draw,minimum width=.7\linewidth] at (0,0) {pre hook}; + \node[draw,minimum width=.7\linewidth] at (0,-1) {begin template code}; + \node[draw,minimum width=.7\linewidth] at (0,-2) {begin hook}; + \node[draw,minimum width=.7\linewidth] at (0,-3) {environment body}; + \node[draw,minimum width=.7\linewidth] at (0,-4) {end hook}; + \node[draw,minimum width=.7\linewidth] at (0,-5) {end template code}; + \node[draw,minimum width=.7\linewidth] at (0,-6) {post hook}; + \end{tikzpicture} + \caption{Schematic structure of an exercise or solution.}\label{fig:schematic-structure} +\end{figure} + +\subsection{Environment Options \& Hooks}\label{sec:environment-options-hooks} + +For each exercise type there are the following options for both environments, +the environments' names are the module names for the options (here using the +\enquote{exercise} type): +\begin{options} + \keybool{print}\Module{exercise}\Default{true} + Determines if exercises of type \enquote{exercise} are printed. + \keybool{use}\Module{exercise}\Default{true} + Determines if exercises of type \enquote{exercise} are used. + \keybool{collect}\Module{exercise}\Default{false} + \sinceversion{0.20}Sets both \option{print} and \option{use} to + \code{false} when \keyis{collect}{true} is set and vice versa. + \keyval{within}{counter}\Module{exercise}\Default + \changedversion{0.20}Adds the exercise counter to the reset list of the + counter \meta{counter} using \cs*{counterwithin}. \emph{Beware that if + the counter is a shared counter this will affect \emph{all objects} + using this counter!} + \keyval{the-counter}{code}\Module{exercise} + An interface for redefining the counter representation command + \cs*{the\meta{counter}}. + \keyval{template}{template}\Module{exercise} + An interface for \cs{SetExerciseParameter}\Marg{exercise}% + \Marg{exercise-template}\marg{template}. + \keyval{template}{template}\Module{solution} + An interface for \cs{SetExerciseParameter}\Marg{exercise}% + \Marg{solution-template}\marg{template}. + \keyval{name}{name}\Module{exercise} + An interface for \cs{SetExerciseParameter}\Marg{exercise}% + \Marg{exercise-name}\marg{name}. + \keyval{name}{name}\Module{solution} + An interface for \cs{SetExerciseParameter}\Marg{exercise}% + \Marg{solution-name}\marg{name}. + \keyval{heading}{heading command}\Module{exercise} + An\sinceversion{0.14} interface for \cs{SetExerciseParameter}% + \Marg{exercise}\Marg{exercise-heading}\marg{heading command}. + \keyval{heading}{heading command}\Module{solution} + An\sinceversion{0.14} interface for \cs{SetExerciseParameter}% + \Marg{exercise}\Marg{solution-heading}\marg{heading command}. + \keyval{pre-hook}{code}\Module{exercise}\Default + The code for the \emph{pre exercise hook} for exercises of the type + \enquote{exercise}. + \keyval{begin-hook}{code}\Module{exercise}\Default + The code for the \emph{begin exercise hook} for exercises of the type + \enquote{exercise}. + \keyval{end-hook}{code}\Module{exercise}\Default + The code for the \emph{end exercise hook} for exercises of the type + \enquote{exercise}. + \keyval{post-hook}{code}\Module{exercise}\Default + The code for the \emph{post exercise hook} for exercises of the type + \enquote{exercise}. + \keybool{print}\Module{solution}\Default{false} + Determines if solutions of type \enquote{exercise} are printed. + \keyval{pre-hook}{code}\Module{solution}\Default + The code for the \emph{pre solution hook} for solutions of the type + \enquote{exercise}. + \keyval{begin-hook}{code}\Module{solution}\Default + The code for the \emph{begin solution hook} for solutions of the type + \enquote{exercise}. + \keyval{end-hook}{code}\Module{solution}\Default + The code for the \emph{end solution hook} for solutions of the type + \enquote{exercise}. + \keyval{post-hook}{code}\Module{solution}\Default + The code for the \emph{post solution hook} for solutions of the type + \enquote{exercise}. + % TODO +\end{options} + +\subsection{(Re-) Inserting a Certain Exercise} +If you know type and \property{id} of an exercise you can (re-)insert every +existing exercise, \ie, every exercise whose external file exists. +\begin{commands} + \command{printexercise}[\marg{type}\marg{csv of ids}] + \changedversion{0.17}Inserts the exercise or exercises of type + \meta{type} with the \property{id}s or \property{ID}s given in \meta{csv + of ids}. + \command{xprintexercise}[\marg{type}\marg{csv of ids}] + \sincechanged{0.16}{0.17}The same as \cs{printexercise} but expands + \meta{type} and the items of \meta{csv of ids} before it uses them. +\end{commands} +\begin{example} + \printexercise{exercise}{invisible} +\end{example} + +\section{Collecting Exercises}\label{sec:collecting-exercises} + +\begin{bewareofthedog} + The whole collection mechanism has been changed completely with + version~0.20. Please check this section carefully and update and adapt your + collections. +\end{bewareofthedog} + +\subsection{Background} +\xsim\ knows the concept of \emph{exercise collections}. A collection of +exercises can be used in two cases, basically: +\begin{enumerate} + \item When you want to print a certain group of exercises several times. In + this case you add the exercise to a collection while also using it in the + running text. Somewhere later (or earlier actually) in the document you + can the reprint the collection\footnote{There is another way to do that, + but\dots}. + \item If you only want to print exercises which have certain tags. Maybe + you have some kind of exercise library in an external which you include + into you document and want to print only those exercises which fit + certain conditions. +\end{enumerate} +Each collection must have a unique name with which you can refer to the +corresponding collection. A collection is realized by declaring the +collection in the preamble and by activating the collection. + +\subsection{Usage} +\subsubsection{Declaring collections} +\emph{A collection must be declared in the preamble.} Using a pair of +commands explained below exercises between those commands are added to the +corresponding collection but not printed. After a collection is completed the +collection can be printed as often as needed. +\begin{commands} + \command{DeclareExerciseCollection}[\oarg{tag values}\marg{collection name}] + Define a new collection \meta{collection name} in the document preamble. + An example could look like this: + \cs{DeclareExerciseCollection}\Oarg{topics=algebra,level=1}\Marg{easy-algebra}. + Choosing tags automatically activates the collection which means that all + exercises which fit the tags are automatically added to the new + collection. +\end{commands} + +\subsubsection{Activating collections} +If a collection is not activated per default in can be activated (or +deactivated in the opposite case) with these commands: +\begin{commands} + \command{activatecollection}[\marg{collection name}] + \sinceversion{0.20}Activates the collection \meta{collection name} which + now collects all exercises until the collection is + deactivated. \meta{collection name} can be a csv list of collection + names. + \command{deactivatecollection}[\marg{collection name}] + \sinceversion{0.20}Deactivates the collection \meta{collection name}. + \meta{collection name} can be a csv list of collection names. +\end{commands} +These commands do not influence exercises in other ways other than adding them +to collections. +\begin{commands} + \command{collectexercises}[\marg{collection name}] + Activates the collection \meta{collection name} which now collects all + exercises until the collection is deactivated, starts a group with + \cs*{begingroup} and sets the option \option{collect}, see below. + \command{collectexercisesstop}[\marg{collection name}] + Deactivates the collection \meta{collection name} and ends a group with + \cs*{endgroup}. +\end{commands} +\begin{options} + \keybool{collect}\Default{false} + A shortcut option which sets the options + \module{\meta{type}}\code{/}\module{collect} for each exercise type. +\end{options} + +\subsubsection{Printing collections} +\begin{commands} + \command{printcollection}[\oarg{options}\marg{collection name}] + Prints the collection \meta{collection name}, \ie, all exercises collected + earlier. This command cannot be used before the corresponding collection + has been closed correctly. +\end{commands} +Valid options are the following: +\begin{options} + \keybool{headings}\Module{print-collection}\Default{false} + If true a heading for each exercise type is inserted. + \keyval{headings-template}{template}\Module{print-collection}\Default{collection} + The heading template used when \keyis{headings}{true}. + \keychoice{print}{exercises,solutions,both}\Module{print-collection}\Default{exercises} + Determines wether \cs{printcollection} prints the exercises or the + solutions of the collection. When you choose \code{both} exercises and + solutions are printed alternately. +\end{options} + +Those options can also be set via \cs{xsimsetup} using the module +\module{print-collection}. + +\begin{bewareofthedog} + Please be aware that exercises are not used or printed while they are + collected. Nonetheless the property \property{use} is set to \code{true} + (so that solutions can be printed even if the exercises are not) and the + property \property{print} is set to \code{false}. Also their counters are + \emph{not stepped} during the process. This only happens when they are + printed the first time, \cf~the \property{used} property. At that time + also the properties \property{page}, \property{section} and + \property{chapter} are set and the property \property{print} is set to + \code{true}. +\end{bewareofthedog} + +The usage should be clear: +\begin{example} + \collectexercises{foo} + \begin{exercise} + This exercise is added to the collection `foo'. + \end{exercise} + \begin{exercise} + This exercise is also added to the collection `foo'. + \end{exercise} + \begin{exercise} + So is this. + \end{exercise} + \begin{exercise} + As well as this one. + \end{exercise} + \collectexercisesstop{foo} +\end{example} +Once the collection is closed it can be printed: +\begin{example} + \printcollection{foo} +\end{example} + +You can open several collections at the same time: +\begin{sourcecode} + \collectexercises{foo} + ... + \activatecollection{bar} + ... + \deactivatecollection{foo} + ... + \collectexercisesstop{bar} +\end{sourcecode} +Exercises will be added to each open collection. + +There is one generic collection called \enquote{\code{all exercises}}. As the +name already suggests it will hold all exercises. So if you say +\begin{sourcecode} + \printcollection{all exercises} +\end{sourcecode} +all exercises will be printed. + +\begin{bewareofthedog} + If you use \cs*{label}s inside of exercises and you print exercises more + than once in your document (by reusing a collection for example) you will + get +\begin{sourcecode} + LaTeX Warning: There were multiply-defined labels. +\end{sourcecode} + Equally if you have environments like \environ{equation} which step a + counter inside an exercise or solution the counter will be stepped each time + the exercise is used. +\end{bewareofthedog} + +At last now an example using external files, collections and tags: +\begin{sourcecode} + % preamble: + % \DeclareExerciseCollection{foo-easy} + % \DeclareExerciseCollection{foo-medium} + % \DeclareExerciseTagging{difficulty} + + % document: + \collectexercises{foo-easy} + \xsimsetup{difficulty=easy} + \input{foo.tex} + \collectexercisesstop{foo-easy} + % collection `foo-easy' now contains all exercises of file `foo.tex' tagged + % with `difficulty=easy' + + \collectexercises{foo-medium} + \xsimsetup{difficulty=medium} + \input{foo.tex} + \collectexercisesstop{foo-medium} + % collection `foo-medium' now contains all exercises of file `foo.tex' + % tagged with `difficulty=medium' +\end{sourcecode} + +\begin{bewareofthedog} + The recommended usage is similar to the last example. Actually a collection + can be printed \emph{before} it is opened, too. (This needs \emph{at least} + two compilations, though.) However, it is safer printing a collection only + once and only \emph{after it has been collected}. No guaranties are given + that properties are set correctly if you use the collection before. You + usually also will make sure that the exercises in a collection are unique, + \ie, that an exercise is not part of several collections -- at least not if + both collections are printed in the same document. +\end{bewareofthedog} + +\section{Printing Random Exercises From a Collection} +\xsim\ provides the possibility of selecting random exercises from a +collection (\cf~section~\vref{sec:collecting-exercises}). +\begin{bewareofthedog} + Please be aware that this feature is \emph{not} available in \XeLaTeX! +\end{bewareofthedog} +\begin{commands} + \command{printrandomexercises}[\oarg{options}\marg{number}] + This command prints \meta{number} random exercises from the collection + chosen with option \option{collection}, see below. When this command is + used it generates a random list of integers which is written to the + \code{aux} file. On the subsequent compilations the according exercises + are printed. \emph{If you want to regenerate the random list you have to + delete the \code{aux} file before compiling.} +\end{commands} +Valid options for this command are: +\begin{options} + \keybool{sort}\Module{random}\Default{true} + Determines wether the random chosen exercises should be sorted according + to their order of definition in the collection or not. + \keyval{collection}{collection}\Module{random}\Default{all exercises} + The collection from which the exercises are to be chosen from. + \keyval{exclude}{csv list of ids}\Module{random} + A list of \property{id}s or \property{ID}s of exercises \emph{not} to be + chosen. + \keychoice{print}{exercises,solutions,both}\Module{random}\Default{exercises} + Determines wether \cs{printrandomexercises} prints the exercises or the + solutions. When you choose \code{both} exercises and solutions are + printed alternately. +\end{options} + +\begin{example} + \printrandomexercises[collection=foo]{2} +\end{example} + +The example above of course doesn't make much sense but if you have a +collection which collects exercises from an external file and the exercises +haven't been printed in the document before then you will get a list of +subsequently numbered exercises. + +\section{Printing Solutions}\label{sec:printing-solutions} + +There are different commands for printing the solutions to exercises: +\begin{commands} + \command{printsolutionstype}[\sarg\oarg{options}\marg{exercise type}] + Prints the solutions of all used exercises of type \meta{exercise type}. + The starred version only prints the solutions of all printed exercises of + type \meta{exercise type}. + \command{printsolutions}[\sarg\oarg{options}] + Prints the solutions of all used exercises of all types ordered by type. + The starred version only prints the solutions of all printed exercises of + all types. + \command{printallsolutions}[\sarg\oarg{options}] + Prints the solutions of all used exercises of all types ordered by + appearance in the document. The starred version only prints the solutions + of all printed exercises of all types. + \command{printsolution}[\oarg{options}\marg{type}\marg{id}] + Prints the solution of the exercise of type \meta{type} with the + \property{id} \meta{id}. + \command{xprintsolution}[\marg{type}\marg{id}] + \sinceversion{0.16}The same as \cs{printsolution} but expands \meta{type} + and \meta{id} before it uses them. +\end{commands} + +\begin{example} + \printsolutionstype{exercise} +\end{example} + +The options can be divided into two groups. The ones in the first group +modify the layout. +\begin{options} + \keybool{headings}\Module{print-solutions}\Default{true} + If true a heading for each exercise type is inserted. + \keyval{headings-template}{template}\Module{print-solutions}\Default{default} + The heading template used when \keyis{headings}{true}. +\end{options} + +The ones in the second group set conditions selecting which solutions are +printed. If you combine those conditions a solution is printed if it meets +either of the conditions. +\begin{options} + \keychoice{section}{\default{true},false,\meta{integer}}\Module{print-solutions}% + \Default{false} + If you set \keyis{section}{true} only solutions of exercises of the + current section are printed. If you set \keyis{section}{4} only solutions + of exercises in a section with number~$4$ are printed. + \keychoice{chapter}{\default{true},false,\meta{integer}}\Module{print-solutions}% + \Default{false} + If you set \keyis{chapter}{true} only solutions of exercises of the + current chapter are printed. If you set \keyis{chapter}{4} only solutions + of exercises in a chapter with number~$4$ are printed. + \keychoice{collection}{false,\meta{collection name}}\Module{print-solutions}% + \Default{false} + If used only solutions of exercises belonging to collection + \meta{collection name} are printed. +\end{options} + +The conditions can be combined. The following call will only print solutions +from exercises in section~3 of chapter~2: +\begin{sourcecode} + \printsolutions[chapter=2,section=3] +\end{sourcecode} + +\begin{bewareofthedog} + The selection per section or per chapter relies on the \emph{counter + numbers} of the sections or chapters, respectively. This means if section + numbers are reset (\eg\ by \cs*{chapter} or \cs*{appendix}) and you have + exercises from \emph{different} sections with \emph{the same section number} + the solutions of \emph{all those exercises} will be printed. This means you + only should use the \option{section} selection when section are the top + document level headings (apart from parts) and you have no exercises in the + appendix. Similar considerations are valid for the \option{chapter} + selection. +\end{bewareofthedog} + +All options can also be set via \cs{xsimsetup} using the module +\module{print-solutions}. + +\begin{example} + \printsolutions[section=4,headings-template=per-section] +\end{example} + +\begin{example} + \printsolution{exercise}{5} +\end{example} + +\section{Grading Tables}\label{sec:grading-tables} +When you create exercises it may not only be desirable to be able to add +points and bonus-points to a question (see section~\vref{sec:goals} about +exercise goals) but also to be able to output a grading table. \xsim\ has +built-in means for this. +\begin{commands} + \command{gradingtable}[\oarg{options}] + Print a grading table. +\end{commands} +Valid options for this command are +\begin{options} + \keyval{template}{template}\Default{default} + Choose the template used for the grading table. + \keyval{type}{exercise type}\Default + Choose the exercise type for which the table is printed. +\end{options} +Both option defaults can be changed with \cs{xsimsetup} setting the options +using \module{grading-table}: +\begin{sourcecode} + \xsimsetup{ + grading-table/template = default* + } +\end{sourcecode} + +An example: +\begin{example} + \gradingtable[type=exercise] +\end{example} + +Or using the \enquote{\code{default*}} template: +\begin{example} + \gradingtable[template=default*,type=exercise] +\end{example} + +Available templates and how to define new ones are explained in +sections~\vref{sec:grad-table-templ} and~\vref{sec:template-examples}. \xsim\ +per default provides two templates \enquote{\code{default}} and +\enquote{\code{default*}}, the first one has a vertical layout, the second a +horizontal layout. Both templates can be used per type like in the examples +above or for all types at once by leaving the specification \option{type} +away: +\begin{example} + \gradingtable +\end{example} + +\section{Styling the Exercises -- Templates}\label{sec:styl-exerc-templ} + +\subsection{Background} +Whenever \xsim\ outputs something to be typeset it uses so-called templates +for the task. \xsim\ knows of three different kinds of templates: +\begin{itemize} + \item environment templates (see section~\vref{sec:envir-templ}), + \item heading templates (see section~\vref{sec:heading-templates}) and + \item grading table templates (see section~\vref{sec:grad-table-templ}) +\end{itemize} + +The most important one for the styling of the exercises are the environment +templates. Those templates give you complete control over the look and +arrangement of an exercise. To be able to do this \xsim\ provides a large +number of commands which can be used only inside template +definitions\footnote{The last sentence is wrong: those commands can be used + anywhere but most of them only give useful results inside of templates.}. +Those commands are explained in the next section. Their usage will hopefully +become clear in the examples in section~\vref{sec:template-examples}. Having +full control over the layout comes at a price: you need to be able to program +yourself in order to achieve certain layouts\footnote{I plan to incorporate + the most common layouts -- and maybe some fancy ones, too -- in the examples + section~\vref{sec:template-examples} but at the time of writing this is still + up in the air.}. + +\subsection{Templates Provided by the Package} +\xsim\ comes with a few predefined layouts: +\begin{description} + \item[\code{default}] The template activated per default and the only one + available without further action. + \item[\code{runin}] A layout rather similar to the one by package + \pkg{exsheets}, see section~\vref{sec:runin-template}. Available through + the style file \code{layouts} (see section~\vref{sec:style-files} for more + information on style files\index{style file}). + \item[\code{margin}] A layout rather similar to the one by package + \pkg{exsheets}, see section~\ref{sec:margin-template}. Available through + the style file \code{layouts}. + \item[\code{minimal}] A\sinceversion{0.13} minimalistic layout, see + section~\ref{sec:minimal-template}. As the others inspired by an + \pkg{exsheets} layout. Available through the style file \code{layouts}. + \item[\code{inline}] A\sinceversion{0.18} minimalistic layout, the same as + \code{minimal} but doesn't add \cs*{par} at the beginning and end. + Available through the style file \code{layouts}. + \item[\code{centered}] A\sinceversion{0.18} layout with a centered heading. + Available through the style file \code{layouts}. +\end{description} + +\collectexercises{layouts} +\begin{exercise}[subtitle=The Subtitle,points=2.5,ID=showlayout] + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, + vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum + gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, + magna. Donec vehicula augue eu neque. Pellentesque habitant morbi tristique + senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras + viverra metus rhoncus sem. +\end{exercise} +\collectexercisesstop{layouts} + +\listlayouts + +\subsection{Commands for Usage in Template Definitions} +\subsubsection{Goals} +\begin{commands} + \command{IfExerciseGoal\TF}[\marg{goal}\marg{relation and + value}\marg{true}\marg{false}] + Checks the sum of goal \meta{goal} against \meta{relation and value}. + \command{IfExerciseGoalSingular\TF}[\marg{goal}\marg{true}\marg{false}] + Checks if the value of the goal \meta{goal} of the current exercise + equals~$1$. This is the same as \\ + \cs{IfExerciseGoalTF}\marg{goal}\Marg{=1}\marg{true}\marg{false}. + \command{IfExerciseTypeGoalsSum\TF}[\marg{type}\marg{list of + goals}\marg{relation and value}\marg{true}\marg{false}] + Ckecks the sum of all goals in \meta{list of goals} for the exercises of + type \meta{type} against \meta{relation and value}. + \command{IfExerciseGoalsSum\TF}[\marg{type}\marg{list of + goals}\marg{relation and value}\marg{true}\marg{false}] + Ckecks the sum of all goals in \meta{list of goals} for all exercises of + all types against \meta{relation and value}. + \command{TotalExerciseTypeGoal}[\marg{goal}\marg{type}\marg{singular}\marg{plural}] + Print the sum of goal \meta{goal} for the exercises of type \meta{type} + and append \meta{singular} or \meta{plural} depending on wether the sum + equals~$1$ or not. + \command{TotalExerciseGoal}[\marg{goal}\marg{singular}\marg{plural}] + Print the sum of goal \meta{goal} for all exercises of all types + and append \meta{singular} or \meta{plural} depending on wether the sum + equals~$1$ or not. +\end{commands} + +\subsubsection{Properties} +\begin{commands} + \expandable\command{IfExercisePropertyExist\TF}[\marg{property}\marg{true}% + \marg{false}] + Tests wether an exercise property with the name \meta{property} is defined. + \command{IfExercisePropertySet\TF}[\marg{property}\marg{true}\marg{false}] + Tests wether the exercise property \meta{property} has been set for the + current exercise. + \expandable\command{GetExerciseProperty}[\marg{property}] + Retrieves the value of the property \meta{property} for the current + exercise. + \command{GetExerciseProperty\TF}[\marg{property}\marg{true}\marg{false}] + Tests wether the exercise property \meta{property} has been set for the + current exercise. Inside the \meta{true} branch you can refer to the + retrieved value either with \code{\#1} or with \cs{PropertyValue}. + \emph{This command expands its contents inside a group.} + \command{GetExerciseBody}[\Marg{exercise\textnormal{|}solution}] + \sinceversion{0.10}Retrieves the environment body of either the + \code{exercise} or the corresponding \code{solution} of the current + exercise. + \expandable\command{GetExerciseIdForProperty}[\marg{property}\marg{value}] + Retrieves the property \property{id} of the exercise where the property + \meta{property} has the value \meta{value}. \emph{This only works for + \emph{unique} properties!} + \command{GetExerciseTypeForProperty}[\marg{property}\marg{value}] + Retrieves the property \property{type} of the exercise where the + property \meta{property} has the value \meta{value}. \emph{This only + works for \emph{unique} properties!} + \command{SetExerciseProperty}[\marg{property}\marg{value}] + \changedversion{0.9}Set the property \meta{property} of the current + exercise to \meta{value}. + \command{SetExpandedExerciseProperty}[\marg{property}\marg{value}] + \sinceversion{0.9}Expand \meta{value} \cs*{edef}-like and set the property + \meta{property} of the current exercise to the result of the expansion. + \command{ExerciseSetProperty}[\marg{type}\marg{id}\marg{property}\marg{value}] + \sinceversion{0.9}Set the property \meta{property} of the exercise of type + \meta{type} and id \meta{id} to \meta{value}. + \command{ExerciseSetExpandedProperty}[\marg{type}\marg{id}\marg{property}\marg{value}] + \sinceversion{0.9}Expand \meta{value} \cs*{edef}-like and set the property + \meta{property} of the exercise of type \meta{type} and id \meta{id} to + the result of the expansion. + \expandable\command{IfExerciseBooleanProperty\TF}[\marg{property}% + \marg{true}\marg{false}] + Checks wether the boolean property \meta{property} has value \code{true} + or \meta{false} and leaves the corresponding argument in the input + stream. Gives an error if \meta{property} is not a boolean property. + \expandable\command{GetExerciseAliasProperty}[\marg{property}] + Retrieves the value of the property of which \meta{property} is an alias + of for the current exercise. + \command{SaveExerciseProperty}[\marg{property}\meta{macro}] + Saves the value of the property \meta{property} for the current + exercise in macro \meta{macro}. + \command{GlobalSaveExerciseProperty} + Globally saves the value of the property \meta{property} for the current + exercise in macro \meta{macro}. + \command{ExercisePropertyIfSet\TF}[\marg{type}\marg{id}\marg{property}% + \marg{true}\marg{false}] + Test if the property \meta{property} has been set for the exercise of type + \meta{type} with id \meta{id}. + \expandable\command{ExercisePropertyGet}[\marg{type}\marg{id}\marg{property}] + Retrieves the value of the property \meta{property} for the exercise of type + \meta{type} with id \meta{id}. + \expandable\command{ExercisePropertyGetAlias}[\marg{type}\marg{id}\marg{property}] + Retrieves the value of the property of which \meta{property} is an alias + of for the exercise of type \meta{type} with id \meta{id}. + \command{ExercisePropertySave}[\marg{type}\marg{id}\marg{property}\meta{macro}] + Saves the value of the property \meta{property} for the exercise of type + \meta{type} with id \meta{id} in macro \meta{macro}. + \command{ExercisePropertyGlobalSave}[\marg{type}\marg{id}\marg{property}\meta{macro}] + Globally saves the value of the property \meta{property} for the exercise + of type \meta{type} with id \meta{id} in macro \meta{macro}. +\end{commands} + +\subsubsection{Parameters} +\begin{commands} + \expandable\command{GetExerciseParameter}[\marg{parameter}] + Retrieves the value of the parameter \meta{paramater} for the current + exercise type. + \command{GetExerciseParameter\TF}[\marg{parameter}\marg{true}\marg{false}] + \sinceversion{0.9}Retrieves the value of the parameter \meta{paramater} + for the current exercise type. Inside the \meta{true} branch you can refer + to the retrieved value either with \code{\#1} or with \cs{ParameterValue}. + \emph{This command expands its contents inside a group.} + \expandable\command{GetExerciseName} + Retrieves the value of the parameter \parameter{exercise-name} for the + current exercise or of the parameter \parameter{solution-name} for the + current solution. + \expandable\command{GetExerciseHeadingF}[\marg{false}] + \sinceversion{0.14}Retrieves the value of the parameter + \parameter{exercise-heading} for the current exercise or of the parameter + \parameter{solution-heading} for the current solution. Inserts + \meta{false} if the corresponding parameter has not been set. + \expandable\command{ExerciseParameterGet}[\marg{type}\marg{parameter}] + Retrieves the value of the parameter \meta{parameter} for the exercise of type + \meta{type} with id \meta{id}. + \expandable\command{IfExerciseParameterSet\TF}[\marg{parameter}% + \marg{true}\marg{false}] + \sinceversion{0.9}Test if the parameter \meta{parameter} has been set for + the current exercise type. + \expandable\command{ExerciseParameterIfSet\TF}[\marg{type}\marg{parameter}% + \marg{true}\marg{false}] + \sinceversion{0.9}Test if the parameter \meta{parameter} has been set for + the exercise type \meta{type}. +\end{commands} + +\subsubsection{Tags} +\begin{commands} + \command{ForEachExerciseTag}[\marg{type}\marg{code}] + Loops over all tags of tag type \meta{type} for the current exercise + applying \meta{code} each time. Inside \meta{code} you can refer to the + corresponding tag with \code{\#1}. + \command{ListExerciseTags}[\marg{type}\marg{between}] + Lists all tags of tag type \meta{type} for the current exercise using + \meta{between} as a separator. + \command{UseExerciseTags}[\marg{type}\marg{between + two}\marg{between}\marg{between last two}] + Lists all tags of tag type \meta{type} for the current exercise using + \meta{between} as a separator and \meta{between last two} as separator + between the last two tags of the list. If the list only consists of two + tags \meta{between two} is used as separator. + \command{IfExerciseTagSet\TF}[\marg{value}\marg{true}\marg{false}] + In\sinceversion{0.11} order to insert text (also \emph{outside} of + exercises) depending on the chosen tags this command lets you check if + value \meta{value} has been set for \property{tags}. + \command{IfExerciseTopicSet\TF}[\marg{value}\marg{true}\marg{false}] + In\sinceversion{0.11} order to insert text (also \emph{outside} of + exercises) depending on the chosen tags this command lets you check if + value \meta{value} has been set for \property{topics}. +\end{commands} + +\subsubsection{Further Commands for Usage in Template Definitions} +\begin{commands} + \command{UseExerciseTemplate}[\marg{type}\marg{name}] + Retrieve template \meta{name} of type \meta{type}. This can be useful if + you want to define a template which just adds some code to an existing + template (an automated \cs*{label}, say). + \expandable\command{ExerciseType} + Can be used to refer to the current exercise type. + \expandable\command{ExerciseID} + Can be used to refer to the current exercise id. + \expandable\command{ExerciseText} + Can be used inside solutions to retrieve the text of the corresponding + solution. This is propably seldom useful as in most use cases the + exercise property \property{solution} is the easier alternative. + \expandable\command{ExerciseCollection} + Can be used in certain templates to refer to the collection that is + currently inserted. + \expandable\command{numberofusedexercises} + Holds the total number of used exercises. Useful in table template + definitions. + \expandable\command{ExerciseTableType}[\marg{code}] + In table template definitions this macro either expands to the given + exercise type or -- if no type has been given -- to \meta{code}. + \expandable\command{IfInsideSolution\TF}[\marg{true}\marg{false}] + Tests if the template is used inside a solution environment or not. + \expandable\command{IfSolutionPrint\TF}[\marg{true}\marg{false}] + Tests if the option \option{print} for the solutions of the current + \cs{ExerciseType} is set to \code{true} or \code{false}. + \command{IfExistSolution\TF}[\marg{true}\marg{false}] + \sinceversion{0.9}Tests if a solution for the current exercise exists. + \command{ForEachPrintedExerciseByType}[\marg{code}] + Loops over each \emph{printed} exercise ordered by the exercise types and + within each type by id. Inside \meta{code} you can refer to several + properties of the corresponding exercise: + \begin{itemize} + \item \code{\#1}: the type of the exercise + \item \code{\#2}: the id of the exercise + \item \code{\#3}: the \property{counter} property of the exercise + \item \code{\#4}: the \property{subtitle} property of the exercise + \item \code{\#5}: the \property{points} property of the exercise + \item \code{\#6}: the \property{bonus-points} property of the exercise + \end{itemize} + \command{ForEachUsedExerciseByType}[\marg{code}] + Loops over each \emph{used} exercise ordered by the exercise types and + within each type by id. Inside \meta{code} you can refer to several + properties of the corresponding exercise: + \begin{itemize} + \item \code{\#1}: the type of the exercise + \item \code{\#2}: the id of the exercise + \item \code{\#3}: the \property{counter} property of the exercise + \item \code{\#4}: the \property{subtitle} property of the exercise + \item \code{\#5}: the \property{points} property of the exercise + \item \code{\#6}: the \property{bonus-points} property of the exercise + \end{itemize} + \command{ForEachPrintedExerciseByID}[\marg{code}] + Loops over each \emph{printed} exercise order by the exercise id. Inside + \meta{code} you can refer to several properties of the corresponding + exercise: + \begin{itemize} + \item \code{\#1}: the type of the exercise + \item \code{\#2}: the id of the exercise + \item \code{\#3}: the \property{counter} property of the exercise + \item \code{\#4}: the \property{subtitle} property of the exercise + \item \code{\#5}: the \property{points} property of the exercise + \item \code{\#6}: the \property{bonus-points} property of the exercise + \end{itemize} + \command{ForEachUsedExerciseByID}[\marg{code}] + Loops over each \emph{used} exercise order by the exercise id. Inside + \meta{code} you can refer to several properties of the corresponding + exercise: + \begin{itemize} + \item \code{\#1}: the type of the exercise + \item \code{\#2}: the id of the exercise + \item \code{\#3}: the \property{counter} property of the exercise + \item \code{\#4}: the \property{subtitle} property of the exercise + \item \code{\#5}: the \property{points} property of the exercise + \item \code{\#6}: the \property{bonus-points} property of the exercise + \end{itemize} + \command{XSIMprint}[\Marg{exercise|solution}\marg{type}\marg{id}] + \sincechanged{0.16}{0.17}Inserts the either the exercise or the solution + of type \meta{type} with the \property{id} or \property{ID} \meta{id}. + \command{XSIMxprint}[\Marg{exercise|solution}\marg{type}\marg{id}] + The same as \cs{XSIMprint} but expands \meta{type} and \meta{id} before it + uses them.\sincechanged{0.16}{0.17} + \expandable\command{XSIMtranslate}[\marg{keyword}] + Delivers the translation of \meta{keyword} according to the current + document language (in the meaning of a \pkg{babel}~\cite{pkg:babel} or + \pkg{polyglossia}~\cite{pkg:polyglossia} language). Existing keywords and + keyword translations (and how to add new ones) are explained in + section~\vref{sec:exerc-transl}. + \command{XSIMexpandcode}[\marg{code}] + Expands \meta{code} like \cs*{edef} does and leaves the result in the + input stream. + \expandable\command{XSIMifchapter\TF}[\marg{true}\marg{false}] + Returns \meta{true} if both a macro \cs*{chapter} and a counter + \code{chapter} are defined and \meta{false} otherwise. + \command{XSIMmixedcase}[\marg{code}] + Converts the full expansion of \meta{code} to mixed case: \\ + \verbcode+\XSIMmixedcase{this is some text}+ \XSIMmixedcase{this is some + text} \\ + \emph{This command expands \meta{code} before converting it}. + \command{XSIMputright}[\meta{macro}\marg{code}] + Extends the macro definition of \meta{macro} with \meta{code} putting it + to the right. This is more or less a local version of the LaTeX kernel + macro \cs*{g@addto@macro}. + \expandable\command{XSIMifeq\TF}[\marg{code 1}\marg{code + 2}\marg{true}\marg{false}] + Checks if the full expansion of \meta{code 1} and \meta{code 2} is the + same tokenlist. + \expandable\command{XSIMifblank\TF}[\marg{code}\marg{true}\marg{false}] + Checks if the full expansion of \meta{code} is blank (\ie, if it is empty + or only consists of spaces). + \command{XSIMatbegindocument}[\marg{code}] + \sinceversion{0.16}Adds \meta{code} to \xsim's begin document hook. + Should be used inside style files instead of \cs*{AtBeginDocument}. + \command{XSIMatenddocument}[\marg{code}] + \sinceversion{0.16}Adds \meta{code} to \xsim's end document hook. + Should be used inside style files instead of \cs*{AtEndDocument}. +\end{commands} + +\subsection{Declaring Templates} +\subsubsection{Environment Templates}\label{sec:envir-templ} +\begin{commands} + \command{DeclareExerciseEnvironmentTemplate}[\marg{name}\marg{begin + code}\marg{end code}] + Declare the environment template \meta{name}. +\end{commands} +Environment templates are used by the exercise and solution environments. +Those are the templates set with the parameters \parameter{exercise-template} +and \parameter{solution-template}. + +The predefined template is called \enquote{\code{default}}, see +section~\vref{sec:exercise-templ-default}. + +\subsubsection{Heading Templates}\label{sec:heading-templates} +\begin{commands} + \command{DeclareExerciseHeadingTemplate}[\marg{name}\marg{code}] + Declare the heading template \meta{name}. +\end{commands} +Heading templates are used by \cs{printsolutions}, \cs{printsolutionstype} and +\cs{printcollection}. Those are the templates set with the option +\option{headings-template} of the modules \module{print-solutions} and +\module{print-collection}. + +The predefined templates are \enquote{\code{default}}, +\enquote{\code{collection}}, \enquote{\code{per-section}} and +\enquote{\code{per-chapter}} see section~\vref{sec:headings-templates}. + +\subsubsection{Grading Table Templates}\label{sec:grad-table-templ} +\begin{commands} + \command{DeclareExerciseTableTemplate}[\marg{name}\marg{code}] + Declare the grading table template \meta{name}. +\end{commands} +Table templates are used by \cs{gradingtable}. Those are the templates set +with the option \option{template} of module \module{grading-table} + +The predefined templates are \enquote{\code{default}} and +\enquote{\code{default*}}, see sections~\vref{sec:table-templ-default} +and~\vref{sec:table-templ-default*}. + +\subsection{Create and Use \xsim\ Style Files}\label{sec:style-files} +\index{style file|(} + +\xsim\changedversion{0.11} offers you the possibility to create own +\emph{style files}. Let's say you want to have a style called +\code{math-exam}. Then you need to save all necessary definitions in a file +called: +\begin{center} + \code{xsim.style.math-exam.code.tex} +\end{center} +The first command in the file should be \cs{xsimstyle}\Marg{math-exam}. This +file can now be loaded into your document using +\cs{loadxsimstyle}\Marg{math-exam} or by using +\cs{xsimsetup}\Marg{load-style=math-exam}: +\begin{sourcecode} + \documentclass[DIV=18,parskip=half]{scrartcl} + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + + \usepackage[clear-aux]{xsim} + \loadxsimstyle{math-exam} + + \title{Math Exam \#3} + \date{2017-03-28} +\end{sourcecode} + +In this style file stuff like template and property definitions should +happen. This is more or less a convenient way to +\begin{itemize} + \item keep the preamble \enquote{clean} and + \item define re-usable styles without the need of copying the document + preamble to another document. +\end{itemize} +A style file is like a package or class file, \ie, \code{@} has category +code~11 (letter). + +The formal description of the commands: +\begin{commands} + \command{xsimstyle}[\sarg\marg{style name}] + The\changedversion{0.11} first command in a \xsim\ style file called + \code{xsim.style.\meta{style name}.code.tex} which defines the \xsim\ + style \meta{style name}. The starred version activates expl3 + syntax\footnote{Those users who want this will know what it means. If you + don't know what it means you will not need it.}. + \command{loadxsimstyle}[\marg{csv list of style names}] + Load one or more styles into the document. +\end{commands} +\begin{options} + \keyval{load-style}{csv list of style names} + Another\sinceversion{0.14} interface for \cs{loadxsimstyle}\marg{csv list + of style names}. +\end{options} + +\begin{bewareofthedog} + At the moment this mechanism offers no advantages over creating a custom + package or simply \cs*{input}ing a file. Future versions might provide + additional features. +\end{bewareofthedog} + +\index{style file|)} + +\subsection{Examples}\label{sec:template-examples} + +The repository of this package\footnote{GitHub: + \url{https://github.com/cgnieder/xsim/}, CTAN: + \url{http://www.ctan.org/pkg/xsim/}} currently includes +\theexamplefiles~example documents demonstrating how different aspects of this +package work or how different kinds of problems can be solved or how different +kinds of layouts can be achieved as well as how solve concrete problems that +have come up in different \LaTeX\ forums, see +section~\vref{sec:example-files}. + +\subsubsection{The \code{default} Exercise Template}\label{sec:exercise-templ-default} + +Below the definition\changedversion{0.14} of the \code{default} exercise +template provided by \xsim\ is shown: + +\begin{sourcecode} + \DeclareExerciseEnvironmentTemplate{default}{% + \GetExerciseHeadingF{\subsection*}% + {% + \XSIMmixedcase{\GetExerciseName}\nobreakspace + \GetExerciseProperty{counter}% + \IfInsideSolutionF + {% + \GetExercisePropertyT{subtitle} + { {\normalfont\itshape\PropertyValue}}% + }% + } + \GetExercisePropertyT{points} + {% + \marginpar + {% + \IfInsideSolutionF{\rule{1.2cm}{1pt}\slash}% + \printgoal{\PropertyValue} + \GetExercisePropertyT{bonus-points}{~(+\printgoal{\PropertyValue})}% + ~\XSIMtranslate {point-abbr}% + }% + }% + } + {\par} +\end{sourcecode} + +\subsubsection{A New Exercise Type Using \pkg*{tcolorbox}} +Let's say we want exercises to be put in a \env*{tcolorbox}. We want a bold +title and. if given, an italic subtitle. Exercises should also have the +points after the subtitle in parentheses if given. Let's also say we want +those to be an additional exercise type in addition to the ones \xsim\ already +provides. This is shown with the following code which is also how the +problems in this manual have been defined: + +\begin{sourcecode} + \DeclareExerciseEnvironmentTemplate{tcolorbox} + {% + \tcolorbox[ + colback = red!5!white , + colframe = red!75!black , + colbacktitle = yellow!50!red , + coltitle = red!25!black , + breakable , + drop shadow , + beforeafter skip = .5\baselineskip , + title = + \textbf{\GetExerciseName~\GetExerciseProperty{counter}}% + \GetExercisePropertyT{subtitle}{ \textit{\PropertyValue}}% + \IfInsideSolutionF{% + \GetExercisePropertyT{points}{ % notice the space + (% + \printgoal{\PropertyValue} + \IfExerciseGoalSingularTF{points} + {\XSIMtranslate{point}} + {\XSIMtranslate{points}}% + )% + }% + }% + ]% + } + {\endtcolorbox} + + \DeclareExerciseType{problem}{ + exercise-env = problem , + solution-env = answer , + exercise-name = Problem , + solution-name = Answer , + exercise-template = tcolorbox , + solution-template = tcolorbox + } +\end{sourcecode} + +See it in action: +\begin{example} + \begin{problem}[subtitle=My subtitle,points=5] + This is a problem using a subtitle and points. + \end{problem} + \begin{answer} + This is the answer to problem~\GetExerciseProperty{counter}. + \end{answer} +\end{example} + +\subsubsection{Mimicking \pkg*{exsheets}' \code{runin} Template} +\label{sec:runin-template} + +The following example shows how you could mimick \pkg*{exsheets}' \code{runin} +template. The outcome isn't exactly the same since \pkg{exsheets} doesn't use +\cs*{marginpar} but the result should look very similar. A safer definition +would use a real sectioning command for the title. + +\begin{sourcecode} + \usepackage{needspace} + \DeclareExerciseEnvironmentTemplate{runin} + {% + \par\vspace{\baselineskip} + \Needspace*{2\baselineskip} + \noindent + \textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}}% + \GetExercisePropertyT{subtitle}{ \textit{#1}} % <<< notice the space + \IfInsideSolutionF{% + \GetExercisePropertyT{points}{% + \marginpar{% + \printgoal{\PropertyValue}% + \GetExercisePropertyT{bonus-points}{+\printgoal{\PropertyValue}}% + \,\IfExerciseGoalSingularTF{points} + {\XSIMtranslate{point}} + {\XSIMtranslate{points}}% + }% + }% + }% + } + {} +\end{sourcecode} + +\subsubsection{Mimicking \pkg*{exsheets}' \code{margin} Template} +\label{sec:margin-template} + +The following example shows how you could mimick \pkg*{exsheets}' +\code{margin} template. + +\begin{sourcecode} + \DeclareExerciseEnvironmentTemplate{margin} + {% + \trivlist + \item[\llap{% + \smash{% + \tabular[t]{@{}r@{}} + \textbf{\XSIMmixedcase{\GetExerciseName}~\GetExerciseProperty{counter}} + \IfExercisePropertySetT{points}{% + \tabularnewline + (% + \printgoal{\GetExerciseProperty{points}}% + \GetExercisePropertyT{bonus-points}{+\printgoal{#1}}% + \,\XSIMtranslate{point-abbr}% + )% + }% + \endtabular + }% + }]\relax + } + {\endtrivlist} +\end{sourcecode} + +\subsubsection{A \code{minimal} Template} +\label{sec:minimal-template} + +This shows the implementation of the \code{minimal} template: +\begin{sourcecode} + \DeclareExerciseEnvironmentTemplate{minimal} + {% + \par + \textbf{\GetExerciseProperty{counter}}% + \IfInsideSolutionF{% + \GetExercisePropertyT{points}{% + \GetExercisePropertyT{bonus-points}{+\printgoal{\PropertyValue}}% + \,\IfExerciseGoalSingularTF{points} + {\XSIMtranslate{point}} + {\XSIMtranslate{points}}% + }% + }% + } + {\par} +\end{sourcecode} + +\subsubsection{The Headings Templates}\label{sec:headings-templates} +\xsim\ defines four heading templates which only differ by which text they +output: +\begin{sourcecode} + \DeclareExerciseHeadingTemplate{default} + {\section*{\XSIMtranslate{default-heading}}} + \DeclareExerciseHeadingTemplate{collection} + {\section*{\XSIMtranslate{collection-heading}}} + \DeclareExerciseHeadingTemplate{per-section} + {\section*{\XSIMtranslate{per-section-heading}}} + \DeclareExerciseHeadingTemplate{per-chapter} + {\section*{\XSIMtranslate{per-chapter-heading}}} +\end{sourcecode} +Section~\vref{sec:exerc-transl} shows how the translations are defined. + +\subsubsection{The \code{default} Table Template}\label{sec:table-templ-default} +This template is the one used for grading tables per default. It has a +vertical layout. + +\begin{sourcecode} + \DeclareExerciseTableTemplate{default}{% + \XSIMputright\ExerciseTableCode{% + \toprule + \XSIMifblankF{\ExerciseType} + {\XSIMmixedcase{\GetExerciseParameter{exercise-name}}} + & + \XSIMmixedcase{\XSIMtranslate{points}} & + \XSIMtranslate{reached} \\ + \midrule + }% + \ForEachUsedExerciseByType{% + \XSIMifeqT{#1}{\ExerciseTableType{#1}} + {% + \XSIMifblankT{\ExerciseTableType{}} + {% + \XSIMputright\ExerciseTableCode{% + \XSIMmixedcase{\ExerciseParameterGet{#1}{exercise-name} }% + }% + }% + \XSIMputright\ExerciseTableCode + {#3 & \XSIMifblankTF{#5}{\printgoal{0}}{\printgoal{#5}} & \\ }% + }% + } + \XSIMputright\ExerciseTableCode{% + \midrule + \XSIMtranslate{total} & + \XSIMifblankTF{\ExerciseType} + {\TotalExerciseGoal{points}{}{}} + {\TotalExerciseTypeGoal{\ExerciseType}{points}{}{}} & + \\ \bottomrule + }% + \XSIMexpandcode{% + \noexpand\begin{tabular}{\XSIMifblankTF{\ExerciseType}{l}{c}cc} + \noexpand\ExerciseTableCode + \noexpand\end{tabular}% + }% + } +\end{sourcecode} + +The part +\begin{sourcecode} + \XSIMifblankTF{\ExerciseType}{ ... }{ ... } +\end{sourcecode} +repeatedly checks if an exercise type has been given for the table. This +makes it possible to design the table differently if it is for one exercise +type only (the \code{true} case) or for all exercise types (the \code{false} +case). \cs*{ExerciseTableType}\marg{code} either expands to the given +exercise type or to \meta{code}. + +\subsubsection{The \code{default*} Table Template}\label{sec:table-templ-default*} +The second of the predefined grading table templates. It has a horizontal +layout. +\begin{bewareofthedog} + If you have a lot of exercises the width of a table with this layout may + exceed the text width of the document! +\end{bewareofthedog} + +\begin{sourcecode} + \DeclareExerciseTableTemplate{default*}{% + \XSIMputright\ExerciseTableCode{% + \toprule + \XSIMifblankF{\ExerciseType} + {\XSIMmixedcase{\GetExerciseParameter{exercise-name}}} + &% + }% + \ForEachUsedExerciseByType{% + \XSIMifeqT{#1}{\ExerciseTableType{#1}} + { + \XSIMifblankT{\ExerciseTableType{}} + {% + \XSIMputright\ExerciseTableCode{% + \XSIMmixedcase{\ExerciseParameterGet{#1}{exercise-name} }% + }% + }% + \XSIMputright\ExerciseTableCode{#3 &} + }% + }% + \XSIMputright\ExerciseTableCode{% + \XSIMtranslate{total} \\ + \midrule + \XSIMmixedcase{\XSIMtranslate{points}} & + }% + \ForEachUsedExerciseByType{% + \XSIMifeqT{#1}{\ExerciseTableType{#1}} + {% + \XSIMputright\ExerciseTableCode{% + \XSIMifblankTF{#5}{\printgoal{0}}{\printgoal{#5}} &}% + }% + }% + \XSIMputright\ExerciseTableCode{% + \XSIMifblankTF{\ExerciseType} + {\TotalExerciseGoal{points}{}{}} + {\TotalExerciseTypeGoal{\ExerciseType}{points}{}{}}% + \\ \midrule + \XSIMtranslate{reached} &% + }% + \ForEachUsedExerciseByType{% + \XSIMifeqT{#1}{\ExerciseTableType{#1}} + {\XSIMputright\ExerciseTableCode{&}}% + }% + \XSIMputright\ExerciseTableCode{ \\ \bottomrule }% + \edef\numberofcolumns{% + \XSIMifblankTF{\ExerciseType} + {\numberofusedexercises} + {\csname numberof \ExerciseType s\endcsname}% + }% + \XSIMifeqF{\numberofcolumns}{0} + {% + \begin{tabular}{l*{\numberofcolumns}{c}c} + \ExerciseTableCode + \end {tabular}% + }% + } +\end{sourcecode} + +The part +\begin{sourcecode} + \XSIMifblankTF{\ExerciseType}{ ... }{ ... } +\end{sourcecode} +repeatedly checks if an exercise type has been given for the table. This +makes it possible to design the table differently if it is for one exercise +type only (the \code{true} case) or for all exercise types (the \code{false} +case). \cs*{ExerciseTableType}\marg{code} either expands to the given +exercise type or to \meta{code}. + +\section{Exercise Translations}\label{sec:exerc-transl} + +\begin{commands} + \command{DeclareExerciseTranslation}[\marg{language}\marg{keyword}\marg{translation}] + Declare the translation of \meta{keyword} for language \meta{language}. + \command{DeclareExerciseTranslations}[\marg{keyword}\marg{translations}] + Declare the translations of \meta{keyword} for several languages at once. + See an example of the usage below. + \expandable\command{XSIMtranslate}[\marg{keyword}] + Delivers the translation of \meta{keyword} according to the current + document language (in the meaning of a \pkg{babel}~\cite{pkg:babel} or + \pkg{polyglossia}~\cite{pkg:polyglossia} language). + \command{ForEachExerciseTranslation}[\marg{code}] + Loops over all translations of all keywords known to \xsim. Inside + \meta{code} you can refer to the keyword with \code{\#1}, to the language + with \code{\#2}, and to the translation with \code{\#3}. +\end{commands} + +As an example how to use \cs{DeclareExerciseTranslations} here is how the +translations for \code{exercise} have been defined: + +\begin{sourcecode} + \DeclareExerciseTranslations{exercise}{ + Fallback = exercise , + English = exercise , + French = exercice , + German = \"Ubung + } +\end{sourcecode} + +Table~\vref{tab:translation-keys} shows all existing keywords with all +predefined translations. + +\ForEachExerciseTranslation{ + \appto\translationtable{\texttt{#1} & #2 & \texttt{\detokenize{#3}} \\} +} + +\begin{longtable}{llp{.55\linewidth}} + \caption{Translation keywords predefined by \xsim.} + \label{tab:translation-keys} \\ + \toprule + \bfseries keyword & \bfseries language & \bfseries translation \\ + \midrule + \endfirsthead + \toprule + \bfseries keyword & \bfseries language & \bfseries translation \\ + \midrule + \endhead + \bottomrule + \endlastfoot + \midrule + & & \hfill\emph{continues} \\ + \endfoot + \translationtable +\end{longtable} + +\section{Cloze Tests and Blank Lines} + +Similar to \pkg{exsheets} \xsim\ provides a command \cs{blank}: +\begin{commands} + \command{blank}[\sarg\oarg{options}\marg{text to be filled in}] + Creates a blank in normal text or in an exercise but fills the text of its + argument if inside a solution. If used at the \emph{begin of a paragraph} + \cs{blank} will do two things: it will set the linespread according to an + option explained below and will insert \cs*{par} after the lines. The + starred version doesn't do these things. +\end{commands} + +Those are the options for customization: +\begin{options} + \keyval{blank-style}{code}\Module{blank}\Default{\cs*{underline}\Marg{\#1}} + Instructions for typesetting the blank cloze. Refer to the filled in + space with \code{\#1}. + \keyval{filled-style}{code}\Module{blank}\Default{\cs*{underline}\Marg{\#1}} + Instructions for typesetting the filled cloze. Refer to the filled in text + with \code{\#1} + \keyval{style}{code} + Shortcut for setting both \option{blank-style} and \option{filled-style} + at once. + \keyval{scale}{decimal number}\Module{blank}\Default{\code{1}} +\textsc{} Scales the blank to \meta{decimal number} times its natural width. + \keyval{width}{dim}\Module{blank}\Default + Sets the blank to a width of \meta{dim}. This takes precendence over + \option{scale}. + \keyval{linespread}{decimal number}\Module{blank}\Default{\code{1}} + Set the linespread for the blank lines. This only has an effect if + \cs{blank} is used at the begin of a paragraph. + \keyval{line-increment}{dim}\Module{blank}\Default{\code{0.001\cs*{linewidth}}} + The blank line is built in multiples of this value. If the value is too + large you may end up with uneven lines. If the value is too small you may + end up with a non-ending compilation. Experiment with values to find the + suiting one for your use case. + \keyval{line-minimum-length}{dim}\Module{blank}\Default{\code{2em}} + The minimal length a line must have before it is built step by step. +\end{options} + +\begin{example} + This is a \blank{blank} outside in normal text. + \begin{exercise} + Try to fill in \blank[width=4cm]{these} blanks. All of them + \blank{are created} by using the \cs{blank} \blank{command}. + \end{exercise} + \xsimsetup{blank/filled-style=\textcolor{red}{#1}} + \begin{solution}[print] + Try to fill in \blank[width=4cm]{these} blanks. All of them + \blank{are created} by using the \cs{blank} \blank{command}. + \end{solution} +\end{example} +A number of empty lines are easily created by setting the \option{width} +option: +\begin{example} + Write up the pros and cons of \xsim\ over \pkg{exsheets}: + + \blank[width=4.8\linewidth,linespread=1.5]{} +\end{example} + +\edef\lastsection{\arabic{section}} + +\appendix + +\section{Future Plans} + +\xsim\ is complete in so far as it is perfectly usable to create exams or +exercise and solution sections in books with the most freedom in layout +already. But still there are features which would be useful additions. Below +I list all ideas that I currently plan to add to \xsim: +\begin{itemize} + \item a document class \code{xsim-exam} for creating exams; this class + should itself feature the possibility of creating different versions of an + exam, maybe already provide multiple choice questions and so on; one could + also think about automatic creation of running headers and footers, \ie, + means for changing the layout of the exam; following the spirit of \xsim\ + this should probably be done using templates as well. +\end{itemize} +I am very open to suggestions regarding features, both in general and +specifically regarding the document class. + +\section{FAQ \& How to\dots} +This section serves as a kind of gallery showing solutions to common +problems. I expect this section to grow over the years. Some examples +especially regarding other layouts are also shown in example files added to +this package. + +\subsection{\dots Know if \xsim\ Needs Another Compilation?} +If \xsim\ wants you to recompile your document it issues a warning and writes +the following to the logfile: +\begin{sourcecode} + Package xsim Warning: Exercise properties may have changed. Rerun to get them + (xsim) synchronized. +\end{sourcecode} +So just check the logfile regularly (which you should be doing anyway) and +keep your eyes open. + +\subsection{\dots Resolve Getting Repeatedly Wrong Exercise Properties or + Wrong Exercise Lists?}\label{sec:resolve-getting} +\xsimauxfileinfo + +\subsection{\dots Resolve Strange Errors After Updating?} +\xsim\ writes a lot of stuff to the auxiliary file. An update may well change +how this is done so deleting the auxiliary file and doing a few fresh +compilations may resolve your problems. + +\subsection{\code{! TeX capacity exceeded, sorry [text input levels=15].} + Why?} +Did you try to use an exercise or solution in a macro of some sort? This +generally will fail if you also use the option \option{use-files}\footnote{The + reasons are similar to the ones given here: + \url{https://tex.stackexchange.com/a/295422/}.}. But there should never be +the need to hide the environments inside of a macro, anyway. + +\subsection{\code{Runaway argument? !File ended while scanning use of \^{}\^{}M.} Why?} +Did you try to use an exercise or solution in a macro of some sort? This +generally will fail if you also use the option \option{use-files}. But there +should never be the need to hide the environments inside of a macro, anyway. + +\subsection{\dots Put a Star (or Another Symbol) in Headings of Exercises That + Are Special?} + +The code below shows one possible modification of an exercise template which +allows to easily create bonus exercises: +\begin{sourcecode} + % preamble: + \usepackage{amsymb} + % declare boolean property: + \DeclareExerciseProperty*{bonus} + \DeclareExerciseEnvironmentTemplate{bonus} + {% + \subsection* + {% + % test for boolean property and insert star symbol if true: + \IfExerciseBooleanPropertyT{bonus}{\llap{$\bigstar$ }Bonus }% + \XSIMmixedcase{\GetExerciseName}\nobreakspace + \GetExerciseProperty{counter}% + \IfInsideSolutionF + {% + \IfExercisePropertySetT{subtitle} + { {\normalfont\itshape\GetExerciseProperty{subtitle}}}% + }% + } + \GetExercisePropertyT{points} + {% + \marginpar + {% + \IfInsideSolutionF{\rule{1.2cm}{1pt}\slash}% + \PropertyValue + \GetExercisePropertyT{bonus-points} + {\nobreakspace(+\PropertyValue)}% + \nobreakspace\XSIMtranslate{point-abbr}% + }% + }% + } + {} +\end{sourcecode} + +The usage is now as follows: +\begin{example} + \xsimsetup{exercise/template = bonus} + % set the boolean property to true + \begin{exercise}[bonus] + A bonus question. + \end{exercise} +\end{example} + +\subsection{\dots Print All Solutions Grouped by Section?} +Here is an idea how to get a list of all solutions grouped by the section the +corresponding exercises are appearing in. +\begin{sourcecode} + % preamble: + % \usepackage{etoolbox} + % \newcounter{sections} + + % document: + \setcounter{sections}{1} + \whileboolexpr + { test {\ifnumless{\value{sections}}{\value{section}+1}} } + { + \printsolutions[section=\value{sections},headings-template=per-section] + \stepcounter{sections} + } +\end{sourcecode} +For this manual we then get the following list\footnote{Taking care of the + fact that we're in the appendix now which means we can't use + \cs*{value}\Marg{section}. Therefore this manual does + \cs*{edef}\cs*{lastsection}\Marg{\cs*{arabic}\Marg{section}} right before + \cs*{appendix}}. + +\newcounter{sections} +\setcounter{sections}{1} +\whileboolexpr + { test {\ifnumless{\value{sections}}{\lastsection+1}} } + { + \printsolutions[section=\value{sections},headings-template=per-section] + \stepcounter{sections} + } + +\section{The \pkg*{xsimverb} package}\label{sec:xsimverb-package} +\xsim\ comes bundled with another package called +\pkg{xsimverb}\xsimverbversion. This package loads a very small subset of +\xsim\ which allows to create environments that write their contents verbatim +to external files. It provides the following commands (which of course are +also available in \xsim, too): + +\begin{commands} + \command{XSIMfilewritestart}[\sarg\marg{file name}] + Start writing to the file named \meta{file name}. This should be the + \emph{last} command in the \emph{begin} definition of an environment. If + is is used in an environment with arguments where the \emph{last} argument + is optional you should check if the optional argument is given and use + the starred version if the test is negative. This is demonstrated in an + example below using \pkg{xparse}'s \cs{NewDocumentEnvironment}. \emph{If + you want an environment with only an optional argument you \emph{should} + use \pkg{xparse}'s commands to define it. Due to the way how + \cs*{newenvironment} scans for optional arguments you'll otherwise may + end up with leading spaces gobbled from the first line in your + environment.} + \command{XSIMfilewritestop} + Stop writing to the file. This should be the \emph{first} command in the + \emph{end} definition of an environment. + \command{XSIMsetfilebegin}[\marg{code}] + This command can be used to write something to the external file + \emph{before} the environment contents. Must be set before + \cs{XSIMfilewritestart} in the \emph{begin} definition. + \command{XSIMsetfileend}[\marg{code}] + This command can be used to write something to the external file + \emph{after} the environment contents. Must be set before + \cs{XSIMfilewritestart} in the \emph{begin} definition. + \command{XSIMgobblechars}[\marg{integer}] + Determines how many characters are cut off of the beginning of each line + of the environment body before it is written to the file. The default + value is~$0$. +\end{commands} + +The following code shows an example of how to use those commands: +\begin{sourcecode} + \documentclass{article} + \usepackage{xsimverb,listings} + + \makeatletter + \NewDocumentEnvironment{example}{o} + {% + \XSIMsetfilebegin{\@percentchar\space file `\jobname.tmp'}% + \XSIMsetfileend{\@percentchar\space bye bye}% + \IfNoValueTF{#1} + {\XSIMfilewritestart*{\jobname.tmp}} + {\XSIMfilewritestart{\jobname.tmp}}% + } + {% + \XSIMfilewritestop + \lstinputlisting[language={[LaTeX]TeX}]{\jobname.tmp}% + \input{\jobname.tmp} + } + \makeatother + + \begin{document} + + \begin{example} + bla bla \LaTeX + \end{example} + + \end{document} +\end{sourcecode} + +The \code{tmp} file produced by the above example will contain the following +three lines (if the file itself was called \code{test.tex}): +\begin{sourcecode} + % file `test.tmp' + bla bla \LaTeX + % bye bye +\end{sourcecode} + +\section{All Exercise Examples} + +\begin{bewareofthedog} + You will notice that some exercises from + section~\vref{sec:template-examples} look differently in this section. That + is because all exercises of a type use the template that's \emph{currently + active}. If you want exercises with a different look you should use + different exercises types. +\end{bewareofthedog} + +The following list is created with this code: +\begin{sourcecode} + \xsimsetup{exercise/template = bonus} + \printcollection[headings]{all exercises} +\end{sourcecode} + +\xsimsetup{exercise/template = bonus} +\printcollection[headings]{all exercises} + +\section{All Solution Examples} +\printsolutions + +\section{Example Documents Coming With This Package}\label{sec:example-files} +The repository of this package\footnote{GitHub: + \url{https://github.com/cgnieder/xsim/}, CTAN: + \url{http://www.ctan.org/pkg/xsim/}} currently includes +\theexamplefiles~example documents demonstrating how different aspects of this +package work or how different kinds of problems can be solved or how different +kinds of layouts can be achieved as well as how to solve concrete problems +that have come up in different \LaTeX\ forums. + +Besides showing excerpts of the code and the resulting pdf the examples below +also link to both the \code{tex} source the resulting pdf. + +\listexamplefiles + +\printbibliography + +\end{document} |