%% %% This is file `exsol.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% exsol.dtx (with options: `package') %% %% This is a generated file. %% %% Copyright (C) 2019 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 %% 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.3 or later is part of all distributions of LaTeX version %% 2005/12/01 or later. %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{exsol} [2024/01/07 v1.6 ExSol - Exercises and Solutions package (DMW)] \RequirePackage{ifmtarg} \RequirePackage{fancyvrb} \RequirePackage{ifthen} \RequirePackage{kvoptions} \RequirePackage{multicol} \RequirePackage{varwidth} \@ifpackageloaded{babel}{\typeout{Good: you loaded babel first!}}{\PackageError{exsol}{You forgot to load the babel package before exsol}{}} \DeclareBoolOption[false]{local} \DeclareBoolOption[false]{external} \DeclareBoolOption[false]{inline} \DeclareBoolOption[false]{nolabels} \DeclareStringOption[normalsize]{exercisesfontsize} \DeclareBoolOption[false]{exerciseaslist} \DeclareBoolOption[false]{copyexercisesinsolutions} \DeclareBoolOption[false]{minipage} \DeclareBoolOption[false]{usesolutionserieslabels} \ProcessKeyvalOptions* \newcommand{\exercisesfontsize}{\csname \exsol@exercisesfontsize\endcsname} \newlength{\exsolexercisesaboveskip} \setlength{\exsolexercisesaboveskip}{0ex plus 1pt minus 1pt} \addtolength{\exsolexercisesaboveskip}{-2\baselineskip} \newlength{\exsolexercisesbelowskip} \setlength{\exsolexercisesbelowskip}{0ex plus 1pt minus 1pt} \addtolength{\exsolexercisesbelowskip}{\baselineskip} \newlength{\exsolexercisetopbottomsep} \setlength{\exsolexercisetopbottomsep}{0pt plus 0pt minus 1pt} \newlength{\exsolexerciseleftmargin} \setlength{\exsolexerciseleftmargin}{1em} \newlength{\exsolexerciserightmargin} \setlength{\exsolexerciserightmargin}{1em} \newlength{\exsolexerciseparindent} \setlength{\exsolexerciseparindent}{0em} \newlength{\exsolexerciselabelsep} \setlength{\exsolexerciselabelsep}{0.5em} \newlength{\exsolexerciselabelwidth} \setlength{\exsolexerciselabelwidth}{0pt} \newlength{\exsolexerciseitemindent} \setlength{\exsolexerciseitemindent}{0pt} \newlength{\exsolexerciseparsep} \setlength{\exsolexerciseparsep}{\parskip} \AtBeginDocument{ \typeout{Writing solutions to solution file \jobname.sol.tex} \newwrite\solutionstream \immediate\openout\solutionstream=\jobname.sol.tex \ifexsol@external \typeout{Writing exercises to exercise file \jobname.exc.tex} \newwrite\exercisestream \immediate\openout\exercisestream=\jobname.exc.tex \else \typeout{Using intermediate exercise file \jobname.exc.tex} \newwrite\exercisestream \fi \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 } \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}% \fi \fi } \newcommand{\GPES@write@detok}[1]{% \immediate\write\exercisestream{\detokenize{#1}}}% \newcommand{\GPSS@write@detok}[1]{% \immediate\write\solutionstream{\detokenize{#1}}}% \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}% \ifexsol@external\else \immediate\openout\exercisestream=\jobname.exc.tex \fi \ifexsol@local \else \fi \ifexsol@copyexercisesinsolutions \immediate\write\solutionstream{\string\begin{exsol@exercise}{\theexercise}} \fi \immediate\write\exercisestream{\string\begin{exsol@exercise}{\theexercise}} \@bsphack \begingroup \FV@UseKeyValues \FV@DefineWhiteSpace \def\FV@Space{\space}% \FV@DefineTabOut \ifexsol@copyexercisesinsolutions \let\FV@ProcessLine\GPESS@write@detok % \else \let\FV@ProcessLine\GPES@write@detok % \fi \relax \let\FV@FontScanPrep\relax \let\@noligs\relax \FV@Scan } \def\FVE@exercise{ \endgroup\@esphack \immediate\write\exercisestream{\string\end{exsol@exercise}} \ifexsol@copyexercisesinsolutions \immediate\write\solutionstream{\string\end{exsol@exercise}} \fi \ifexsol@external\else \immediate\closeout\exercisestream \input{\jobname.exc.tex} \fi } \DefineVerbatimEnvironment{exercise}{exercise}{} \newenvironment{exsol@exercise}[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\exercisename{}~#1:\fi]% } {\ifexsol@nolabels #1:\else% \subparagraph{\exercisename{}~#1:}\fi} } {% \ifthenelse{\boolean{exsol@exerciseaslist}}% {\end{list}}{}% \ifthenelse{\boolean{exsol@minipage}}{\end{minipage}}{\par}% } \def\solution{\FV@Environment{}{solution}} \def\FVB@solution{% % \typeout{Writing solution to \jobname.sol.tex} % WDSC \ifexsol@copyexercisesinsolutions \immediate\write\solutionstream{\string\begin{exsol@solution}{}} \else \ifexsol@inline \immediate\write\solutionstream{\string\begin{exsol@solution}{}} \else \immediate\write\solutionstream{\string\begin{exsol@solution}{\theexercise}} \fi \fi % \ifexsol@copyexercisesinsolutions % \immediate\write\solutionstream{\string\begin{exsol@solution}{}} % \else % \immediate\write\solutionstream{\string\begin{exsol@solution}{\theexercise}} % \fi \@bsphack \begingroup \FV@UseKeyValues \FV@DefineWhiteSpace \def\FV@Space{\space}% \FV@DefineTabOut \let\FV@ProcessLine\GPSS@write@detok % \relax \let\FV@FontScanPrep\relax \let\@noligs\relax \FV@Scan } \def\FVE@solution{ \endgroup\@esphack \immediate\write\solutionstream{\string\end{exsol@solution}} \ifexsol@inline \immediate\closeout\solutionstream \input{\jobname.sol.tex} \immediate\openout\solutionstream=\jobname.sol.tex \fi } \DefineVerbatimEnvironment{solution}{solution}{} \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% \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}% \exercisesfontsize\rule{.25\linewidth}{0.15mm}% \vspace*{-1.5\baselineskip}% \paragraph{\exercisesname}~\\* \ifthenelse{\columncount > 1}{\begin{multicols}{\columncount}}{}% }% { \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax% \vspace*{-\baselineskip}\vspace*{\exsolexercisesbelowskip}% \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}}{} \ifexsol@inline\else \immediate\write\solutionstream{\string\begin\string{solutionseries\string}% \string[#1\string]\string{#2\string}\string{\theexerciseseries\string}} \fi } { \ifthenelse{\columncount > 1}{\end{multicols}}{}\relax \exsubrule\par \ifexsol@inline\else \immediate\write\solutionstream{\string\end\string{solutionseries\string}} \fi } \newenvironment{solutionseries}[3][] { \newcommand\columncount{1} % default \newcommand\exsubrule{} % default \newcommand\solsubrule{} % default \setkeys{exercises}{#1}% \paragraph{\seriesname~#3\ifexsol@usesolutionserieslabels: #2\fi}~\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}% } \newif\ifnoexinchapter \noexinchapterfalse \ifexsol@local \else \let\exsol@@makechapterhead\@makechapterhead \def\@makechapterhead#1{% \exsol@@makechapterhead{#1} \ifnoexinchapter \noexinchapterfalse \else \addtocounter{chapter}{-1} \immediate\write\solutionstream{\string\setcounter{chapter}{\arabic{chapter}}% \string\chapter{#1}}% \ifexsol@external \immediate\write\exercisestream{\string\setcounter{chapter}{\arabic{chapter}}% \string\chapter{#1}}% \fi \addtocounter{chapter}{1} \fi } \ifdefined\frontmatter \let\exsol@@frontmatter\frontmatter \def\frontmatter{% \immediate\write\solutionstream{\string\frontmatter}% \ifexsol@external% \immediate\write\exercisestream{\string\frontmatter}% \fi% \exsol@@frontmatter } \fi \ifdefined\frontmatter \let\exsol@@mainmatter\mainmatter \def\mainmatter{% \immediate\write\solutionstream{\string\mainmatter}% \ifexsol@external% \immediate\write\exercisestream{\string\mainmatter}% \fi% \exsol@@mainmatter } \fi \ifdefined\backmatter \let\exsol@@backmatter\backmatter \def\backmatter{% \immediate\write\solutionstream{\string\backmatter}% \ifexsol@external% \immediate\write\exercisestream{\string\backmatter}% \fi% \exsol@@backmatter } \fi \ifdefined\appendix \let\exsol@@appendix\appendix \def\appendix{% \immediate\write\solutionstream{\string\appendix}% \ifexsol@external% \immediate\write\exercisestream{\string\appendix}% \fi% \exsol@@appendix } \fi \fi \newcommand{\noexercisesinnextchapter} { \noexinchaptertrue } \newcommand{\noexercisesinchapter} { \immediate\write\solutionstream{No exercises in this chapter} \ifexsol@external% \immediate\write\exercisestream{No exercises in this chapter}% \fi% } \endinput %% %% End of file `exsol.sty'.