diff options
Diffstat (limited to 'macros/latex/contrib/acrotex/contsolns.dtx')
-rw-r--r-- | macros/latex/contrib/acrotex/contsolns.dtx | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/macros/latex/contrib/acrotex/contsolns.dtx b/macros/latex/contrib/acrotex/contsolns.dtx new file mode 100644 index 0000000000..0020bd154a --- /dev/null +++ b/macros/latex/contrib/acrotex/contsolns.dtx @@ -0,0 +1,296 @@ +%\iffalse meta-comment +%<*internal> +\def\nameofplainTeX{plain} +\ifx\fmtname\nameofplainTeX\else + \expandafter\begingroup +\fi +%</internal> +%<*install> +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble +\endpreamble +\ifx\fmtname\nameofplainTeX + \generate{\file{\jobname.def}{\from{\jobname.dtx}{package}}} +\fi +%</install> +%<install>\endbatchfile +%<*internal> +\ifx\fmtname\nameofplainTeX + \expandafter\endbatchfile\else + \expandafter\endgroup\fi +%</internal> +%<*driver> +\documentclass{ltxdoc} +%\usepackage[numbered]{hypdoc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +%\title{\textsf{contsolns}} +%\author{D. P. Story} +% +%\maketitle +% +% \paragraph{Installation.} Open the file \texttt{\jobname.dtx} in +% your favorite tex editor (\textsf{WinEdt}) and compile using the +% \emph{\textbf{tex} compiler}, not the \textbf{latex} compiler. Doing so, +% generates the file \texttt{\jobname.def}. The files \texttt{\jobname.dtx} +% and \texttt{\jobname.def} are distributed with AeB. The \textsf{exerquiz} +% package has the \texttt{contsolns} option to use the code in this file. +% +% \subparagraph{Demo file.} The demo file for this feature of \textsf{exerquiz} +% is \texttt{contsolns\_ex.tex}. This feature is available to users of any +% supported driver. +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \section{Introduction} +% +% This collection of definitions is designed for use with \textbf{AeB} +% (more specifically, the \textsf{web} and \textsf{exerquiz} package). +% My occasional friend J\"{u}rgen wanted to have a ``continued on next page'' string to +% appear at the bottom of a solution (when it appears at the end of the +% file) to indicate the solution to this current problem continues onto the +% next page. Originally, this was done for the \texttt{shortquiz} +% environment, and later extended to the \texttt{quiz} and \texttt{exercise} +% environments. +% +% \paragraph{Assumptions.} The code assumes the \textsf{web} package page style, +% \texttt{webheadings}, is in effect; otherwise, this code fails. +% +%\section{Documentation} +% +% The use of the \texttt{contsolns} option should be pretty +% seamless. The message that appears in the right footer is \DescribeMacro{\rfootContStr} +% \cmd{\rfootContStr}; the command takes two argument, the second of which is a short +% string that identifies the question. It can be redefined. The labels \DescribeMacro{\Qlabel}\cmd{\Qlabel} +% and \DescribeMacro{\Elabel}\cmd{\Elabel} may also be redefined. When compiled +% for paper (\texttt{forpaper} option), we emit the \textsf{exerquiz} command +% \cmd{\promoteNewPageHere} with an argument of \DescribeMacro{\promoteNPHskip}\cmd{\promoteNPHskip} +% in a vain attempt to get the numbers right. \cmd{\promoteNPHskip} is set to +% \texttt{.1\cs{textheight}} and may be redefined if this value is not working as it should. +% +% This code file uses the running headers, left and right. If you want to use these +% footers and this feature, you need to preserve the code. This is what I do in this +% code file: +%\begin{verbatim} +%\expandafter\lfooter\expandafter{\expandafter\newLFooterCmd\web@lfoot} +%\expandafter\rfooter\expandafter{\web@rfoot\newRFooterCmd} +%\end{verbatim} +%This demonstrates how to put the new code on the left of the old, or on the right. +% +% \subparagraph{Problems.} Problems arise if the numbers in the footer do not match +% the exercise or quiz numbers, this may occur when using the \texttt{forpaper} option, +% the workaround is to adjust \cmd{\promoteNPHskip} to a larger value. +% +% When using the \texttt{navibar} option of \textsf{web}, there may be insufficient +% room to the right of the navigation bar; in this case, shorten the text created by +% \cmd{\rfootContStr}, or reduce the number of navigation buttons on the solution pages. +% +% \section{The Code} +% First, we determine if \textsf{web} is loaded. +% \begin{macrocode} +\@ifpackageloaded{web}{}{\PackageError{exerquiz} + {The consolns option of exerquiz requires\MessageBreak + the web package}{Use the web package.}} +% \end{macrocode} +% \DescribeMacro{\setQNum}\cmd{\setQNum} sets the question number in to the solutions at +% end of the file. While \DescribeMacro{\setENum}\cs{setENum} does the same thing +% for exercises. \DescribeMacro{\Qlabel}\cmd{\Qlabel} provides a label for the +% quiz question as a result, \cs{setQNum} expands to strings like `Q1', `Q1(a)', +% or `Q1(a)(i)'. \DescribeMacro{\Elabel}\cmd{\Elabel} does the same for exercises. +% \cs{setEnum} expands to `E1' and `E1(a)', for example. +% Both \cs{Qlabel} and \cs{Elabel} are fragile. All four of these commands may be redefined. + +% \begin{macrocode} +\def\setQNum{\Qlabel\ifcase\@eqquestiondepth\or\arabic{eqquestionnoi}% + \or\arabic{eqquestionnoi}(\alph{eqquestionnoii})% + \or\arabic{eqquestionnoi}(\alph{eqquestionnoii})% + (\roman{eqquestionnoiii})\fi} +\def\setENum{\Elabel\if\exerstar*\theeqexno(\alph{partno})\else + \theeqexno\fi} +% \end{macrocode} +% The default definitions of \cs{Qlabel} and \cs{Elabel} are next. +% \begin{macrocode} +\def\Qlabel{Q}\def\Elabel{E} +% \end{macrocode} +% \DescribeMacro{\solContMarks}\cmd{\solContMarks} really does nothing other than expand +% to arguments enclosed in braces. The arguments act as a signal +% to the running footer telling it to insert some text or not. +% \begin{macrocode} +\def\SolContMrk#1#2{\gdef\solContMarks{{#1}{#2}}} +% \end{macrocode} +% The default definition of \cs{solContMarks} +% \begin{macrocode} +\def\solContMarks{{}{}} +% \end{macrocode} +% We use \cs{eq@sqPostHeaderHook} (\cs{eq@qPostHeaderHook}) to insert some +% special code into the top of each solution. It inserts the command +% \cmd{\SolContMrk} with two arguments, the quiz number +% (\verb!Q\@shortquizCnt!, resp., \verb!Q\@quizCnt!) and the question +% number (\verb!\setQNum!). +% \begin{macrocode} +\def\eq@sqPostHeaderHook{% + \string\SolContMrk{Q\@shortquizCnt}{\setQNum}\relax} +\def\eq@qPostHeaderHook{% + \string\SolContMrk{Q\@quizCnt}{\setQNum}\relax} +\def\exer@solnheadhook{% + \string\SolContMrk{Ex}{\setENum}} +% \end{macrocode} +% \DescribeMacro{\promoteNPHskip} used if compiled for paper, this is the amount +% that we use to promote a new page. We have to do this for otherwise, if {\TeX}s +% page breaking algorithm is used, then the page number may be wrong. +% \begin{macrocode} +\newlength{\promoteNPHskip} +\setlength{\promoteNPHskip}{.1\textheight} +% \end{macrocode} +% There are two definitions of \DescribeMacro{\redefForContSolns}\cmd{\redefForContSolns}, +% one for paper and one for screen. The command itself redefines the solution markers +% that appear in the solution files (\textsf{SOL} and \textsf{QSL}). +% \begin{macrocode} +\ifeqforpaper +\def\redefForContSolns{% +% \end{macrocode} +% If the document is compiled for paper, we promote a new page using the +% command \verb!\promoteNewPageHere{\promoteNPHskip}!, and modify the +% commands \cs{fpAfterSolutionsSkip} and \cmd{\belowexsolnskip}, which appear +% in the \texttt{forpaper} option. +% It's the last command that appears at the end of each solution. +% Here we clear the arguments of \cs{SolContMrk}. +% The two \cs{prior@...} commands are special hooks at the top of the +% definitions of \cs{quizSolnHeader} and \cs{exerSolnHeader}. These latter +% two hooks were added (2013/12/15) to \textsf{exerquiz} +% \begin{macrocode} + \def\prior@quizSolnHeaderHook{\promoteNewPageHere{\promoteNPHskip}} + \def\prior@exerSolnHeaderHook{\promoteNewPageHere{\promoteNPHskip}} +% \end{macrocode} +% We use \cs{eq@scratchtoks}, a token register declared in \textsf{exerquiz} +% \begin{macrocode} + \eq@scratchtoks=\expandafter{\fpAfterSolutionsSkip\SolContMrk{}{}} + \edef\@tempExp{\noexpand\promoteNewPageHere{% + \noexpand\promoteNPHskip}\the\eq@scratchtoks} + \eq@scratchtoks=\expandafter{\@tempExp} + \edef\fpAfterSolutionsSkip{\the\eq@scratchtoks} + \eq@scratchtoks=\expandafter{% + \belowexsolnskip\protect\SolContMrk{}{}} + \edef\belowexsolnskip{\noexpand\noexpand + \string\promoteNewPageHere{% + \noexpand\noexpand\string\promoteNPHskip}\the\eq@scratchtoks} +} +\else +% \end{macrocode} +% Now if the document is compiled for the screen, each solution starts +% on a new digital piece of paper, so no need to modify \cs{eqSQt} as +% above. The command \cs{fpAfterSolutionsSkip} is not used in the +% screen version, so the last command is \cs{endeqSqt}, which we +% modify. +% \begin{macrocode} +\def\redefForContSolns{% + \let\endeqSQtSAVE\endeqSQt + \def\endeqSQt{\endeqSQtSAVE\par\SolContMrk{}{}} + \let\endeqQtSAVE\endeqSQt + \def\endeqQt{\endeqQtSAVE\par\SolContMrk{}{}} + \let\endeqEXtSAVE\endeqEXt + \def\endeqEXt{\endeqEXtSAVE\par\SolContMrk{}{}} +} +\fi % \ifeqforpaper +% \end{macrocode} +% We expand \cmd\redefForContSolns at the beginning of the document so as to +% include any changes made by the document author, or another package developer. +% \begin{macrocode} +\AtBeginDocument{\redefForContSolns} +% \end{macrocode} +% \DescribeMacro{\getSolContMarks} is the command that decides whether +% to put something in the running footer. If the first argument is +% empty (we have already cleared the arguments of \cs{SolContMrk} we do +% nothing; if the first argument is nonempty, we emit a message. +% \DescribeMacro{\rfootContStr} \cmd{\rfootContStr} is the string that +% contains the string that appears in the running footer. +% \begin{macrocode} +\newcommand{\getSolContMarks}[2]{\ifcontSoln + \rfootContStr{#1}{#2}\fi} +\newcommand{\rfootContStr}[2]{Solution to {#2} continues next page} +% \end{macrocode} +% Set the running footer; this should only appear in the solutions section +% at the end of the file. \DescribeMacro{\ifcontSol}We establish a new +% switch \cs{ifcontSoln} that will be use to signal the need for a +% continuation of the solution. +% \begin{macrocode} +\newif\ifcontSoln \contSolnfalse +% \end{macrocode} +% We put this in the left footer. {\TeX} processes from left to right, +% so we need this on the left, so the switch will be set for the +% \cs{cfooter} and \cs{rfooter}. The \DescribeMacro{\bSolContMarks}\cmd{\bSolContMarks} +% command makes the decision of setting the switch \cs{ifcontSoln}. It reads the +% expansion of \cs{solContMarks}, which holds two arguments. +% \begin{macrocode} +\newcommand{\bSolContMarks}[2]{% + \def\eq@argi{#1}\def\eq@argii{#2}% + \ifx\eq@argi\@empty\global\contSolnfalse\else + \global\contSolntrue\fi} +% \end{macrocode} +% \DescribeMacro{\lFootbCont} is placed in \cs{lfooter}, and it will set the switch +% by first expanding \cs{solContMarks}, then \cs{bSolContMarks}. +% \begin{macrocode} +\def\lFootbCont{\expandafter\bSolContMarks\solContMarks} +% \end{macrocode} +% \cs{rFootCont} goes in \cs{rfooter}, and holds the continuation string. +% \begin{macrocode} +\def\rFootCont{\makebox[0pt][r]{% + \expandafter\getSolContMarks\solContMarks}} +% \end{macrocode} +% Set the left and right footers. +% \begin{macrocode} +\@ifundefined{web@footerprivate}{% + \def\addtolfooter{\expandafter + \lfooter\expandafter{\expandafter\lFootbCont\web@lfoot}}% +}{% + \def\addtolfooter{\def\web@footerprivate{\lFootbCont}}% +} +\def\addtorfooter{\expandafter + \rfooter\expandafter{\web@rfoot\rFootCont}} +% \end{macrocode} +% Install these footers at the beginning of the document. First check +% to see if the \texttt{webheadings} pagestyle is being used. +% \begin{macrocode} +\def\cs@testWH#1#2{\ifx\webfootwrapper#1 + \def\cs@next{\AtBeginDocument{\addtolfooter\addtorfooter}}\else + \def\cs@next{\PackageError{contsoln.def}{% + webheadings of the web package are NOT\MessageBreak + in effect. The contsoln.def file requires\MessageBreak + webheadings}{Use the default webheadings pagestyle + from the web package.}}\fi + \cs@next +} +% \end{macrocode} +% The default definition of \cs{@oddfoot} is +%\begin{verbatim} +% \renewcommand{\@oddfoot}{\webfootwrapper{..}} +%\end{verbatim} +% So, the first token is \cs{webfootwrapper}, if that token +% is there, we install the footers, and they should work as +% expected; otherwise we declare an error. +% \begin{macrocode} +\AtBeginDocument{\expandafter\cs@testWH\@oddfoot} +% \end{macrocode} +% \begin{macrocode} +%</package> +% \end{macrocode} +%\Finale +\endinput + +\def\addtolfooter{\ifx\web@lfoot\@empty + \lfooter{\lFootbCont}\else + \expandafter\lfooter\expandafter{\expandafter + \noexpand\expandafter\lFootbCont\web@lfoot}\fi +} +\def\addtorfooter{\ifx\web@rfoot\@empty + \rfooter{\rFootCont}\else + \expandafter\rfooter\expandafter{\expandafter + \noexpand\expandafter\rFootCont\web@rfoot}\fi +} |