From 89254042b68b23ffae35800172b5de13786b5451 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 11 Jun 2016 23:15:38 +0000 Subject: exsol (5jun16) git-svn-id: svn://tug.org/texlive/trunk@41377 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/exsol/README | 44 + .../doc/latex/exsol/example-formulacollection.pdf | Bin 0 -> 86134 bytes .../texmf-dist/doc/latex/exsol/example-local.pdf | Bin 0 -> 95256 bytes .../doc/latex/exsol/example-solutionbook.pdf | Bin 0 -> 101915 bytes Master/texmf-dist/doc/latex/exsol/example.pdf | Bin 0 -> 100483 bytes Master/texmf-dist/doc/latex/exsol/exsol.pdf | Bin 256889 -> 286860 bytes Master/texmf-dist/source/latex/exsol/exsol.dtx | 1019 +++++++++++++++----- Master/texmf-dist/source/latex/exsol/exsol.ins | 9 +- Master/texmf-dist/tex/latex/exsol/exsol.sty | 240 ++++- 9 files changed, 1025 insertions(+), 287 deletions(-) create mode 100644 Master/texmf-dist/doc/latex/exsol/README create mode 100644 Master/texmf-dist/doc/latex/exsol/example-formulacollection.pdf create mode 100644 Master/texmf-dist/doc/latex/exsol/example-local.pdf create mode 100644 Master/texmf-dist/doc/latex/exsol/example-solutionbook.pdf create mode 100644 Master/texmf-dist/doc/latex/exsol/example.pdf (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/exsol/README b/Master/texmf-dist/doc/latex/exsol/README new file mode 100644 index 00000000000..4797af6769a --- /dev/null +++ b/Master/texmf-dist/doc/latex/exsol/README @@ -0,0 +1,44 @@ +************************************************************ +* * +* The exsol package * +* * +************************************************************ + Walter Daems + walter.daems(at)uantwerpen.be + +The package \exsol{} provides macros to allow +embedding exercises and solutions in the LaTeX source of an +instructional text (e.g., a book or a course text) while generating +the following separate documents: + - your original text that only contains the exercises, and + - a solution book that only contains the solutions to the + exercises (a package option exists to also copy the exercises + themselves to the solution book). + +The former is generated when running LaTeX on your document. This +run writes the solutions to a secondary file that can be included +into a simple document harness, such that when running LaTeX on +the latter, you can generate a nice solution book. + +The code of the exsol package was taken almost literally from +fancyvrb [http://www.ctan.org/pkg/fancyvrb]. +Therefore, all credits go to the authors/maintainers of fancyvrb. + +If you think + - there's an error in this package, + - there's a feature missing in this package, +please, don't hesitate to contact the author through e-mail +(walter.daems@uantwerpen.be). + +Do you like this class file? You're welcome to send beer, wine, or +just kind words. + +License +======= + + see file LICENSE + +History +======= + + see documentation (exsol.pdf) \ No newline at end of file diff --git a/Master/texmf-dist/doc/latex/exsol/example-formulacollection.pdf b/Master/texmf-dist/doc/latex/exsol/example-formulacollection.pdf new file mode 100644 index 00000000000..18f02459cad Binary files /dev/null and b/Master/texmf-dist/doc/latex/exsol/example-formulacollection.pdf differ diff --git a/Master/texmf-dist/doc/latex/exsol/example-local.pdf b/Master/texmf-dist/doc/latex/exsol/example-local.pdf new file mode 100644 index 00000000000..a9ff732bfda Binary files /dev/null and b/Master/texmf-dist/doc/latex/exsol/example-local.pdf differ diff --git a/Master/texmf-dist/doc/latex/exsol/example-solutionbook.pdf b/Master/texmf-dist/doc/latex/exsol/example-solutionbook.pdf new file mode 100644 index 00000000000..43f77cf7f3f Binary files /dev/null and b/Master/texmf-dist/doc/latex/exsol/example-solutionbook.pdf differ diff --git a/Master/texmf-dist/doc/latex/exsol/example.pdf b/Master/texmf-dist/doc/latex/exsol/example.pdf new file mode 100644 index 00000000000..e7df256dc04 Binary files /dev/null and b/Master/texmf-dist/doc/latex/exsol/example.pdf differ diff --git a/Master/texmf-dist/doc/latex/exsol/exsol.pdf b/Master/texmf-dist/doc/latex/exsol/exsol.pdf index 2dbb52814f3..a05a974e6b3 100644 Binary files a/Master/texmf-dist/doc/latex/exsol/exsol.pdf and b/Master/texmf-dist/doc/latex/exsol/exsol.pdf differ diff --git a/Master/texmf-dist/source/latex/exsol/exsol.dtx b/Master/texmf-dist/source/latex/exsol/exsol.dtx index 236f934340c..f964f7d55a7 100644 --- a/Master/texmf-dist/source/latex/exsol/exsol.dtx +++ b/Master/texmf-dist/source/latex/exsol/exsol.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2014 by Walter Daems +% Copyright (C) 2016 by Walter Daems % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, either version 1.3 of this license @@ -21,7 +21,8 @@ % - exsol.sty % - example.tex % - example-solutionbook.tex -% +% - example-formulacollection.tex +% - example-local.tex % \fi % % \iffalse @@ -29,9 +30,9 @@ %\NeedsTeXFormat{LaTeX2e} %\ProvidesFile{exsol.dtx} %\ProvidesPackage{exsol} -% [2014/08/31 v0.91 ExSol - Exercises and Solutions package (DMW)] +% [2016/05/13 v1.2 ExSol - Exercises and Solutions package (DMW)] %<*driver> -\documentclass[11pt]{ltxdoc} +\documentclass[10pt,a4paper]{ltxdoc} \usepackage[english]{babel} \usepackage[exercisesfontsize=small]{exsol} \usepackage{metalogo} @@ -45,10 +46,10 @@ \EnableCrossrefs \CodelineIndex \RecordChanges -\newcommand{\exsol}{\textsf{ExSol}} +\newcommand{\exsol}{\textsc{ExSol}} \StopEventually{\PrintChanges\PrintIndex} -\def\fileversion{0.91} -\def\filedate{2014/08/31} +\def\fileversion{1.2} +\def\filedate{2016/05/05} \begin{document} \DocInput{exsol.dtx} \end{document} @@ -74,22 +75,28 @@ % Right brace \} Tilde \~} % % -% \changes{v0.1}{2012/01/05}{. Initial version} -% \changes{v0.2}{2012/01/06}{. Minor bug fixes based on first use by +% \changes{v0.1}{2012/01/05}{\@ Initial version} +% \changes{v0.2}{2012/01/06}{\@ Minor bug fixes based on first use by % Paul Levrie} -% \changes{v0.3}{2012/01/07}{. Minor bug fixes based on second use by +% \changes{v0.3}{2012/01/07}{\@ Minor bug fixes based on second use by % Paul} -% \changes{v0.4}{2012/01/09}{. Allowed for non-list formatting of +% \changes{v0.4}{2012/01/09}{\@ Allowed for non-list formatting of % exercises (as default)} -% \changes{v0.5}{2012/01/15}{. Added option to also send exercises to +% \changes{v0.5}{2012/01/15}{\@ Added option to also send exercises to % solutions file} -% \changes{v0.6}{2013/05/12}{. Prepared for CTAN publication} -% \changes{v0.7}{2014/07/14}{. Fixed UTF8 compatibility issues} -% \changes{v0.8}{2014/07/15}{. Fixed missing babel tag and running out -% of write hanles} -% \changes{v0.9}{2014/07/28}{. Changed default behavior -% w.r.t. minipage-wraping of exercises} -% \changes{v0.91}{2014/08/31}{. Corrected minipage dependence, made } +% \changes{v0.6}{2013/05/12}{\@ Prepared for CTAN publication} +% \changes{v0.7}{2014/07/14}{\@ Fixed UTF8 compatibility issues} +% \changes{v0.8}{2014/07/15}{\@ Fixed missing babel tag and running out +% of write handles} +% \changes{v0.9}{2014/07/28}{\@ Changed default behavior +% w.r.t. minipage-wrapping of exercises} +% \changes{v0.91}{2014/08/31}{\@ Corrected minipage dependence, made } +% \changes{v1.0}{2015/09/16}{\@ First stable release} +% \changes{v1.1}{2015/12/30}{\@ Bugfix release} +% \changes{v1.2}{2016/05/05}{\@ Implemented multicolumn option for +% exercises, introduced new options (local, nolabels), separate +% counter for exerciseseries (only for use local mode), introduced +% local mode} % % \DoNotIndex{\newcommand,\newenvironment} % \setlength{\parindent}{0em} @@ -104,242 +111,500 @@ % % \section{Introduction} % %%%%%%%%%%%%%%%%%%%%%% +% +% \subsection{Package goal} % The package \exsol{} provides macros to allow % embedding exercises and solutions in the \LaTeX{} source of an -% instructional text (e.g., a book or a course text) while generating +% instructional text (e.g., a book or a course text) while keeping the +% exercises and the solutions apart in the typeset result. +% +% In \emph{global mode} (the default), this corresponds to generating % the following separate documents: % \begin{itemize} % \item your original text that only contains the exercises, and % \item a solution book that only contains the solutions to the -% exercises (a package option exists to also copy the exercises themselves to the solution book). +% exercises (a package option exists to also copy the exercises +% themselves to the solution book). % \end{itemize} -% % The former is generated when running \LaTeX{} on your document. This % run writes the solutions to a secondary file that can be included % into a simple document harness, such that when running \LaTeX{} on % the latter, you can generate a nice solution book. +% +% In \emph{local mode} (invoked by specifying the package option 'local'), +% this corresponds to reading in the saved solutions in the current +% document at a later stage in the text. % -% Why use \exsol{}? +% \subsection{Why use \exsol{}?} % \begin{itemize} % \item It allows to keep the \LaTeX{} source of your exercises and their -% solutions in a single file. Away with the nightmare to keep your -% solutions in sync with the original text. +% solutions together in a single file, next to each other. Away with +% the nightmare to keep your solutions in sync with the exercises. % \item It separates exercises and solutions, allowing you % \begin{itemize} % \item to only release the solution book to the instructors of the -% course; -% \item to encourage students that you provide with the solution -% book to first try solving the exercises without opening the book; -% this seems to be easier than not peeking into the solution of an -% exercise that is typeset just below the exercise itself. +% course (using global mode); +% \item to encourage students that you provide with the solutions +% separated from the exercises to first try solving the exercises +% without peeking into the list of solutions (or the solution book). % \end{itemize} % \end{itemize} -% +% +% \subsection{Credits} % The code of the \exsol{} package was taken almost literally -% from \textsf{fancyvrb} \cite{fancyvrb}. Therefore, all credits go to the -% authors/maintainers of \textsf{fancyvrb}. -% -% Thanks to Pieter Pareit and Pekka Pere for signaling problems and -% making suggestions for the documentation. +% from \textsf{fancyvrb} \cite{fancyvrb}. Therefore, all credits go to +% the authors/maintainers of \textsf{fancyvrb}. +% +% Thanks to Paul Levrie, Pieter Pareit, Pekka Pere, Benjamin +% Grinstein and Philippe Marti for signaling problems and making +% suggestions for the improvement of the package and the +% documentation. +% +% \subsection{Note} +% As of version 1.2, the package also contains facilities for +% generating a formula collection. The only limitation is that +% exercises and solutions cannot be part of the formula collection. +% Though this is a restriction, it is not a severe one in my +% opinion. Formula collections should be as concise as they can be. +% +% Though generating formula collections goes beyond exercises and +% solutions, I chose not to change the package's name +% \exsol{}. Einstein's name was also not changed into Relativistic +% Einstein when he got to understand the theory of relativity. % % \section{Installation} -% %%%%%%%%%%%%%%%%%%%%%% +% %%%%%%%%%%%%%%%%%%%%%%%% % Either you are a package manager and then you'll know how to % prepare an installation package for \exsol{}. % % Either you are a normal user and then you have two options. First, % check if there is a package that your favorite \LaTeX{} % distributor has prepared for you. Second, grab the TDS package -% from CTAN \cite{CTAN} (\texttt{exsol.tds.zip}) and unzip it somewhere in your -% own TDS tree, regenerate your filename database and off you go. -% In any case, make sure that \LaTeX{} finds the \texttt{exsol.sty} file. -% -% The \exsol{} package uses some auxiliary packages: \textsf{fancyvrb}, +% from CTAN \cite{CTAN} (|exsol.tds.zip|) and unzip it +% somewhere in your own TDS tree, regenerate your filename database +% and off you go. +% In any case, make sure that \LaTeX{} finds the |exsol.sty| +% file. +% +% The \exsol{} package uses some auxiliary packages: +% \textsf{fancyvrb}, % \textsf{ifthen}, \textsf{kvoptions} and, optionally, % \textsf{babel}. Fetch them from CTAN \cite{CTAN} if your \TeX{} % distributor does not provide them. % % \section{Usage} -% %%%%%%%%%%%%%%% +% %%%%%%%%%%%%%%%%% % % \subsection{Preparing your document source} -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \subsubsection{Loading the package} % The macro package exsol can be loaded with: % \begin{verbatim} % \usepackage{exsol} % \end{verbatim} % -% Then, you are ready to add some exercises including their solution -% to your document source. To this end, embed them in a -% \texttt{exercise} and a corresponding \texttt{solution} environment. -% Optionally, you may embed several of them in a \texttt{exercises} -% environment, to make them stand out in your text. -% E.g., +% Your first choice to make is where you want your solutions to +% appear. The primary objective of the exsol package was 'global +% mode', i.e. separating your solutions from the exercises, +% gathering the solutions in a separate book. +% To this end, don't specify the package option '|[local]|', or +% specify '|[local=false]|'. +% +% A second mode of operation is 'local mode'. This allows grouping +% your exercises in series and including them later in your text. +% Gathering exercises in (numbered) series and 'loading' them locally +% in your text, allows for simplifying the +% individual exercise numbers (omitting their prefix containing, +% chapter number, section number, subsection number a.s.o.). +% +% \subsubsection{Global mode - flat grouping exercises} +% Adding exercises together with their solutions in your document is +% easy. Just embed them in a +% |exercise| and a corresponding |solution| environment. +% Optionally, you may embed several of them in a |exercises| +% environment to make them stand out in your text. % -% \begin{VerbatimOut}{exsol.tmp} -% -% \begin{exercises} +% \begin{verbatim} +% \begin{exercises}[columns=2] % % \begin{exercise} -% Solve the following equation for $x \in C$, with $C$ the set of -% complex numbers: -% \begin{equation} -% 5 x^2 -3 x = 5 -% \end{equation} -% \end{exercise} +% Calculate $y = 5 + 7$ +% \end{exercises} % \begin{solution} -% Let's start by rearranging the equation, a bit: -% \begin{eqnarray} -% 5.7 x^2 - 3.1 x &=& 5.3\\ -% 5.7 x^2 - 3.1 x -5.3 &=& 0 -% \end{eqnarray} -% The equation is now in the standard form: -% \begin{equation} -% a x^2 + b x + c = 0 -% \end{equation} -% For quadratic equations in the standard form, we know that two -% solutions exist: -% \begin{equation} -% x_{1,2} = \frac{ -b \pm \sqrt{d}}{2a} -% \end{equation} -% with -% \begin{equation} -% d = b^2 - 4 a c -% \end{equation} -% If we apply this to our case, we obtain: -% \begin{equation} -% d = (-3.1)^2 - 4 \cdot 5.7 \cdot (-5.3) = 130.45 -% \end{equation} -% and -% \begin{eqnarray} -% x_1 &=& \frac{3.1 + \sqrt{130.45}}{11.4} = 1.27\\ -% x_2 &=& \frac{3.1 - \sqrt{130.45}}{11.4} = -0.73 -% \end{eqnarray} -% The proposed values $x = x_1, x_2$ are solutions to the given equation. +% $y = 12$ % \end{solution} +% % \begin{exercise} -% Consider a 2-dimensional vector space equipped with a Euclidean -% distance function. Given a right-angled triangle, with the sides -% $A$ and $B$ adjacent to the right angle having lengths, $3$ and -% $4$, calculate the length of the hypotenuse, labeled $C$. -% \end{exercise} +% Calculate $y = 7 - 12$ +% \end{exercises} % \begin{solution} -% This calls for application of Pythagoras' theorem, which -% tells us: -% \begin{equation} -% \left\|A\right\|^2 + \left\|B\right\|^2 = \left\|C\right\|^2 -% \end{equation} -% and therefore: -% \begin{eqnarray} -% \left\|C\right\| -% &=& \sqrt{\left\|A\right\|^2 + \left\|B\right\|^2}\\ -% &=& \sqrt{3^2 + 4^2}\\ -% &=& \sqrt{25} = 5 -% \end{eqnarray} -% Therefore, the length of the hypotenuse equals $5$. +% $y = -5$ % \end{solution} % % \end{exercises} -% \end{VerbatimOut} -% \VerbatimInput[frame=lines,gobble=2,fontsize=\footnotesize]{exsol.tmp} +% \end{verbatim} +% +% The optional argument of the exercises environment allows specifying +% the typesetting in multiple columns. +% +% On how to generate a solution book, take a look at the examples in +% section~\ref{examplesglobal}. +% +% \subsubsection{Local mode - grouping of exercises in series} +% One might also consider to keep the solutions in the same text, in +% local mode. In this case, we advise to gather the exercises in +% series (e.g. according to their degree of difficulty). This can be +% done by using the |exerciseseries| environment instead of the +% |exercises| environment. +% This environment takes and also takes a +% mandatory label argument. +% In addition it takes two optional arguments: +% \begin{itemize} +% \item |columns| to specify the amount of clumns +% \item |exsubrule| to specify the creation of a horizontal rule below +% the exercise series. +% \item |solsubrule| to specify the creation of a horizontal rule below +% the solution series. +% \item |subrule| to specify the creation of a horizontal rule below +% the exercise and the solution series. +% \end{itemize} +% +% +% \begin{verbatim} +% \begin{exerciseseries}[columns=2,subrule=\hrule]{Easy exercises} +% +% \begin{exercise} +% Calculate $y = 5 + 7$ +% \end{exercises} +% \begin{solution} +% $y = 12$ +% \end{solution} +% +% \begin{exercise} +% Calculate $y = 7 - 12$ +% \end{exercises} +% \begin{solution} +% $y = -5$ +% \end{solution} +% +% \end{exerciseseries} % -% The result in the original document, can be seen below. As you can -% see, there's no trace of the solution. +% \begin{exerciseseries}{Difficult exercises} % -% \input{exsol.tmp} +% \begin{exercise} +% Calculate $y = 5 \cdot 7$ +% \end{exercises} +% \begin{solution} +% $y = 35$ +% \end{solution} % -% When running \LaTeX{} on your document (in our case on the -% \texttt{exsol.dtx} file, as a side effect a file with extension -% \texttt{.sol.tex} has been written to disk (in our case, the file -% \texttt{exsol.sol.tex}), containing all solutions in sequence. +% \begin{exercise} +% Calculate $y = 8 / 4$ +% \end{exercises} +% \begin{solution} +% $y = 2$ +% \end{solution} % -% Generating a solution book is a simple as including the file into a -% simple \LaTeX{} harness, that allows you giving it a proper title page and to -% add other bells and whistles. +% \end{exerciseseries} +% \end{verbatim} % -% E.g., -% \begin{VerbatimOut}{exsol-solutionbook.tex} -% \documentclass{article} -% \usepackage[english]{babel} -% \title{Solutions to the exercises, specified in the \textsf{ExSol} package} -% \author{Walter Daems} -% \date{2013/05/12} % -% \begin{document} % -% \maketitle +% \subsection{Examples} % -% \input{exsol.sol} +% \subsubsection{Global mode} +% \label{examplesglobal} +% Below, you can find an example of a file that contains a number of +% exercises and solutions, with the goal to generate a separate +% solution book. % -% \end{document} -% \end{VerbatimOut} -% \VerbatimInput[frame=lines,gobble=2,fontsize=\footnotesize]{exsol-solutionbook.tex} +% \begin{Verbatim}[fontsize=\footnotesize] +%<*example> +\documentclass[a4paper,10pt]{article} + +\usepackage{a4wide} +\usepackage[english]{babel} +\usepackage[copyexercisesinsolutions]{exsol} + +\title{Gobal example, from the \textsf{ExSol} package} +\author{Walter Daems} +\setlength{\parindent}{0em} +\begin{document} +\maketitle + +\section{Introduction} + +In this text we explain how to wolve second-order polynomial +equations. + +\section{Solving second-order polynomial equations} + +\begin{informulacollectiononly} +\section*{Solving second-order polynomial equations} +\end{informulacollectiononly} +\begin{informulacollection} + The roots of the following equation + \begin{equation} + a x^2 + bx + c = 0 + \end{equation} + can be determined as: + \begin{equation} + x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4 a c}}{2 a} + \end{equation} +\end{informulacollection} + +\begin{exercises}[columns = 2] + + \begin{exercise} + Solve the following equation for $x \in C$, with $C$ the set of + complex numbers: + \begin{equation} + 5 x^2 -3 x = 5 + \end{equation} + \end{exercise} + \begin{solution} + Let's start by rearranging the equation, a bit: + \begin{eqnarray} + 5.7 x^2 - 3.1 x &=& 5.3\\ + 5.7 x^2 - 3.1 x -5.3 &=& 0 + \end{eqnarray} + The equation is now in the standard form: + \begin{equation} + a x^2 + b x + c = 0 + \end{equation} + For quadratic equations in the standard form, we know that two + solutions exist: + \begin{equation} + x_{1,2} = \frac{ -b \pm \sqrt{d}}{2a} + \end{equation} + with + \begin{equation} + d = b^2 - 4 a c + \end{equation} + If we apply this to our case, we obtain: + \begin{equation} + d = (-3.1)^2 - 4 \cdot 5.7 \cdot (-5.3) = 130.45 + \end{equation} + and + \begin{eqnarray} + x_1 &=& \frac{3.1 + \sqrt{130.45}}{11.4} = 1.27\\ + x_2 &=& \frac{3.1 - \sqrt{130.45}}{11.4} = -0.73 + \end{eqnarray} + The proposed values $x = x_1, x_2$ are solutions to the given equation. + \end{solution} + \begin{exercise} + Consider a 2-dimensional vector space equipped with a Euclidean + distance function. Given a right-angled triangle, with the sides + $A$ and $B$ adjacent to the right angle having lengths, $3$ and + $4$, calculate the length of the hypotenuse, labeled $C$. + \end{exercise} + \begin{solution} + This calls for application of Pythagoras' theorem, which + tells us: + \begin{equation} + \left\|A\right\|^2 + \left\|B\right\|^2 = \left\|C\right\|^2 + \end{equation} + and therefore: + \begin{eqnarray} + \left\|C\right\| + &=& \sqrt{\left\|A\right\|^2 + \left\|B\right\|^2}\\ + &=& \sqrt{3^2 + 4^2}\\ + &=& \sqrt{25} = 5 + \end{eqnarray} + Therefore, the length of the hypotenuse equals $5$. + \end{solution} + +\end{exercises} + +\end{document} +% +%\end{Verbatim} +% +% The result in the original document, can be seen in the file +% |example.pdf|. As you can see, the formulacollection entry and the +% exercise appear. There's no trace of the solution. +% +% When running \LaTeX{} on your document (e.g., the file example.tex +% as part of the exsol package, as a side effect files with the +% extension |.sol.tex| and |.fc.tex| have been written +% to disk (in our case, the files |example.sol.tex| and +% |example.fc.tex|), containing all solutions and entries for +% the formula collection in sequence. +% +% Generating a solution book is as simple as including the solution +% file into a simple \LaTeX{} harness, that allows you giving it a +% proper title page and to add other bells and whistles. +% This can be seen below: +% +% \begin{Verbatim}[fontsize=\footnotesize] +%<*examplesol> +\documentclass[a4paper,10pt]{article} + +\usepackage{a4wide} +\usepackage[english]{babel} +\usepackage{exsol} + +\setlength{\parindent}{0em} + +\title{Solutions to the exercises, specified in the example of the + \textsf{ExSol} package} +\author{Walter Daems} + +\begin{document} + +\maketitle + +\input{example.sol.tex} + +\end{document} +% +% \end{Verbatim} +% +% Generating a formula collection is as simple as including the +% formula collectoin file into a simple \LaTeX{} harness, that allows +% you giving it a proper title page and to add other bells and +% whistles. +% This can be seen below: % -% You may generate this solution book, by running \LaTeX{} on the -% file named \texttt{exsol-solutionbook.tex} that is generated when running -% \LaTeX{} on the \texttt{exsol.dtx} file. -% -% The result approximately looks like this: -% -% \setcounter{equation}{0} -% \rule{\linewidth}{.7pt} -% \begin{center} -% {\Large Solutions to the exercises, specified in the \textsf{ExSol} package}\\ -% {\large Walter Daems}\\ -% {\large 2013/05/12} -% \end{center} -% \par---\newline\textbf{Solution 3.1-1} -% Let's start by rearranging the equation, a bit: -% \begin{eqnarray} -% 5.7 x^2 - 3.1 x &=% 5.3\\ -% 5.7 x^2 - 3.1 x -5.3 &=% 0 -% \end{eqnarray} -% The equation is now in the standard form: -% \begin{equation} -% a x^2 + b x + c = 0 -% \end{equation} -% For quadratic equations in the standard form, we know that two -% solutions exist: -% \begin{equation} -% x_{1,2} = \frac{ -b \pm \sqrt{d}}{2a} -% \end{equation} -% with -% \begin{equation} -% d = b^2 - 4 a c -% \end{equation} -% If we apply this to our case, we obtain: -% \begin{equation} -% d = (-3.1)^2 - 4 \cdot 5.7 \cdot (-5.3) = 130.45 -% \end{equation} -% and -% \begin{eqnarray} -% x_1 &=& \frac{3.1 + \sqrt{130.45}}{11.4} = 1.27\\ -% x_2 &=& \frac{3.1 + \sqrt{130.45}}{11.4} = -0.73 -% \end{eqnarray} -% The proposed values $x = x_1, x_2$ are solutions to -% the given equation. -% \par---\newline\textbf{Solution 3.1-2} -% This calls for application of Pythagoras' theorem, which -% tells us: -% \begin{equation} -% \left\|A\right\|^2 + \left\|B\right\|^2 = \left\|C\right\|^2 -% \end{equation} -% and therefore: -% \begin{eqnarray} -% \left\|C\right\| -% &=& \sqrt{\left\|A\right\|^2 + \left\|B\right\|^2}\\ -% &=& \sqrt{3^2 + 4^2}\\ -% &=& \sqrt{25} = 5 -% \end{eqnarray} -% Therefore, the length of the hypotenuse equals $5$. -% -% \rule{\linewidth}{.7pt} +% \begin{Verbatim}[fontsize=\footnotesize] +%<*examplefor> +\documentclass[a4paper,10pt]{article} + +\usepackage{a4wide} +\usepackage[english]{babel} +\usepackage{exsol} + +\setlength{\parindent}{0em} + +\title{Formula collection, specified in the example of the + \textsf{ExSol} package} +\author{Walter Daems} + +\begin{document} + +\maketitle + +\input{example.fc.tex} + +\end{document} +% +% \end{Verbatim} +% +% \subsubsection{Local mode} +% +% Below, you can find an example of a file that contains a number of +% exercises and solutions, with the goal to include them later in the +% same document. +% This is done by issuing the |loadSolutions| macro at the very end of +% the file. This macro can be called multiple times and will gobble up +% and include all solutions so far. As a consequence the solutions +% file is emptied and can be filled again by specifying new +% exercise/solution pairs. +% +% +% \begin{Verbatim}[fontsize=\footnotesize] +%<*example-local> +\documentclass[a4paper,10pt]{article} + +\usepackage{a4wide} +\usepackage[german]{babel} +\usepackage[local,nolabels,exerciseaslist]{exsol} +\usepackage{enumitem} + +\setlength{\exsolexercisetopbottomsep}{0pt plus 0pt minus 1pt} +\setlength{\exsolexerciseleftmargin}{2em} +\setlength{\exsolexerciserightmargin}{1em} +\setlength{\exsolexerciseparindent}{0em} +\setlength{\exsolexerciselabelsep}{1ex} +\setlength{\exsolexerciselabelwidth}{30pt} +\setlength{\exsolexerciseitemindent}{0pt} +\setlength{\exsolexerciseparsep}{\parskip} + +\title{Local example, from the \textsf{ExSol} package} +\author{Philippe Marti} +\setlength{\parindent}{0em} +\begin{document} +\maketitle + +\section{\exercisesname} + +\begin{exerciseseries}[columns=2,solsubrule=\hrule]{Gleichungen $|$ Gleichungssysteme} + + \begin{exercise} + Die Summe zweier Zahlen ist 17 und ihre Differenz 7. Bestimme die + beiden Zahlen! + \end{exercise} + \begin{solution} + 5 und 12 + \end{solution} + + \begin{exercise} + Die Differenz einer Zahl und dem Dreifachen einer zweiten Zahl ist + 14. Bestimme die beiden Zahlen, falls die zweite Zahl ein Zehntel + der ersten ist. + \end{exercise} + \begin{solution} + 20 und 2 + \end{solution} + +\end{exerciseseries} + +\begin{exerciseseries}[columns=2]{Geraden} + \begin{exercise} + Berechne den Schnittpunkt von \mbox{$y=3x+1$} und \mbox{$y=3x-7$}. + \end{exercise} + \begin{solution} + Es gibt keinen Schnittpunkt + \end{solution} + + \begin{exercise} + Die Familie Meier fordert Offerten f\"ur eine Heizungsreparatur + ein. Firma A berechnet f\"ur die Fahrtkosten Fr. 42.- und f\"ur + jede Arbeitsstunde 76.-. Bei der Firma B sind die Fahrtkosten + Fr. 35.- und jede Arbeitsstunde wird mit Fr. 80.- berechnet. + \begin{enumerate}[label=\alph*)] + \item Welche Kosten entstehen f\"ur beide Firmen, wenn ein Monteur + 3.5 Stunden + f\"ur die Arbeit benötigt? Welche Firma ist in diesem Fall + kostengünstiger? + + \item Wie lauten die Gleichungen derjenigen zwei linearen + Funktionen, die jeder Arbeitszeit $x$ (in Stunden) die + entstehenden Kosten $y$ (in Franken) zuordnet? + + \item Berechne, bei welcher Arbeitszeit die Kosten bei beiden + Firmen gleich sind. + \end{enumerate} + \end{exercise} + \begin{solution} + \begin{enumerate}[label=\alph*)] + \item Firma A: 308.- $|$ Firma B: 315.- + \item A: $y=76x+42$ $|$ B: $y=80x+35$ + \item Bei $1\frac{3}{4}$ Stunden + \end{enumerate} + \end{solution} +\end{exerciseseries} + +\section{\solutionsname} +\loadSolutions + +\end{document} +% +% \end{Verbatim} % % \subsection{Fiddling with the spacing} % % The default spacing provided by the \textsf{ExSol} package should be % fine for most users. However, if you like to tweak, below you can % find the controls. +% +% As the formula collection generation is intended to interfere as +% little as possible with the flow of the main document, you will +% notice that it is impossible to control the extra spacing, as no +% extra spacing should originate from using the +% |informulacollection| environment. +% % \subsubsection{Spacing before and after the \texttt{exercises} environment} % % The lengths below control the spacing of the |exercises| environment: @@ -403,8 +668,8 @@ % \subsection{Tips and tricks} % % If you want to include the solutions all at the -% end of the current document, you need to explicitly close the -% solution stream before including it: +% end of the current document in global mode, you need to explicitly +% close the solution stream before including it: % \begin{verbatim} % \closeout\solutionstream\input{\jobname.sol.tex} % \end{verbatim} @@ -425,23 +690,47 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The package uses some auxiliary packages: % \begin{macrocode} +\RequirePackage{ifmtarg} \RequirePackage{fancyvrb} \RequirePackage{ifthen} \RequirePackage{kvoptions} +\RequirePackage{multicol} % \end{macrocode} % % \subsection{Package options} % %%%%%%%%%%%%%%%%%%%%%%%%%%%% % The package offers some options: % +% \changes{v1.2}{2016/05/05}{Added option local} +% \begin{macro}{local} +% This boolean option (true, false) allows setting the mode of the +% package into local, i.e. that the numbering of the exercises is not +% related to the position in the document, but uses it's own local +% counter in combination with a exerciseseries counter. +% \begin{macrocode} +\DeclareBoolOption[false]{local} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2}{2016/05/05}{Added option nolabels} +% \begin{macro}{nolabels} +% This boolean option (true, false) allows suppressing the 'Exercise' +% and 'Solution' label that normally appear before the exercise and +% solution number. +% \begin{macrocode} +\DeclareBoolOption[false]{nolabels} +% \end{macrocode} +% \end{macro} +% % \changes{v0.2}{2012/01/06}{Added option exercisesfont} -% \changes{v0.4}{2012/01/09}{Changed name of option to exercisesfontsize} +% \changes{v0.4}{2012/01/09}{Changed name of option to +% exercisesfontsize} % % \begin{macro}{exercisesfontsize} -% This option allows setting the font of the \texttt{exercises} +% This option allows setting the font of the |exercises| % environment. You may chopse one of tiny, scriptsize, footnotesize, % small, normalsize, large, etc.\\ -% E.g., \texttt{[exercisesfontsize=small]}. +% E.g., |[exercisesfontsize=small]|. % \begin{macrocode} \DeclareStringOption[normalsize]{exercisesfontsize} % \end{macrocode} @@ -452,7 +741,7 @@ % % \begin{macro}{exerciseaslist} % This boolean option (true, false) allows setting the typesetting of -% the \texttt{exercises} in a list environment. This causes the +% the |exercises| in a list environment. This causes the % exercises to be typeset in a more compact fashion, with indented % left and right margin. % \begin{macrocode} @@ -501,9 +790,9 @@ % First some lengths to control the spacing before and after |exercises|. % \begin{macrocode} \newlength{\exsolexercisesaboveskip} -\setlength{\exsolexercisesaboveskip}{1ex plus 1pt minus 1pt} +\setlength{\exsolexercisesaboveskip}{0ex plus 1pt minus 1pt} \newlength{\exsolexercisesbelowskip} -\setlength{\exsolexercisesbelowskip}{1ex plus 1pt minus 1pt} +\setlength{\exsolexercisesbelowskip}{0ex plus 1pt minus 1pt} % \end{macrocode} % % Then some lengths to control the spacing for a single @@ -538,16 +827,50 @@ % spot to avoid consuming all handles} % \begin{macrocode} \AtBeginDocument{ + \typeout{Writing solutions to solution file \jobname.sol.tex} \newwrite\solutionstream \immediate\openout\solutionstream=\jobname.sol.tex + \typeout{Using intermediate exercise file \jobname.exc.tex} \newwrite\exercisestream + \typeout{Writing formulae to formula collection file \jobname.fc.tex} + \newwrite\formulacollectionstream + \immediate\openout\formulacollectionstream=\jobname.fc.tex + \typeout{Using intermediate formula file \jobname.for.tex} + \newwrite\formulastream } \AtEndDocument{ + \immediate\closeout\formulacollectionstream \immediate\closeout\solutionstream } % \end{macrocode} % -% \subsection{Exercises counter} +% +% In local mode we also want to close the solutionstream, read it and +% open it again: +% \begin{macrocode} +\newcommand\loadSolutions{ + \immediate\closeout\solutionstream + \input{\jobname.sol.tex} +% \immediate\openout\solutionstream=\jobname.sol.tex +} +% \end{macrocode} +% +% \subsection{Series counter} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% By providing an exerciseseries counter, proper numbering of the +% exercise series is provided. Note that separate series, render the +% numbering of the exercises from document-global, to series-local, +% therefore hindering the concordance of solutions to exercises. +% +% \changes{v1.2}{2016/05/05}{Added series counter} +% \begin{macrocode} +\newcounter{exerciseseries}[subsubsection] +\setcounter{exerciseseries}{0} +\renewcommand{\theexerciseseries}{\arabic{exerciseseries}} +% \end{macrocode} +% +% +% \subsection{Exercise counter} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % By providing an exercise counter, proper numbering of the exercises % is provided to allow for good cross referencing of the solutions to @@ -555,24 +878,27 @@ % \changes{v0.2}{2012/01/06}{Removed dash in counter when in document % without sectioning commands} % \begin{macrocode} -\newcounter{exercise}[subsection] +\newcounter{exercise}[exerciseseries] \setcounter{exercise}{0} \renewcommand{\theexercise}{% + \ifexsol@local + \arabic{exerciseseries}.\arabic{exercise}% + \else \@ifundefined{c@chapter}{}{\if0\arabic{chapter}\else\arabic{chapter}.\fi}% \if0\arabic{section}\else\arabic{section}\fi% \if0\arabic{subsection}\else.\arabic{subsection}\fi% \if0\arabic{subsubsection}\else.\arabic{subsubsection}\fi% \if0\arabic{exercise}\else% - \@ifundefined{c@chapter}% - {\if0\arabic{section}\else-\fi}% - {-}% - \arabic{exercise}% + \@ifundefined{c@chapter}% + {\if0\arabic{section}\else-\fi}% + {-}% + \arabic{exercise}% + \fi \fi } % \end{macrocode} % % -% % \subsection{Detokenization in order to cope with utf8} % % Combining old-school \LaTeX{} (before \XeTeX{} and \LuaTeX{}) and @@ -580,6 +906,8 @@ % Detokenization has been suggested by Geoffrey Poore to solve issues % with UTF-8 characters messing up the |fancyvrb| internals. % \changes{v0.7}{2014/07/14}{Added detokenized writing} +% \changes{v1.0}{2014/09/13}{Added detokenized writing of formula and +% formula collection stream} % \begin{macrocode} \newcommand{\GPES@write@detok}[1]{% \immediate\write\exercisestream{\detokenize{#1}}}% @@ -588,16 +916,21 @@ \newcommand{\GPESS@write@detok}[1]{% \GPES@write@detok{#1}% \GPSS@write@detok{#1}}% +\newcommand{\GPFORCOL@write@detok}[1]{% + \immediate\write\formulacollectionstream{\detokenize{#1}}% + \immediate\write\formulastream{\detokenize{#1}}}% +\newcommand{\GPFORCOLONLY@write@detok}[1]{% + \immediate\write\formulacollectionstream{\detokenize{#1}}}% % \end{macrocode} % % % \section{The user environments} % % \begin{macro}{exercise} -% The \texttt{exercise} environment is used to typeset your +% The |exercise| environment is used to typeset your % exercises, provide them with a nice label and allow for copying % the exercise to the solutions file (if the package option -% \texttt{copyexercisesinsolution}) is set. The label can be +% |copyexercisesinsolution|) is set. The label can be % set by redefining the \cs{exercisename} macro, or by relying on % the \textsf{Babel} provisions. The code is almost litteraly % taken from the \textsf{fancyvrb} package. @@ -606,14 +939,18 @@ \def\FVB@exercise{% \refstepcounter{exercise}% \immediate\openout\exercisestream=\jobname.exc.tex - \ifexsol@copyexercisesinsolutions - \typeout{Writing exercise to \jobname.sol.tex} - \immediate\write\solutionstream{\string\par---\string\newline - \string\textbf\string{\exercisename{} \theexercise \string}} + \ifexsol@local +% \immediate\write\solutionstream{} \else - \immediate\write\solutionstream{\string\par---\string\newline} +% \immediate\write\solutionstream{\string\vspace*\string{2ex\string}% +% \string\quad\string\newline} + \fi + \ifexsol@copyexercisesinsolutions + % WDSC tofix + % \typeout{Writing exercise to \jobname.sol.tex} + \immediate\write\solutionstream{\string\begin{exsol@exercise}{\theexercise}} \fi - \immediate\write\exercisestream{\string\begin{exsol@exercise}} + \immediate\write\exercisestream{\string\begin{exsol@exercise}{\theexercise}} \@bsphack \begingroup \FV@UseKeyValues @@ -634,7 +971,7 @@ \endgroup\@esphack \immediate\write\exercisestream{\string\end{exsol@exercise}} \ifexsol@copyexercisesinsolutions - \immediate\write\solutionstream{\string~\string\newline} + \immediate\write\solutionstream{\string\end{exsol@exercise}} \fi \immediate\closeout\exercisestream \input{\jobname.exc.tex} @@ -644,10 +981,10 @@ % \end{macro} % % \begin{macro}{exsol@exercise} -% The \texttt{exsol@exercise} environment is an internal macro used +% The |exsol@exercise| environment is an internal macro used % to typeset your exercises and provide them with a nice label and % number. Do not use it directly. Use the proper environment -% \texttt{exercise} instead. +% |exercise| instead. % \changes{v0.2}{2012/01/06}{Attempted to fix MiKTeX formatting problems} % \changes{v0.3}{2012/01/08}{Fixed labelsep to avoid cluttered % itemize environments} @@ -656,7 +993,7 @@ % \changes{v0.5}{2012/01/09}{Changed implementation to allow for % copying the exercises to the solutions file.} % \begin{macrocode} -\newenvironment{exsol@exercise}[0] +\newenvironment{exsol@exercise}[1] {% \ifthenelse{\boolean{exsol@minipage}}{\begin{minipage}[t]{\textwidth}}{}% \ifthenelse{\boolean{exsol@exerciseaslist}} @@ -672,9 +1009,11 @@ \setlength{\parsep}{\exsolexerciseparsep} \setlength{\labelsep}{\exsolexerciselabelsep} \setlength{\labelwidth}{\exsolexerciselabelwidth}} - \item[\textit{~\exercisename{} \theexercise:~}] + \item[\ifexsol@nolabels~#1:\else% + \subparagraph{\exercisename{}~#1:}\fi] }% - {\textit{\exercisename{} \theexercise:}} + {\ifexsol@nolabels #1:\else% + \subparagraph{\exercisename{}~#1:}\fi} } {% \ifthenelse{\boolean{exsol@exerciseaslist}}% @@ -686,7 +1025,7 @@ % % % \begin{macro}{solution} -% The \texttt{solution} environment is used to typeset your solutions +% The |solution| environment is used to typeset your solutions % and provide them with a nice label and number that corresponds to % the exercise that preceeded this solution. Theno label can be % set by redefining the \cs{solutionname} macro, or by relying on @@ -695,13 +1034,11 @@ % \begin{macrocode} \def\solution{\FV@Environment{}{solution}} \def\FVB@solution{% - \typeout{Writing solution to \jobname.sol.tex} - \immediate\write\solutionstream{\string\textbf\string{\solutionname{}\string}} + %\typeout{Writing solution to \jobname.sol.tex} \ifexsol@copyexercisesinsolutions - \immediate\write\solutionstream{\string\newline} + \immediate\write\solutionstream{\string\begin{exsol@solution}{}} \else - \immediate\write\solutionstream{\string\textbf\string{\theexercise\string}% - \string\newline} + \immediate\write\solutionstream{\string\begin{exsol@solution}{\theexercise}} \fi \@bsphack \begingroup @@ -715,60 +1052,195 @@ \let\@noligs\relax \FV@Scan } -\def\FVE@solution{\endgroup\@esphack} +\def\FVE@solution{ + \endgroup\@esphack + \immediate\write\solutionstream{\string\end{exsol@solution}} +} \DefineVerbatimEnvironment{solution}{solution}{} % \end{macrocode} % \end{macro} % +% \begin{macro}{exsol@solution} +% The |exsol@solution| environment is an internal macro used +% to typeset your solutions. Do not use it directly. Use the proper +% environment |solution| instead. +% \changes{v1.2}{2016/05/05}{Added |exsol@solution| environment for +% improved control on solution typesetting} +% \begin{macrocode} +\newenvironment{exsol@solution}[1] +{% + \ifthenelse{\boolean{exsol@minipage}}{\begin{minipage}[t]{\textwidth}}{}% + \ifthenelse{\boolean{exsol@exerciseaslist}} + {\begin{list}% + {% + }% + {% + \setlength{\topsep}{\exsolexercisetopbottomsep}% + \setlength{\leftmargin}{\exsolexerciseleftmargin}% + \setlength{\rightmargin}{\exsolexerciserightmargin}% + \setlength{\listparindent}{\exsolexerciseparindent}% + \setlength{\itemindent}{\exsolexerciseitemindent}% + \setlength{\parsep}{\exsolexerciseparsep} + \setlength{\labelsep}{\exsolexerciselabelsep} + \setlength{\labelwidth}{\exsolexerciselabelwidth}} + \item[\ifexsol@nolabels #1:\else% + \subparagraph{\solutionname{}\@ifmtarg{#1}{}{~}#1:}\fi] + }% + {\ifexsol@nolabels #1:\else% + \subparagraph{\solutionname{}\@ifmtarg{#1}{}{~}#1:}\fi} + } + {% + \ifthenelse{\boolean{exsol@exerciseaslist}}% + {\end{list}}{}% + \ifthenelse{\boolean{exsol@minipage}}{\end{minipage}}{\par}% +} +% \end{macrocode} +% \end{macro} +% +% % \begin{macro}{exercises} -% The \texttt{exercises} environment helps typesetting your exercises to +% The |exercises| environment helps typesetting your exercises to % stand out from the rest of the text. You may use it at the end of % a chapter, or just to group some exercises in the text. % \changes{v0.2}{2012/01/06}{Attempted to fix MiKTeX formatting problems} -% \changes{v0.3}{2012/01/07}{Added some extra whitespace below exercisesname} +% \changes{v0.3}{2012/01/07}{Added some extra whitespace below +% exercisesname} +% \changes{v1.2}{2016/05/05}{Added multicolumn feature} % \begin{macrocode} -\newenvironment{exercises} -{\par\exercisesfontsize\rule{.25\linewidth}{0.15mm}\vspace*{\exsolexercisesaboveskip}\\*% - \textbf{\normalsize \exercisesname}} -{\vspace*{-\baselineskip}\vspace*{\exsolexercisesbelowskip}\rule{.25\linewidth}{0.15mm}\par} +\define@key{exercises}{columns}{\renewcommand\columncount{#1}} +\define@key{exercises}{exsubrule}{\renewcommand\exsubrule{#1}} +\define@key{exercises}{solsubrule}{\renewcommand\solsubrule{#1}} +\define@key{exercises}{subrule}{\renewcommand\exsubrule{#1}\renewcommand\solsubrule{#1}} +\newenvironment{exercises}[1][] +{ + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exercises}{#1} + \par\exercisesfontsize\rule{.25\linewidth}{0.15mm}% + \vspace*{\exsolexercisesaboveskip}% + \paragraph{\exercisesname}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax + \vspace*{-\baselineskip}\vspace*{\exsolexercisesbelowskip}% + %\rule{.25\linewidth}{0.15mm} + \exsubrule\par} % \end{macrocode} % \end{macro} -% -% \subsection{Some Babel provisions} -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \changes{v0.2}{2012/01/06}{Fixed babel errors} -% \begin{macro}{\exercisename} -% The exercise environment makes use of a label \texttt{\exercisename{}} -% macro. +% +% \changes{v1.2}{2016/05/05}{Added exerciseseries environment} +% \begin{macro}{exerciseseries} +% The |exerciseseries| environment helps typesetting your +% exercises in series. % \begin{macrocode} -\newcommand{\exercisename}{Exercise} +\define@key{exerciseseries}{columns}{\renewcommand\columncount{#1}} +\define@key{exerciseseries}{exsubrule}{\renewcommand\exsubrule{#1}} +\define@key{exerciseseries}{solsubrule}{\renewcommand\solsubrule{#1}} +\define@key{exerciseseries}{subrule}{\renewcommand\exsubrule{#1}\renewcommand\solsubrule{#1}} +\newenvironment{exerciseseries}[2][] +{ + \refstepcounter{exerciseseries}% + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exerciseseries}{#1} + \paragraph{\seriesname~\theexerciseseries:~#2}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + \immediate\write\solutionstream{\string\begin\string{solutionseries\string}% + \string[#1\string]\string{#2\string}\string{\theexerciseseries\string}} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax + \exsubrule\par + \immediate\write\solutionstream{\string\end\string{solutionseries\string}} +} +\newenvironment{solutionseries}[3][] +{ + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exercises}{#1} + \paragraph{\seriesname~#3}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{} + \solsubrule\par +} % \end{macrocode} % \end{macro} -% -% \begin{macro}{\exercisesname} -% The exercises environment makes use of a label \texttt{\exercisesname{}} -% macro. +% +% \begin{macro}{informulacollection} +% The |informulacollection| environment is used to write its +% contents to the formula collection stream and load back into the +% main text for typesetting. The code is almost litteraly +% taken from the \textsf{fancyvrb} package. % \begin{macrocode} -\newcommand{\exercisesname}{Exercises} +\def\informulacollection{\FV@Environment{}{informulacollection}} +\def\FVB@informulacollection{% + \immediate\openout\formulastream=\jobname.for.tex + %\typeout{Writing formula to \jobname.for.tex and \jobname.fc.tex} + \@bsphack + \begingroup + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \let\FV@ProcessLine\GPFORCOL@write@detok % + \relax + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FV@Scan + } +\def\FVE@informulacollection{ + \endgroup\@esphack + \immediate\closeout\formulastream + \input{\jobname.for.tex} +} +\DefineVerbatimEnvironment{informulacollection}{informulacollection}{} % \end{macrocode} % \end{macro} -% -% \begin{macro}{\solutionname} -% The solution environment makes use of a label \texttt{\solutionname{}} -% macro. +% +% \begin{macro}{informulacollectiononly} +% The |informulacollectiononly| environment is used to write its +% contents to the formula collection stream \emph{without} loading +% it back into the main text for typesetting. The code is almost litteraly +% taken from the \textsf{fancyvrb} package. % \begin{macrocode} -\newcommand{\solutionname}{Solution} +\def\informulacollectiononly{\FV@Environment{}{informulacollectiononly}} +\def\FVB@informulacollectiononly{% + %\typeout{Writing special to \jobname.fc.tex} + \@bsphack + \begingroup + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \let\FV@ProcessLine\GPFORCOLONLY@write@detok % + \relax + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FV@Scan + } +\def\FVE@informulacollectiononly{ + \endgroup\@esphack +} +\DefineVerbatimEnvironment{informulacollectiononly}{informulacollectiononly}{} % \end{macrocode} % \end{macro} % -% \begin{macro}{\solutionname} -% The solution environment makes use of a label \texttt{\solutionname{}} -% macro. -% \changes{v0.8}{2014/07/15}{Added missing babel tag} +% \subsection{Some Babel provisions} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \changes{v0.2}{2012/01/06}{Fixed babel errors} % \begin{macrocode} +\newcommand{\exercisename}{Exercise} +\newcommand{\exercisesname}{Exercises} +\newcommand{\solutionname}{Solution} \newcommand{\solutionsname}{Solutions} +\newcommand{\seriesname}{Series} % \end{macrocode} -% \end{macro} % % % You may redefine these macros, but to help you out a little bit, we @@ -777,30 +1249,51 @@ % languages, I'm very willing to incorporate them into the code. % % \changes{v0.7}{2014/07/14}{Added Finnish language support} +% \changes{v1.2}{2016/05/05}{Added Spanish language support} +% \changes{v1.2}{2016/05/05}{Completed German language support +% (i.e. new spelling ngerman) support} % \begin{macrocode} \addto\captionsdutch{% \renewcommand{\exercisename}{Oefening}% \renewcommand{\exercisesname}{Oefeningen}% \renewcommand{\solutionname}{Oplossing}% \renewcommand{\solutionsname}{Oplossingen}% + \renewcommand{\seriesname}{Reeks}% } \addto\captionsgerman{% \renewcommand{\exercisename}{Aufgabe}% \renewcommand{\exercisesname}{Aufgaben}% \renewcommand{\solutionname}{L\"osung}% \renewcommand{\solutionsname}{L\"osungen}% + \renewcommand{\seriesname}{Serie}% +} +\addto\captionsngerman{% + \renewcommand{\exercisename}{Aufgabe}% + \renewcommand{\exercisesname}{Aufgaben}% + \renewcommand{\solutionname}{L\"osung}% + \renewcommand{\solutionsname}{L\"osungen}% + \renewcommand{\seriesname}{Serie}% } \addto\captionsfrench{% \renewcommand{\exercisename}{Exercice}% \renewcommand{\exercisesname}{Exercices}% \renewcommand{\solutionname}{Solution}% \renewcommand{\solutionsname}{Solutions}% + \renewcommand{\seriesname}{Serie}% } \addto\captionsfinnish{ \renewcommand{\exercisename}{Teht\"av\"a}% \renewcommand{\exercisesname}{Teht\"avi\"a}% \renewcommand{\solutionname}{Ratkaisu}% \renewcommand{\solutionsname}{Ratkaisut}% + \renewcommand{\seriesname}{Sarja} +} +\addto\captionsspanish{% + \renewcommand{\exercisename}{Ejercicio}% + \renewcommand{\exercisesname}{Ejercicios}% + \renewcommand{\solutionname}{Soluci\'on}% + \renewcommand{\solutionsname}{Soluciones}% + \renewcommand{\seriesname}{Serie}% } % \end{macrocode} % @@ -809,11 +1302,19 @@ % Now the final hack overloads the basic sectioning commands to make % sure that they are copied into your solution book. % +% \changes{v1.0}{2015/09/16}{Added congruence of chaptercounter of +% main document and chapter counter of exercises document} +% \changes{v1.1}{2015/09/16}{Corrected congruence of chaptercounter of +% main document and chapter counter of exercises document (taking +% intou account alphanumbered chapters} % \begin{macrocode} +\ifexsol@local +\else \let\exsol@@makechapterhead\@makechapterhead \def\@makechapterhead#1{% - \immediate\write\solutionstream{\string\chapter{#1}}% \exsol@@makechapterhead{#1} + \immediate\write\solutionstream{\string\setcounter{chapter}{\arabic{chapter}}% + \string\chapter{#1}}% } \ifdefined\frontmatter \let\exsol@@frontmatter\frontmatter @@ -836,6 +1337,14 @@ \exsol@@backmatter } \fi +\ifdefined\appendix + \let\exsol@@appendix\appendix + \def\appendix{% + \immediate\write\solutionstream{\string\appendix}% + \exsol@@appendix + } +\fi +\fi % \end{macrocode} % % \begin{macro}{\noexercisesinchapter} diff --git a/Master/texmf-dist/source/latex/exsol/exsol.ins b/Master/texmf-dist/source/latex/exsol/exsol.ins index 212df7f3583..f65a0e0aaa3 100644 --- a/Master/texmf-dist/source/latex/exsol/exsol.ins +++ b/Master/texmf-dist/source/latex/exsol/exsol.ins @@ -1,4 +1,4 @@ -%% Copyright (C) 2014 by Walter Daems +%% Copyright (C) 2015 by Walter Daems %% %% This work may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3 of this license @@ -27,7 +27,7 @@ This is a generated file. -Copyright (C) 2014 by Walter Daems +Copyright (C) 2015 by Walter Daems This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license @@ -43,6 +43,11 @@ and version 1.3 or later is part of all distributions of LaTeX version \usedir{tex/latex/exsol} \generate{\file{exsol.sty}{\from{exsol.dtx}{package}}} +\generate{\file{example.tex}{\from{exsol.dtx}{example}}} +\generate{\file{example-solutionbook.tex}{\from{exsol.dtx}{examplesol}}} +\generate{\file{example-formulacollection.tex}{\from{exsol.dtx}{examplefor}}} +\generate{\file{example-local.tex}{\from{exsol.dtx}{example-local}}} + \obeyspaces \Msg{***************************************************************} diff --git a/Master/texmf-dist/tex/latex/exsol/exsol.sty b/Master/texmf-dist/tex/latex/exsol/exsol.sty index 4afcf4b74b8..15b81643381 100644 --- a/Master/texmf-dist/tex/latex/exsol/exsol.sty +++ b/Master/texmf-dist/tex/latex/exsol/exsol.sty @@ -8,7 +8,7 @@ %% %% This is a generated file. %% -%% Copyright (C) 2014 by Walter Daems +%% Copyright (C) 2015 by Walter Daems %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3 of this license @@ -22,10 +22,14 @@ %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{exsol} - [2014/08/31 v0.91 ExSol - Exercises and Solutions package (DMW)] + [2016/05/13 v1.2 ExSol - Exercises and Solutions package (DMW)] +\RequirePackage{ifmtarg} \RequirePackage{fancyvrb} \RequirePackage{ifthen} \RequirePackage{kvoptions} +\RequirePackage{multicol} +\DeclareBoolOption[false]{local} +\DeclareBoolOption[false]{nolabels} \DeclareStringOption[normalsize]{exercisesfontsize} \DeclareBoolOption[false]{exerciseaslist} \DeclareBoolOption[false]{copyexercisesinsolutions} @@ -33,9 +37,9 @@ \ProcessKeyvalOptions* \newcommand{\exercisesfontsize}{\csname \exsol@exercisesfontsize\endcsname} \newlength{\exsolexercisesaboveskip} -\setlength{\exsolexercisesaboveskip}{1ex plus 1pt minus 1pt} +\setlength{\exsolexercisesaboveskip}{0ex plus 1pt minus 1pt} \newlength{\exsolexercisesbelowskip} -\setlength{\exsolexercisesbelowskip}{1ex plus 1pt minus 1pt} +\setlength{\exsolexercisesbelowskip}{0ex plus 1pt minus 1pt} \newlength{\exsolexercisetopbottomsep} \setlength{\exsolexercisetopbottomsep}{0pt plus 0pt minus 1pt} \newlength{\exsolexerciseleftmargin} @@ -53,25 +57,44 @@ \newlength{\exsolexerciseparsep} \setlength{\exsolexerciseparsep}{\parskip} \AtBeginDocument{ + \typeout{Writing solutions to solution file \jobname.sol.tex} \newwrite\solutionstream \immediate\openout\solutionstream=\jobname.sol.tex + \typeout{Using intermediate exercise file \jobname.exc.tex} \newwrite\exercisestream + \typeout{Writing formulae to formula collection file \jobname.fc.tex} + \newwrite\formulacollectionstream + \immediate\openout\formulacollectionstream=\jobname.fc.tex + \typeout{Using intermediate formula file \jobname.for.tex} + \newwrite\formulastream } \AtEndDocument{ + \immediate\closeout\formulacollectionstream \immediate\closeout\solutionstream } -\newcounter{exercise}[subsection] +\newcommand\loadSolutions{ + \immediate\closeout\solutionstream + \input{\jobname.sol.tex} +} +\newcounter{exerciseseries}[subsubsection] +\setcounter{exerciseseries}{0} +\renewcommand{\theexerciseseries}{\arabic{exerciseseries}} +\newcounter{exercise}[exerciseseries] \setcounter{exercise}{0} \renewcommand{\theexercise}{% + \ifexsol@local + \arabic{exerciseseries}.\arabic{exercise}% + \else \@ifundefined{c@chapter}{}{\if0\arabic{chapter}\else\arabic{chapter}.\fi}% \if0\arabic{section}\else\arabic{section}\fi% \if0\arabic{subsection}\else.\arabic{subsection}\fi% \if0\arabic{subsubsection}\else.\arabic{subsubsection}\fi% \if0\arabic{exercise}\else% - \@ifundefined{c@chapter}% - {\if0\arabic{section}\else-\fi}% - {-}% - \arabic{exercise}% + \@ifundefined{c@chapter}% + {\if0\arabic{section}\else-\fi}% + {-}% + \arabic{exercise}% + \fi \fi } \newcommand{\GPES@write@detok}[1]{% @@ -81,18 +104,24 @@ \newcommand{\GPESS@write@detok}[1]{% \GPES@write@detok{#1}% \GPSS@write@detok{#1}}% +\newcommand{\GPFORCOL@write@detok}[1]{% + \immediate\write\formulacollectionstream{\detokenize{#1}}% + \immediate\write\formulastream{\detokenize{#1}}}% +\newcommand{\GPFORCOLONLY@write@detok}[1]{% + \immediate\write\formulacollectionstream{\detokenize{#1}}}% \def\exercise{\FV@Environment{}{exercise}} \def\FVB@exercise{% \refstepcounter{exercise}% \immediate\openout\exercisestream=\jobname.exc.tex - \ifexsol@copyexercisesinsolutions - \typeout{Writing exercise to \jobname.sol.tex} - \immediate\write\solutionstream{\string\par---\string\newline - \string\textbf\string{\exercisename{} \theexercise \string}} + \ifexsol@local \else - \immediate\write\solutionstream{\string\par---\string\newline} \fi - \immediate\write\exercisestream{\string\begin{exsol@exercise}} + \ifexsol@copyexercisesinsolutions + % WDSC tofix + % \typeout{Writing exercise to \jobname.sol.tex} + \immediate\write\solutionstream{\string\begin{exsol@exercise}{\theexercise}} + \fi + \immediate\write\exercisestream{\string\begin{exsol@exercise}{\theexercise}} \@bsphack \begingroup \FV@UseKeyValues @@ -113,13 +142,13 @@ \endgroup\@esphack \immediate\write\exercisestream{\string\end{exsol@exercise}} \ifexsol@copyexercisesinsolutions - \immediate\write\solutionstream{\string~\string\newline} + \immediate\write\solutionstream{\string\end{exsol@exercise}} \fi \immediate\closeout\exercisestream \input{\jobname.exc.tex} } \DefineVerbatimEnvironment{exercise}{exercise}{} -\newenvironment{exsol@exercise}[0] +\newenvironment{exsol@exercise}[1] {% \ifthenelse{\boolean{exsol@minipage}}{\begin{minipage}[t]{\textwidth}}{}% \ifthenelse{\boolean{exsol@exerciseaslist}} @@ -135,9 +164,11 @@ \setlength{\parsep}{\exsolexerciseparsep} \setlength{\labelsep}{\exsolexerciselabelsep} \setlength{\labelwidth}{\exsolexerciselabelwidth}} - \item[\textit{~\exercisename{} \theexercise:~}] + \item[\ifexsol@nolabels~#1:\else% + \subparagraph{\exercisename{}~#1:}\fi] }% - {\textit{\exercisename{} \theexercise:}} + {\ifexsol@nolabels #1:\else% + \subparagraph{\exercisename{}~#1:}\fi} } {% \ifthenelse{\boolean{exsol@exerciseaslist}}% @@ -146,13 +177,11 @@ } \def\solution{\FV@Environment{}{solution}} \def\FVB@solution{% - \typeout{Writing solution to \jobname.sol.tex} - \immediate\write\solutionstream{\string\textbf\string{\solutionname{}\string}} + %\typeout{Writing solution to \jobname.sol.tex} \ifexsol@copyexercisesinsolutions - \immediate\write\solutionstream{\string\newline} + \immediate\write\solutionstream{\string\begin{exsol@solution}{}} \else - \immediate\write\solutionstream{\string\textbf\string{\theexercise\string}% - \string\newline} + \immediate\write\solutionstream{\string\begin{exsol@solution}{\theexercise}} \fi \@bsphack \begingroup @@ -166,44 +195,187 @@ \let\@noligs\relax \FV@Scan } -\def\FVE@solution{\endgroup\@esphack} +\def\FVE@solution{ + \endgroup\@esphack + \immediate\write\solutionstream{\string\end{exsol@solution}} +} \DefineVerbatimEnvironment{solution}{solution}{} -\newenvironment{exercises} -{\par\exercisesfontsize\rule{.25\linewidth}{0.15mm}\vspace*{\exsolexercisesaboveskip}\\*% - \textbf{\normalsize \exercisesname}} -{\vspace*{-\baselineskip}\vspace*{\exsolexercisesbelowskip}\rule{.25\linewidth}{0.15mm}\par} +\newenvironment{exsol@solution}[1] +{% + \ifthenelse{\boolean{exsol@minipage}}{\begin{minipage}[t]{\textwidth}}{}% + \ifthenelse{\boolean{exsol@exerciseaslist}} + {\begin{list}% + {% + }% + {% + \setlength{\topsep}{\exsolexercisetopbottomsep}% + \setlength{\leftmargin}{\exsolexerciseleftmargin}% + \setlength{\rightmargin}{\exsolexerciserightmargin}% + \setlength{\listparindent}{\exsolexerciseparindent}% + \setlength{\itemindent}{\exsolexerciseitemindent}% + \setlength{\parsep}{\exsolexerciseparsep} + \setlength{\labelsep}{\exsolexerciselabelsep} + \setlength{\labelwidth}{\exsolexerciselabelwidth}} + \item[\ifexsol@nolabels #1:\else% + \subparagraph{\solutionname{}\@ifmtarg{#1}{}{~}#1:}\fi] + }% + {\ifexsol@nolabels #1:\else% + \subparagraph{\solutionname{}\@ifmtarg{#1}{}{~}#1:}\fi} + } + {% + \ifthenelse{\boolean{exsol@exerciseaslist}}% + {\end{list}}{}% + \ifthenelse{\boolean{exsol@minipage}}{\end{minipage}}{\par}% +} +\define@key{exercises}{columns}{\renewcommand\columncount{#1}} +\define@key{exercises}{exsubrule}{\renewcommand\exsubrule{#1}} +\define@key{exercises}{solsubrule}{\renewcommand\solsubrule{#1}} +\define@key{exercises}{subrule}{\renewcommand\exsubrule{#1}\renewcommand\solsubrule{#1}} +\newenvironment{exercises}[1][] +{ + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exercises}{#1} + \par\exercisesfontsize\rule{.25\linewidth}{0.15mm}% + \vspace*{\exsolexercisesaboveskip}% + \paragraph{\exercisesname}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax + \vspace*{-\baselineskip}\vspace*{\exsolexercisesbelowskip}% + %\rule{.25\linewidth}{0.15mm} + \exsubrule\par} +\define@key{exerciseseries}{columns}{\renewcommand\columncount{#1}} +\define@key{exerciseseries}{exsubrule}{\renewcommand\exsubrule{#1}} +\define@key{exerciseseries}{solsubrule}{\renewcommand\solsubrule{#1}} +\define@key{exerciseseries}{subrule}{\renewcommand\exsubrule{#1}\renewcommand\solsubrule{#1}} +\newenvironment{exerciseseries}[2][] +{ + \refstepcounter{exerciseseries}% + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exerciseseries}{#1} + \paragraph{\seriesname~\theexerciseseries:~#2}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + \immediate\write\solutionstream{\string\begin\string{solutionseries\string}% + \string[#1\string]\string{#2\string}\string{\theexerciseseries\string}} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax + \exsubrule\par + \immediate\write\solutionstream{\string\end\string{solutionseries\string}} +} +\newenvironment{solutionseries}[3][] +{ + \newcommand\columncount{1} % default + \newcommand\exsubrule{} % default + \newcommand\solsubrule{} % default + \setkeys{exercises}{#1} + \paragraph{\seriesname~#3}~\par + \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{} + } + { + \ifthenelse{\columncount > 1}{\end{multicols}}{} + \solsubrule\par +} +\def\informulacollection{\FV@Environment{}{informulacollection}} +\def\FVB@informulacollection{% + \immediate\openout\formulastream=\jobname.for.tex + %\typeout{Writing formula to \jobname.for.tex and \jobname.fc.tex} + \@bsphack + \begingroup + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \let\FV@ProcessLine\GPFORCOL@write@detok % + \relax + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FV@Scan + } +\def\FVE@informulacollection{ + \endgroup\@esphack + \immediate\closeout\formulastream + \input{\jobname.for.tex} +} +\DefineVerbatimEnvironment{informulacollection}{informulacollection}{} +\def\informulacollectiononly{\FV@Environment{}{informulacollectiononly}} +\def\FVB@informulacollectiononly{% + %\typeout{Writing special to \jobname.fc.tex} + \@bsphack + \begingroup + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \let\FV@ProcessLine\GPFORCOLONLY@write@detok % + \relax + \let\FV@FontScanPrep\relax + \let\@noligs\relax + \FV@Scan + } +\def\FVE@informulacollectiononly{ + \endgroup\@esphack +} +\DefineVerbatimEnvironment{informulacollectiononly}{informulacollectiononly}{} \newcommand{\exercisename}{Exercise} \newcommand{\exercisesname}{Exercises} \newcommand{\solutionname}{Solution} \newcommand{\solutionsname}{Solutions} +\newcommand{\seriesname}{Series} \addto\captionsdutch{% \renewcommand{\exercisename}{Oefening}% \renewcommand{\exercisesname}{Oefeningen}% \renewcommand{\solutionname}{Oplossing}% \renewcommand{\solutionsname}{Oplossingen}% + \renewcommand{\seriesname}{Reeks}% } \addto\captionsgerman{% \renewcommand{\exercisename}{Aufgabe}% \renewcommand{\exercisesname}{Aufgaben}% \renewcommand{\solutionname}{L\"osung}% \renewcommand{\solutionsname}{L\"osungen}% + \renewcommand{\seriesname}{Serie}% +} +\addto\captionsngerman{% + \renewcommand{\exercisename}{Aufgabe}% + \renewcommand{\exercisesname}{Aufgaben}% + \renewcommand{\solutionname}{L\"osung}% + \renewcommand{\solutionsname}{L\"osungen}% + \renewcommand{\seriesname}{Serie}% } \addto\captionsfrench{% \renewcommand{\exercisename}{Exercice}% \renewcommand{\exercisesname}{Exercices}% \renewcommand{\solutionname}{Solution}% \renewcommand{\solutionsname}{Solutions}% + \renewcommand{\seriesname}{Serie}% } \addto\captionsfinnish{ \renewcommand{\exercisename}{Teht\"av\"a}% \renewcommand{\exercisesname}{Teht\"avi\"a}% \renewcommand{\solutionname}{Ratkaisu}% \renewcommand{\solutionsname}{Ratkaisut}% + \renewcommand{\seriesname}{Sarja} +} +\addto\captionsspanish{% + \renewcommand{\exercisename}{Ejercicio}% + \renewcommand{\exercisesname}{Ejercicios}% + \renewcommand{\solutionname}{Soluci\'on}% + \renewcommand{\solutionsname}{Soluciones}% + \renewcommand{\seriesname}{Serie}% } +\ifexsol@local +\else \let\exsol@@makechapterhead\@makechapterhead \def\@makechapterhead#1{% - \immediate\write\solutionstream{\string\chapter{#1}}% \exsol@@makechapterhead{#1} + \immediate\write\solutionstream{\string\setcounter{chapter}{\arabic{chapter}}% + \string\chapter{#1}}% } \ifdefined\frontmatter \let\exsol@@frontmatter\frontmatter @@ -226,6 +398,14 @@ \exsol@@backmatter } \fi +\ifdefined\appendix + \let\exsol@@appendix\appendix + \def\appendix{% + \immediate\write\solutionstream{\string\appendix}% + \exsol@@appendix + } +\fi +\fi \newcommand{\noexercisesinchapter} { \immediate\write\solutionstream{No exercises in this chapter} -- cgit v1.2.3