diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/exam |
Initial commit
Diffstat (limited to 'macros/latex/contrib/exam')
-rw-r--r-- | macros/latex/contrib/exam/README | 50 | ||||
-rw-r--r-- | macros/latex/contrib/exam/exam.cls | 8306 | ||||
-rw-r--r-- | macros/latex/contrib/exam/exam.md5 | 3 | ||||
-rw-r--r-- | macros/latex/contrib/exam/examdoc.pdf | bin | 0 -> 481243 bytes | |||
-rw-r--r-- | macros/latex/contrib/exam/examdoc.tex | 8770 |
5 files changed, 17129 insertions, 0 deletions
diff --git a/macros/latex/contrib/exam/README b/macros/latex/contrib/exam/README new file mode 100644 index 0000000000..01b54c4184 --- /dev/null +++ b/macros/latex/contrib/exam/README @@ -0,0 +1,50 @@ +This is version 2.603 of the exam document class, dated December 17, +2017. + +The exam document class, together with its user's guide examdoc.tex, +attempts to make it easy for even a LaTeX novice to prepare exams. +Simple commands are provided to: + +1. Create questions, parts of questions, subparts of parts, and +subsubparts of subparts, all with optional point values. + +2. Create a grading table, indexed either by question number (listing +each question and the total possible points for that question) or by +page number (listing each page with points and the total possible +points for that page). A grading table can cover the entire exam or +just a part of the exam. Grading tables can have multiple rows or +multiple columns. + +3. Create headers and footers that are each specified in three parts: +One part to be left justified, one part to be centered, and one part +to be right justified. + +4. Have headers and/or footers that are different on the first page of +the exam, different on the last page of the exam, and that vary +depending on whether the page number is odd or even, or on whether the +current page continues a question from a previous page, or on whether +the last question on the current page continues onto the following +page. + +5. Have multiple line headers and/or footers, and to increase the part +of the page devoted to headers and/or footers to allow for this. + +6. Include solutions and have these solutions either printed or +ignored (or replaced automatically by space in which the students can +write their answers) depending on a single command. + +7. Leave blank space, or space in a box, or lined space, or dotted +lined space, or space filled with a grid. + +8. Change the words that are inserted by the document class (for, +e.g., point values, or table headings), so that they can be adapted to +personal taste and/or languages other than English. + +The user's guide examdoc.tex attempts to explain all of the +possibilities in a readable way, with many examples. + +-------------------------------------------------------------------- + +This work 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. diff --git a/macros/latex/contrib/exam/exam.cls b/macros/latex/contrib/exam/exam.cls new file mode 100644 index 0000000000..cc587b3d65 --- /dev/null +++ b/macros/latex/contrib/exam/exam.cls @@ -0,0 +1,8306 @@ +% exam.cls +% +% A LaTeX2e document class for preparing exams. + +%% exam.cls +%% Copyright (c) 1994, 1997, 2000, 2004, 2008, 2011, +%% 2015, 2017 Philip S. Hirschhorn +% +% This work 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 2003/12/01 or later. +% +% This work has the LPPL maintenance status "author-maintained". +% +% This work consists of the files exam.cls and examdoc.tex. + + +% The user's guide for exam.cls is in the file examdoc.tex. + + +%%% Philip Hirschhorn +%%% Department of Mathematics +%%% Wellesley College +%%% Wellesley, MA 02481 +%%% psh@math.mit.edu + +% The newest version of this documentclass should always be available +% from my web page: http://www-math.mit.edu/~psh/ + + +\def\fileversion{2.603} +\def\filedate{2017/12/17} +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +% +% If there's some feature that you'd like that this file doesn't +% provide, tell me about it. +% +% +% +% +% +% Thanks to: +% +% Piet van Oostrum, from whose excellent ``fancyheadings.sty'' we +% shamelessly stole most of the code for setting the headers and +% footers. +% +% Mate Wierdl <mw@wierdlmpc.msci.memphis.edu>, who contributed the +% code so that if the number of points is ``1'', then the default +% value of \pointname will print ``1 point'' instead of ``1 points''. +% +% Tom Brikowski <brikowi@utdallas.edu>, who contributed the code for +% making the number of points and number of questions available as +% macros (as well as the idea of putting the number of points in a +% box, instead of in parentheses). (I changed his code to make this +% all optional, so if there are errors there, it's my fault and not +% his.) +% +% Ottmar Beucher <beucher@fh-karlsruhe.de>, Dan Drake +% <drake@math.umn.edu>, and Justus Piater <Justus.Piater@ULg.ac.be> who +% contributed ideas and code for the \pointsofquestion and \gradetable +% commands for printing a Grading Table. (I changed all the code to +% make this compatible with hyperref.sty, so if there are errors there, +% it's my fault and not theirs.) +% +% Justus Piater <Justus.Piater@ULg.ac.be>, who contributed the code for +% the solution environment. (I changed his code to allow page breaks +% inside solutions so, once again, if it's buggy, it's my fault.) +% +% Donald Arseneau <asnd@triumf.ca>, who created the excellent +% ``framed.sty'' and generously allowed me to include basically the +% whole thing in exam.cls, making the few changes needed for it to +% work well with question environments: +% framed.sty v 0.8a 21-Jul-2003 +% Copyright (C) 1992-2003 by Donald Arseneau +% These macros may be freely transmitted, reproduced, or modified +% provided that this notice is left intact. +% +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Changelog since version 2.4: + +%-------------------------------------------------------------------- +% Version 2.603, 2017/12/15 + +% No longer betatest. + +%-------------------------------------------------------------------- +% Version 2.602$\beta$, 2017/12/15 + +% We changed the code for multicolumn grade and point tables to remove +% the incompatibility with colortbl.sty and other packages that load +% colortbl.sty (e.g., xcolor.sty with the "table" option). + +%-------------------------------------------------------------------- +% Version 2.601$\beta$, 2017/09/22 + +% We changed command and environment names in the code from framed.sty +% that's included (slightly modified) in exam.cls so that the user can +% say \usepackage{framed} without creating conflicts. This also allows +% the user to use packages, such as minted.sty, that load framed.sty + +%-------------------------------------------------------------------- +% Version 2.6, 2017/09/19 + +% No longer betatest. + +%-------------------------------------------------------------------- +% Version 2.510$\beta$, 2016/10/11 + +% Bugfix: We changed \@setheadheight and \@setfootheight to fix a bug +% that was introduced by the bugfix in version 2.306beta, 2009/03/28: +% If the second page has a different \textheight (because of a change +% in either headheight or footheight between pages 1 and 2), then page +% 2 would use the \textheight of page 1. Pages 3 and beyond would get +% the correct \textheight. The original version of this set \@colroom +% and \vsize to the new \textheight, but that had a bug in that if a +% float appeared at the top of a page, there would be no notice taken +% of the space lost to the float, and so the text would overrun the +% bottom of the page. The bugfix in version 2.306beta eliminated the +% changes to \@colht and \vsize. In this bugfix, we adjust \@colroom, +% \@colht, and \vsize in the same way that we adjust \textheight. + +%-------------------------------------------------------------------- +% Version 2.509$\beta$, 2016/09/12 + +% Multicolumn grade and point tables, and a new syntax for multirow +% grade and point tables (which were introduced in version +% 2.508beta). + +% Multicolumn tables are vertically oriented, while multirow tables +% are horizontally oriented, and so they do not take the optional +% argument choosing between horizontal and vertical. They all take +% one required argument specifying the number of columns (for +% multicolumn) or the number of rows (for multirow). + +% The tables can be: + +% grade tables or point tables, + +% plain, bonus, or combined, + +% indexed by questions or by pages, + +% complete or partial. + +% As usual, if you omit the optional argument that chooses between +% questions and pages, you get questions. + +% The new commands are: + +% \def\multirowgradetable{numrows}[questions or pages] +% \def\multirowpointtable{numrows}[questions or pages] +% \def\multirowbonusgradetable{numrows}[questions or pages] +% \def\multirowbonuspointtable{numrows}[questions or pages] +% \def\multirowcombinedgradetable{numrows}[questions or pages] +% \def\multirowcombinedpointtable{numrows}[questions or pages] + +% \def\multirowpartialgradetable{numrows}{rangename}[questions or pages] +% \def\multirowpartialpointtable{numrows}{rangename}[questions or pages] +% \def\multirowpartialbonusgradetable{numrows}{rangename}[questions or pages] +% \def\multirowpartialbonuspointtable{numrows}{rangename}[questions or pages] +% \def\multirowpartialcombinedgradetable{numrows}{rangename}[questions or pages] +% \def\multirowpartialcombinedpointtable{numrows}{rangename}[questions or pages] + +% \def\multicolumngradetable{numcols}[questions or pages] +% \def\multicolumnpointtable{numcols}[questions or pages] +% \def\multicolumnbonusgradetable{numcols}[questions or pages] +% \def\multicolumnbonuspointtable{numcols}[questions or pages] +% \def\multicolumncombinedgradetable{numcols}[questions or pages] +% \def\multicolumncombinedpointtable{numcols}[questions or pages] + +% \def\multicolumnpartialgradetable{numcols}{rangename}[questions or pages] +% \def\multicolumnpartialpointtable{numcols}{rangename}[questions or pages] +% \def\multicolumnpartialbonusgradetable{numcols}{rangename}[questions or pages] +% \def\multicolumnpartialbonuspointtable{numcols}{rangename}[questions or pages] +% \def\multicolumnpartialcombinedgradetable{numcols}{rangename}[questions or pages] +% \def\multicolumnpartialcombinedpointtable{numcols}{rangename}[questions or pages] + +% The older grade and point table commands can still be used. For +% example, the commands + +% \gradetable[h][questions] +% \multirowgradetable{1}[questions] + +% are equivalent. + +% The distance between the rows of a multirow table and between the +% columns of a multicolumn table is \doublerulesep, the default value +% of which is 2.0pt. You can change that using a \setlength command, +% as in + +% \setlength{\doublerulesep}{0.5in} + +%-------------------------------------------------------------------- +% Version 2.508$\beta$, 2016/08/06 + +% New commands: Multirow grade and point tables. + +% These are all horizontally oriented tables, and so do not take the +% optional argument choosing between horizontal and vertical. They all +% take one required argument specifying the number of columns, which is +% the number of columns used for the point values (including the total), +% but not counting the column of row headings. + +% Note: The syntax was changed in version 2.509beta, so that you now +% specify the number of *rows* rather than the number of *columns*! For +% example, the first command below should now be + +% \multirowgradetable{numrows}[questions or pages] + +% The tables can be: + +% grade tables or point tables, + +% plain, bonus, or combined, + +% indexed by questions or by pages, + +% complete or partial. + +% The new commands are: + + +% \multirowgradetable{numcols}[questions or pages] +% \multirowpointtable{numcols}[questions or pages] +% \multirowbonusgradetable{numcols}[questions or pages] +% \multirowbonuspointtable{numcols}[questions or pages] +% \multirowcombinedgradetable{numcols}[questions or pages] +% \multirowcombinedpointtable{numcols}[questions or pages] + +% \multirowpartialgradetable{numcols}{rangename}[questions or pages] +% \multirowpartialpointtable{numcols}{rangename}[questions or pages] +% \multirowpartialbonusgradetable{numcols}{rangename}[questions or pages] +% \multirowpartialbonuspointtable{numcols}{rangename}[questions or pages] +% \multirowpartialcombinedgradetable{numcols}{rangename}[questions or pages] +% \multirowpartialcombinedpointtable{numcols}{rangename}[questions or pages] + +%-------------------------------------------------------------------- +% Version 2.507$\beta$, 2016/07/14 + +% New commands: + +% \pointstwosided +% \pointstwosidedreversed + +% The first causes points to be in the right margin on odd numbered +% pages and in the left margin on even numbered pages. + +% The second causes points to be in the left margin on odd numbered +% pages and in the right margin on even numbered pages. + +% Also: Some minor edits (e.g., deleting the unused \thebonuspoints). + +%-------------------------------------------------------------------- +% Version 2.506$\beta$, 2016/05/12 + +% Fixed an obscure bug that arose only when \CorrectChoiceEmphasis +% used color and a \CorrectChoice (in a choices or checkboxes +% environment) followed a \choice whose text completely filled its +% last line, and which was not separated from the \CorrectChoice by a +% blank line, in which case an extra (blank) line was inserted by that +% \choice. We fixed this by adding an improvised "\leavehmode" +% (styled after \leavevmode) to the \CorrectChoice command in both the +% choices and checkboxes environments, which caused the text of the +% previous \choice to be broken into lines *before* the \special +% inserted by the \color command was added. + +%-------------------------------------------------------------------- +% Version 2.505$\beta$, 2016/05/10 + +% We fixed a bug in the choices and checkboxes environments that arose +% only when \CorrectChoiceEmphasis used color. If it did, and if the +% text of a correct choice exactly filled a line, and if there was no +% blank line in the latex file separating this correct choice from the +% following choice, there would be an extra blank line inserted after +% the correct choice. We did this by inserting \color@begingroup and +% \color@endgroup as needed. (We're pretty sure the actual fix was +% the \endgraf in the expansion of \color@endgroup.) + +%-------------------------------------------------------------------- +% Version 2.504$\beta$, 2016/05/09 + +% We fixed a bug in the solutionbox environment that caused enumerate, +% itemize, or description environments to have their text stick into +% the right margin. We did this by resetting \@totalleftmargin and +% \linewidth in the box containing the solution. + +%-------------------------------------------------------------------- +% Version 2.503$\beta$, 2016/03/25 + +% New commands: + +% \colorfillwithlines +% \colorfillwithdottedlines + +% The first causes the lines drawn by the \fillwithlines command to be +% drawn in color. The default color is set by the command + +% \definecolor{FillWithLinesColor}{gray}{0.8} + +% and the color can be changed by giving a new \definecolor command. +% You can return to black lines by giving the command + +% \nocolorfillwithlines + +% \colorfillwithdottedlines causes the lines drawn by the +% \fillwithdottedlines command to be drawn in color. The default +% color is set by the command + +% \definecolor{FillWithDottedLinesColor}{gray}{0.8} + +% and the color can be changed by giving a new \definecolor command. +% You can return to black dotted lines by giving the command + +% \nocolorfillwithdottedlines + +%-------------------------------------------------------------------- +% Version 2.502$\beta$, 2016/03/23 + +% The command + +% \colorsolutionboxes + +% that was created in version 2.501beta now affects not only the boxes +% created by \solutionbox, but also by \makeemptybox, \solutionorbox, +% and all of the boxes printed by all of the various solution +% environments when solutions are being printed surrounded by a box. + +%-------------------------------------------------------------------- +% Version 2.501$\beta$, 2016/02/08 + +% Changed the \solutionbox environment so that it works correctly +% inside a tabular. + +% Also: The \solutionbox frame can now be printed in color, as long as +% you load color.sty in the preamble. +% +% Usage: Say +% +% \usepackage{color} +% +% in the preamble, and then give the command +% +% \colorsolutionboxes +% +% to have the frame around a solutionbox in color. The default color +% was created by the command +% +% \definecolor{SolutionBoxColor}{gray}{0.8} +% +% and you can change the color by giving a new \definecolor command +% (which must be done *after* the \colorsolutionboxes command). +% +% To cancel color solutionbox frames and return to black, give the +% command +% +% \nocolorsolutionboxes + +%-------------------------------------------------------------------- +% Version 2.5 2015/05/07 + +% No longer betatest. + +%-------------------------------------------------------------------- +% Version 2.408$\beta$ 2013/11/17 + +% New commands: +% +% \firstqinrange{whatever} +% \lastqinrange{whatever} +% \numqinrange{whatever} +% +% where ``whatever'' is the name of a grading range. +% +% \firstqinrange{whatever} prints the number of the first question in +% the range. +% +% \lastqinrange{whatever} prints the number of the last question in the +% range. +% +% \numqinrange{whatever} prints the number of questions in the range. +% +% We changed a couple of internal command name related to grading +% ranges. If the user defines the range `myrange', then we now use + +% \range@myrange@firstp +% \range@myrange@lastp +% \range@myrange@firstq +% \range@myrange@lastq +% +% where we used to use +% +% \tbl@myrange@firstp +% \tbl@myrange@lastp +% \tbl@myrange@firstq +% \tbl@myrange@lastq + +%-------------------------------------------------------------------- +% Version 2.407$\beta$ 2012/12/19 + +% New environment: +% +% solutionbox +% +% The solutionbox environment is different from the other solution +% environments (solution, solutionorbox, solutionorlines, +% solutionordottedlines, and solutionorgrid), in that +% +% (1) The box is always printed, whether answers are being printed +% or not. +% +% (2) The argument giving the size of the box is a required +% argument, not an optional argument, and so it should be enclosed +% in braces, not in brackets. It can be either a length or +% \stretch{number}. +% +% (3) We make no use of the TheSolution environment; the solutionbox +% environment is completely freestanding. +% +% If answers are not being printed then only the box is printed, with +% nothing in it. If answers are being printed, then the solution is +% printed inside of the box. +% +% Note: It's the user's responsibility to be sure that the box is +% large enough to hold the solution! If the solution takes up too +% much vertical space, then it will spill out of the bottom of the +% box, overwriting whatever follows the box. +% +%-------------------------------------------------------------------- +% Version 2.406$\beta$, 2012/12/16 +% +% New command: +% +% \noquestionsonthispage +% +% This command tells the \ifcontinuation and \ifincomplete commands +% to assume that no part of any question is on this page. This is +% similar to the job done by the \nomorequestions command for the +% pages that follow the end of all of the questions. +% +% +% If you give the command \noquestionsonthispage on a page, then +% +% (1) \ifcontinuation on that page will expand to its second +% argument, +% (2) \ifincomplete on that page will expand to its second +% argument, and +% (3) an \ifincomplete on an earlier page will not assume that a +% question from that earlier page continues onto this page. +% +% The way that this command affects the \ifincomplete command on +% earlier pages is as follows: If there is a page with no questions or +% parts or subparts or subsubparts, then the last page before that +% with a question (or part, etc.) would normally be deemed incomplete; +% if, however, the page with no questions (or parts, etc.) (along with +% all adjacent pages with no questions or parts etc.) has a +% \noquestionsonthispage command, then that last page with a question +% (or part, etc.) will not be deemed incomplete. +% +% Note that if you're tempted to use this command on a page that follows +% the end of all of the questions, then you should probably use the +% command \nomorequestions instead. +% +%-------------------------------------------------------------------- +% Version 2.405$\beta$, 2012/10/21 +% +% It is now possible to use a parts, subparts, or subsubparts +% environment inside one of the solution environments (solution, +% solutionorbox, solutionorlines, solutionordottedlines, or +% solutionorgrid) without getting problems from multiply defined +% labels or having its points (if any) counted as being actual points +% on the exam. +% +% Any \part, \subpart, or \subsubpart command inside one of the +% solution environments now writes a \PgInfo command in the .aux file +% of the form question2@object3, but no labels and no other \PgInfo +% commands. In addition, if there are points assigned to any of these +% commands inside any of the solution environments, those points are +% not added to the points of the question or the points on the page, +% and do not affect any gradetables or pointtables. +% +%-------------------------------------------------------------------- +% Version 2.404$\beta$, 2012/09/03 +% +% New command: +% +% \fillwithgrid{length} +% +% New environment: +% +% solutionorgrid +% +% These are similar to the \fillwithlines command and the +% solutionorlines environment. +% +% By default, the created grids are in black. However, if you give the +% commands +% +% \usepackage{color} +% \colorgrids +% +% then the grids will be in color, by default a light gray. That +% default color was defined by the command +% +% \definecolor{GridColor}{gray}{0.8} +% +% You can change the color by redefining the color GridColor, and you +% can return to using black grids by giving the command +% +% \nocolorgrids +% +% The default grid size and grid line thickness were set by the +% commands +% +% \setlength{\gridsize}{5mm} +% \setlength{\gridlinewidth}{0.1pt} +% +% You can change either or both of those by giving new \setlength +% commands. The period of the grid is \gridsize (both horizontally +% and vertically). That is, the horizontal distance from the left +% edge of one vertical line to the left edge of the next vertical line +% is \gridsize, as is the vertical distance from the top edge of one +% horizontal line to the top edge of the next horizontal line. Thus, +% each square has outer side length equal to \gridsize+\gridlinewidth. +% +%-------------------------------------------------------------------- +% Version 2.403$\beta$, 2012/08/29: +% +% We changed the code for the command \fillin (which had been modified +% in version 2.402beta) so that if only one optional argument is used, +% a space following that optional argument will not be ignored. We +% did this in such a way that the second optional argument will be +% recognized even when spaces appear in between the optional +% arguments. +% +%-------------------------------------------------------------------- +% Version 2.402$\beta$, 2012/08/21: +% +% We modified the command \fillin that we had created in version +% 2.401beta. \fillin now takes two optional arguments (and no required +% arguments). +% +% \fillin can take two optional arguments, as in +% +% \fillin[Answer][Length] +% +% The first optional argument is the answer to be printed above the line +% when \printanswers is in effect; the default value is empty. That +% line is printed a distance of \answerclearance below the baseline. +% +% The second optional argument is the length of the line that we print; +% the default value is \fillinlinelength. The value of +% \fillinlinelength is set with the command +% +% \setlength\fillinlinelength{1in} +% +% and can be changed by giving a new \setlength command. +% +% When answers are being printed, the first optional argument is +% printed subject to the declarations in the argument of the last +% \CorrectChoiceEmphasis command. It is centered on the line unless +% it is too long, in which case it extends to the right of the line. +% +%-------------------------------------------------------------------- +% Version 2.401$\beta$, 2012/08/20: +% +% +% New command: +% +% \fillin[CorrectAnswer]{width} +% +% This is for use in fill in the blank questions. This command inserts +% a blank line of width ``width''. If answers are being printed and if +% the optional argument ``CorrectAnswer'' appears, then the optional +% argument is printed subject to the declarations in the argument of the +% last \CorrectChoiceEmphasis command, and it is printed a distance of +% \answerclearance above the line. It is centered on the line unless it +% is too long, in which case it extends to the right of the line. +% +% Note: We changed this command in version 2.401beta. +% +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +\NeedsTeXFormat{LaTeX2e} + +\ProvidesClass{exam}[\filedate\space Version \fileversion\space by + Philip Hirschhorn] + +\RequirePackage{ifthen} + +\newif\ifprintanswers +\printanswersfalse +\DeclareOption{answers}{\printanswerstrue} +\DeclareOption{noanswers}{\printanswersfalse} + +\newif\ifcancelspace +\cancelspacefalse +\DeclareOption{cancelspace}{\cancelspacetrue} +\DeclareOption{nocancelspace}{\cancelspacefalse} + +% The following keeps track of whether the user has requested that we +% add up the points on the exam. We make the default false so that +% users who put other than numbers into the points argument of a +% question (or part, or subpart) won't get error messages. +% We use \if@printtotalpoints as a flag to signal that we are counting +% points, so that we will know to print the total on the screen (and +% in the log file). We use this separate flag so that the user can +% use both \addpoints and \noaddpoints to count some points and not +% others, but still have the total printed when we finish the file no +% matter what the state of \if@addpoints. +\newif\if@addpoints +\newif\if@printtotalpoints +\def\addpoints{\global\@addpointstrue\global\@printtotalpointstrue} +\def\noaddpoints{\global\@addpointsfalse} +\@addpointsfalse +\@printtotalpointsfalse +\DeclareOption{addpoints}{\addpoints} + + +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{article}% +} +\ProcessOptions\relax +\LoadClass{article} + + + + +% ***************** +% ** PAGE LAYOUT ** +% ***************** + + +% We set the parameters in terms of \paperwidth and \paperheight +% so that the options + +% a4paper +% a5paper +% b5paper +% letterpaper +% legalpaper +% executivepaper +% landscape + +% will all work: + +\setlength{\textwidth}{\paperwidth} +\addtolength{\textwidth}{-2in} +\setlength{\oddsidemargin}{0pt} +\setlength{\evensidemargin}{0pt} + +\setlength{\headheight}{15pt} +\setlength{\headsep}{15pt} +\setlength{\topmargin}{0in} +\addtolength{\topmargin}{-\headheight} +\addtolength{\topmargin}{-\headsep} +\setlength{\footskip}{29pt} +\setlength{\textheight}{\paperheight} +\addtolength{\textheight}{-2.2in} + +\setlength{\marginparwidth}{.5in} +\setlength{\marginparsep}{5pt} + +%-------------------------------------------------------------------- + +% **************** +% ** EXTRAWIDTH ** +% **************** + +\newlength\@extrawidth + +% \@rightmargin is needed for \pointsinrightmargin and +% \pointsdroppedatright, so that we can right justify the points: +\newlength\@rightmargin +\setlength{\@rightmargin}{1in} + +% We put the argument of \extrawidth into a length so that it will +% work correctly even if it's negative: + +\def\extrawidth#1{% + \@extrawidth=#1 + \advance \textwidth by \@extrawidth + \divide\@extrawidth by 2 + \advance\oddsidemargin by -\@extrawidth + \advance\evensidemargin by -\@extrawidth + % Bug fix, 13 April 2004: + %\advance\@rightmargin by \@extrawidth + \advance\@rightmargin by -\@extrawidth +} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Making room for large headers and footers + +% The following are used to save the effect of any changes to +% \topmargin and \textheight caused by \extraheadheight or +% \extrafootheight commands. They hold the values currently in effect. +% We put them into lengths so that it will work correctly even if the +% argument is negative: + +\newlength\@extrahead +\newlength\@extrafoot +\setlength{\@extrahead}{0in} +\setlength{\@extrafoot}{0in} + +% The following are used to hold the requested values for extrahead and +% extrafoot, first page and all pages after the first, and then the +% similar things requested for the cover pages: +\newlength\run@exhd +\newlength\fp@exhd +\newlength\run@exft +\newlength\fp@exft +\newlength\covrun@exhd +\newlength\covfp@exhd +\newlength\covrun@exft +\newlength\covfp@exft + +\setlength{\run@exhd}{0in} +\setlength{\fp@exhd}{0in} +\setlength{\run@exft}{0in} +\setlength{\fp@exft}{0in} +\setlength{\covrun@exhd}{0in} +\setlength{\covfp@exhd}{0in} +\setlength{\covrun@exft}{0in} +\setlength{\covfp@exft}{0in} + +\newcommand*\adj@hdht@ftht{% + \if@coverpages + \ifnum\value{page}=1\relax + \@setheadheight{\covfp@exhd}% + \@setfootheight{\covfp@exft}% + \else + \@setheadheight{\covrun@exhd}% + \@setfootheight{\covrun@exft}% + \fi + \else + \ifnum\value{page}=1\relax + \@setheadheight{\fp@exhd}% + \@setfootheight{\fp@exft}% + \else + \@setheadheight{\run@exhd}% + \@setfootheight{\run@exft}% + \fi + \fi +} + +\newcommand*\extraheadheight{% + \@ifnextchar[{\@xtrahd}{\@ytrahd}% +} + +\def\@xtrahd[#1]#2{% + \setlength{\fp@exhd}{#1}% + \setlength{\run@exhd}{#2}% + \adj@hdht@ftht +} + +\def\@ytrahd#1{% + \setlength{\fp@exhd}{#1}% + \setlength{\run@exhd}{#1}% + \adj@hdht@ftht +} + +\newcommand*\extrafootheight{% + \@ifnextchar[{\@xtraft}{\@ytraft}% +} + +\def\@xtraft[#1]#2{% + \setlength{\fp@exft}{#1}% + \setlength{\run@exft}{#2}% + \adj@hdht@ftht +} + +\def\@ytraft#1{% + \setlength{\fp@exft}{#1}% + \setlength{\run@exft}{#1}% + \adj@hdht@ftht +} + +\newcommand*\coverextraheadheight{% + \@ifnextchar[{\cov@xtrahd}{\cov@ytrahd}% +} + +\def\cov@xtrahd[#1]#2{% + \setlength{\covfp@exhd}{#1}% + \setlength{\covrun@exhd}{#2}% + \adj@hdht@ftht +} + +\def\cov@ytrahd#1{% + \setlength{\covfp@exhd}{#1}% + \setlength{\covrun@exhd}{#1}% + \adj@hdht@ftht +} + +\newcommand*\coverextrafootheight{% + \@ifnextchar[{\cov@xtraft}{\cov@ytraft}% +} + +\def\cov@xtraft[#1]#2{% + \setlength{\covfp@exft}{#1}% + \setlength{\covrun@exft}{#2}% + \adj@hdht@ftht +} + +\def\cov@ytraft#1{% + \setlength{\covfp@exft}{#1}% + \setlength{\covrun@exft}{#1}% + \adj@hdht@ftht +} + +\def\@appendoutput#1{% + \output=\expandafter{\the\output #1}% +} + +\@appendoutput{\adj@hdht@ftht} + +%-------------------------------------------------------------------- +% \@setheadheight and \@setfootheight: + +\def\@setheadheight#1{% + \begingroup % Avoid trouble from using \@temp and \@spaces + % Reset the effect of the most recent change: + \global\advance\topmargin by -\@extrahead + \global\advance\textheight by \@extrahead + % Bugfix, Version 2.510beta, 2016/10/11: + \global\advance\@colroom by \@extrahead + \global\advance\@colht by \@extrahead + \global\advance\vsize by \@extrahead + % + % Save the newly set value: + \def\@temp{#1} + \def\@spaces{ } + \ifx\@temp\@empty + \global\@extrahead=0in + \else + \ifx\@temp\@spaces + \global\@extrahead=0in + \else + \global\@extrahead=#1 + \fi + \fi + % Set the new values: + \global\advance\topmargin by \@extrahead + \global\advance\textheight by -\@extrahead + % Bugfix, Version 2.510beta, 2016/10/11: + \global\advance\@colroom by -\@extrahead + \global\advance\@colht by -\@extrahead + \global\advance\vsize by -\@extrahead + % + % Bugfix, Version 2.510beta, 2016/10/11: + % We're fixing a bug that was introduced by the bugfix in version + % 2.306beta, 2009/03/28: If the second page has a different + % \textheight (because of a change in either headheight or + % footheight between pages 1 and 2), then page 2 would use the + % \textheight of page 1. Pages 3 and beyond would get the correct + % \textheight. + % The original version of this set \@colroom and \vsize to the new + % \textheight, but that had a bug in that if a float appeared at + % the top of a page, there would be no notice taken of the space + % lost to the float, and so the text would overrun the bottom of + % the page. + % In this bugfix, we adjust \@colroom, \@colht, and \vsize in the + % same way that we adjust \textheight. + % + % Make it take effect RIGHT NOW!: + % (The following stuff isn't necessary if \@setheadheight is + % executed only in the preamble or as we return from the output + % routine, but we're leaving it in so that this will still work if + % we use this at some random point in the middle of composing a + % page). + % Bugfix, Version 2.306beta, 2009/03/28: + % We don't do this!! + % If the user had a figure environment that floated to the + % top of a page, then this would cause that page to run + % over the footer and off the bottom of the page, because + % this somehow caused a full page's worth of stuff to be + % placed after the figure, as if the figure wasn't taking + % up space on the page. + % We *do* need to put \@colht at the correct new value, though, + % apparently because \@colht is set near the end of the + % output routine. +% \global\@colht=\textheight +% +% \global\@colroom=\textheight +% \global\vsize=\textheight +% \global\pagegoal=\textheight + \endgroup +}% @setheadheight + +\def\@setfootheight#1{% + \begingroup % Avoid trouble from using \@temp and \@spaces + % Reset the effect of the most recent change: + \global\advance\textheight by \@extrafoot + % Bugfix, Version 2.510beta, 2016/10/11: + \global\advance\@colroom by \@extrafoot + \global\advance\@colht by \@extrafoot + \global\advance\vsize by \@extrafoot + % + % Save the newly set value: + \def\@temp{#1} + \def\@spaces{ } + \ifx\@temp\@empty + \global\@extrafoot=0in + \else + \ifx\@temp\@spaces + \global\@extrafoot=0in + \else + \global\@extrafoot=#1 + \fi + \fi + % Set the new values: + \global\advance\textheight by -\@extrafoot + % Bugfix, Version 2.510beta, 2016/10/11: + \global\advance\@colroom by -\@extrafoot + \global\advance\@colht by -\@extrafoot + \global\advance\vsize by -\@extrafoot + % + % Bugfix, Version 2.510beta, 2016/10/11: + % We're fixing a bug that was introduced by the bugfix in version + % 2.306beta, 2009/03/28: If the second page has a different + % \textheight (because of a change in either headheight or + % footheight between pages 1 and 2), then page 2 would use the + % \textheight of page 1. Pages 3 and beyond would get the correct + % \textheight. + % The original version of this set \@colroom and \vsize to the new + % \textheight, but that had a bug in that if a float appeared at + % the top of a page, there would be no notice taken of the space + % lost to the float, and so the text would overrun the bottom of + % the page. + % In this bugfix, we adjust \@colroom, \@colht, and \vsize in the + % same way that we adjust \textheight. + % + % Make it take effect RIGHT NOW!: + % (The following stuff isn't necessary if \@setfootheight is + % executed only in the preamble or as we return from the output + % routine, but we're leaving it in so that this will still work if + % we use this at some random point in the middle of composing a + % page). + % Bugfix, Version 2.306beta, 2009/03/28: + % We don't do this!! + % If the user had a figure environment that floated to the + % top of a page, then this would cause that page to run + % over the footer and off the bottom of the page, because + % this somehow caused a full page's worth of stuff to be + % placed after the figure, as if the figure wasn't taking + % up space on the page. + % We *do* need to put \@colht at the correct new value, though, + % apparently because \@colht is set near the end of the + % output routine. +% \global\@colht=\textheight +% +% \global\@colroom=\textheight +% \global\vsize=\textheight +% \global\pagegoal=\textheight + \endgroup +}% @setfootheight + + +%--------------------------------------------------------------------- +% +% ************************* +% ** HEADERS AND FOOTERS ** +% ************************* +% +% The pagestyles available are head, foot, headandfoot, and empty. +% \pagestyle{head} prints the head, and gives an empty foot. +% \pagestyle{foot} prints the foot, and gives an empty head. +% \pagestyle{headandfoot} prints both the head and the foot. +% \pagestyle{empty} gives an empty head and an empty foot. +% + +% Pagestyles: + +\newcommand*\ps@head{% + \@dohead + \@nofoot +} + +\newcommand*\ps@headandfoot{% + \@dohead + \@dofoot +} + +\newcommand*\ps@foot{% + \@nohead + \@dofoot +} + +% \ps@empty is already defined by article.cls, so we'll +% say \def instead of \newcommand*: +\def\ps@empty{% + \@nohead + \@nofoot +} + +\newif\if@coverpages +\@coverpagesfalse + +\newcounter{num@coverpages} +% We'll set this to zero in case there is no coverpages environment: +\setcounter{num@coverpages}{0} + +\newenvironment{coverpages}{% + \ifnum \value{numquestions}>0\relax + \ClassError{exam}{% + Coverpages cannot be used after questions have begun.\MessageBreak + }{% + All question, part, subpart, and subsubpart environments + \MessageBreak + must begin after the cover pages are complete.\MessageBreak + }% + \fi + \@coverpagestrue + \pagenumbering{roman}% + \adj@hdht@ftht + }{% + \clearpage + \setcounter{num@coverpages}{\value{page}}% + \addtocounter{num@coverpages}{-1}% + \pagenumbering{arabic}% + % Bugfix, Version 2.307\beta, 2009/06/11: + % We have to say \@coverpagesfalse before \adj@hdht@ftht + % because we're still inside the group created by the + % coverpages environment and we want to set the + % extraheadheight and extrafootheight to the values correct + % for the first non-cover page: + \@coverpagesfalse + \adj@hdht@ftht +} + +\newcommand*\cover@question@error{% + \ClassError{exam}{% + No questions are allowed in the cover pages.\MessageBreak + }{% + All question, part, subpart, and subsubpart environments + \MessageBreak + must begin after the cover pages are complete.\MessageBreak + }% +} + +\newcommand*\@dohead{% + \def\@oddhead{% + \if@coverpages + \ifnum\value{page}=1\relax + \cov@fullhead + \else + \covrun@fullhead + \fi + \else + \ifnum\value{page}=1\relax + \@fullhead + \else + \run@fullhead + \fi + \fi + }% @oddhead + \let\@evenhead=\@oddhead +} + +\newcommand*\@dofoot{% + \def\@oddfoot{% + \if@coverpages + \ifnum\value{page}=1\relax + \cov@fullfoot + \else + \covrun@fullfoot + \fi + \else + \ifnum\value{page}=1\relax + \@fullfoot + \else + \run@fullfoot + \fi + \fi + }% @oddfoot + \let\@evenfoot=\@oddfoot +} + +\newcommand*\@nohead{% + \def\@oddhead{}% + \let\@evenhead=\@oddhead +} + +\newcommand*\@nofoot{% + \def\@oddfoot{}% + \let\@evenfoot=\@oddfoot +} + +%-------------------------------------------------------------------- +% \@fullhead, \run@fullhead, \@fullfoot, and \run@fullfoot: + +\newcommand*\@fullhead{% + \vbox to \headheight{% + \vss + \hbox to \textwidth{% + \normalfont\rlap{\parbox[b]{\textwidth}{\raggedright\@lhead\strut}}% + \hss\parbox[b]{\textwidth}{\centering\@chead\strut}\hss + \llap{\parbox[b]{\textwidth}{\raggedleft\@rhead\strut}}% + }% hbox + \if@headrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + }% vbox +} + +\newcommand*\run@fullhead{% + \vbox to \headheight{% + \vss + \hbox to \textwidth{% + \normalfont\rlap{\parbox[b]{\textwidth}{\raggedright\run@lhead\strut}}% + \hss\parbox[b]{\textwidth}{\centering\run@chead\strut}\hss + \llap{\parbox[b]{\textwidth}{\raggedleft\run@rhead\strut}}% + }% hbox + \ifrun@headrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + }% vbox +} + +% We arrange it so that the very top of first line of text in the +% foot is at a fixed position on the page, whether or not there's +% a footrule: + +\newcommand*\@fullfoot{% + \vbox to 0pt{% + \if@footrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + \vskip 3pt + \hbox to \textwidth{% + \normalfont\rlap{\parbox[t]{\textwidth}{\raggedright\@lfoot}}% + \hss\parbox[t]{\textwidth}{\centering\@cfoot}\hss + \llap{\parbox[t]{\textwidth}{\raggedleft\@rfoot}}% + }% hbox + \vss + }% vbox +} + +\newcommand*\run@fullfoot{% + \vbox to 0pt{% + \ifrun@footrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + \vskip 3pt + \hbox to \textwidth{% + \normalfont\rlap{\parbox[t]{\textwidth}{\raggedright\run@lfoot}}% + \hss\parbox[t]{\textwidth}{\centering\run@cfoot}\hss + \llap{\parbox[t]{\textwidth}{\raggedleft\run@rfoot}}% + }% hbox + \vss + }% vbox +} + +%-------------------------------------------------------------------- +% \cov@fullhead, \covrun@fullhead, \cov@fullfoot, and +% \covrun@fullfoot: + +\newcommand*\cov@fullhead{% + \vbox to \headheight{% + \vss + \hbox to \textwidth{% + \normalfont\rlap{\parbox[b]{\textwidth}{\raggedright\cov@lhead\strut}}% + \hss\parbox[b]{\textwidth}{\centering\cov@chead\strut}\hss + \llap{\parbox[b]{\textwidth}{\raggedleft\cov@rhead\strut}}% + }% hbox + \ifcov@headrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + }% vbox +} + +\newcommand*\covrun@fullhead{% + \vbox to \headheight{% + \vss + \hbox to \textwidth{% + \normalfont\rlap{\parbox[b]{\textwidth}{\raggedright\covrun@lhead\strut}}% + \hss\parbox[b]{\textwidth}{\centering\covrun@chead\strut}\hss + \llap{\parbox[b]{\textwidth}{\raggedleft\covrun@rhead\strut}}% + }% hbox + \ifcovrun@headrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + }% vbox +} + +% We arrange it so that the very top of first line of text in the +% foot is at a fixed position on the page, whether or not there's +% a footrule: + +\newcommand*\cov@fullfoot{% + \vbox to 0pt{% + \ifcov@footrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + \vskip 3pt + \hbox to \textwidth{% + \normalfont\rlap{\parbox[t]{\textwidth}{\raggedright\cov@lfoot}}% + \hss\parbox[t]{\textwidth}{\centering\cov@cfoot}\hss + \llap{\parbox[t]{\textwidth}{\raggedleft\cov@rfoot}}% + }% hbox + \vss + }% vbox +} + +\newcommand*\covrun@fullfoot{% + \vbox to 0pt{% + \ifcovrun@footrule + \hrule + \else + % an invisible hrule, to keep positioning constant: + \hrule width 0pt + \fi + \vskip 3pt + \hbox to \textwidth{% + \normalfont\rlap{\parbox[t]{\textwidth}{\raggedright\covrun@lfoot}}% + \hss\parbox[t]{\textwidth}{\centering\covrun@cfoot}\hss + \llap{\parbox[t]{\textwidth}{\raggedleft\covrun@rfoot}}% + }% hbox + \vss + }% vbox +} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% +% ******************************************** +% ** COMMANDS TO DEFINE HEADERS AND FOOTERS ** +% ******************************************** +% +% \lhead[#1]{#2} sets the first page left head to #1, and the +% running left head to #2 +% +% \lhead{#1} sets both the first page left head and the running +% left head to #1 +% +% \chead, \rhead, \lfoot, \cfoot, and \rfoot work similarly. +% +% +% \@lhead is the left head for Page 1 +% \run@lhead is the running left head +% (i.e., for all pages other than the first) +% +% \@chead is the center head for Page 1 +% \run@chead is the running center head +% (i.e., for all pages other than the first) +% +% etc. +% +% Alternative commands are: +% \firstpageheader{LEFT}{CENTER}{RIGHT} +% \runningheader{LEFT}{CENTER}{RIGHT} +% or +% \header{LEFT}{CENTER}{RIGHT} +% which is equivalent to the two commands +% \firstpageheader{LEFT}{CENTER}{RIGHT} +% \runningheader{LEFT}{CENTER}{RIGHT} +% +% Alternative commands are: +% \firstpagefooter{LEFT}{CENTER}{RIGHT} +% \runningfoother{LEFT}{CENTER}{RIGHT} +% or +% \footer{LEFT}{CENTER}{RIGHT} +% which is equivalent to the two commands +% \firstpagefooter{LEFT}{CENTER}{RIGHT} +% \runningfoother{LEFT}{CENTER}{RIGHT} + +\def\firstpageheader#1#2#3{% + \def\@lhead{#1}% + \def\@chead{#2}% + \def\@rhead{#3}% +} + +\def\runningheader#1#2#3{% + \def\run@lhead{#1}% + \def\run@chead{#2}% + \def\run@rhead{#3}% +} + +\def\header#1#2#3{% + \firstpageheader{#1}{#2}{#3}% + \runningheader{#1}{#2}{#3}% +} + +\def\firstpagefooter#1#2#3{% + \def\@lfoot{#1}% + \def\@cfoot{#2}% + \def\@rfoot{#3}% +} + +\def\runningfooter#1#2#3{% + \def\run@lfoot{#1}% + \def\run@cfoot{#2}% + \def\run@rfoot{#3}% +} + +\def\footer#1#2#3{% + \firstpagefooter{#1}{#2}{#3}% + \runningfooter{#1}{#2}{#3}% +} + +\def\lhead{\@ifnextchar[{\@xlhead}{\@ylhead}} +\def\@xlhead[#1]#2{\def\@lhead{#1}\def\run@lhead{#2}} +\def\@ylhead#1{\def\run@lhead{#1}\def\@lhead{#1}} + +\def\chead{\@ifnextchar[{\@xchead}{\@ychead}} +\def\@xchead[#1]#2{\def\@chead{#1}\def\run@chead{#2}} +\def\@ychead#1{\def\run@chead{#1}\def\@chead{#1}} + +\def\rhead{\@ifnextchar[{\@xrhead}{\@yrhead}} +\def\@xrhead[#1]#2{\def\@rhead{#1}\def\run@rhead{#2}} +\def\@yrhead#1{\def\run@rhead{#1}\def\@rhead{#1}} + +\def\lfoot{\@ifnextchar[{\@xlfoot}{\@ylfoot}} +\def\@xlfoot[#1]#2{\def\@lfoot{#1}\def\run@lfoot{#2}} +\def\@ylfoot#1{\def\run@lfoot{#1}\def\@lfoot{#1}} + +\def\cfoot{\@ifnextchar[{\@xcfoot}{\@ycfoot}} +\def\@xcfoot[#1]#2{\def\@cfoot{#1}\def\run@cfoot{#2}} +\def\@ycfoot#1{\def\run@cfoot{#1}\def\@cfoot{#1}} + +\def\rfoot{\@ifnextchar[{\@xrfoot}{\@yrfoot}} +\def\@xrfoot[#1]#2{\def\@rfoot{#1}\def\run@rfoot{#2}} +\def\@yrfoot#1{\def\run@rfoot{#1}\def\@rfoot{#1}} + + +% Initialize head and foot: + +\pagestyle{headandfoot} + +\lhead{} +\chead{} +\rhead{} +\lfoot{} +\cfoot[]{Page \thepage} +\rfoot{} + +%-------------------------------------------------------------------- +% Coverpage headers and footers +% +% \coverlhead[#1]{#2} sets the first cover page left head to #1, and the +% running cover left head to #2 +% +% \coverlhead{#1} sets both the first cover page left head and the running +% cover left head to #1 +% +% \coverchead, \coverrhead, \coverlfoot, \covercfoot, and \coverrfoot +% work similarly. +% +% +% \cov@lhead is the left head for Page 1 +% \covrun@lhead is the running left head +% (i.e., for all pages other than the first) +% +% \cov@chead is the center head for Page 1 +% \covrun@chead is the running center head +% (i.e., for all pages other than the first) +% +% etc. +% +% Alternative commands are: +% \coverfirstpageheader{LEFT}{CENTER}{RIGHT} +% \coverrunningheader{LEFT}{CENTER}{RIGHT} +% or +% \coverheader{LEFT}{CENTER}{RIGHT} +% which is equivalent to the two commands +% \coverfirstpageheader{LEFT}{CENTER}{RIGHT} +% \coverrunningheader{LEFT}{CENTER}{RIGHT} +% +% Alternative commands are: +% \coverfirstpagefooter{LEFT}{CENTER}{RIGHT} +% \coverrunningfoother{LEFT}{CENTER}{RIGHT} +% or +% \coverfooter{LEFT}{CENTER}{RIGHT} +% which is equivalent to the two commands +% \coverfirstpagefooter{LEFT}{CENTER}{RIGHT} +% \coverrunningfoother{LEFT}{CENTER}{RIGHT} + +\def\coverfirstpageheader#1#2#3{% + \def\cov@lhead{#1}% + \def\cov@chead{#2}% + \def\cov@rhead{#3}% +} + +\def\coverrunningheader#1#2#3{% + \def\covrun@lhead{#1}% + \def\covrun@chead{#2}% + \def\covrun@rhead{#3}% +} + +\def\coverheader#1#2#3{% + \coverfirstpageheader{#1}{#2}{#3}% + \coverrunningheader{#1}{#2}{#3}% +} + +\def\coverfirstpagefooter#1#2#3{% + \def\cov@lfoot{#1}% + \def\cov@cfoot{#2}% + \def\cov@rfoot{#3}% +} + +\def\coverrunningfooter#1#2#3{% + \def\covrun@lfoot{#1}% + \def\covrun@cfoot{#2}% + \def\covrun@rfoot{#3}% +} + +\def\coverfooter#1#2#3{% + \coverfirstpagefooter{#1}{#2}{#3}% + \coverrunningfooter{#1}{#2}{#3}% +} + +\def\coverlhead{\@ifnextchar[{\cov@xlhead}{\cov@ylhead}} +\def\cov@xlhead[#1]#2{\def\cov@lhead{#1}\def\covrun@lhead{#2}} +\def\cov@ylhead#1{\def\covrun@lhead{#1}\def\cov@lhead{#1}} + +\def\coverchead{\@ifnextchar[{\cov@xchead}{\cov@ychead}} +\def\cov@xchead[#1]#2{\def\cov@chead{#1}\def\covrun@chead{#2}} +\def\cov@ychead#1{\def\covrun@chead{#1}\def\cov@chead{#1}} + +\def\coverrhead{\@ifnextchar[{\cov@xrhead}{\cov@yrhead}} +\def\cov@xrhead[#1]#2{\def\cov@rhead{#1}\def\covrun@rhead{#2}} +\def\cov@yrhead#1{\def\covrun@rhead{#1}\def\cov@rhead{#1}} + +\def\coverlfoot{\@ifnextchar[{\cov@xlfoot}{\cov@ylfoot}} +\def\cov@xlfoot[#1]#2{\def\cov@lfoot{#1}\def\covrun@lfoot{#2}} +\def\cov@ylfoot#1{\def\covrun@lfoot{#1}\def\cov@lfoot{#1}} + +\def\covercfoot{\@ifnextchar[{\cov@xcfoot}{\cov@ycfoot}} +\def\cov@xcfoot[#1]#2{\def\cov@cfoot{#1}\def\covrun@cfoot{#2}} +\def\cov@ycfoot#1{\def\covrun@cfoot{#1}\def\cov@cfoot{#1}} + +\def\coverrfoot{\@ifnextchar[{\cov@xrfoot}{\cov@yrfoot}} +\def\cov@xrfoot[#1]#2{\def\cov@rfoot{#1}\def\covrun@rfoot{#2}} +\def\cov@yrfoot#1{\def\covrun@rfoot{#1}\def\cov@rfoot{#1}} + + +% Initialize coverpage head and foot: + +\coverlhead{} +\coverchead{} +\coverrhead{} +\coverlfoot{} +\covercfoot{} +\coverrfoot{} + + + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +% Headrules and footrules: + +\newif\if@headrule +\newif\ifrun@headrule + +\def\firstpageheadrule{\@headruletrue} +\def\nofirstpageheadrule{\@headrulefalse} + +\def\runningheadrule{\run@headruletrue} +\def\norunningheadrule{\run@headrulefalse} + +\def\headrule{\@headruletrue\run@headruletrue} +\def\noheadrule{\@headrulefalse\run@headrulefalse} + +\newif\if@footrule +\newif\ifrun@footrule + +\def\firstpagefootrule{\@footruletrue} +\def\nofirstpagefootrule{\@footrulefalse} + +\def\runningfootrule{\run@footruletrue} +\def\norunningfootrule{\run@footrulefalse} + +\def\footrule{\@footruletrue\run@footruletrue} +\def\nofootrule{\@footrulefalse\run@footrulefalse} + +% Initialize: + +\noheadrule +\nofootrule + +% Cover page headrules and footrules: + +\newif\ifcov@headrule +\newif\ifcovrun@headrule + +\def\coverfirstpageheadrule{\cov@headruletrue} +\def\nocoverfirstpageheadrule{\cov@headrulefalse} + +\def\coverrunningheadrule{\covrun@headruletrue} +\def\nocoverrunningheadrule{\covrun@headrulefalse} + +\def\coverheadrule{\cov@headruletrue\covrun@headruletrue} +\def\nocoverheadrule{\cov@headrulefalse\covrun@headrulefalse} + +\newif\ifcov@footrule +\newif\ifcovrun@footrule + +\def\coverfirstpagefootrule{\cov@footruletrue} +\def\nocoverfirstpagefootrule{\cov@footrulefalse} + +\def\coverrunningfootrule{\covrun@footruletrue} +\def\nocoverrunningfootrule{\covrun@footrulefalse} + +\def\coverfootrule{\cov@footruletrue\covrun@footruletrue} +\def\nocoverfootrule{\cov@footrulefalse\covrun@footrulefalse} + +% Initialize: + +\nocoverheadrule +\nocoverfootrule + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +% \numpages, \iflastpage, and \oddeven +% Also: \numpoints, \numquestions, \numparts, and \numsubparts +% Also also: \pointsofquestion +% Also: \numcoverpages and \totalnumpages + +% Make the number of pages available as the macro \numpages, +% the number of points as \numpoints, +% the number of questions as \numquestions, +% the number of parts as \numparts, and +% the number of subparts as \numsubparts + +% This was previously done with \pageref commands. When I stopped +% using \pageref for this (in order to make this compatible with +% hyperref.sty), this stuff was created: + +% \gdef commands for exam@lastpage, exam@numpoints, +% exam@numbonuspoints, exam@numquestions, exam@numparts, +% exam@numsubparts and exam@numsubsubparts are written to the .aux +% file via \AtEndDocument. + +% \gdef commands for pointsofq@i, pointsofq@ii, etc. and +% bonuspointsofq@i, bonuspointsofq@ii, etc. are written to the .aux +% file as each question is completed (see the definition of the +% questions environment). + +% \gdef commands for pointsonpage@i, pointsonpage@ii, etc. and +% bonuspointsonpage@i, bonuspointsonpage@ii, etc. are written to the +% .aux file as we encounter points defined for a later page, and for +% the last such page with AtEndDocument. + +\def\numpages{\@ifundefined{exam@lastpage}% + {\mbox{\normalfont\bfseries ??}}% + \exam@lastpage +}% numpages + +% Change 2011/04/01: We added a ``0'' in front of the +% mbox when \exam@lastcoverpage isn't defined. This is +% so that the construction \romannumeral\numcoverpages +% won't generate an error on the first run of latex. +\def\numcoverpages{\@ifundefined{exam@lastcoverpage}% + {0\mbox{\normalfont\bfseries ??}}% + \exam@lastcoverpage +}% numpages + +\def\totalnumpages{\@ifundefined{exam@totalpages}% + {\mbox{\normalfont\bfseries ??}}% + \exam@totalpages +}% numpages + +\def\numpoints{\@ifundefined{exam@numpoints}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numpoints +}% numpoints +\def\numbonuspoints{\@ifundefined{exam@numbonuspoints}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numbonuspoints +}% numbonuspoints + +\def\numquestions{\@ifundefined{exam@numquestions}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numquestions +}% numquestions + +\def\numparts{\@ifundefined{exam@numparts}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numparts +}% numparts + +\def\numsubparts{\@ifundefined{exam@numsubparts}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numsubparts +}% numsubparts + +\def\numsubsubparts{\@ifundefined{exam@numsubsubparts}% + {\mbox{\normalfont\bfseries ??}}% + \exam@numsubsubparts +}% numsubsubparts + +\def\pointsofquestion#1{\@ifundefined{pointsofq@\romannumeral #1}% + {\mbox{\normalfont\bfseries ??}}% + {\csname pointsofq@\romannumeral #1\endcsname}% +}% pointsofquestion +\def\bonuspointsofquestion#1{\@ifundefined{bonuspointsofq@\romannumeral #1}% + {\mbox{\normalfont\bfseries ??}}% + {\csname bonuspointsofq@\romannumeral #1\endcsname}% +}% bonuspointsofquestion + +% For use in \combinedgradetable and \combinedpointtable, we're +% changing the defintions of \pointsonpage and \bonuspointsonpage +% so that when, e.g., pointsonpage@ii is undefined, we just produce +% 0. This comes up because the final page of the exam may have either +% points with no bonus point or bonus points with no points, in which +% case the combined table will try to list both points and bonus points +% for that last page, and one of those will be undefined. +% +% \def\pointsonpage#1{\@ifundefined{pointsonpage@\romannumeral #1}% +% {\mbox{\normalfont\bfseries ??}}% +% {\csname pointsonpage@\romannumeral #1\endcsname}% +% }% pointsonpage +% \def\bonuspointsonpage#1{\@ifundefined{bonuspointsonpage@\romannumeral #1}% +% {\mbox{\normalfont\bfseries ??}}% +% {\csname bonuspointsonpage@\romannumeral #1\endcsname}% +% }% bonuspointsonpage +% +% spanish.ldf redefines \@roman, so we'll avoid using \roman: +\def\pointsonpage#1{\@ifundefined{pointsonpage@\romannumeral #1}% + {0}% + {\csname pointsonpage@\romannumeral #1\endcsname}% +}% pointsonpage +\def\bonuspointsonpage#1{\@ifundefined{bonuspointsonpage@\romannumeral #1}% + {0}% + {\csname bonuspointsonpage@\romannumeral #1\endcsname}% +}% bonuspointsonpage + + +\newif\if@pointschanged +\@pointschangedfalse + +\newcommand*{\CheckIfChanged@hlf}[2]{% + % The first argument is the name of a half counter. + % The second argument expands to the name (without the escape + % character, and not assumed to be defined) of the control sequence + % holding the previous value. + \@ifundefined{#2}% + {\global\@pointschangedtrue}% + {% + % OK; it's defined. See if it's changed: + \begingroup + \set@hlfcntr{tmp@hlfcntr}{\csname #2\endcsname}% + \edef\othpt@check{\prtaux@hlfcntr{tmp@hlfcntr}}% + \edef\pt@check{\prtaux@hlfcntr{#1}}% + \ifx \pt@check \othpt@check + % Do nothing + \else + \global\@pointschangedtrue + \fi + \endgroup + }% +}% CheckIfChanged@hlf + + +%%%\let\@realenddocument=\enddocument +%%%\def\enddocument{\clearpage +%%% \if@filesw +%%% {\advance\c@page-1 \immediate\write\@mainaux +%%% {\string\newlabel{@lastpage}{{}{\arabic{page}}}}% +%%% } +%%% \fi +%%% \@realenddocument +%%%} + +\AtEndDocument{% + \clearpage + \if@filesw + \advance\c@page-1 + \immediate\write\@mainaux + {\string\gdef\string\exam@lastpage{\arabic{page}}}% + \immediate\write\@mainaux + {\string\gdef\string\exam@lastcoverpage{\arabic{num@coverpages}}}% + % We can now trash the value of num@coverpages: + \addtocounter{num@coverpages}{\value{page}}% + \immediate\write\@mainaux + {\string\gdef\string\exam@totalpages{\arabic{num@coverpages}}}% + \advance\c@page+1 % In case some other package looks at \c@page + % + \immediate\write\@mainaux + {\string\gdef\string\exam@numpoints{% + \prtaux@hlfcntr{numpoints}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{numpoints}{exam@numpoints}% + \immediate\write\@mainaux + {\string\gdef\string\exam@numbonuspoints{% + \prtaux@hlfcntr{numbonuspoints}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{numbonuspoints}{exam@numbonuspoints}% + \immediate\write\@mainaux + {\string\gdef\string\exam@numquestions{\thenumquestions}}% + \immediate\write\@mainaux + {\string\gdef\string\exam@numparts{\thenumparts}}% + \immediate\write\@mainaux + {\string\gdef\string\exam@numsubparts{\thenumsubparts}}% + \immediate\write\@mainaux + {\string\gdef\string\exam@numsubsubparts{\thenumsubsubparts}}% + \ifnum \thepageof@pagepoints > 0\relax + \immediate\write\@mainaux + {\string\gdef\string\pointsonpage@\romannumeral + \csname c@pageof@pagepoints\endcsname + {\prtaux@hlfcntr{@pagepoints}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{@pagepoints}{pointsonpage@\romannumeral + \csname c@pageof@pagepoints\endcsname}% + \fi + \ifnum \thepageof@pagebonuspoints > 0\relax + \immediate\write\@mainaux + {\string\gdef\string\bonuspointsonpage@\romannumeral + \csname c@pageof@pagebonuspoints\endcsname + {\prtaux@hlfcntr{@pagebonuspoints}}}% + \CheckIfChanged@hlf{@pagebonuspoints}{bonuspointsonpage@\romannumeral + \csname c@pageof@pagebonuspoints\endcsname}% + \fi + \immediate\write\@mainaux + {\string\gdef\string\lastpage@withpoints{\page@withpoints}}% + % See if this has changed from the last run of LaTeX: + \@ifundefined{lastpage@withpoints}% + {\global\@pointschangedtrue}% + {% + % OK; it's defined. See if it's changed: + \begingroup + \edef\othpt@check{\page@withpoints}% + \edef\pt@check{\lastpage@withpoints}% + \ifx \pt@check \othpt@check + % Do nothing + \else + \global\@pointschangedtrue + \fi + \endgroup + }% + \immediate\write\@mainaux + {\string\gdef\string\lastpage@withbonuspoints{\page@withbonuspoints}}% + % See if this has changed from the last run of LaTeX: + \@ifundefined{lastpage@withbonuspoints}% + {\global\@pointschangedtrue}% + {% + % OK; it's defined. See if it's changed: + \begingroup + \edef\othpt@check{\page@withbonuspoints}% + \edef\pt@check{\lastpage@withbonuspoints}% + \ifx \pt@check \othpt@check + % Do nothing + \else + \global\@pointschangedtrue + \fi + \endgroup + }% + \fi + % Echo numbers of questions, parts, and subparts: + \typeout{This exam contains \thenumquestions\space questions + with \thenumparts\space parts, \thenumsubparts\space subparts, + and \thenumsubsubparts\space subsubparts.} + % If counting points, echo total points: + \if@printtotalpoints + \begingroup + \def\typ@expnd{% + \thenumpoints + \ifnumpoints@half + \space and a half% + \fi + } + \typeout{This exam has a total of \typ@expnd\space points.} + \def\typ@expnd{% + \thenumbonuspoints + \ifnumbonuspoints@half + \space and a half% + \fi + } + \typeout{This exam has a total of \typ@expnd\space bonus points.} + \endgroup + \fi + \if@pointschanged + \ClassWarningNoLine{exam}{Point totals have changed. + Rerun to get point totals right}% + \fi +}% AtEndDocument + + +% We define \iflastpage so that it can safely be used +% in headers and footers: +\def\iflastpage#1#2{% + \@ifundefined{exam@lastpage}{\def\@@lastpage{-1}}% + {\edef\@@lastpage{\exam@lastpage}}% + \ifnum\value{page}=\@@lastpage\relax + #1% + \else + #2% + \fi +}% iflastpage + + +% The macro \oddeven takes two arguments. If the page number is odd, +% then you get the first argument; otherwise, you get the second +% argument. +\def\oddeven#1#2{% + \ifodd\value{page}% + #1% + \else + #2% + \fi +}% oddeven + + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% \ifcontinuation, \ContinuedQuestion, +% \ifincomplete, and \IncompleteQuestion + +% The commands \ifcontinuation, \ContinuedQuestion, \ifincomplete, and +% \IncompleteQuestion assume that there is only one questions +% environment in the entire document. (Actually, \ContinuedQuestion +% should work even if there are multiple questions environments, but +% none of the other three will work in general.) + + + +% \PgInfo@write, \PgInfo and \PgInfo@get are our replacements +% for \label, \newlabel, and \pageref. (We're avoiding using +% \label, \newlabel, and \pageref so that we will be compatible +% with hyperref.sty, which redefines those commands.) + +% We use \PgInfo, \PgInfo@write, and \PgInfo@get to know on which page +% each question, part, subpart, subsubpart, and choice appears. + +% We use \PgInfo@write to write \PgInfo commands to the .aux file. The +% \PgInfo command takes two arguments: A question (or part, or subpart, +% or subsubpart) label, and the number of the page on which it appears. + +% The label for a question is of the form `question@2' (if it's question +% 2). + +% The label for a part is of the form `part@2@1' (if it's part a of +% question 2). + +% The label for a subpart is of the form `subpart@2@1@3' (if it's +% subpart iii of part a of question 2). + +% The label for a subsubpart is of the form `subsubpart@2@1@3@4' (if +% it's subsubpart $\delta$ of subpart iii of part a of question 2). + +% Each question, part, subpart, subsubpart, and choice also gets a +% \PgInfo@write command using a label of the form question2@object3 (if +% it's the third object of the second question). + +% Inside one of the solution environments (solution, solutionorbox, +% etc.) each part, subpart, subsubpart, and choice get only the +% \PgInfo@write command using a label of the form question2@object3 +% (if it's the third object of the second question). + +% When read in from the .aux file, the \PgInfo command defines a +% control sequence of the form `Pg@label' that expands to the page +% number for the corresponding question. For example, +% \PgInfo{subsubpart@2@1@3@4}{7} defines \csname +% Pg@subsubpart@2@1@3@4\endcsname to expand to 7. + +% The \PgInfo@get{label} command returns the value of the macro Pg@label, +% but it *doesn't* check whether that macro is defined. Thus, it's +% important to check that the macro Pg@label is defined before giving the +% command \PgInfo@get{label}. + + + +% The token list to a \write command isn't expanded until +% it's shipped out. Since the argument to PgInfo@write +% generally contains macros, we want to expand those macros +% now, rather than waiting until this is shipped out, at which +% point the macros may have different values. Thus, we use +% \edef to force expansion of the argument, and we put +% a \noexpand in front of \thepage so that the \thepage +% will not be expanded now. (This may not get shipped out +% until a later page, and so we want the \thepage to be expanded +% only when it's shipped out.) +% We use the \begingroup \endgroup pair so that our use +% of \reserved@a won't affect its use anywhere else. +\def\PgInfo@write#1{% + \begingroup + \edef\reserved@a{\write\@mainaux + {\string\PgInfo{#1}{\noexpand\thepage}}}% + \reserved@a + \endgroup +} + +%\PgInfo commands are written to the .aux file by the \PgInfo@write +%command; that's the only place that \PgInfo commands appear. +\def\PgInfo#1#2{\expandafter\gdef\csname Pg@#1\endcsname{#2}} + +% Note: PgInfo@get assumes that the control sequence being +% constructed is already defined; you have to make sure of this +% *before* calling \Pginfo@get +\def\PgInfo@get#1{\csname Pg@#1\endcsname} + +% \set@counter@to@pageof takes two arguments: The first is the name of a +% counter, and the second (expands to) the label of a question, part, +% subpart, subsubpart, or choice. If that label exists, then we set the +% counter equal to the page on which the question (or part, etc.) +% appears. If that label doesn't exist, we set the counter equal to -1. +% (No labels exist on the first run of LaTeX on the file, and if a new +% question (or part, etc.) was created by editing the file, then the +% label will not exist until the run of LaTeX after that.) +\def\set@counter@to@pageof#1#2{% + \@ifundefined{Pg@#2}% + {\setcounter{#1}{-1}}% + {\setcounter{#1}{\csname Pg@#2\endcsname}}% +} + + +%-------------------------------------------------------------------- + +% \ifcontinuation#1#2 expands to #2 if either: +% (1) The command \noquestionsonthispage has been given on this page, +% or +% (2) The current page is before the page containing question number +% 1, or +% (3) A question begins on this page before any part, subpart, +% subsubpart, or choice begins, or +% (4) The current page is later than a page with the \nomorequestions +% command. +% Otherwise, it expands to #1. +% +% Thus, for example, if there are no questions, parts, subparts, +% subsubparts, or choices on this page, and no \noquestionsonthispage +% command, and we're not before question 1, and not after a +% \nomorequestions command, then \ifcontinuation will expand to #1. + + +\def\ifcontinuation#1#2{% + % If there's a \noquestionsonthispage command on this page, then + % we assume that we're not continuing anything: + \@ifundefined{No@Questions@Pg@\thepage}% + {\chk@contin{#1}{#2}}% + {#2}% +}% \ifcontinuation + +\def\chk@contin#1#2{% + % We check whether we're on a page *before* the page on which the + % first question appears. If we don't yet know which page has + % question number 1, then we must be doing an early run of LaTeX, + % and we'll assume we're not a continuation. + \expandafter\ifx\csname Pg@question@1\endcsname\relax + % No page info yet; assume not a continuation + #2% + \else + % Note: The ``\relax'' at the end of the following \ifnum + % serves an entirely different purpose from the one at the + % end of the above \expandafter\ifx. That one (above) + % is one of the things being compared, whereas the + % one we're about to use is just to clearly mark the + % end of the second number being compared by the \ifnum + % (since it's conceivable that the ``#2'' would begin + % with a digit). + \ifnum \thepage < \csname Pg@question@1\endcsname\relax + % We're before the page with question 1: + #2% + \else + % The current page begins a new question if Contin@\thepage + % has been defined as a macro that expands to \relax (Note + % that this is different from if Contin@\thepage has never + % been defined at all, in which case it will be let equal to + % \relax (temporarily) by the \csname command.) + \expandafter\ifx\csname Contin@\thepage\endcsname\ref@relax + #2% + \else + % See if we're after a \nomorequestions command: + \@ifundefined{Pg@@endquestions}% + {#1}% + {\ifnum \thepage > \PgInfo@get{@endquestions}\relax + % We're after a \nomorequestions: + #2% + \else + % We actually are incomplete: + #1% + \fi + }% + \fi + \fi + \fi +}% chk@contin + +\def\nomorequestions{% + \PgInfo@write{@endquestions}% +}% nomorequestions + +\def\noquestionsonthispage{% + \write\@mainaux{\string\expandafter\string\gdef + \string\csname\space No@Questions@Pg@\thepage\string\endcsname + {No questions here}}% +}% noquestionsonthispage + + +%-------------------------------------------------------------------- +% \ContinuedQuestion is for use in headers and footers, where we can +% assume that \thepage is the number of the page on which we'll +% actually appear. + +% \ContinuedQuestion expands to the number of the question that +% continues onto this page, or to -1 if this page begins with a new +% question. + +% ACTUALLY: \ContinuedQuestion expands to a positive number if either +% (1) this page doesn't contain the beginning of any question, part, +% subpart, subsubpart, or choice, or (2) this page has a part, subpart, +% subsubpart, or choice that appears before any question. That means +% that if the current page actually begins with space for a continuation +% of the previous question (but doesn't begin any part, subpart, +% subsubpart, or choice of that question) and then has a question, then +% we'll be asserting that this page begins with a new question, but the +% actual top of the page will begin with some blank space that's +% intended for the previous question. + +% \ContinuedQuestion works by examining the value of the macro +% Contin@\thepage. If this page starts with a question (i.e., if no +% question continues onto this page), then the macro Contin@\thepage +% will be defined, and will expand to `\relax' (and so an \ifx between +% \csname Contin@\thepage\endcsname and \ref@relax will be true). + +% If Contin@\thepage is undefined, then when it is used in an \ifx +% command it will be temporarily set equal to \relax (which is +% *different* from being a macro that expands to \relax); in this case, +% there is no question, part, subpart, subsubpart, or choice that begins +% on this page, and so \ContinuedQuestion will be set equal to the last +% question that was begun on a page before this one. + +% The last possibility is that this page begins with either a part, +% subpart, subsubpart, or choice. In this case, Contin@\thepage is +% defined, and it expands to the number of the question that is +% continued onto this page. + + +\def\ref@relax{\relax} + +\def\ContinuedQuestion{% + \expandafter\ifx\csname Contin@\thepage\endcsname\relax + % We get here if there's no question, part, subpart, + % subsubpart, or choice on this page, and so Contin@\thepage has + % never been defined at all. In that case, this page + % continues whichever question was last begun on or + % before this page. + \find@latestques + \thelatest@ques + \else + \expandafter\ifx\csname Contin@\thepage\endcsname\ref@relax + % We get here if this page begins with a new question, + % which is why Contin@\thepage has been defined to be + % a macro that expands to \relax. + % ACTUALLY: We get here if this page has a question that + % appears before any part, subpart, subsubpart, or choice. That + % means that if the current page actually begins with space + % for a continuation of the previous question but doesn't begin + % any part, subpart, subsubpart, or choice of that question, then + % we'll be asserting that this page begins with a new question, + % but the actual top of the page will begin with some space + % that's intended for the previous question. + -1\relax + \else + % We get here if we didn't get anywhere above. This happens + % if Contin@\thepage has been defined to be a macro that expands + % to something other than \relax, in which case it has been + % defined to be a macro that expands to the number of the + % question that continues onto this page. + \csname Contin@\thepage\endcsname + \fi + \fi +} + +%-------------------------------------------------------------------- +% \find@latestques is for use in headers and footers, where we can +% assume that \thepage actually equals the page on which we'll appear. +% We find the last question that was started on or before the current +% page. + +\newcounter{latest@ques} + +\newcommand\find@latestques{% + % \find@latestques is for use in headers and footers. + % \find@latestques will set the counter latest@ques + % to the number of the last question + % that was begun on the exam from page 1 through the current + % page. This may well be the value of the question counter, + % but it may be less than that if the page following this one + % begins a new question and that question beginning was + % typeset before the present page was shipped out. + % Note: This macro is called both by \ContinuedQuestion and by + % \find@quesend, which is why it has to find the last question + % begun on or before the current page, rather than just before + % the current page. + \ifnum 1 > \value{question}\relax + % Oops; probably because we're before the first question + % Just set latest@ques to -1: + \setcounter{latest@ques}{-1}% + \else + % If question latest@ques actually begins on this page (rather + % than on the next page, but early enough on the next page + % that the counter was advanced before we ran off into the + % output routine to output the page and set the header and + % footer), then that's the correct question number. + \expandafter\ifx\csname Pg@question@\arabic{question}\endcsname\relax + % We don't know what page that question is on; + % this must be an early run, before the aux file + % is helpful. Just set it equal to -1 and wait until the next + % run to get it right. + \setcounter{latest@ques}{-1}% + \else + % We now know that \PgInfo@get can tell us the page number + % of \arabic{question} and of all earlier questions. + % Set latest@ques equal to the current question number, and + % then call \decr@latest@ques to recursively decrement + % latest@ques as needed to find a question that begins on + % or before the current page: + \setcounter{latest@ques}{\value{question}}% + \decr@latest@ques + \fi + \fi +} + +\def\decr@latest@ques{% + % If we get here, then we've already checked that the reference + % Pg@question@\thelatest@ques is defined at least for a value of + % \thelatest@ques greater than or equal to it's present value, + % so we assume it's defined for all lesser values as well: + \ifnum \thepage < \PgInfo@get{question@\thelatest@ques}\relax + % Nope; latest@ques starts on a later page + % Decrement latest@ques and see if that one's right: + \addtocounter{latest@ques}{-1}% + \ifnum \thelatest@ques < 1\relax + \setcounter{latest@ques}{-1}% + \let\next@dlq=\relax + \else + \let\next@dlq=\decr@latest@ques + \fi + \else + % latest@ques starts on this page or earlier, so + % that's the correct question number! Exit: + \let\next@dlq=\relax + \fi + \next@dlq +} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\newcounter{ques@end} +\newcounter{last@object} + +\def\find@quesend{% + % We find the last question started on or before the current page + % and then find the page containing the last part (or subpart, or + % subsubpart, or choice) of that question, and set the counter + % ques@end to that page number. + % Set latest@ques equal to the correct question number: + \find@latestques + \ifnum \value{latest@ques} < 0\relax + % This must be an early run of LaTeX, before we have + % \PgInfo commands in the .aux file: + \setcounter{ques@end}{-1}% + \else + % We now know that this question has at least one object (since + % we know that latest@ques isn't negative). + % We'll find its highest numbered object by setting last@object + % equal to 2 and then calling \find@lastobject to recursively + % test whether that object number exists and, if so, incrementing + % last@object to test for a higher numbered one: + \setcounter{last@object}{2}% + \find@lastobject + \setcounter{ques@end}{\PgInfo@get{question\thelatest@ques + @object\thelast@object}}% + \fi +}% find@quesend + +\def\find@lastobject{% + % We check whether this question has an object numbered last@object + % and recursively increment last@object to find the highest + % numbered value for which the object exists: + \@ifundefined{Pg@question\thelatest@ques @object\thelast@object}% + {\addtocounter{last@object}{-1}% + \let\nextfind@lastobject=\relax + }% + {\addtocounter{last@object}{1}% + \let\nextfind@lastobject=\find@lastobject + }% + \nextfind@lastobject +}% find@lastobject + + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +\newcounter{incmp@ques} + +\def\IncompleteQuestion{% + \Find@Incmp@ques + % If there's no incomplete question, the counter incmp@ques will be + % set to -1: + \theincmp@ques +} + +\def\Find@Incmp@ques{% + % If we're on the last page, then there's no incomplete question: + \iflastpage{\setcounter{incmp@ques}{-1}}{\chk@incomp}% +}% Find@Incmp@ques +\newcounter{next@ques} +\newcounter{next@page} + +\def\chk@incomp{% + % If we get here, we're not on the last page. + % \find@quesend calls \find@latestques to set the counter + % latest@ques equal to the number of the last question begun on or + % before the current page, and then it sets the counter ques@end to + % the page containing the last ques@object of that question: + \find@quesend + \ifnum \theques@end > \thepage\relax + % This question has a part (or sub...) starting on a later page + \setcounter{incmp@ques}{\value{latest@ques}}% + \else + \chk@incompi + \fi +}% chk@incomp + +\def\chk@incompi{% + % If there are any pages after the current one and before the next + % question (if there is a next question) that lack a + % \noquestionsonthispage and that aren't following the page of a + % \nomorequestions command, then question latest@ques is incomplete. + % Otherwise, there is no incomplete question: + \setcounter{next@ques}{\thelatest@ques}% + \addtocounter{next@ques}{1}% + % We use next@page as a scratch counter. We start by setting it + % to the last page we want to check for a \noquestionsonthispage + % command: + \expandafter\ifx\csname Pg@question@\thenext@ques \endcsname\relax + % This isn't the last page but there is no next question: +% + \@ifundefined{exam@lastpage}% + {\setcounter{next@page}{-1}}% + {\setcounter{next@page}{\exam@lastpage}}% +% +% \setcounter{next@page}{\exam@lastpage}% + \else + \setcounter{next@page}{\PgInfo@get{question@\thenext@ques}}% + \addtocounter{next@page}{-1}% + \fi + % See if that's after a \nomorequestions command: + \@ifundefined{Pg@@endquestions}% + {}% + {\ifnum \PgInfo@get{@endquestions} < \value{next@page}\relax + \setcounter{next@page}{\PgInfo@get{@endquestions}}% + \fi + }% + % OK, the counter next@page now contains the last page to check. + \chk@incompii +}% chk@incompi + +\def\chk@incompii{% + \ifnum \value{next@page} > \value{page}\relax + % We need to check the page next@page: + \@ifundefined{No@Questions@Pg@\arabic{next@page}}% + {\setcounter{incmp@ques}{\value{latest@ques}}% + \let\next@incompii=\relax + }% + {\addtocounter{next@page}{-1}% + \let\next@incompii = \chk@incompii + }% + \else + % There's no incomplete question: + \setcounter{incmp@ques}{-1}% + \let\next@incompii=\relax + \fi + \next@incompii +}% chk@incompii + +\def\ifincomplete#1#2{% + % We need to pass the arguments to \chk@ifincomp; we save them in + % macros so they won't be messed up by the call to \Find@Incmp@ques: + \def\incomp@first{#1}% + \def\incomp@second{#2}% + % If there's a \noquestionsonthispage command on this page, then + % we assume nothing from this page is incomplete: + \@ifundefined{No@Questions@Pg@\thepage}% + {\chk@ifincomp}% + {\incomp@second}% +}% ifincomplete + +\def\chk@ifincomp{% + \Find@Incmp@ques + % If there's no incomplete question, \Find@Incmp@ques sets the + % counter incmp@ques to -1: + \ifnum \theincmp@ques < 0\relax + \incomp@second + \else + % Are we after a page with \nomorequestions? + \@ifundefined{Pg@@endquestions}% + {\incomp@first}% + {\ifnum \thepage < \PgInfo@get{@endquestions}\relax + \incomp@first + \else + \incomp@second + \fi + }% + \fi +}% chk@ifincomp + +%-------------------------------------------------------------------- +% These are the commands for dealing with hlfcntr's, i.e., the things +% used to count points. +% +% A point value is a nonnegative integer with an optional half integer. +% A hlfcntr consists of a regular counter together with an \if: If the +% regular counter is called ``counter'', then the \if is called +% ``\ifcounter@half''; it's set true by ``\counter@halftrue'' and set +% false by ``\counter@halffalse''. +% +% The commands: +% +% \new@hlfcntr{countername} +% \set@hlfcntr{countername}{value} +% \copy@hlfcntr{tocounter}{fromcounter} +% \addto@hlfcntr{countername}{value} +% \add@hlfcntrtohlfcntr{getsaddedto}{whatsadded} +% \ifhlfcntr@pos{countername} +% \prtaux@hlfcntr{countername} +% \prt@hlfcntr{countername} +% +% ``value'' can be either a (nonnegative) integer, an integer followed by +% ``\half'', or just plain ``\half''. (Actually, ``value'' can be empty +% (although the braces must be present), in which case it's interpreted +% as ``0''.) +% +% Examples of valid values: +% 0 +% 0\half +% 1 +% 1\half +% 2 +% 2\half +% etc. + +% Note on using ``\global'': LaTeX's \setcounter and \addtocounter +% commands are already \global (i.e., you don't have to say +% ``\global''), but \somethingtrue and \somethingfalse (used to set +% \ifsomething) aren't. Thus, we need to say ``\global'' when setting +% these things. + +% To create a hlfcntr: +\newcommand*\new@hlfcntr[1]{% + \newcounter{#1}% + \expandafter\newif\csname if#1@half\endcsname +}% new@hlfcntr + + +% A scratch hlfcntr: +\new@hlfcntr{tmp@hlfcntr} + +\newcommand*\horiz@half{$\frac{1}{2}$} +\newcommand*\slanted@half{% + $\raise0.6ex\hbox{$\scriptstyle 1$}\kern -.2em/\kern -.2em + \raise-0.5ex\hbox{$\scriptstyle 2$}$% +}% slanted@half +\newcommand*\useslantedhalf{\global\let\half\slanted@half} +\newcommand*\usehorizontalhalf{\global\let\half\horiz@half} +\newcommand*\half{\slanted@half} + + +\newcommand*\set@hlfcntr[2]{% + \begingroup + \global\csname #1@halffalse\endcsname + % If there as a `\half' present, it will be executed + % right after the assignment of the digit part of #2 + % to the counter #1. + \def\half{% + \global\csname #1@halftrue\endcsname + }% + % We insert a `0' in case there are no digits present: + % We avoid using \setcounter, because calc.sty redefines + % \setcounter in a way that conflicts with the \half trick + % we're using: + % \setcounter{#1}{0#2}\relax + \global\csname c@#1\endcsname 0#2\relax + \endgroup +}% set@hlfcntr + +\newcommand*\copy@hlfcntr[2]{% + % We set #1 to the value of #2 + \setcounter{#1}{\value{#2}}% + \csname if#2@half\endcsname + \global\csname #1@halftrue\endcsname + \else + \global\csname #1@halffalse\endcsname + \fi +}% copy@hlfcntr + +\newcommand*\addto@hlfcntr[2]{% + % We add the valueandhalf #2 to hlfcntr #1 + \begingroup + \def\half{\add@half{#1}}% + % We insert a `0' in case there are no digits present: + % We avoid using \addtocounter, because calc.sty redefines + % \addtocounter in a way that conflicts with the \half trick + % we're using: + % \addtocounter{#1}{0#2}\relax + \global\advance\csname c@#1\endcsname 0#2\relax + \endgroup +}% addto@hlfcntr + +\newcommand*\add@hlfcntrtohlfcntr[2]{% + % We add the hlfcntr #2 to the hlfcntr #1 + \addtocounter{#1}{\value{#2}}% + \csname if#2@half\endcsname + \add@half{#1}% + \fi +}% add@hlfcntrtohlfcntr + +\newcommand*\add@half[1]{% + % We add one half to hlfcntr #1: + \csname if#1@half\endcsname + \addtocounter{#1}{1}% + \global\csname #1@halffalse\endcsname + \else + \global\csname #1@halftrue\endcsname + \fi +}% add@half + +% Important reminder about \ifhlfcntr@pos: Do not use it inside +% another conditional! The construction +% \ifhlfcntr@pos{somecounter} +% do some stuff... +% \fi +% is perfectly fine as long as it's expanded, but: If it's inside +% another conditional, and the condition is not satisfied, then it's +% read through without expansion. In that case, TeX sees the +% \ifhlfcntr@pos but does *not* recognize it as being part of a +% conditional, but when it sees the concluding \fi it does recognize +% that, and so TeX completes the outer conditional at that \fi, which +% causes an error. +\newcounter{ifpos@cntr} +\def\ifhlfcntr@pos#1{% + % The argument must be a hlfcntr (which, of course, + % can never be negative); we'll be true if and only if + % that halfcntr is positive: + \setcounter{ifpos@cntr}{\value{#1}}% + \csname if#1@half\endcsname + \addtocounter{ifpos@cntr}{1}% + \fi + \ifnum \value{ifpos@cntr} > 0\relax +}% ifhlfnctr@pos + +% \prtaux@hlfcntr is used inside the argument of a \write command for +% writing to the .aux file: +\newcommand*\prtaux@hlfcntr[1]{% + % We don't want a \relax after the 0 in the following + % line, because it would sometimes appear in the aux file: + \ifnum \value{#1} = 0 + % We have to make the following a macro, because if we + % don't do this part, the \fi will cause confusion, since + % there's no \if visible until the \csname is expanded: + \prtaux@halforzero{#1}% + \else + \arabic{#1}% + % We have to make the following a macro, because if we + % don't do this part, the \fi will cause confusion, since + % there's no \if visible until the \csname is expanded: + \prtaux@halforblank{#1}% + \fi +}% prtaux@hlfcntr +\newcommand*\prtaux@halforzero[1]{% + \csname if#1@half\endcsname + \string\half + \else + 0% + \fi +}% prtaux@hlforzero +\newcommand*\prtaux@halforblank[1]{% + \csname if#1@half\endcsname + \string\half + \fi +}% prtaux@halforblank + +\newcommand*\prt@hlfcntr[1]{% + % We don't want a \relax after the 0 in the following + % line, because it would sometimes appear in the aux file: + \ifnum \value{#1} = 0 + % We have to make the following a macro, because if we + % don't do this part, the \fi will cause confusion, since + % there's no \if visible until the \csname is expanded: + \prt@halforzero{#1}% + \else + \arabic{#1}% + % We have to make the following a macro, because if we + % don't do this part, the \fi will cause confusion, since + % there's no \if visible until the \csname is expanded: + \prt@halforblank{#1}% + \fi +}% prt@hlfcntr +\newcommand*\prt@halforzero[1]{% + \csname if#1@half\endcsname + \half + \else + 0% + \fi +}% prt@hlforzero +\newcommand*\prt@halforblank[1]{% + \csname if#1@half\endcsname + \half + \fi +}% prt@halforblank + +% End of the commands for dealing with hlfcntr's + +%-------------------------------------------------------------------- +%--------------------------------------------------------------------- +% +% *************************** +% ** QUESTION ENVIRONMENTS ** +% *************************** +% +% +% + +% We define the command \part only inside of a parts environment, so +% that we don't interfere with the meaning of the standard article +% documentclass command \part if that is used inside of a questions +% environment. The commands \question, \subpart, and \subsubpart are +% defined everywhere inside of a questions environment. If the user +% accidentally gives a \subpart command outside of a subparts +% environment, then an error will be created. + + + + +% We use the counter name `partno' for the parts environment so that +% we will not interfere with the counter `part' used by the article +% document class. + +\newcounter{question} +\newcounter{partno} +\newcounter{subpart} +\newcounter{subsubpart} +\newcounter{choice} +\new@hlfcntr{numpoints} +\set@hlfcntr{numpoints}{0} +\new@hlfcntr{numbonuspoints} +\set@hlfcntr{numbonuspoints}{0} +\new@hlfcntr{pointsof@thisquestion} +\set@hlfcntr{pointsof@thisquestion}{0} +\new@hlfcntr{bonuspointsof@thisquestion} +\set@hlfcntr{bonuspointsof@thisquestion}{0} +\newcounter{numquestions} +\newcounter{numparts} +\newcounter{numsubparts} +\newcounter{numsubsubparts} +\newcounter{Curr@Page} + +% @pagepoints accumulates the points on a single page: +\new@hlfcntr{@pagepoints} +\set@hlfcntr{@pagepoints}{0} +\new@hlfcntr{@pagebonuspoints} +\set@hlfcntr{@pagebonuspoints}{0} +\newcounter{pageof@pagepoints} +\setcounter{pageof@pagepoints}{0} +\newcounter{pageof@pagebonuspoints} +\setcounter{pageof@pagebonuspoints}{0} + +% latest@points is a holding area for points until we know +% whether they'll land on the same page as the points +% currently counted in @pagepoints: +\new@hlfcntr{latest@points} +\set@hlfcntr{latest@points}{0} +\new@hlfcntr{latest@bonuspoints} +\set@hlfcntr{latest@bonuspoints}{0} + +% Whenever we meet a new page on which points are defined, we'll +% redefine \page@withpoints to expand to that page. At the end of the +% document, it will hold the last page that has points, and we'll write +% a \gdef\lastpage@withpoints command to the .aux file. +% We initialize \page@withpoints here: +\def\page@withpoints{0}% +\def\page@withbonuspoints{0}% + +% \pageinfo@commands is used by each question, part, subpart, and +% subsubpart to insert into everypar the \PgInfo@write command to put +% its page number into the .aux file, the \PgInfo@get command to read +% the page number into the counter Curr@Page, and to test and set +% \Contin@\theCurr@Page. \temp@toks is used by part, subpart, and +% subsubpart to append all that to \pageinfo@commands, rather than +% deleting whatever may have been put into \pageinfo@commands by the +% current question and/or part and/or subpart. +\newtoks\pageinfo@commands +\newtoks\temp@toks + +% \pagepoint@commands holds the commands to manage the counting of the +% number of points defined on each page. +\newtoks\pagepoint@commands + +% \point@toks holds the commands to print the points at the proper +% location on the page (except that it's not used by the \qformat +% option). +\newtoks\point@toks + +% We'll use \greeknum to number subsubparts +\def\greeknum#1{\expandafter\lc@greek\csname c@#1\endcsname} +\def\lc@greek#1{% + \ifcase #1\or $\alpha$\or $\beta$\or $\gamma$\or $\delta$\or + $\epsilon$\or $\zeta$\or $\eta$\or $\theta$\or $\iota$\or + $\kappa$\or $\lambda$\or $\mu$\or $\nu$\or $\xi$\or o\or $\pi$\or + $\rho$\or $\sigma$\or $\tau$\or $\upsilon$\or $\phi$\or $\chi$\or + $\psi$\or $\omega$\else \@ctrerr + \fi +}% lc@greek + + +% The following macros are a variation on a trick from Victor +% Eijkhout's ``TeX by Topic'', page 142: +% Both \prepend@toklist and \append@toklist take two arguments, +% both of which should be token lists. +% \prepend@toklist prepends #2 to #1 +% \append@toklist appends #2 to #1 + +\def\prepend@toklist#1#2{% + \edef\do@it{\noexpand#1={\the#2\the#1}}% + \do@it +}% prepend@toklist + +\def\append@toklist#1#2{% + \edef\do@it{\noexpand#1={\the#1\the#2}}% + \do@it +}% append@toklist + + +% The command \qformat is provided for the user who wants to +% design a nonstandard question line. If this command is used, +% then the usual line containing the question number and the beginning +% of the question will be replaced by the line specified by the +% \qformat command, and the question will begin on the following +% line. +% Within the argument of the \qformat command: +% \thequestion will be replaced by the question number, and +% \thepoints will be replaced by ``\@points \@pointname'' if the +% number of points has been specified for this question, and otherwise +% it inserts nothing at all. (The conditional @placepoints is used to +% determine if there were points specified for this question.) +% The argument to the \qformat command *must* contain some +% stretch, i.e., at least one \hfil or \dotfill or ... +% +% The command \noqformat cancels the effect of \qformat and returns us +% to the default situation. +% +% The commands \bonusqformat and \nobonusformat are analogous. +\newif\if@qformat +\@qformatfalse +\newif\if@bonusqformat +\@bonusqformatfalse + +\def\qformat#1{% + \global\@qformattrue + \gdef\@questionformat{#1}% +}% qformat +\def\bonusqformat#1{% + \global\@bonusqformattrue + \gdef\@bonusquestionformat{#1}% +}% bonusqformat + +\newcommand\noqformat{% + \global\@qformatfalse +}% noqformat +\newcommand\nobonusqformat{% + \global\@bonusqformatfalse +}% nobonusqformat + + +% \thepoints is for use in either a \qformat command +% or a \pointformat command (or a \bonusqformat command). +% It needs to have the +% \if@placepoints so that if it's used in a \qformat command +% it won't print anything if there are no points: +\newcommand\thepoints{% + \if@placepoints + \if@bonus + \@points \@bonuspointname + \else + \@points \@pointname + \fi + \fi +}% thepoints + +% \themarginpoints is for use only in a \pointformat command, +% and so it doesn't need the \if@placepoints bit in \thepoints: +\newcommand\themarginpoints{% + \if@bonus + \@points \@marginbonuspointname + \else + \@points \@marginpointname + \fi +}% themarginpoints + +% We define the \subpart and \subsubpart commands when we enter a +% questions environment (rather than waiting until we enter a subparts +% of subsubparts environment) so that we can signal an error if a +% \subpart or \subsubpart command appears outside of the corresponding +% environment. (We don't do this for the \part command so that the user +% can use the standard sectioning \part command outside of a parts +% environment.) + +% The counter ques@object will count the items in each question, where +% an item is defined as either the question itself, or a part, or a +% subpart, or a subsubpart, or a choice. This will be used by +% \find@quesend to find the last page occupied by the last question +% begun on or before the current page: +\newcounter{ques@object} + +% \first@questionobject will be used by the \question command. +% That is, it will be used only once, but we want to keep its +% definition here, near the definitions of \addquestionobject and +% \questionobject@pluspagecheck. +\newcommand{\first@questionobject}{% + \setcounter{ques@object}{1}% + % \PgInfo@write expands it's argument, so we don't need edef: +% \edef\q@object@label{% +% question\arabic{question}@object\arabic{ques@object}}% +% \PgInfo@write{\q@object@label}% + \PgInfo@write{question\arabic{question}@object\arabic{ques@object}}% +}% first@questionobject + +% \addquestionobject will be used by each part, subpart, and +% subsubpart, and can also be used by the user to mark the end of a +% question that spills over onto the next page without any part, +% subpart, etc. starting on that page: +\newcommand{\addquestionobject}{% + \addtocounter{ques@object}{1}% + % \PgInfo@write expands it's argument, so we don't need edef: +% \edef\q@object@label{% +% question\arabic{question}@object\arabic{ques@object}}% +% \PgInfo@write{\q@object@label}% + \PgInfo@write{question\arabic{question}@object\arabic{ques@object}}% +}% addquestionobject + +% \questionobject@pluspagecheck will be used by each choice, as well +% as by any \part, \subpart, or \subsubpart that's inside of a +% solution. It uses the questionobject to check if we're the first +% one on the current page, since choices (and questions etc. inside of +% solution environments) don't have labels the way that questions, +% parts, subparts, and subsubparts do (those things use the label to +% check if they're the first thing on the page). +\newcommand{\questionobject@pluspagecheck}{% + % We don't want to do any of this if we're both inside a solution + % environment and not printing answers (because we want to avoid + % incrementing ques@object): + \if@insolution + \ifprintanswers + \doqobj@ppchk + \fi + \else + \doqobj@ppchk + \fi +}% questionobject@pluspagecheck +\newcommand{\doqobj@ppchk}{% + \addtocounter{ques@object}{1}% + % We need the edef because we check the page of \q@object@label: + \edef\q@object@label{% + question\arabic{question}@object\arabic{ques@object}}% + \PgInfo@write{\q@object@label}% + \set@counter@to@pageof{Curr@Page}{\q@object@label}% + \expandafter\ifx\csname Contin@\theCurr@Page\endcsname\relax + % We're the first \question, \part, \subpart, \subsubpart, + % or choice on this page: + \global\expandafter\edef\csname + Contin@\theCurr@Page\endcsname{\arabic{question}}% + \fi +}% doqobj@ppchk + + + +% if@bonus will be true when we're doing a bonusquestion or bonuspart +% or etc., and it will also be used also to distinguish between +% \gradetable and \bonusgradetable (and between \pointtable and +% \bonuspointtable, etc.), and also to distinguish between +% \pointsinrange and \bonuspointsinrange: +\newif\if@bonus +\@bonusfalse + +% The following are for advanced users who want to customize the list +% parameters (\topsep, \partopsep, \itemsep, \parsep, etc.) for the +% lists that these environments create. They are all defined to be +% empty, but the user can change them using \renewcommand. +\newcommand\questionshook{} +\newcommand\partshook{} +\newcommand\subpartshook{} +\newcommand\subsubpartshook{} +\newcommand\choiceshook{} +\newcommand\checkboxeshook{} + + +\newenvironment{questions}{% + % \@queslevel is used for two purposes: + % (1) We check that every \question, \part, \subpart, and + % \subsubpart command appears inside the appropriate environment, + % and generate an error if one appears in the wrong place. + % (2) If a \qformat is being used and if \@queslevel tells us + % that we're currently processing a question, then we set + % \global \point@toks={} to avoid setting the points for a + % question other than via the qformat command. + \def\@queslevel{question}% + \def\titledquestion##1{% + \@bonusfalse + \def\thequestiontitle{##1}% + \process@question + }% + \def\bonustitledquestion##1{% + \@bonustrue + \def\thequestiontitle{##1}% + \process@question + }% + \def\question{% + \@bonusfalse + \def\thequestiontitle{\csname p@question\endcsname + \csname thequestion\endcsname}% + \process@question + }% + \def\bonusquestion{% + \@bonustrue + \def\thequestiontitle{\csname p@question\endcsname + \csname thequestion\endcsname}% + \process@question + }% + \def\process@question{% + \if@coverpages + \cover@question@error + \fi + \@checkqueslevel{question}% + \addtocounter{numquestions}{1}% + % Write the sum of points of the previous question (if any) + % to the .aux file. (At this point, the question counter + % has not yet been incremented, so \value{question} is the + % number of the question that was just completed.) + \if@filesw + \ifnum \value{question} > 0\relax + % First do regular points: + \immediate\write\@mainaux + {\string\gdef\string\pointsofq@ + \romannumeral \csname c@question\endcsname + {\prtaux@hlfcntr{pointsof@thisquestion}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{pointsof@thisquestion}{pointsofq@\romannumeral + \csname c@question\endcsname}% + % Now do bonus points: + \immediate\write\@mainaux + {\string\gdef\string\bonuspointsofq@ + \romannumeral \csname c@question\endcsname + {\prtaux@hlfcntr{bonuspointsof@thisquestion}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{bonuspointsof@thisquestion}% + {bonuspointsofq@\romannumeral + \csname c@question\endcsname}% + \fi + \fi + \set@hlfcntr{pointsof@thisquestion}{0}% + \set@hlfcntr{bonuspointsof@thisquestion}{0}% + % If there was a question with points immediately preceding + % this question (i.e., there were no parts in the previous + % question), then @placepoints will still be true, and we need to + % cancel it. (We used to do this inside of the \thepoints macro, + % but that allowed for an error if the user specified points for a + % question but had a \qformat that didn't mention \thepoints.) We + % also set @placepoints to be false when entering a parts + % environment. + \global \@placepointsfalse + % point@toks will normally be empty at this point, but it might be + % nonempty if there were points somewhere in the previous question + % that never made it onto the page because we never entered + % horizontal mode (perhaps because the user was weird and let the + % text of a question (or part, etc.) consist entirely of an + % enumerate environment, or description environment, or etc.). + \global \point@toks={}% + % Important: Don't leave any blank lines inside of + % \pageinfo@commands!! This token list will be dumped into + % horizontal mode by \everypar, and so any blank lines will + % cause paragraph breaks. + \pageinfo@commands={% + \edef\@queslabel{question@\arabic{question}}% + \PgInfo@write{\@queslabel}% + \first@questionobject + % In addition to the \PgInfo@write we use an actual \label + % command. We do this in order to make the question numbers in + % the grade tables into \ref's, so that if the user says + % \usepackage{hyperref}, those question numbers will be clickable. + % + % A further purpose of these labels (which we actually do for all + % questions, parts, subparts, and subsubparts) is that if a + % question (or part, etc.) is, e.g., moved from one page to + % another, LaTeX will notice this and warn the user that LaTeX + % must be run one more time to be sure everything is correct. + % + % We need to do this even though we've already included code to + % check when point totals change because questions (and parts, + % etc.) know what page they're on from reading the info written to + % the .aux file on the previous run. Thus, if a question (or + % part, etc.) is moved to a different page, then the pointsonpage + % totals won't notice until the *second* subsequent run of LaTeX, + % and so there'll be no warning to the user on the *first* run. + % Including these labels gives the user a warning on that first + % run. + % + % Further futzing required: Since this is being put into the + % token list \pageinfo@commands, the contents of which won't + % actually be executed until we enter horizontal mode (which + % may well be in the first part of a parts environment), we need + % to make sure that \@currentlabel is the number of the + % question: + \begingroup % to confine the change to \@currentlabel +% \def\@currentlabel{\csname p@question\endcsname +% \csname thequestion\endcsname}% + \def\@currentlabel{\thequestiontitle}% + \label{\@queslabel}% + \endgroup + \set@counter@to@pageof{Curr@Page}{\@queslabel}% + \expandafter\ifx\csname Contin@\theCurr@Page\endcsname\relax + % We're the first \question, \part, \subpart, \subsubpart, + % or choice on this page: + \global\expandafter\edef + \csname Contin@\theCurr@Page\endcsname{\relax}% + \fi + \the\pagepoint@commands + \global \pageinfo@commands={}% + }% pageinfo@commands + \ifhmode + % Remove any skips at the end of the previous paragraph + % that might cause a blank line, and then end that paragraph: + \unskip\unskip \par + \fi + \@doitem + }% process@question + \def\subpart{% + \@bonusfalse + \process@subpart + }% + \def\bonussubpart{% + \@bonustrue + \process@subpart + }% + \def\process@subpart{% + \if@coverpages + \cover@question@error + \fi + \@checkqueslevel{subpart}% + \if@insolution + % We don't count this subpart, so no addtocounter{numsubparts}. + \temp@toks={% + \questionobject@pluspagecheck + \global \pageinfo@commands={}% + % We omit the pagepoint@commands + }% temp@toks + \else + \addtocounter{numsubparts}{1}% + % Important: Don't leave any blank lines inside of + % \pageinfo@commands!! This token list will be dumped into + % horizontal mode by \everypar, and so any blank lines will + % cause paragraph breaks. + \temp@toks={% + \edef\@subpartlabel{subpart@\arabic{question}% + @\arabic{partno}@\arabic{subpart}}% + \PgInfo@write{\@subpartlabel}% + \addquestionobject + % In addition to the \PgInfo@write we use an actual \label + % command. We do this in order to make the question numbers in + % the grade tables into \ref's, so that if the user says + % \usepackage{hyperref}, those question numbers will be clickable. + % + % A further purpose of these labels (which we actually do for all + % questions, parts, subparts, and subsubparts) is that if a + % question (or part, etc.) is, e.g., moved from one page to + % another, LaTeX will notice this and warn the user that LaTeX + % must be run one more time to be sure everything is correct. + % + % We need to do this even though we've already included code to + % check when point totals change because questions (and parts, + % etc.) know what page they're on from reading the info written to + % the .aux file on the previous run. Thus, if a question (or + % part, etc.) is moved to a different page, then the pointsonpage + % totals won't notice until the *second* subsequent run of LaTeX, + % and so there'll be no warning to the user on the *first* run. + % Including these labels gives the user a warning on that first + % run. + \label{\@subpartlabel}% + \set@counter@to@pageof{Curr@Page}{\@subpartlabel}% + \expandafter\ifx\csname Contin@\theCurr@Page\endcsname\relax + % We're the first \question, \part, \subpart, \subsubpart, + % or choice on this page: + \global\expandafter\edef\csname + Contin@\theCurr@Page\endcsname{\arabic{question}}% + \fi + \the\pagepoint@commands + \global \pageinfo@commands={}% + }% temp@toks + \fi + \append@toklist \pageinfo@commands \temp@toks + \ifhmode + % Remove any skips at the end of the previous paragraph + % that might cause a blank line, and then end that paragraph: + \unskip\unskip \par + \fi + \@doitem + }% process@subpart + \def\subsubpart{% + \@bonusfalse + \process@subsubpart + }% + \def\bonussubsubpart{% + \@bonustrue + \process@subsubpart + }% + \def\process@subsubpart{% + \if@coverpages + \cover@question@error + \fi + \@checkqueslevel{subsubpart}% + \if@insolution + % We don't count this subsubpart, so no addtocounter{numsubsubparts}. + \temp@toks={% + \questionobject@pluspagecheck + \global \pageinfo@commands={}% + % We omit the pagepoint@commands + }% temp@toks + \else + \addtocounter{numsubsubparts}{1}% + % Important: Don't leave any blank lines inside of + % \pageinfo@commands!! This token list will be dumped into + % horizontal mode by \everypar, and so any blank lines will + % cause paragraph breaks. + \temp@toks={% + \edef\@subsubpartlabel{subsubpart@\arabic{question}% + @\arabic{partno}@\arabic{subpart}@\arabic{subsubpart}}% + \PgInfo@write{\@subsubpartlabel}% + \addquestionobject + % In addition to the \PgInfo@write we use an actual \label + % command. We do this in order to make the question numbers in + % the grade tables into \ref's, so that if the user says + % \usepackage{hyperref}, those question numbers will be clickable. + % + % A further purpose of these labels (which we actually do for all + % questions, parts, subparts, and subsubparts) is that if a + % question (or part, etc.) is, e.g., moved from one page to + % another, LaTeX will notice this and warn the user that LaTeX + % must be run one more time to be sure everything is correct. + % + % We need to do this even though we've already included code to + % check when point totals change because questions (and parts, + % etc.) know what page they're on from reading the info written to + % the .aux file on the previous run. Thus, if a question (or + % part, etc.) is moved to a different page, then the pointsonpage + % totals won't notice until the *second* subsequent run of LaTeX, + % and so there'll be no warning to the user on the *first* run. + % Including these labels gives the user a warning on that first + % run. + \label{\@subsubpartlabel}% + \set@counter@to@pageof{Curr@Page}{\@subsubpartlabel}% + \expandafter\ifx\csname Contin@\theCurr@Page\endcsname\relax + % We're the first \question, \part, \subpart, \subsubpart, + % or choice on this page: + \global\expandafter\edef\csname + Contin@\theCurr@Page\endcsname{\arabic{question}}% + \fi + \the\pagepoint@commands + \global \pageinfo@commands={}% + }% temp@toks + \fi + \append@toklist \pageinfo@commands \temp@toks + \ifhmode + % Remove any skips at the end of the previous paragraph + % that might cause a blank line, and then end that paragraph: + \unskip\unskip \par + \fi + \@doitem + }% process@subsubpart + \list{\question@number}% + {\usecounter{question}% + % We use the default definition of \makelabel + % so as not to interfere with \qformat commands. + % \def\makelabel##1{\hss\llap{##1}}% + \settowidth{\leftmargin}{10.\hskip\labelsep}% + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \partopsep=0pt + \questionshook + }% + }% End of the first argument of \newenvironment{questions} + {% + \endlist + % Write the number of points of the final question + % to the .aux file: + \if@filesw + \ifnum \value{question} > 0\relax + % First do the regular points: + \immediate\write\@mainaux + {\string\gdef\string\pointsofq@\romannumeral + \csname c@question\endcsname + {\prtaux@hlfcntr{pointsof@thisquestion}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{pointsof@thisquestion}% + {pointsofq@\romannumeral + \csname c@question\endcsname}% + % Now do the bonus points: + \immediate\write\@mainaux + {\string\gdef\string\bonuspointsofq@\romannumeral + \csname c@question\endcsname + {\prtaux@hlfcntr{bonuspointsof@thisquestion}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{bonuspointsof@thisquestion}% + {bonuspointsofq@\romannumeral + \csname c@question\endcsname}% + \fi + \fi + }% End of the second argument of \newenvironment{questions} + +% \question@number is used as the label in the question list (instead +% of \questionlabel) so that if the user uses a \qformat command, +% we'll use the \@questionformat specified by the \qformat command: + +\def\question@number{% + \if@bonus + \if@bonusqformat + \makebox[\hsize][s]{\@bonusquestionformat}\hskip-\labelsep + \else + \questionlabel + \fi + \else + \if@qformat + \makebox[\hsize][s]{\@questionformat}\hskip-\labelsep + \else + \questionlabel + \fi + \fi +} +\newcommand\questionlabel{\thequestion.} + +% We want the \part command to be defined *only* inside of a parts +% environment, so that the user can use the standard sectioning \part +% command inside of a questions environment (as long as it's outside of +% a parts environment). + +\newenvironment{parts}{% + \def\@queslevel{part}% + % If the question numbers are being inserted via a \qformat, + % and if a question is beginning with a parts environment, then + % we need to enter horizonal mode to get the qformat printed + % on the page, rather than saving up the question label (and + % possible points) to be combined with the label of the first + % part. (\if@inlabel tells us if we are still waiting to enter + % horizontal mode after seeing a \question command.) + \if@bonus + \if@bonusqformat + \if@inlabel + \leavevmode + \@inlabelfalse + \fi + % The following is just in case the question had points, + % in which case @placepoints will still be true. + % (We used to do this inside of the \thepoints macro, + % but that allowed for an error if the user specified points for + % a question but had a \qformat that didn't mention \thepoints.) + % We also set @placepoints to be false in the \question command, + % in case one queation follows a previous one that had no parts. + \global \@placepointsfalse + \fi + \else + \if@qformat + \if@inlabel + \leavevmode + \@inlabelfalse + \fi + % The following is just in case the question had points, + % in which case @placepoints will still be true. + % (We used to do this inside of the \thepoints macro, + % but that allowed for an error if the user specified points for + % a question but had a \qformat that didn't mention \thepoints.) + % We also set @placepoints to be false in the \question command, + % in case one queation follows a previous one that had no parts. + \global \@placepointsfalse + \fi + \fi + \def\part{% + \@bonusfalse + \process@part + }% + \def\bonuspart{% + \@bonustrue + \process@part + }% + \def\process@part{% + \if@coverpages + \cover@question@error + \fi + \@checkqueslevel{part}% + \if@insolution + % We don't count this part, so no addtocounter{numparts}. + \temp@toks={% + \questionobject@pluspagecheck + \global \pageinfo@commands={}% + % We omit the pagepoint@commands + }% temp@toks + \else + \addtocounter{numparts}{1}% + % Important: Don't leave any blank lines inside of + % \pageinfo@commands!! This token list will be dumped into + % horizontal mode by \everypar, and so any blank lines will + % cause paragraph breaks. + \temp@toks={% + \edef\@partlabel{part@\arabic{question}@\arabic{partno}}% + \PgInfo@write{\@partlabel}% + \addquestionobject + % In addition to the \PgInfo@write we use an actual \label + % command. We do this in order to make the question numbers in + % the grade tables into \ref's, so that if the user says + % \usepackage{hyperref}, those question numbers will be clickable. + % + % A further purpose of these labels (which we actually do for all + % questions, parts, subparts, and subsubparts) is that if a + % question (or part, etc.) is, e.g., moved from one page to + % another, LaTeX will notice this and warn the user that LaTeX + % must be run one more time to be sure everything is correct. + % + % We need to do this even though we've already included code to + % check when point totals change because questions (and parts, + % etc.) know what page they're on from reading the info written to + % the .aux file on the previous run. Thus, if a question (or + % part, etc.) is moved to a different page, then the pointsonpage + % totals won't notice until the *second* subsequent run of LaTeX, + % and so there'll be no warning to the user on the *first* run. + % Including these labels gives the user a warning on that first + % run. + \label{\@partlabel}% + \set@counter@to@pageof{Curr@Page}{\@partlabel}% + \expandafter\ifx\csname Contin@\theCurr@Page\endcsname\relax + \global\expandafter\edef\csname + Contin@\theCurr@Page\endcsname{\arabic{question}}% + \fi + \the\pagepoint@commands + \global \pageinfo@commands={}% + }% temp@toks + \fi + \append@toklist \pageinfo@commands \temp@toks + \ifhmode + % Remove any skips at the end of the previous paragraph + % that might cause a blank line, and then end that paragraph: + \unskip\unskip \par + \fi + \@doitem + }% process@part + \list{\partlabel}% + {% + \usecounter{partno}\def\makelabel##1{\hss\llap{##1}}% + \settowidth{\leftmargin}{(m)\hskip\labelsep}% + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \topsep=0pt + \partopsep=0pt + \partshook + }% + }% newenvironment{parts} + {\endlist} +\newcommand\partlabel{(\thepartno)} +\def\thepartno{\alph{partno}} + +\newenvironment{subparts}{% + \def\@queslevel{subpart}% + \list{\subpartlabel}% + {% + \usecounter{subpart}\def\makelabel##1{\hss\llap{##1}}% + \settowidth{\leftmargin}{vii.\hskip\labelsep}% + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \topsep=0pt + \partopsep=0pt + \subpartshook + }% + }% + {\endlist} +\newcommand\subpartlabel{\thesubpart.} +\def\thesubpart{\roman{subpart}} + +\newenvironment{subsubparts}{% + \def\@queslevel{subsubpart}% + \list{\subsubpartlabel}% + {% + \usecounter{subsubpart}\def\makelabel##1{\hss\llap{##1}}% + \settowidth{\leftmargin}{($\psi$)\hskip\labelsep}% + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \topsep=0pt + \partopsep=0pt + \subsubpartshook + }% + }% + {\endlist} +\newcommand\subsubpartlabel{\thesubsubpart)} +\def\thesubsubpart{\greeknum{subsubpart}} + + + + +\pagepoint@commands={% + \ifhlfcntr@pos{latest@points}% + % We're putting a question (or part, etc.) + % with points onto this page: + \ifnum \theCurr@Page > \thepageof@pagepoints\relax + % These points go on a later page than + % the points currently counted in @pagepoints: + \ifnum \thepageof@pagepoints = 0\relax + % Do nothing... + \else + \immediate\write\@mainaux + {\string\gdef\string\pointsonpage@ + \romannumeral \csname c@pageof@pagepoints\endcsname + {\prtaux@hlfcntr{@pagepoints}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{@pagepoints}{pointsonpage@\romannumeral + \csname c@pageof@pagepoints\endcsname}% + \fi + % The following is a macro because \theCurr@Page and + % \thepageof@pagepoints might differ by more than 1: + \increment@pageof@pagepoints + % The following label is so that we can make the page + % numbers in a grade table indexed by page into \pageref's + % so that \usepackage{hyperref} and pdflatex will + % make them clickable: + \label{firstpoints@onpage@\arabic{Curr@Page}}% + \else + % These points go on the same page as the points + % currently counted in @pagepoints: + \add@hlfcntrtohlfcntr{@pagepoints}{latest@points}% + \set@hlfcntr{latest@points}{0}% + \fi + \fi + \ifhlfcntr@pos{latest@bonuspoints}% + % We're putting a question (or part, etc.) + % with bonus points onto this page: + \ifnum \theCurr@Page > \thepageof@pagebonuspoints\relax + % These bonus points go on a later page than + % the points currently counted in @pagebonuspoints: + \ifnum \thepageof@pagebonuspoints = 0\relax + % Do nothing... + \else + \immediate\write\@mainaux + {\string\gdef\string\bonuspointsonpage@ + \romannumeral \csname c@pageof@pagebonuspoints\endcsname + {\prtaux@hlfcntr{@pagebonuspoints}}}% + % See if this has changed from the last run of LaTeX: + \CheckIfChanged@hlf{@pagebonuspoints}% + {bonuspointsonpage@\romannumeral + \csname c@pageof@pagebonuspoints\endcsname}% + \fi + % The following is a macro because \theCurr@Page and + % \thepageof@pagebonuspoints might differ by more than 1: + \increment@pageof@pagebonuspoints + % The following label is so that we can make the page + % numbers in a bonus grade table indexed by page into \pageref's + % so that \usepackage{hyperref} and pdflatex will + % make them clickable: + \label{firstbonuspoints@onpage@\arabic{Curr@Page}}% + \else + % These points go on the same page as the points + % currently counted in @pagebonuspoints: + \add@hlfcntrtohlfcntr{@pagebonuspoints}{latest@bonuspoints}% + \set@hlfcntr{latest@bonuspoints}{0}% + \fi + \fi +}% pagepoint@commands +\def\increment@pageof@pagepoints{% + \addtocounter{pageof@pagepoints}{1}% + \ifnum \theCurr@Page > \thepageof@pagepoints\relax + \immediate\write\@mainaux + {\string\gdef\string\pointsonpage@ + \romannumeral \csname c@pageof@pagepoints\endcsname{0}}% + % See if this has changed from the last run of LaTeX: + \@ifundefined{pointsonpage@\romannumeral + \csname c@pageof@pagepoints\endcsname} + {\global\@pointschangedtrue}% + {% + % OK; it's defined. See if it's changed: + \begingroup + \set@hlfcntr{tmp@hlfcntr}{\csname pointsonpage@\romannumeral + \csname c@pageof@pagepoints\endcsname\endcsname}% + \edef\othpt@check{\prtaux@hlfcntr{tmp@hlfcntr}}% + \def\pt@check{0}% + \ifx \pt@check \othpt@check + % Do nothing + \else + \global\@pointschangedtrue + \fi + \endgroup + }% + \let\next@incr@pageof = \increment@pageof@pagepoints + \else + \copy@hlfcntr{@pagepoints}{latest@points}% + \set@hlfcntr{latest@points}{0}% + % \page@withpoints will be used to find the last + % page that has points, which will be written to + % the .aux file via \AtEndDocument: + \global\edef\page@withpoints{\thepageof@pagepoints}% + \let\next@incr@pageof = \relax + \fi + \next@incr@pageof +}% increment@pageof@pagepoints +\def\increment@pageof@pagebonuspoints{% + \addtocounter{pageof@pagebonuspoints}{1}% + \ifnum \theCurr@Page > \thepageof@pagebonuspoints\relax + \immediate\write\@mainaux + {\string\gdef\string\bonuspointsonpage@ + \romannumeral \csname c@pageof@pagebonuspoints\endcsname{0}}% + % See if this has changed from the last run of LaTeX: + \@ifundefined{bonuspointsonpage@\romannumeral + \csname c@pageof@pagebonuspoints\endcsname} + {\global\@pointschangedtrue}% + {% + % OK; it's defined. See if it's changed: + \begingroup + \set@hlfcntr{tmp@hlfcntr}{\csname bonuspointsonpage@\romannumeral + \csname c@pageof@pagebonuspoints\endcsname\endcsname}% + \edef\othpt@check{\prtaux@hlfcntr{tmp@hlfcntr}}% + \def\pt@check{0}% + \ifx \pt@check \othpt@check + % Do nothing + \else + \global\@pointschangedtrue + \fi + \endgroup + }% + \let\next@incr@pageof = \increment@pageof@pagebonuspoints + \else + \copy@hlfcntr{@pagebonuspoints}{latest@bonuspoints}% + \set@hlfcntr{latest@bonuspoints}{0}% + % \page@withbonuspoints will be used to find the last + % page that has bonus points, which will be written to + % the .aux file via \AtEndDocument: + \global\edef\page@withbonuspoints{\thepageof@pagebonuspoints}% + \let\next@incr@pageof = \relax + \fi + \next@incr@pageof +}% increment@pageof@pagebonuspoints + + + + + + +\def\@checkqueslevel#1{% + \begingroup + \def\exam@temp{#1}% + \ifx\exam@temp\@queslevel + % Everything's fine; do nothing. + \else + \ClassError{exam}{% + I found a #1 where I expected to find a + \@queslevel\MessageBreak + }{% + Both #1 and \@queslevel \space can be used only inside the + correct \MessageBreak \space \space + environment and outside of any smaller environment + \MessageBreak + }% + \fi + \endgroup +} + +\def\@doitem{\@ifnextchar[{\@readpoints}% + {\item@points@pageinfo}% +} + +\def\@readpoints[#1]{% +% We use \def for \@points instead of \edef because we don't want +% \half (if present) to be expanded yet, so that the command \points +% can figure out how to deal with it: + \def\@points{#1}% + \global \@placepointstrue + \if@addpoints + \if@bonus + \addto@hlfcntr{numbonuspoints}{\@points}% + \addto@hlfcntr{bonuspointsof@thisquestion}{\@points}% + % latest@bonuspoints is a holding area for bonus points to be + % added to @pagepoints after we check whether they're + % on the same page as the points currently counted + % by @pagepoints: + \addto@hlfcntr{latest@bonuspoints}{\@points}% + \else + \addto@hlfcntr{numpoints}{\@points}% + \addto@hlfcntr{pointsof@thisquestion}{\@points}% + % latest@points is a holding area for points to be + % added to @pagepoints after we check whether they're + % on the same page as the points currently counted + % by @pagepoints: + \addto@hlfcntr{latest@points}{\@points}% + \fi + \fi + \item@points@pageinfo +} + + + + +% Bug fix, 5 April 2004: \item@points@pageinfo +% Appending \point@toks and \pageinfo@commands to \everypar: +% Instead of appending the contents of \point@toks and +% \pageinfo@commands to \everypar using \append@toklist, +% we instead want to append only the two tokens +% \the\point@toks +% and the two tokens +% \the\pageinfo@commands +% to \everypar. We need to do this because if a questions environment +% immediately follows a \section command, then @nobreak will be true, +% and so the \if@nobreak inside of \everypar will *not* execute the +% \everypar={} that we had been counting on to keep the points from +% being inserted a second time in the second paragraph of a question. +% Since we've put the command \global \point@toks={} inside of +% \point@toks and the command \pageinfo@commands={} inside of +% \pageinfo@commands, when the contents of \point@toks and of +% \pageinfo@commands are executed (when we enter horizontal mode and +% \everypar is dumped in), the contents of \point@toks and +% \pageinfo@commands will be made empty, and so if +% the second paragraph also gets \the\point@toks and +% \the\pageinfo@commands, it won't matter. + +\def\item@points@pageinfo{% + \item + % Also: We need to do this here, *after* the \item command, rather + % than inside the macro \@readpoints, because the \item command + % puts the result of the \qformat command into an \hbox (with the + % command ``\sbox\@tempboxa{\makelabel{#1}}%''), expanding the + % argument of \qformat as it does so. Thus, @placepoints will be + % true when the argument of \qformat is expanded, and so if the + % user put a \thepoints command inside that argument it will + % correctly expand to the number of points. (When @placepoints is + % false, \thepoints expands to nothing at all). + % + % We also want to define \padded@point@block when @placepoints is + % true even if qformat and bonusqformat are true just in case the + % user, for some deranged reason, says \droppoints immediately + % following a \question. + % + \if@placepoints + % Since we want the user to be able to say \thepoints in the + % argument to a \pointformat command, we need \@placepointstrue + % when \point@block is expanded so that \thepoints will actually + % print something. (After setting up \point@toks, we do + % \@placepointsfalse, but \point@block isn't actually expanded + % until we enter horizontal mode.) Thus, we define + % \padded@point@block, and use that instead of \point@block. We + % put \begingroup and \endgroup around this to confine the + % effect of \@placepointstrue and also to confine the effect of + % any declarations like, e.g., \bfseries that the user might put + % in the argument of a \pointformat command. + % + % Note: We first tried using an \edef to expand \point@block right + % here, while @placepoints is true, but that causes problems if + % the user puts a \boldmath declaration in the argument of a + % \pointformat command. Apparently, expanding \boldmath (without + % executing anything) gives you bunches of undefined control + % sequence errors. + \if@bonus + \def\padded@point@block{% + \begingroup + \@placepointstrue + \bonuspoint@block + \endgroup + }% + \else + \def\padded@point@block{% + \begingroup + \@placepointstrue + \point@block + \endgroup + }% + \fi + % \setup@point@toks puts commands into \point@toks to place + % \padded@point@block at the correct spot. It doesn't append + % anything to \everypar (we do that in this macro, below). + % + % If @qformat is true, and if we're currently doing a question (or + % if @bonusqformat is true and we're doing a bonusquestion) + % (rather than a part, subpart, or subsubpart), then we don't want + % to set the points (if any), since the points of a question will + % appear only if the user chooses to cause that by putting a + % \thepoints in the argument of the \qformat command. + \if@pointsdropped + % Do nothing! + \else + \if@bonus + \if@bonusqformat + \ifx\ques@ref\@queslevel + % Do nothing + \else + \setup@point@toks + \fi + \else + \setup@point@toks + \fi + \else + \if@qformat + \ifx\ques@ref\@queslevel + % Do nothing + \else + \setup@point@toks + \fi + \else + \setup@point@toks + \fi + \fi + \fi + \global \@placepointsfalse + \fi + % We *don't* use \append@toklist; see the Bug fixnote above + % (Bug fix, 5 April 2004). + % We can append the tokens ``\the\point@toks'' whether or not we're + % setting any points because if we're not setting them, \point@toks + % will be empty. + % Also: It's important to do this *after* the \item command above, + % since the \item command discards the previous contents of + % \everypar. + % Version 2.218$\beta$, 2007/10/31 changes: + % Instead of appending + % \the \pageinfo@commands \the \point@toks + % to \everypar, we insert them into the box \@labels. This corrects + % the problem that arose when a question (or part, etc.) begins with + % a list environment (including verbatim, flushleft, center, + % flushright, and possibly others that are implemented as trivlist + % environments). The \item command in those environments throws + % away the previous contents of \everypar, and so the tokens \the + % \pageinfo@commands \the \point@toks didn't get inserted where we + % expected. List environments *do* preserve the contents of the box + % \@labels, though. + \global\setbox\@labels\hbox{\unhbox\@labels + \the \pageinfo@commands + \the \point@toks}% + % \edef\append@everypar{\noexpand\everypar={\the\everypar + % \noexpand\the \noexpand\pageinfo@commands + % \noexpand\the \noexpand\point@toks}}% + % \append@everypar +} + + + + + + + +% Initialize \@points: +% (The only reason I think this is necessary is in case the user uses +% a \qformat command, puts \themarginpoints into the format (which is +% *not* the intended use of \themarginpoints), and then doesn't have +% any points for the first question.) +\def\@points{0} + + +\def\setup@point@toks{% +% We set the token list \point@toks equal to the sequence of commands +% needed to put \padded@point@block at the correct location, followed +% by the tokens ``\global \point@toks={}''. The \question, \part, +% \subpart, or \subsubpart command then adds the two tokens +% ``\the\point@toks'' to \everypar. +% +% Note: It is not the *contents* of \point@toks that is added to +% \everypar; just the two tokens ``\the\point@toks''. This difference +% is the bug fix of 2 April 2004, described above (the bug was that in +% earlier versions, we used to append the contents). +% +% The result of this is that whenever we finally enter horizontal mode +% (because we finally encountered the text of a question, part, +% subpart, or subsubpart) the contents of \point@toks will be dumped +% into horizontal mode and executed, and so the points will be placed +% and the token list \point@toks will be set to empty. Thus, in the +% occasional circumstances in which \everypar is *not* set to empty +% after being added to the first paragraph (which occurs when a +% questions environment immediately follows a \section command), and +% so \everypar will still contain ``\the\point@toks'' when it +% encounters a possible second paragraph of the first question, the +% tokens ``\the\point@toks'' will insert an *empty* token list, which +% will do no harm. +% + \if@pointstwosided + % Set \csname \q@label \endcsname equal to the thing + % that expands to the page number of the current (question or + % part or subpart or subsubpar; whatever it is), but do it + % carefully because, if we don't yet have page info, then it won't + % be defined: + \ifx\@queslevel\ques@ref + \def\q@label{Pg@question@\arabic{question}} + \else + \ifx\@queslevel\part@ref + \def\q@label{Pg@part@\arabic{question}@\arabic{partno}} + \else + \ifx\@queslevel\subpart@ref + \def\q@label{Pg@subpart@\arabic{question}% + @\arabic{partno}@\arabic{subpart}} + \else + \ifx\@queslevel\subsubpart@ref + \def\q@label{Pg@subsubpart@\arabic{question}% + @\arabic{partno}@\arabic{subpart}@\arabic{subsubpart}} + \else + \ClassError{exam}{% + This can't happen in function \protect\setup@point@toks + \MessageBreak + }{% + An unexplained error occurred in exam.cls;\MessageBreak + please inform the package maintainer, and send along + \MessageBreak + the LaTeX file that shows the error.\MessageBreak + }% + \fi + \fi + \fi + \fi + % + \expandafter\ifx \csname \q@label \endcsname\relax + % No page info yet; put it into the right margin + \@pointsinrightmargintrue + \@pointsinleftmarginfalse + \else + \ifodd \csname \q@label \endcsname\relax + \if@pointsinoutsidemargin + \@pointsinrightmargintrue + \@pointsinleftmarginfalse + \else + \@pointsinrightmarginfalse + \@pointsinleftmargintrue + \fi + \else + \if@pointsinoutsidemargin + \@pointsinrightmarginfalse + \@pointsinleftmargintrue + \else + \@pointsinrightmargintrue + \@pointsinleftmarginfalse + \fi + \fi + \fi + \fi + % That ends the \if@pointstwosided. + % Now we actually setup \point@toks: + \if@pointsinleftmargin + \point@toks={% + \llap{\padded@point@block + \hskip\@totalleftmargin + \hskip\marginpointssep + }% + \global \point@toks={}% + }% + \else + \if@pointsinrightmargin + \point@toks={% + \rlap{\hskip-\@totalleftmargin + \hskip\textwidth + \hskip\@rightmargin + \hskip-\rightpointsmargin + \llap{\padded@point@block}% + }% + \global \point@toks={}% + }% + \else + % The points just go after the question number: + \point@toks={% + \padded@point@block + \enspace + \global \point@toks={}% + }% + \fi + \fi +}% setup@point@toks + +\def\droppoints{% + \leavevmode\unskip\nobreak\hfill + \rlap{\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{\padded@point@block}% + }% rlap + \par +} + +\def\droptotalpoints{% + \leavevmode\unskip\nobreak\hfill + \rlap{\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{\total@block}% + }% rlap + \par +}% droptotalpoints +\def\droptotalbonuspoints{% + \leavevmode\unskip\nobreak\hfill + \rlap{\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{\bonustotal@block}% + }% rlap + \par +}% droptotalbonuspoints + +% The following is the default definition; +% it can be changed by a \totalformat command. +\def\total@block{% + Total for Question \thequestion: \totalpoints\@marginpointname +}% total@block +\def\bonustotal@block{% + Total for Question \thequestion: \totalbonuspoints\@marginbonuspointname +}% bonustotal@block + +\def\totalformat#1{% + \gdef\total@block{\begingroup #1\endgroup}% +}% totalformat +\def\bonustotalformat#1{% + \gdef\bonustotal@block{\begingroup #1\endgroup}% +}% bonustotalformat +% The following is for use in the argument to a \totalformat command: +\def\totalpoints{\pointsofquestion{\arabic{question}}} +\def\totalbonuspoints{\bonuspointsofquestion{\arabic{question}}} + + + +% @placepoints is set true when we encounter a question (or part, etc.) +% that has points. It is set to false (1) when we set \point@toks equal +% to the sequence of commands required to put the properly formatted +% points onto the page (this happens only if @qformat is false or if +% @qformat is true but we're not doing a question), or (2) by a +% \question command or entering a parts environment (since if we're +% doing a question and @qformat is true, we need to leave @placepoints +% true so that the \thepoints command can tell if it should expand to +% points or to nothing, and encountering a \question command or parts +% environment tells us that we no longer have to deal with a possible +% \thepoints, since we won't be expanding a qformat). +\newif\if@placepoints +\@placepointsfalse + + +% \marginpointssep will be used if the user says +% \pointsinleftmargin. It will be the distance from whatever encloses +% the points (parentheses, brackets, or a box) to the left margin: +\newlength\marginpointssep +\setlength{\marginpointssep}{5pt} + +% \rightpointsmargin will be used if the user says \pointsinrightmargin. +% It will be the distance from whatever encloses the point (parentheses, +% brackets, or a box) to the right edge of the paper: +\newlength\rightpointsmargin +\setlength{\rightpointsmargin}{1cm} + + +\newif\if@pointsdropped +\newif\if@pointsinleftmargin +\newif\if@pointsinrightmargin +\newif\if@pointstwosided +\newif\if@pointsinoutsidemargin + +% If we have \@pointstwosidedtrue and \@pointsinoutsidemarginfalse, +% then the points will be printed on the inside margin (left on odd +% numbered pages, right on even numbered pages). If we have +% \@pointstwosidedfalse, then \if@pointsinoutsidemargin is ignored. + +% If we have \@pointstwosidedtrue, then both \@pointsinleftmargin and +% \@pointsinrightmargin will be flipped back and forth, as needed, in +% \setup@point@toks. + +\def\pointsinleftmargin{\global\@pointsinleftmargintrue + \global\@pointsinrightmarginfalse + \global\@pointsdroppedfalse + \global\@pointstwosidedfalse + \gdef\pt@name{\@marginpointname}% + \gdef\bnspt@name{\@marginbonuspointname}} +\def\pointsinrightmargin{\global\@pointsinrightmargintrue + \global\@pointsinleftmarginfalse + \global\@pointsdroppedfalse + \global\@pointstwosidedfalse + \gdef\pt@name{\@marginpointname}% + \gdef\bnspt@name{\@marginbonuspointname}} +\def\nopointsinmargin{\global\@pointsinleftmarginfalse + \global\@pointsinrightmarginfalse + \global\@pointsdroppedfalse + \global\@pointstwosidedfalse + \gdef\pt@name{\@pointname}% + \gdef\bnspt@name{\@bonuspointname}} +\def\pointsdroppedatright{\global\@pointsdroppedtrue + \global\@pointsinleftmarginfalse + \global\@pointsinrightmarginfalse + \global\@pointstwosidedfalse + \gdef\pt@name{\@marginpointname}% + \gdef\bnspt@name{\@marginbonuspointname}} +\def\pointstwosided{\global\@pointstwosidedtrue + \global\@pointsinoutsidemargintrue + \global\@pointsdroppedfalse + \gdef\pt@name{\@marginpointname}% + \gdef\bnspt@name{\@marginbonuspointname}} +\def\pointstwosidedreversed{\global\@pointstwosidedtrue + \global\@pointsinoutsidemarginfalse + \global\@pointsdroppedfalse + \gdef\pt@name{\@marginpointname}% + \gdef\bnspt@name{\@marginbonuspointname}} +\let\pointsinmargin=\pointsinleftmargin +\let\nopointsinrightmargin=\nopointsinmargin +\let\nopointsinleftmargin=\nopointsinmargin + +\nopointsinmargin + + +% Will the points be displayed inside parentheses (the default), or +% will they be boxed or bracketed, or customized using pointformat: +\def\boxedpoints{% + \gdef\point@block{\fbox{\@points\pt@name}}% + \gdef\bonuspoint@block{\fbox{\@points\bnspt@name}}% +} +\def\noboxedpoints{% + \gdef\point@block{(\@points\pt@name)}% + \gdef\bonuspoint@block{(\@points\bnspt@name)}% +} +\def\bracketedpoints{% + \gdef\point@block{[\@points\pt@name]}% + \gdef\bonuspoint@block{[\@points\bnspt@name]}% +} +\let\nobracketedpoints=\noboxedpoints + +\def\pointformat#1{% + % We don't have to worry about the user putting things + % like \bfseries, etc. into \point@block, because + % \padded@point@block encloses \point@block in a group, + % which confines the effects of anything here: + \gdef\point@block{#1}% +} + +\def\bonuspointformat#1{% + % We don't have to worry about the user putting things + % like \bfseries, etc. into \point@block, because + % \padded@point@block encloses \point@block in a group, + % which confines the effects of anything here: + \gdef\bonuspoint@block{#1}% +} + +%Initialize: +\noboxedpoints + + + + +\def\pointname#1{\gdef\@pointname{#1}} +\def\bonuspointname#1{\gdef\@bonuspointname{#1}} +% Initialize to leave a space, and then the word `points': +%%\pointname{ points} +% The following improvement was contributed by +% Mate Wierdl <mw@wierdlmpc.msci.memphis.edu> +% If the number of points is ``1'', then the default value of +% \pointname will print `` point'' instead of `` points'' (and this +% version of the command doesn't generate an error message if the +% points entry is something other than a number): +% Note the space before the \points in the following; it's +% intentional!) +\pointname{ \points} +\bonuspointname{ \bonuspoints} +\newcommand\point@sing{point} +\newcommand\point@plur{points} +\newcommand\pointpoints[2]{% + \renewcommand\point@sing{#1}% + \renewcommand\point@plur{#2}% +} +%\newcommand\bonuspoint@sing{bonus point} +%\newcommand\bonuspoint@plur{bonus points} +\newcommand\bonuspoint@sing{point (bonus)} +\newcommand\bonuspoint@plur{points (bonus)} +\newcommand\bonuspointpoints[2]{% + \renewcommand\bonuspoint@sing{#1}% + \renewcommand\bonuspoint@plur{#2}% +} + + + +% The command \points: +% We use \ifthenelse and \equal so that if the user types something +% other than a legit point value, there still won't be any error +% messages. We rig it so that if the point value looks like it's +% intended to be One or one or ONE, or some strange way of attempting +% one half, then it will expand to the singular value. Alas, this is +% only useful for English, but I'm hoping few or no users will try doing +% this anyway. + +% 0 points, one half point, 1 point, 1 and a half points, etc.: +\newcommand\points{% + \begingroup + \let\half=\relax + \edef\pt@string{\@points}% + \ifthenelse{\equal{\pt@string}{1} \or \equal{\pt@string}{\half}} + {\point@sing}{\point@plur}% + \endgroup +}% \points +\newcommand\bonuspoints{% + \begingroup + \let\half=\relax + \edef\pt@string{\@points}% + \ifthenelse{\equal{\pt@string}{1} \or \equal{\pt@string}{\half}} + {\bonuspoint@sing}{\bonuspoint@plur}% + \endgroup +}% \bonuspoints +%\newcommand\points{% +% \begingroup +% \let\half=\relax +% \edef\pt@string{\@points}% +% \ifthenelse{\equal{\pt@string}{1} \or \equal{\pt@string}{\half} \or +% \equal{\pt@string}{0\half} \or \equal{\pt@string}{0 \half} +% \equal{\pt@string}{one} \or \equal{\pt@string}{One} \or +% \equal{\pt@string}{ONE}} +% {\point@sing}{\point@plur}% +% \endgroup +%} + +%\newcommand\points{\ifthenelse{\equal{\@points}{1}}{\point@sing}{\point@plur}} +% If we used the following line instead, then you'd get an error +% message if the point value contained something other than a valid +% integer: +%\pointname{ \ifthenelse{\@points = 1}{point}{points}} + +% We used to define a command named \marks that works like \points, +% except that it expands to either ``mark'' or ``marks'', but that +% conflicts with some package or other. Thus, we'll implement +% \marksnotpoints using the \pointpoints command instead: +\newcommand\marksnotpoints{% + \pointpoints{mark}{marks}% + \bonuspointpoints{mark (bonus)}{marks (bonus)}% +}% \marksnotpoints + + +% \@marginpointname is used in place of \@pointname if any of +% \@pointsinmargin, \@pointsinrightmargin, and \@pointsdropped are +% true: +\def\marginpointname#1{\gdef\@marginpointname{#1}} +\marginpointname{} +\def\marginbonuspointname#1{\gdef\@marginbonuspointname{#1}} +\marginbonuspointname{ (bonus)} + + +%-------------------------------------------------------------------- +% choices (for multiple choice) and checkboxes + + +\renewcommand\thechoice{\Alph{choice}} +\newcommand\choicelabel{\thechoice.} + +% We will have \@correctchoicetrue when we're printing solutions +% and we're printing the correct choice of a choices or +% oneparchoices environment. +% We'll say \begingroup before saying \@correctchoicetrue +% and we'll say \endgroup at either the next \choice or \correctchoice +% or the end of the choices or oneparchoices environment. +% Thus, we'll never again need to say \@correctchoicefalse +\newif\if@correctchoice +\@correctchoicefalse + +\newcommand\CorrectChoiceEmphasis[1]{% + \def\CorrectChoice@Emphasis{#1}% +} +\CorrectChoiceEmphasis{\bfseries} +\let\correctchoiceemphasis\CorrectChoiceEmphasis + +% Note: \do@choice@pageinfo is used in both the choices and +% the checkboxes environments. +\newtoks\choice@toks +\def\do@choice@pageinfo{% + \choice@toks={% + \questionobject@pluspagecheck + \choice@toks={}% + }% + % Version 2.217-beta changes: + % Instead of appending stuff to \everypar, we insert + % \the \pageinfo@commands and \the \point@toks + % into the box \@labels: + \global\setbox\@labels\hbox{\unhbox\@labels + \the \choice@toks}% + % \edef\append@everypar{\noexpand\everypar={\the\everypar + % \noexpand\the \noexpand\choice@toks}}% + % \append@everypar +}% do@choice@pageinfo + + + +% Added 22 April 2004: Increased the \leftmargin by 2.5em, +% so the choices will be visibly indented. +\newenvironment{choices}% + {\list{\choicelabel}% + {\usecounter{choice}\def\makelabel##1{\hss\llap{##1}}% + \settowidth{\leftmargin}{W.\hskip\labelsep\hskip 2.5em}% + \def\choice{% + \if@correctchoice + \color@endgroup + \endgroup + \fi + \item + \do@choice@pageinfo + } % choice + \def\CorrectChoice{% + \if@correctchoice + \color@endgroup + \endgroup + \fi + \ifprintanswers + % We can't say \choice here, because that would + % insert an \endgroup: + % 2016/05/10: We say \color@begingroup in addition to + % \begingroup in case \CorrectChoiceEmphasis involves color + % and the text exactly fills the line (which would + % otherwise create a blank line after this choice): + % 2016/05/11: We leave hmode if we're in it, + % i.e., if there's no blank line preceding this + % \CorrectChoice command. (Without this, the + % \special created by a \color{whatever} command that might + % be inserted by \CorrectChoice@Emphasis would be appended + % to the previous \choice, which could cause an extra + % (blank) line to be inserted before this \CorrectChoice.) + % Since \par and \endgraf seem to cancel \@totalleftmargin + % (for reasons I don't understand), we'll do the following: + % Motivated by the def of \leavevmode, + % \def\leavevmode{\unhbox\voidb@x} + % we will now leave hmode (if we're in hmode): + \ifhmode \unskip\unskip\unvbox\voidb@x \fi + \begingroup \color@begingroup \@correctchoicetrue + \CorrectChoice@Emphasis + \fi + \item + \do@choice@pageinfo + } % CorrectChoice + \let\correctchoice\CorrectChoice + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \topsep=0pt + \partopsep=0pt + \choiceshook + }% + }% + {\if@correctchoice \color@endgroup \endgroup \fi \endlist} + +\newenvironment{oneparchoices}% + {% + \setcounter{choice}{0}% + \def\choice{% + \if@correctchoice \endgroup \fi + \refstepcounter{choice}% + \ifnum\value{choice}>1\relax + \penalty -50\hskip 1em plus 1em\relax + \fi + \choicelabel + % No need to put the following into a token string; we just put + % the choicelabel onto the page, so we're at the spot whose page + % number we want to record: + \questionobject@pluspagecheck + \nobreak\enskip + }% choice + \def\CorrectChoice{% + \if@correctchoice \endgroup \fi + \refstepcounter{choice}% + \ifprintanswers + \begingroup \@correctchoicetrue + \CorrectChoice@Emphasis + \fi + \ifnum\value{choice}>1\relax + \penalty -50\hskip 1em plus 1em\relax + \fi + \choicelabel + % No need to put the following into a token string; we just put + % the choicelabel onto the page, so we're at the spot whose page + % number we want to record: + \questionobject@pluspagecheck + \nobreak\enskip + }% CorrectChoice + \let\correctchoice\CorrectChoice + \let\par\@empty + % If we're continuing the paragraph containing the question, + % then leave a bit of space before the first choice: + \ifvmode\else\enskip\fi + \ignorespaces + }% + {\if@correctchoice \endgroup \fi} + +\newcommand{\checkboxchar}[1]{\def\checkbox@char{#1}} +\newcommand{\checkedchar}[1]{\def\checked@char{#1}} +\checkboxchar{$\bigcirc$} +\checkedchar{$\surd$} + +\newenvironment{checkboxes}% + {\list{\checkbox@char}% + {% + \settowidth{\leftmargin}{W.\hskip\labelsep\hskip 2.5em}% + \def\choice{% + \if@correctchoice + \color@endgroup \endgroup + \fi + \item + \do@choice@pageinfo + } % choice + \def\CorrectChoice{% + \if@correctchoice + \color@endgroup \endgroup + \fi + \ifprintanswers + % We can't say \choice here, because that would + % insert an \endgroup. + % 2016/05/10: We say \color@begingroup in addition to + % \begingroup in case \CorrectChoiceEmphasis involves color + % and the text exactly fills the line (which would + % otherwise create a blank line after this choice): + % 2016/05/11: We leave hmode if we're in it, + % i.e., if there's no blank line preceding this + % \CorrectChoice command. (Without this, the + % \special created by a \color{whatever} command that might + % be inserted by \CorrectChoice@Emphasis would be appended + % to the previous \choice, which could cause an extra + % (blank) line to be inserted before this \CorrectChoice.) + % Since \par and \endgraf seem to cancel \@totalleftmargin + % (for reasons I don't understand), we'll do the following: + % Motivated by the def of \leavevmode, + % \def\leavevmode{\unhbox\voidb@x} + % we will now leave hmode (if we're in hmode): + \ifhmode \unskip\unskip\unvbox\voidb@x \fi + \begingroup \color@begingroup \@correctchoicetrue + \CorrectChoice@Emphasis + \item[\checked@char] + \else + \item + \fi + \do@choice@pageinfo + } % CorrectChoice + \let\correctchoice\CorrectChoice + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \topsep=0pt + \partopsep=0pt + \checkboxeshook + }% + }% + {\if@correctchoice \color@endgroup \endgroup \fi \endlist} + +\newenvironment{oneparcheckboxes}% + {% + % Although we're not printing numbers for the choices, we use the + % choice counter to keep track of whether a choice is the first + % one (in which case we don't leave any additional space) or a + % later one (in which case we do leave additional space): + \setcounter{choice}{0}% + \def\choice{% + \if@correctchoice \endgroup \fi + \stepcounter{choice}% + \ifnum\value{choice}>1\relax + \penalty -50\hskip 1em plus 1em\relax + \fi + \checkbox@char + % No need to put the following into a token string; we just put + % \checkbox@char onto the page, so we're at the spot whose page + % number we want to record: + \questionobject@pluspagecheck + \nobreak\enskip + }% choice + \def\CorrectChoice{% + \if@correctchoice \endgroup \fi + \stepcounter{choice}% + \ifprintanswers + \begingroup \@correctchoicetrue + \CorrectChoice@Emphasis + \fi + \ifnum\value{choice}>1\relax + \penalty -50\hskip 1em plus 1em\relax + \fi + \ifprintanswers + \checked@char + \else + \checkbox@char + \fi + % No need to put the following into a token string; we just put + % the choicelabel onto the page, so we're at the spot whose page + % number we want to record: + \questionobject@pluspagecheck + \nobreak\enskip + }% CorrectChoice + \let\correctchoice\CorrectChoice + \let\par\@empty + % If we're continuing the paragraph containing the question, + % then leave a bit of space before the first choice: + \ifvmode\else\enskip\fi + \ignorespaces + }% + {\if@correctchoice \endgroup \fi} + + +%-------------------------------------------------------------------- +% Answer Lines (for short answer questions) + +% Note: \ques@ref is also used in \item@points@pageinfo, and all four +% of the following are used in \setup@point@toks + +\def\ques@ref{question} +\def\part@ref{part} +\def\subpart@ref{subpart} +\def\subsubpart@ref{subsubpart} + +% Note: \answerclearance is also used by \fillin + +\newlength\answerlinelength +\newlength\answerskip +\newlength\answerclearance +\setlength\answerlinelength{1in} +\setlength\answerskip{2ex} +\setlength\answerclearance{0.2ex} + +\newcommand\answerline[1][{}]{% + % One optional argument, the default value of which is empty. + \ifx\@queslevel\ques@ref + \let\ans@l=\questionlabel + \else + \ifx\@queslevel\part@ref + \let\ans@l=\partlabel + \else + \ifx\@queslevel\subpart@ref + \let\ans@l=\subpartlabel + \else + \ifx\@queslevel\subsubpart@ref + \let\ans@l=\subsubpartlabel + \else + % Oops; no question level defined. + % We must be outide of the questions environment. + % Just leave out the label, I guess: + \def\ans@l{}% + \fi + \fi + \fi + \fi + \par \nobreak \vskip \answerskip + \hfill + \ifprintanswers + \ans@l~\hbox to 0pt{\hbox to \answerlinelength{\hrulefill}\hss}% + \raise \answerclearance\hbox to \answerlinelength{% + % 2016/05/10: Added \color@begingroup and \color@endgroup: + \color@begingroup + \CorrectChoice@Emphasis \hfil #1\hss + \color@endgroup}% + \else + \ans@l~\hbox to \answerlinelength{\hrulefill}% + \fi + \par +}% answerline + +%-------------------------------------------------------------------- +% \fillin, for fill-in-the-blank questions + +\newlength\fillinlinelength +\setlength\fillinlinelength{1in} + +% \fillin can take two optional arguments. +% +% The first optional argument is the answer to be printed above the line +% when \printanswers is in effect; the default value is empty. That +% line is printed a distance of \answerclearance below the baseline. +% +% The second optional argument is the length of the line that we print; +% the default value is \fillinlinelength. The value of +% \fillinlinelength is set with the command +% +% \setlength\fillinlinelength{1in} +% +% and can be changed by giving a new \setlength command. +% +% When answers are being printed, the optional argument is printed +% subject to the declarations in the argument of the last +% \CorrectChoiceEmphasis command. It is centered on the line unless it +% is too long, in which case it extends to the right of the line. +% +% \fillin eats (and ignores) space characters appearing before the +% first optional argument. It also eats (and ignores) space +% characters appearing after the first optional argument and before +% the second optional argument. However, if exactly one optional +% argument appears, and if there are one or more space characters +% following that one optional argument, then those spaces are replaced +% by a single space character, but not eaten. + +\newcommand\fillin[1][{}]{% + \def\fillin@ans{#1}% + \fillin@relay +}% fillin + +\newcommand\fillin@relay{% + % We use \exam@ifnextchar, a variation on \@ifnextchar. + % If \exam@ifnextchar encounters one or more space characters + % followed by a [, then those spaces are ignored (just as they would + % be by \@ifnextchar). However, if one or more space characters are + % followed by a non-space character other than [, then + % \exam@ifnextchar inserts a space following the + % {\@fillin@relay[\fillinlinelength]} that is the third argument to + % \exam@ifnextchar. + \exam@ifnextchar[{\@fillin@relay} + {\@fillin@relay[\fillinlinelength]}% +}% fillin@relay + +\def\@fillin@relay[#1]{% + % The first argument is in \fillin@ans, the second is #1. + \leavevmode + \ifprintanswers + \rlap{\raise -\answerclearance \hbox to #1{\hrulefill}}% + \begingroup + \setbox0 \hbox{\color@begingroup + \CorrectChoice@Emphasis \fillin@ans \color@endgroup}% + \ifdim\wd0 > #1\relax + \hbox{\color@begingroup\CorrectChoice@Emphasis \fillin@ans + \color@endgroup}% + \else + \hbox to #1{\color@begingroup\CorrectChoice@Emphasis + \hfil \fillin@ans \hfil\color@endgroup}% + \fi + \endgroup + \else + \raise -\answerclearance \hbox to #1{\hrulefill}% + \fi +}% @fillin@relay + +% \exam@ifnextchar is used by \fillin. +% \exam@ifnextchar is a variation of \@ifnextchar that does not always +% ignore space tokens. If \exam@ifnextchar encounters one or more +% space tokens, it makes note of that (with the command +% \@tempswatrue). If the first non-space character encountered +% matches argument #1, then any spaces that had been encountered are +% ignored. However, if one or more spaces are encountered and the +% first non-space character found does not match argument #1, then +% \exam@ifnextchar produces argument #3 followed by a space character. +% (This differs from the behavior of \new@ifnextchar in amsgen.sty, +% which does lookahead for any character, including a space.) This +% code (as well as the idea for it) is due to Dan Luecking and Ulrich +% Diez. +\long\def\exam@ifnextchar#1#2#3{% + \let\reserved@d=#1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + % The following says we haven't yet seen any spaces: + \@tempswafalse + \futurelet\@let@token\exam@ifnch +}% exam@ifnextchar + +\def\exam@ifnch{% + \ifx\@let@token\@sptoken + % Signal that we've found a space: + \@tempswatrue + \let\reserved@c\exam@xifnch % this gobbles the space + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \if@tempswa + \def\reserved@c{\expandafter\reserved@b\space}% + \else + \let\reserved@c\reserved@b + \fi + \fi + \fi + \reserved@c +}% exam@ifnch + +% The following defines \exam@xifnch so that it will eat a space +% following it and then call \exam@ifnch: +{% keep redefinition of \: local + \def\:{\exam@xifnch} + \expandafter\gdef\: {\futurelet\@let@token\exam@ifnch} +} + +%-------------------------------------------------------------------- +% \fillwithlines + + +% \fillwithlines takes one argument, which is either a length or \fill +% or \stretch{number}, and it fills that much vertical space with +% horizontal lines that run the length of the current line. That is, +% they extend from the current left margin (which depends on whether +% we're in a question, part, subpart, or subsubpart) to the right +% margin. +% +% The distance between the lines is \linefillheight, whose default value +% is set with the command +% +% \setlength\linefillheight{.25in} +% +% This value can be changed by giving a new \setlength command. +% +% The thickness of the lines is \linefillthickness, whose default value +% is set with the command +% +% \setlength\linefillthickness{.1pt} +% +% This value can be changed by giving a new \setlength command. +% +% As of version 2.503, 2016/03/25, the lines drawn by the +% \fillwithlines command will be drawn in color if the user has given +% the command +% +% \colorfillwithlines. +% +% The actual drawing of the lines is now done by the command +% \do@fillwithlines, after the \fillwithlines command decides whether +% they will be in color. The default color is set by the command +% +% \definecolor{FillWithLinesColor}{gray}{0.8} +% +% and the color can be changed by giving a new \definecolor command. +% You can return to black lines by giving the command +% +% \nocolorfillwithlines + +\newlength\linefillheight +\newlength\linefillthickness +\setlength\linefillheight{.25in} +\setlength\linefillthickness{0.1pt} + + + + +\newif\if@colorfillwithlines +\@colorfillwithlinesfalse +\def\colorfillwithlines{% + \@ifundefined{definecolor} + {% + \ClassError{exam}{% + You must load the color package with the command\MessageBreak + \space\space\protect\usepackage{color}\MessageBreak + in order to use the command \protect\colorfillwithlines + \MessageBreak + }{% + This command makes use of the package color.sty,\MessageBreak + and so you have to load color.sty before your\MessageBreak + \protect\begin{document} command.\MessageBreak + }% + }% + {% + \definecolor{FillWithLinesColor}{gray}{0.8} + \@colorfillwithlinestrue + }% +}% \colorfillwithlines +\def\nocolorfillwithlines{\@colorfillwithlinesfalse} + +\newcommand\fillwithlines[1]{% + \if@colorfillwithlines + \color@begingroup + \color{FillWithLinesColor}% + \do@fillwithlines{#1}% + \color@endgroup + \else + \do@fillwithlines{#1}% + \fi +}% \fillwithlines + +\newcommand\linefill{\leavevmode + \leaders\hrule height \linefillthickness \hfill\kern\z@} + +% \do@fillwithlines is called only by \fillwithlines +\def\do@fillwithlines#1{% + \begingroup + \ifhmode + \par + \fi + \hrule height \z@ + \nobreak + \setbox0=\hbox to \hsize{\hskip \@totalleftmargin + \vrule height \linefillheight depth \z@ width \z@ + \linefill}% + % We use \cleaders (rather than \leaders) so that a given + % vertical space will always produce the same number of lines + % no matter where on the page it happens to start: + \cleaders \copy0 \vskip #1 \hbox{}% + \endgroup +}% \do@fillwithlines + +%-------------------------------------------------------------------- +% \fillwithdottedlines + + +% \fillwithdottedlines is similar to \fillwithlines, except that it +% fills the space with dotted lines (created by \dotfill) rather than +% with solid lines. + +% \fillwithdottedlines takes one argument, which is either a length or +% \fill or \stretch{number}, and it fills that much vertical space +% with dotted lines that run the length of the current line. That is, +% they extend from the current left margin (which depends on whether +% we're in a question, part, subpart, or subsubpart) to the right +% margin. +% +% The distance between the lines is \dottedlinefillheight, whose +% default value is set with the command +% +% \setlength\dottedlinefillheight{.25in} +% +% This value can be changed by giving a new \setlength command. + +% As of version 2.503, 2016/03/25, the dotted lines drawn by the +% \fillwithdottedlines command will be drawn in color if the user has +% given the command +% +% \colorfillwithdottedlines. +% +% The actual drawing of the lines is now done by the command +% \do@fillwithdottedlines, after the \fillwithdottedlines command +% decides whether they will be in color. The default color is set by +% the command +% +% \definecolor{FillWithDottedLinesColor}{gray}{0.8} +% +% and the color can be changed by giving a new \definecolor command. +% You can return to black lines by giving the command +% +% \nocolorfillwithdottedlines + + +\newlength\dottedlinefillheight +\setlength\dottedlinefillheight{.25in} + +\newif\if@colorfillwithdottedlines +\@colorfillwithdottedlinesfalse +\def\colorfillwithdottedlines{% + \@ifundefined{definecolor} + {% + \ClassError{exam}{% + You must load the color package with the command\MessageBreak + \space\space\protect\usepackage{color}\MessageBreak + in order to use the command \protect\colorfillwithdottedlines + \MessageBreak + }{% + This command makes use of the package color.sty,\MessageBreak + and so you have to load color.sty before your\MessageBreak + \protect\begin{document} command.\MessageBreak + }% + }% + {% + \definecolor{FillWithDottedLinesColor}{gray}{0.8} + \@colorfillwithdottedlinestrue + }% +}% \colorfillwithdottedlines +\def\nocolorfillwithdottedlines{\@colorfillwithdottedlinesfalse} + +\newcommand\fillwithdottedlines[1]{% + \if@colorfillwithdottedlines + \color@begingroup + \color{FillWithDottedLinesColor}% + \do@fillwithdottedlines{#1}% + \color@endgroup + \else + \do@fillwithdottedlines{#1}% + \fi +}% \fillwithdottedlines + +% \do@fillwithdottedlines is called only by \fillwithdottedlines +\def\do@fillwithdottedlines#1{% + \begingroup + \ifhmode + \par + \fi + \hrule height \z@ + \nobreak + \setbox0=\hbox to \hsize{\hskip \@totalleftmargin + \vrule height \dottedlinefillheight depth \z@ width \z@ + \dotfill}% + % We use \cleaders (rather than \leaders) so that a given + % vertical space will always produce the same number of lines + % no matter where on the page it happens to start: + \cleaders \copy0 \vskip #1 \hbox{}% + \endgroup +}% \do@fillwithdottedlines + +%-------------------------------------------------------------------- +% \fillwithgrid + + +% \fillwithgrid is similar to \fillwithlines, except that it +% fills the space with a grid. + +% \fillwithgrid takes one argument, which is either a length or \fill +% or \stretch{number}, and it fills that much vertical space with a +% grid that runs the length of the current line. That is, it extends +% from the current left margin (which depends on whether we're in a +% question, part, subpart, or subsubpart) to the right margin. +% +% The default grid size and grid line thickness were set by the +% commands +% +% \setlength{\gridsize}{5mm} +% \setlength{\gridlinewidth}{0.1pt} +% +% You can change either or both of those by giving new \setlength +% commands. The period of the grid is \gridsize (both horizontally +% and vertically). That is, the horizontal distance from the left +% edge of one vertical line to the left edge of the next vertical line +% is \gridsize, as is the vertical distance from the top edge of one +% horizontal line to the top edge of the next horizontal line. Thus, +% each square has outer side length equal to \gridsize+\gridlinewidth. + +% By default, the created grids are in black. However, if you give the +% commands +% +% \usepackage{color} +% \colorgrids +% +% then the grids will be in color, by default a light gray. That +% default color was defined by the command +% +% \definecolor{GridColor}{gray}{0.8} +% +% You can change the color by redefining the color GridColor by giving +% a new \definecolor command. + +\newif\if@colorgrids +\newcommand\colorgrids{% + \@ifundefined{definecolor} + {% + \ClassError{exam}{% + You must load the color package with the command\MessageBreak + \space\space\protect\usepackage{color}\MessageBreak + in order to use the command \protect\colorgrids + }{% + This command makes use of the package color.sty,\MessageBreak + and so you have to load color.sty before your\MessageBreak + \protect\begin{document} command.\MessageBreak + }% + }% + {% + \definecolor{GridColor}{gray}{0.8} + \@colorgridstrue + }% +}% \colorgrids +\newcommand\nocolorgrids{\@colorgridsfalse} +\nocolorgrids + +\newlength\gridsize +\newlength\gridlinewidth +\setlength{\gridsize}{5mm} +\setlength{\gridlinewidth}{0.1pt} + +\def\fillwithgrid#1{% + \begingroup + \ifhmode + \par + \fi + \hrule height \z@ + \nobreak + + % We first set box0 equal to an \hbox which, when printed, is a + % square with width and height equal to \gridsize+\gridlinewidth, + % but which has + % width equal to \gridsize, + % height equal to \gridsize, and + % depth equal to 0pt. + % When we put multiple copies of it together using \leaders or + % \cleaders, the right edge will coincide with the left edge of the + % next box and the bottom edge will coincide with the top edge of + % the box below it. + \setlength{\@tempdima}{\gridsize} + \addtolength{\@tempdima}{\gridlinewidth} + \setlength{\@tempdimb}{\gridsize} + \addtolength{\@tempdimb}{-\gridlinewidth} + \setbox0=\hbox{% + \rlap{\vrule height \gridsize depth \gridlinewidth width \gridlinewidth}% + \rlap{\vrule height \gridsize depth -\@tempdimb width \@tempdima}% + \vrule height 0pt depth \gridlinewidth width \@tempdima + \llap{\vrule height \gridsize depth \gridlinewidth width \gridlinewidth}% + }% + \wd0=\gridsize + \dp0=0pt + % Now we set box1 equal to an \hbox containing a single line of + % copies of box0. We use \leaders (instead of \cleaders) so that + % if we use it twice on a page, once with a question and once + % with a part, the boxes will line up vertically. We add a kern of + % \gridlinewidth at the right because the rightmost vertical line + % appears to the right of where the \leaders command thinks that it + % appears. + \setbox1=\hbox to \textwidth{% + \color@begingroup + \if@colorgrids + \color{GridColor}% + \fi + \hskip \@totalleftmargin \leaders\copy0\hfil \kern\gridlinewidth + \color@endgroup + }% + % Finally: We create the grid, using \cleaders: We use \cleaders + % (rather than \leaders) so that a given vertical space will always + % produce the same number of lines no matter where on the page it + % happens to start. We add a kern of \gridlinewidth because the + % bottommost horizontal line appears below where the \cleaders + % command thinks that it appears. + \cleaders \copy1 \vskip #1 \kern \gridlinewidth \hbox{}% + \endgroup +}% fillwithgrid + +%-------------------------------------------------------------------- +% \makeemptybox + +% \makeemptybox takes one argument, which is a length, and it creates +% an empty box of width the length of the current line and of height +% equal to the argument. That is, the box extends from the current +% left margin (which depends on whether we're in a question, part, +% subpart, or subsubpart) to the right margin. + +% As of version 2.304, the argument of \makeemptybox can be either +% a length, or \fill, or \stretch{number}. + +% \newcommand\makeemptybox[1]{ +% \par +% \begingroup +% \setlength{\fboxsep}{0pt}% +% \framebox[\linewidth]{% +% \vrule height 0pt depth #1 width 0pt +% }% +% \endgroup +% } + +\newlength\minboxheight +\setlength\minboxheight{.1in} + + +% As of version 2.502, 2016/03/23, the frame drawn by the +% \makeemptybox command will be drawn in color if the user has given +% the command \colorsolutionboxes. The actual drawing of the box is +% now done by the command \do@emptybox, after the \makeemptybox +% command decides whether it will be in color. + +\newcommand\makeemptybox[1]{% + \if@colorsolutionboxes + \color@begingroup + \color{SolutionBoxColor}% + \do@emptybox{#1}% + \color@endgroup + \else + \do@emptybox{#1}% + \fi +} + +% The command \do@emptybox is called only by \makeemptybox. +\newcommand\do@emptybox[1]{% + \par + \hbox to \hsize{\hskip\@totalleftmargin \leaders\hrule\hfill}% + \nointerlineskip + \begingroup + \setbox0=\hbox to \hsize{\hskip\@totalleftmargin + \vrule height\minboxheight \hfill \vrule}% + % The vertical size desired may not be an exact multiple of + % \minboxheight, and so \cleaders might leave a gap between the + % vertical lines and the horizontal lines above and below it. + % Thus, we put a single copy of \box0 immediately below the + % horizontal line above and we'll also put a single copy of \box0 + % immediately above the horizontal line below. + \copy0 + \nobreak + \vskip -\minboxheight + \cleaders \copy0 \vskip #1 + \vskip -\minboxheight + \nointerlineskip + \copy0 + \endgroup + \nointerlineskip + \hbox to \hsize{\hskip\@totalleftmargin \leaders\hrule\hfill}% +} + +%-------------------------------------------------------------------- +% \uplevel and \fullwidth +% and the EnvUplevel and EnvFullwidth environments: + +% \uplevel is used to print text at the indentation level of the +% enclosing environment. For example, to precede a question with +% directions about how that question should be answered, you would +% say \uplevel{Answer this question correctly.} +% +% \fullwidth is similar, but uses the full page of text on the page. + +% The EnvUplevel environment is similar to the \uplevel command, but it +% has the advantage that you can include verbatim material (using, e.g., +% the \verb command) in the environment. (You can't include verbatim +% material in the argument of an \uplevel command.) + +% The EnvFullwidth environment is similar to the \fullwidth command, but +% it has the advantage that you can include verbatim material (using, +% e.g., the \verb command) in the environment. (You can't include +% verbatim material in the argument of an \fullwidth command.) + + +\long\def\uplevel#1{% + \par\bigskip + \vbox{% + % We entered internal vertical mode, and so we get \parshape=0. + % We set \leftskip to provide the correct left margin for whatever + % is in the argument of the \uplevel command: + \leftskip=\@totalleftmargin + \advance\leftskip-\leftmargin + % We adjust \@totalleftmargin and linewidth in case there's a + % solution environment inside of the argument to the \uplevel: + \advance\@totalleftmargin-\leftmargin + \advance\linewidth\leftmargin + #1% + }% vbox + \nobreak +} + +\newenvironment{EnvUplevel} + {\par\bigskip\vbox\bgroup + % We set \leftskip to provide the correct left margin for whatever + % is inside of the environment: + \leftskip=\@totalleftmargin + \advance\leftskip-\leftmargin + % We adjust \@totalleftmargin (and linewidth?) in case there's a + % solution environment inside of the environment: + \advance\@totalleftmargin-\leftmargin + \advance\linewidth\leftmargin + } + {\egroup\nobreak} + + +\long\def\fullwidth#1{% + \par\bigskip + \vbox{% + % We entered internal vertical mode, and so we get \parshape=0. + \leftskip=0pt \rightskip=0pt + \advance\linewidth\@totalleftmargin + \@totalleftmargin=0pt + #1% + }% vbox + \nobreak +} + +\newenvironment{EnvFullwidth} + {\par\bigskip\vbox\bgroup + % We entered internal vertical mode, and so we get \parshape=0. + \leftskip=0pt \rightskip=0pt + % We adjust \@totalleftmargin (and linewidth?) in case there's a + % solution environment inside of the environment: + \advance\linewidth\@totalleftmargin + \@totalleftmargin=0pt + } + {\egroup\nobreak} + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% +% ******************** +% ** GRADING TABLES ** +% ******************** + + + +\newcounter{@iterator} +\newlength\@cellwidth + +\def\cellwidth#1{\@cellwidth=#1} +\def\gradetablestretch#1{\def\@gtblstretch{#1}} + +% \settabletotalpoints allows the user to specify a total +% number of points to appear in a table that may be different +% from the sum of the points in the table: +\newcommand\prt@tablepoints{\prt@hlfcntr{tbl@points}} +\newcommand\settabletotalpoints[1]{% + \def\prt@tablepoints{#1}% +}% \settabletotalpoints + +% \settabletotalbonuspoints is similar to \settabletotalpoints: +\newcommand\prt@tablebonuspoints{\prt@hlfcntr{tbl@bonuspoints}} +\newcommand\settabletotalbonuspoints[1]{% + \def\prt@tablebonuspoints{#1}% +}% \settabletotalbonuspoints + +% All of the following that begin with `h' are for horizontal tables, +% and all of them that begin with `v' are for vertical tables: +\def\hqword#1{\def\@hqword{#1}} +\def\hpword#1{\def\@hpword{#1}} +\def\hsword#1{\def\@hsword{#1}} +\def\htword#1{\def\@htword{#1}} +\def\hpgword#1{\def\@hpgword{#1}} + +\def\vqword#1{\def\@vqword{#1}} +\def\vpword#1{\def\@vpword{#1}} +\def\vsword#1{\def\@vsword{#1}} +\def\vtword#1{\def\@vtword{#1}} +\def\vpgword#1{\def\@vpgword{#1}} + + +% The following are the versions for bonusgradetable: +\def\bhqword#1{\def\@bhqword{#1}} +\def\bhpword#1{\def\@bhpword{#1}} +\def\bhsword#1{\def\@bhsword{#1}} +\def\bhtword#1{\def\@bhtword{#1}} +\def\bhpgword#1{\def\@bhpgword{#1}} + +\def\bvqword#1{\def\@bvqword{#1}} +\def\bvpword#1{\def\@bvpword{#1}} +\def\bvsword#1{\def\@bvsword{#1}} +\def\bvtword#1{\def\@bvtword{#1}} +\def\bvpgword#1{\def\@bvpgword{#1}} + +% The following are the versions for combinedgradetable: +\def\chqword#1{\def\@chqword{#1}} +\def\chpword#1{\def\@chpword{#1}} +\def\chbpword#1{\def\@chbpword{#1}} +\def\chsword#1{\def\@chsword{#1}} +\def\chtword#1{\def\@chtword{#1}} +\def\chpgword#1{\def\@chpgword{#1}} + +\def\cvqword#1{\def\@cvqword{#1}} +\def\cvpword#1{\def\@cvpword{#1}} +\def\cvbpword#1{\def\@cvbpword{#1}} +\def\cvsword#1{\def\@cvsword{#1}} +\def\cvtword#1{\def\@cvtword{#1}} +\def\cvpgword#1{\def\@cvpgword{#1}} + + + +% Initialize: +\cellwidth{2em} +\gradetablestretch{1.5} + +\hqword{Question:} +\hpgword{Page:} +\hpword{Points:} +\hsword{Score:} +\htword{Total} +\vpword{Points} +\vsword{Score} +\vtword{Total:} +\vqword{Question} +\vpgword{Page} + +\bhqword{Question:} +\bhpgword{Page:} +\bhpword{Bonus Points:} +\bhsword{Score:} +\bhtword{Total} +\bvqword{Question} +\bvpgword{Page} +\bvpword{Bonus Points} +\bvsword{Score} +\bvtword{Total:} + +\chqword{Question:} +\chpgword{Page:} +\chpword{Points:} +\chbpword{Bonus Points:} +\chsword{Score:} +\chtword{Total} +\cvqword{Question} +\cvpgword{Page} +\cvpword{Points} +\cvbpword{Bonus Points} +\cvsword{Score} +\cvtword{Total:} + +% Before we created multirow and multicolumn tables, he only commands +% here accessible to the user were \gradetable, \bonusgradetable, +% \combinedgradetable, \pointtable, \bonuspointtable, +% \combinedpointtable, \partialgradetable, +% \partialbonusgradetable, \partialcombinedtable, \partialpointtable, +% \partialbonuspointtable, \partialcombinedpointtable, +% \begingradingrange, \endgradingrange, \pointsinrange, +% \bonuspointsinrange, \firstqinrange, \lastqinrange, and +% \numqinrange. The new user commands are +% +% \def\multirowgradetable +% \def\multirowpointtable +% \def\multirowbonusgradetable +% \def\multirowbonuspointtable +% \def\multirowcombinedgradetable +% \def\multirowcombinedpointtable +% +% \def\multirowpartialgradetable +% \def\multirowpartialpointtable +% \def\multirowpartialbonusgradetable +% \def\multirowpartialbonuspointtable +% \def\multirowpartialcombinedgradetable +% \def\multirowpartialcombinedpointtable +% +% \def\multicolumngradetable +% \def\multicolumnpointtable +% \def\multicolumnbonusgradetable +% \def\multicolumnbonuspointtable +% \def\multicolumncombinedgradetable +% \def\multicolumncombinedpointtable +% +% \def\multicolumnpartialgradetable +% \def\multicolumnpartialpointtable +% \def\multicolumnpartialbonusgradetable +% \def\multicolumnpartialbonuspointtable +% \def\multicolumnpartialcombinedgradetable +% \def\multicolumnpartialcombinedpointtable + + +% The possibilities are + +% \gradetable[v][questions] +% \gradetable[v][pages] +% \gradetable[h][questions] +% \gradetable[h][pages] + +% \bonusgradetable[v][questions] +% \bonusgradetable[v][pages] +% \bonusgradetable[h][questions] +% \bonusgradetable[h][pages] + +% \combinedgradetable[v][questions] +% \combinedgradetable[v][pages] +% \combinedgradetable[h][questions] +% \combinedgradetable[h][pages] + +% \pointtable[v][questions] +% \pointtable[v][pages] +% \pointtable[h][questions] +% \pointtable[h][pages] + +% \bonuspointtable[v][questions] +% \bonuspointtable[v][pages] +% \bonuspointtable[h][questions] +% \bonuspointtable[h][pages] + +% \combinedpointtable[v][questions] +% \combinedpointtable[v][pages] +% \combinedpointtable[h][questions] +% \combinedpointtable[h][pages] + +% \partialgradetable{whatever}[v][questions] +% \partialgradetable{whatever}[v][pages] +% \partialgradetable{whatever}[h][questions] +% \partialgradetable{whatever}[h][pages] + +% \partialbonusgradetable{whatever}[v][questions] +% \partialbonusgradetable{whatever}[v][pages] +% \partialbonusgradetable{whatever}[h][questions] +% \partialbonusgradetable{whatever}[h][pages] + +% \partialcombinedgradetable{whatever}[v][questions] +% \partialcombinedgradetable{whatever}[v][pages] +% \partialcombinedgradetable{whatever}[h][questions] +% \partialcombinedgradetable{whatever}[h][pages] + +% \partialpointtable{whatever}[v][questions] +% \partialpointtable{whatever}[v][pages] +% \partialpointtable{whatever}[h][questions] +% \partialpointtable{whatever}[h][pages] + +% \partialbonuspointtable{whatever}[v][questions] +% \partialbonuspointtable{whatever}[v][pages] +% \partialbonuspointtable{whatever}[h][questions] +% \partialbonuspointtable{whatever}[h][pages] + +% \partialcombinedpointtable{whatever}[v][questions] +% \partialcombinedpointtable{whatever}[v][pages] +% \partialcombinedpointtable{whatever}[h][questions] +% \partialcombinedpointtable{whatever}[h][pages] + +% \begingradingrange{whatever} +% \endgradingrange{whatever} +% +% \pointsinrange{whatever} +% \bonuspointsinrange{whatever} +% +% \firstqinrange{whatever} +% \lastqinrange{whatever} +% \numqinrange{whatever} +% +% where ``whatever'' is a label chosen by the user. +% +% \def\multirowgradetable{numcols}[questions or pages] +% \def\multirowpointtable{numcols}[questions or pages] +% \def\multirowbonusgradetable{numcols}[questions or pages] +% \def\multirowbonuspointtable{numcols}[questions or pages] +% \def\multirowcombinedgradetable{numcols}[questions or pages] +% \def\multirowcombinedpointtable{numcols}[questions or pages] +% +% \def\multirowpartialgradetable{numcols}{rangename}[questions or pages] +% \def\multirowpartialpointtable{numcols}{rangename}[questions or pages] +% \def\multirowpartialbonusgradetable{numcols}{rangename}[questions or pages] +% \def\multirowpartialbonuspointtable{numcols}{rangename}[questions or pages] +% \def\multirowpartialcombinedgradetable{numcols}{rangename}[questions or pages] +% \def\multirowpartialcombinedpointtable{numcols}{rangename}[questions or pages] +% +% \def\multicolumngradetable{numrows}[questions or pages] +% \def\multicolumnpointtable{numrows}[questions or pages] +% \def\multicolumnbonusgradetable{numrows}[questions or pages] +% \def\multicolumnbonuspointtable{numrows}[questions or pages] +% \def\multicolumncombinedgradetable{numrows}[questions or pages] +% \def\multicolumncombinedpointtable{numrows}[questions or pages] + +% \def\multicolumnpartialgradetable{numrows}{rangename}[questions or pages] +% \def\multicolumnpartialpointtable{numrows}{rangename}[questions or pages] +% \def\multicolumnpartialbonusgradetable{numrows}{rangename}[questions or pages] +% \def\multicolumnpartialbonuspointtable{numrows}{rangename}[questions or pages] +% \def\multicolumnpartialcombinedgradetable{numrows}{rangename}[questions or pages] +% \def\multicolumnpartialcombinedpointtable{numrows}{rangename}[questions or pages] + + +% If one or both optional arguments are omitted, the defaults are +% `[v]' and `[questions]'. + +% \@scorestrue means we're doing \gradetable +% \@scoresfalse mans we're doing \pointtable +\newif\if@scores + +% \@partialtrue means we're doing \partialgradetable, +% \partialbonusgradetable, \partialcombinedgradetable, +% \partialpointtable, \partialbonuspointtable, or +% \partialcombinedpointtable: +\newif\if@partial + +% \@combinedtrue means we're doing \combinedgradetable, +% \combinedpointtable, \partialcombinedgradetable, or +% \partialcombinedpointtable: +\newif\if@combined + +% It's OK to use the counter num@cols as a scratch counter +% in \begingradingrange and \endgradingrange because +% it's only used in typesetting tables: +\def\begingradingrange#1{% + \setcounter{num@cols}{\value{question}}% + \addtocounter{num@cols}{1}% + \immediate\write\@mainaux + {\string\expandafter\string\gdef + \string\csname\space range@#1@firstq\string\endcsname + {\arabic{num@cols}}}% + \write\@mainaux + {\string\expandafter\string\gdef + \string\csname\space range@#1@firstp\string\endcsname + {\thepage}}% +}% begingradingrange + +\def\endgradingrange#1{% + \setcounter{num@cols}{\value{question}}% + \immediate\write\@mainaux + {\string\expandafter\string\gdef + \string\csname\space range@#1@lastq\string\endcsname + {\arabic{num@cols}}}% + \write\@mainaux + {\string\expandafter\string\gdef + \string\csname\space range@#1@lastp\string\endcsname + {\thepage}}% +}% endgradingrange + + +% Now that grading tables may be for only part of the exam, +% we need the counter tbl@points to add up the total points +% for the questions (or pages) that appear on the table: +\new@hlfcntr{tbl@points} + +% We'll use the counter tbl@bonuspoints to add up the total bonus +% points for the questions (or pages) that appear on the table: +\new@hlfcntr{tbl@bonuspoints} + +%-------------------------------------------------------------------- +% multirow tables, non-partial: + +\def\multirowgradetable#1{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedfalse + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedfalse + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowbonusgradetable#1{% + \@scorestrue + \@bonustrue + \@partialfalse + \@combinedfalse + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowbonuspointtable#1{% + \@scoresfalse + \@bonustrue + \@partialfalse + \@combinedfalse + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowcombinedgradetable#1{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedtrue + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowcombinedpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedtrue + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +%-------------------------------------------------------------------- +% multirow tables, partial: + +\def\multirowpartialgradetable#1#2{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpartialpointtable#1#2{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpartialbonusgradetable#1#2{% + \@scorestrue + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpartialbonuspointtable#1#2{% + \@scoresfalse + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpartialcombinedgradetable#1#2{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +\def\multirowpartialcombinedpointtable#1#2{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#2}% + \setcounter{num@rows}{#1}% + \i@gtable[h]% +} + +%-------------------------------------------------------------------- +% multicolumn tables, non-partial: + +\def\multicolumngradetable#1{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedfalse + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedfalse + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnbonusgradetable#1{% + \@scorestrue + \@bonustrue + \@partialfalse + \@combinedfalse + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnbonuspointtable#1{% + \@scoresfalse + \@bonustrue + \@partialfalse + \@combinedfalse + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumncombinedgradetable#1{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedtrue + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumncombinedpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedtrue + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +%-------------------------------------------------------------------- +% multicolumn tables, partial: + +\def\multicolumnpartialgradetable#1#2{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpartialpointtable#1#2{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpartialbonusgradetable#1#2{% + \@scorestrue + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpartialbonuspointtable#1#2{% + \@scoresfalse + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpartialcombinedgradetable#1#2{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +\def\multicolumnpartialcombinedpointtable#1#2{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#2}% + \setcounter{num@cols}{#1}% + \i@gtable[v]% +} + +%-------------------------------------------------------------------- +% partial single row (and column) tables: + +\def\partialgradetable#1{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialgradetable + +\def\partialbonusgradetable#1{% + \@scorestrue + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialbonusgradetable + +\def\partialcombinedgradetable#1{% + \@scorestrue + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialcombinedgradetable + +\def\partialpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedfalse + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialpointtable + +\def\partialbonuspointtable#1{% + \@scoresfalse + \@bonustrue + \@partialtrue + \@combinedfalse + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialbonuspointtable + +\def\partialcombinedpointtable#1{% + \@scoresfalse + \@bonusfalse + \@partialtrue + \@combinedtrue + \def\tbl@range{#1}% + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% partialcombinedpointtable + +%-------------------------------------------------------------------- +% single row (and column) tables, non-partial: + +\def\gradetable{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedfalse + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% gradetable + +\def\bonusgradetable{% + \@scorestrue + \@bonustrue + \@partialfalse + \@combinedfalse + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% bonusgradetable + +\def\combinedgradetable{% + \@scorestrue + \@bonusfalse + \@partialfalse + \@combinedtrue + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% bonusgradetable + +\def\pointtable{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedfalse + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% pointtable + +\def\bonuspointtable{% + \@scoresfalse + \@bonustrue + \@partialfalse + \@combinedfalse + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% bonuspointtable + +\def\combinedpointtable{% + \@scoresfalse + \@bonusfalse + \@partialfalse + \@combinedtrue + % We don't yet know if the table is vertical or horizontal, and so + % we don't know if we need to set num@cols or num@rows. We'll set + % them both, and we'll later on just ignore the value of the one + % that we didn't need to set here: + \setcounter{num@cols}{1}% + \setcounter{num@rows}{1}% + % If the user doesn't include the optional argument + % choosing between vertical and horizontal, + % we give them vertical: + \@ifnextchar[{\i@gtable}{\i@gtable[v]}% +}% bonuspointtable + +%-------------------------------------------------------------------- + +% \i@gtable and \ii@gtable insert any missing optional arguments +% (the defaults being [v] and [questions]) and then make sure +% that the user said \addpoints and that this isn't the +% first run of LaTeX. +% \find@p@or@q@range then branches, depending on whether the user +% selected [questions] or [pages]. + +\def\i@gtable[#1]{% + % If the user doesn't include the second optional argument, + % which chooses between questions and pages, + % we give them questions: + \@ifnextchar[{\ii@gtable{#1}}{\ii@gtable{#1}[questions]}% +} +\def\ii@gtable#1[#2]{% + % We get here from \i@gtable. + % We make sure the user said \addpoints, and then make sure + % that this isn't the first run of LaTeX (by checking that + % \exam@numpoints is defined). If both of those are OK, + % we go to \find@p@or@q@range to see whether we're doing a table + % indexed by questions or by pages. + \if@addpoints + \@ifundefined{exam@numpoints}% + {\ClassWarning{exam}% + {% + You must run LaTeX again to produce the + table.\MessageBreak + }% + \fbox{Run \LaTeX{} again to produce the table}% + }% + {\find@p@or@q@range{#1}{#2}}% + \else + \ClassError{exam}{% + You must give the command \protect\addpoints\MessageBreak + \space\space in order to create a grade table.\MessageBreak + }{% + If you don't give the command \protect\addpoints\MessageBreak + \space\space then we're not keeping track of point values. + \MessageBreak + }% + \fi +}% ii@gtable + +\def\@questionsref{questions} +\def\@pagesref{pages} +\def\find@p@or@q@range#1#2{% + % We get here from \ii@gtable. + % The first argument should be ``v'' or ``h''; + % the second argument should be ``questions'' or ``pages''. + % See whether we're doing a table indexed by + % questions (in which case we go to \find@qrange) or by pages (in + % which case we go to \find@prange): + \begingroup + % We've begun a group that will contain the construction of the + % table, to confine the effect of any \def's that we use. + \def\exam@temp{#2}% + \ifx\exam@temp\@questionsref + \tbl@pgsfalse + \find@qrange{#1}% + \else + \ifx\exam@temp\@pagesref + \tbl@pgstrue + \find@prange{#1}% + \else + \ClassError{exam}{% + Grade and point tables can be indexed\MessageBreak + \space\space by either `questions' or `pages',\MessageBreak + \space\space but not by `#2'.\MessageBreak + }{% + Grade tables and point tables can be indexed by questions or + pages;\MessageBreak + \space\space for others, you're on your own.\MessageBreak + }% + \fbox{\textbf{Error:} grade or point table: Invalid argument + `#2' must be `questions' or `pages'.}% + \fi + \fi + \endgroup +}% find@p@or@q@range + +% \range@undefined can be called from either \find@qrange or +% \find@prange +\def\range@undefined{% + \fbox{Warning: grading range `\tbl@range ' not defined; + run \LaTeX{} again.}% + \ClassWarning{exam}{% + Grading range `\tbl@range' not defined.\MessageBreak + \space\space Run LaTeX again to produce the table.\MessageBreak + }% +}% range@undefined + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Grade and point tables indexed by question numbers: + +% When we get to \find@qrange, we know we're doing a table indexed by +% question numbers and that this is not the first run of latex. The +% argument is either ``v'' or ``h''. If we're not doing a partial +% table, then \find@qrange sets \tbl@firstq and \first@pq@index to 1 +% and \tbl@lastq and \last@pq@index to \numquestions. Otherwise, +% \find@qrange makes sure the grading range is defined and that its +% last question isn't before its first question. \find@qrange then +% calls \tbl@v@or@h, passing along the argument that is either ``v'' +% or ``h''. + +\def\find@qrange#1{% + % We get here from \find@p@or@q@range. + % We're doing a table indexed by question numbers. + \if@partial + \@ifundefined{range@\tbl@range @firstq}% + {% + \range@undefined + }% + {% + \@ifundefined{range@\tbl@range @lastq}% + {% + \range@undefined + }% + {% + \edef\tbl@firstq{\csname range@\tbl@range @firstq\endcsname}% + \edef\tbl@lastq{\csname range@\tbl@range @lastq\endcsname}% + \let\first@pq@index=\tbl@firstq + \let\last@pq@index=\tbl@lastq + % Check that firstq precedes or equals lastq: + \ifnum \tbl@firstq > \tbl@lastq\relax + \fbox{\textbf{Error:} Grading Range `\tbl@range': + Last question precedes first question.}% + \ClassError{exam}{% + In grading range `\tbl@range', + the last question\MessageBreak + \space\space comes before the first question.\MessageBreak + }{% + \string\begingradingrange \space must precede + \string\endgradingrange \space by at + least one question.\MessageBreak + }% + \else + \tbl@v@or@h{#1}% + \fi + }% + }% + \else + \def\tbl@firstq{1}% + \let\first@pq@index=\tbl@firstq + % \numquestions is always defined, even if this is the first + % run of LaTeX and \exam@numquestions isn't defined. + % If it's the first run of LaTeX, then its value isn't useful, + % but it's never used until a later run (when its value is useful). + \def\tbl@lastq{\numquestions}% + \let\last@pq@index=\tbl@lastq + \tbl@v@or@h{#1}% + \fi +}% find@qrange + +\def\@vref{v} +\def\@href{h} +\def\tbl@v@or@h#1{% + % \first@pq@index=\tbl@firstq or \tbl@firstp and + % \last@pq@index=\tbl@lastq or \tbl@lastp have already been set. + % The argument should be either `v' or `h', and we branch + % accordingly. + \def\exam@temp{#1}% + \ifx\exam@temp\@vref + \check@num@cols@v + \else + \ifx\exam@temp\@href + \check@num@rows@h + \else + \ClassError{exam}{% + Grade or point table: the argument `#1'\MessageBreak + \space\space must be `v' or `h'. + \MessageBreak + }{% + Grade tables and point tables can be either vertical or + horizontal;\MessageBreak + \space\space no diagonals allowed.\MessageBreak + }% + \fbox{\textbf{Error:} grade or point table: Invalid argument + `#1' must be `v' or `h'.}% + \fi + \fi +}% tbl@v@or@h + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Grade and point tables indexed by page numbers: + + +% The only pages listed are those on which there are a nonzero number +% of points. We check pages \tbl@firstp through \tbl@lastp +% Once we've checked that, e.g., \lastpage@withpoints and +% \pointsonpage@\romannumeral{\lastpage@withpoints} are defined, we +% can safely (we think) check \pointsonpage@\romannumeral{n} for all n +% between \tbl@firstp and \tbl@lastp without generating errors. +% +% Actually: Since we added the notion of half points and half counters +% (a long time ago), there won't be any errors even if +% \pointsonpage@\romannumeral{n} isn't defined, since it's tested by the +% lines: +% \set@hlfcntr{tmp@hlfcntr}{\csname pointsonpage@\romannumeral +% \csname c@@iterator\endcsname\endcsname}% +% \ifhlfcntr@pos{tmp@hlfcntr}% +% and if +% \csname pointsonpage@\romannumeral +% \csname c@@iterator\endcsname\endcsname +% isn't defined, tmp@hlfcntr gets the value zero (because of the way +% that \set@hlfcntr is written). + +% \find@prange makes sure the grading range is defined and that its +% last page isn't before its first page (if it's a partial table). In +% any case, it then sets \tbl@firstp and \tbl@lastp, and calls +% \check@secondrun. + +\def\find@prange#1{% + % We get here from \find@p@or@q@range. + % We're doing a table indexed by pages. + % The argument is either ``v'' or ``h''. + % We first determine the first and last page of the range, storing + % those in \first@pq@index=\tbl@firstp and + % \last@pq@index=\tbl@lastp. If not a partial table, we set + % \first@pq@index=\tbl@firstp to 1 and \last@pq@index=\tbl@lastp to + % the last page with the appropriate points (and so if it's a + % combined table, it's the last page to have either bonus or + % non-bonus points). + % We then call \check@secondrun, passing it the argument that we + % received (i.e., we say \check@secondrun{#1}) to make sure + % we've done at least two runs of latex (so that we'll have the + % information we need about which pages have points on them). + \if@partial + \@ifundefined{range@\tbl@range @firstp}% + {% + \range@undefined + }% + {% + \@ifundefined{range@\tbl@range @lastp}% + {% + \range@undefined + }% + {% + \edef\tbl@firstp{\csname range@\tbl@range @firstp\endcsname}% + \edef\tbl@lastp{\csname range@\tbl@range @lastp\endcsname}% + \let\first@pq@index=\tbl@firstp + \let\last@pq@index=\tbl@lastp + % Check that firstp precedes or equals lastp: + \ifnum \tbl@firstp > \tbl@lastp\relax + \fbox{\textbf{Error:} Grading Range `\tbl@range ': + Last page precedes first page.}% + \ClassError{exam}{% + In grading range `\tbl@range', the last page\MessageBreak + \space\space comes before the first page.\MessageBreak + }{% + \string\begingradingrange \space must precede + \string\endgradingrange.\MessageBreak + }% + \else + \check@secondrun{#1}% + \fi + }% + }% + \else + % It's not a partial table: + \def\tbl@firstp{1}% + \let\first@pq@index=\tbl@firstp + % We never get here on the first run of LaTeX, and + % \lastpage@withbonuspoints is defined on the second and later runs. + \def\tbl@lastp{\lastpage@withpoints}% + \let\last@pq@index=\tbl@lastp + \if@bonus + \def\tbl@lastp{\lastpage@withbonuspoints}% + \let\last@pq@index=\tbl@lastp + \fi + \if@combined + \ifnum \lastpage@withbonuspoints > \lastpage@withpoints\relax + \def\tbl@lastp{\lastpage@withbonuspoints}% + \let\last@pq@index=\tbl@lastp + \fi + \fi + \check@secondrun{#1}% + \fi +}% find@prange + +\def\check@secondrun#1{% + % The function \ii@gtable already made sure that this isn't the + % first run of latex. To do a table indexed by pages, though, we + % have to also make sure it's not the second run of latex. + % We get here from \find@prange; the argument is either ``v'' or + % ``h''. + % Check that there's enough info from the .aux file to do a page + % indexed grade table. If so, call \tbl@v@or@h{#1}: + \@ifundefined{pointsonpage@\romannumeral + \csname lastpage@withpoints\endcsname}% + {\@ifundefined{bonuspointsonpage@\romannumeral + \csname lastpage@withbonuspoints\endcsname}% + {\ClassWarning{exam}{% + You must run LaTeX again to produce the table.\MessageBreak}% + \fbox{Run \LaTeX{} again to produce the table}% + }% + {\tbl@v@or@h{#1}% + }% + }% + {\tbl@v@or@h{#1}% + }% +}% check@secondrun + +%-------------------------------------------------------------------- +% Indexed by pages: + +% For a table indexed by pages, we need to know how many pages there +% are with points on them. The argument to \count@pgswpts should be +% the name of a counter; we set that counter equal to the number of +% pages with the appropriate kind of points. + +\def\count@pgswpts#1{% + % Set the counter #1 equal to the number of pages in the range with + % the appropriate type of points. + % We're called by \@computenumcols@h and \@computenumrows@v. + \setcounter{#1}{0}% + \setcounter{@iterator}{\tbl@firstp}% + \addtocounter{@iterator}{-1}% + \if@bonus + \docount@pgswbpts{#1}% + \else + \if@combined + \docount@pgswcpts{#1}% + \else + \docount@pgswpts{#1}% + \fi + \fi +}% count@pgswpts + +\def\docount@pgswcpts#1{% + % Called by \count@pgswpts + % Count the number of pages in range with any kind of point (bonus + % or non-bonus): + \addtocounter{@iterator}{1}% + \set@hlfcntr{tmp@hlfcntr}{\pointsonpage{\the@iterator}}% + \ifhlfcntr@pos{tmp@hlfcntr}% + \addtocounter{#1}{1}% + \else + \check@bnsptpage{#1}% + \fi + \ifnum \the@iterator < \tbl@lastp\relax + \def\nextdocount@pgswcpts{\docount@pgswcpts{#1}}% + \else + \let\nextdocount@pgswcpts=\relax + \fi + \nextdocount@pgswcpts +}% docount@pgswcpts +\def\check@bnsptpage#1{% + % We need to hide this inside of a macro because if \ifhlfcntr@pos + % isn't expanded (because this stuff is being skipped in the outer + % conditional), then TeX doesn't see the \ifnum hidden inside the + % \ifhlfcntr@pos, but it does see the \fi, and so it get confused. + \set@hlfcntr{tmp@hlfcntr}{\bonuspointsonpage{\the@iterator}}% + \ifhlfcntr@pos{tmp@hlfcntr}% + \addtocounter{#1}{1}% + \fi +}% check@bnsptpage + +\def\docount@pgswpts#1{% + % Called by \count@pgswpts. + % Count the number of pages in range with regular points. + \addtocounter{@iterator}{1}% + \set@hlfcntr{tmp@hlfcntr}{\pointsonpage{\the@iterator}}% + \ifhlfcntr@pos{tmp@hlfcntr}% + \addtocounter{#1}{1}% + \fi + \ifnum \the@iterator < \tbl@lastp\relax + \def\nextdocount@pgswpts{\docount@pgswpts{#1}}% + \else + \let\nextdocount@pgswpts=\relax + \fi + \nextdocount@pgswpts +}% docount@pgswpts + +\def\docount@pgswbpts#1{% + % Called by \count@pgswpts + % Count the number of pages in range with bonus points. + \addtocounter{@iterator}{1}% + \set@hlfcntr{tmp@hlfcntr}{\bonuspointsonpage{\the@iterator}}% + \ifhlfcntr@pos{tmp@hlfcntr}% + \addtocounter{#1}{1}% + \fi + \ifnum \the@iterator < \tbl@lastp\relax + \def\nextdocount@pgswbpts{\docount@pgswbpts{#1}}% + \else + \let\nextdocount@pgswbpts=\relax + \fi + \nextdocount@pgswbpts +}% docount@pgswbpts + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Multirow horizontal tables, indexed by question numbers: + +\newcounter{pq@index}% In tables indexed by page numbers, it holds a +% page number. In tables indexed by question numbers, it holds a +% question number. + +\newcounter{pq@index@pts}% In horizontal tables, this holds either the +% current page number or the current question number as we put the +% point values for that page or question number into the table. In +% vertical tables, this holds the index for the first column of the +% current row. + +\newcounter{pq@index@bpts}% used to set bonus point values in +% horizontal tables. Often used as scratch elsewhere. + +\def\hidden@ampersand{&}% Needed because an ampersand can't appear in +% the replacement text of a conditional. + +\newif\iftbl@pgs +% \tbl@pgstrue means a table indexed by page numbers +% \tbl@pgsfalse means a table indexed by question numbers + +\newcounter{num@cols} +\newcounter{num@rows} +\newcounter{current@row} +\newcounter{cols@done}% Holds the number of columns done in the +% current row. + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Stuff to unify tables indexed by questions and tables indexed by +% pages: + +% \first@pq@index and \last@pq@index will hold either \tbl@firstq and +% \tbl@lastq or \tbl@firstp and \tbl@lastp. + +\def\increment@index#1{% + % If we're doing a table indexed by question numbers, we increment + % the counter #1. + % If we're doing a table indexed by page numbers, + % we increase the counter #1 by at least 1 to either the number of the + % next page containing the appropriate kind of points, or to + % something greater than \tbl@lastp. + \iftbl@pgs + \find@nextpagewithpoints{#1}% + \else + \addtocounter{#1}{1}% + \fi +}% increment@index + +\def\nextcolumn@index@v#1{% + % Used only for multicolumn tables. + % If we're doing a table indexed by question numbers, we increase + % the counter #1 by num@cols. + % If we're doing a table indexed by page numbers, + % we use \find@nextcolumnpage@v to increment the counter #1 to either + % the (num@rows)'th page number after #1 that contains the + % appropriate kind of points or to a value greater than \tbl@lastp. + \iftbl@pgs + \find@nextcolumnpage@v{#1}% + \else + \addtocounter{#1}{\value{num@rows}}% + \fi +}% nextcolumn@index@v + +\def\pointsof@index#1{% + \iftbl@pgs + \pointsonpage{\arabic{#1}}% + \else + \pointsofquestion{\arabic{#1}}% + \fi +}% pointsof@index + +\def\bonuspointsof@index#1{% + \iftbl@pgs + \bonuspointsonpage{\arabic{#1}}% + \else + \bonuspointsofquestion{\arabic{#1}}% + \fi +}% bonuspointsof@index + +\def\refto@index#1{% + \iftbl@pgs + \if@combined + % Need to hide this inside of a macro: + \refto@comb@index{#1}% + \else + \if@bonus + \pageref{firstbonuspoints@onpage@\arabic{#1}}% + \else + \pageref{firstpoints@onpage@\arabic{#1}}% + \fi + \fi + \else + \ref{question@\arabic{#1}}% + \fi +}% refto@index + +\def\refto@comb@index#1{% + % We're called only by \refto@index. + % We can't have the \ifhlfcntr@pos...\fi inside of another + % conditional, so we're hiding it in this macro. + \set@hlfcntr{tmp@hlfcntr}{\pointsonpage{\arabic{#1}}}% + \ifhlfcntr@pos{tmp@hlfcntr}% + \pageref{firstpoints@onpage@\arabic{#1}}% + \else + % In theory, there *must* be bonus points on this page, because + % there aren't any plain points, but there are allegedly *some* + % points. We're being brave and assuming that's correct, and not + % checking (which we'd have to hide inside a macro, because it + % would use \ifhlfcntr@pos): + \pageref{firstbonuspoints@onpage@\arabic{#1}}% + \fi +}% refto@comb@index + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Multirow tables: + + +%-------------------------------------------------------------------- +% Check that the number of rows is OK, and compute the number of +% columns: + +\def\check@num@rows@h{% + % We get here from \tbl@v@or@h. + % We make sure the number of rows is a positive integer. If it + % is, we go on to \@computenumcols@h + \ifnum \value{num@rows} < 1\relax + \ClassError{exam}{% + The number of rows in a table must be positive.\MessageBreak + }{% + The number of rows must be a positive integer.\MessageBreak + }% + \fbox{\textbf{Error:} Multirow table with no rows!}% + \else + \@computenumcols@h + \fi +}% check@num@rows@h + +\def\@computenumcols@h{% + % We get here from \check@num@rows@h. + % Compute the number of columns. + % First: set num@cols to one more than either (the number of pages + % with the appropriate type of points) or (the number of questions), + % to have slots for the total along with the questions: + \iftbl@pgs + \count@pgswpts{num@cols}% + \addtocounter{num@cols}{1}% + \else + \setcounter{num@cols}{\tbl@lastq}% + \addtocounter{num@cols}{-\tbl@firstq}% + \addtocounter{num@cols}{2}% + \fi + % Save the number of slots needed in pq@index (used for scratch), to + % check for truncation: + \setcounter{pq@index}{\value{num@cols}}% + % Divide the number of slots needed by num@rows: + \divide \csname c@num@cols\endcsname by + \csname c@num@rows\endcsname + % Division truncates: See if there was truncation. + % Use @iterator as a scratch counter. + \setcounter{@iterator}{\value{num@cols}}% + \multiply \csname c@@iterator\endcsname by + \csname c@num@rows\endcsname + \ifnum \value{@iterator} < \value{pq@index}\relax + % There was truncation; add a column to num@cols: + \addtocounter{num@cols}{1}% + \fi + \@multirowtable +}% @computenumcols@h + +%-------------------------------------------------------------------- +% Construct the actual table: + +\def\@multirowtable{% + % We get here from \@computenumcols@h. + % All multirow tables! + \renewcommand\arraystretch{\@gtblstretch}% + \set@hlfcntr{tbl@points}{0}% + \set@hlfcntr{tbl@bonuspoints}{0}% + \setcounter{pq@index}{\first@pq@index}% + \addtocounter{pq@index}{-1}% + \setcounter{pq@index@pts}{\value{pq@index}}% + \setcounter{pq@index@bpts}{\value{pq@index}}% + \setcounter{current@row}{0}% + \begin{tabular}{|l|*{\value{num@cols}}{c|}} + \hline + \if@combined + \do@comblines@h + \else + \do@lines@h + \fi +}% @multirowtable + + +\def\do@lines@h{% + % Called only by \@multirowtable. + % It's either bonus or regular, but not combined: + \addtocounter{current@row}{1}% Set to the number of the current row + \iftbl@pgs + \if@bonus + \@bhpgword + \else + \@hpgword + \fi + \else + \if@bonus + \@bhqword + \else + \@hqword + \fi + \fi + \setcounter{cols@done}{0}% + \do@pq@indexloop@h + % When we finish \do@pq@indexloop@h, either we've finished a + % complete row of page numbers (or questions), or we've done all + % the page numbers (or questions) through \last@pq@index, or both: + \ifnum \value{cols@done} < \value{num@cols}\relax + % We've inserted all the page or question numbers, and there's + % room remaining on the current line for \@htword (or \@bhtword): + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last row; put in the total: + \do@htword@h + \else + % This isn't the last row. We insert (\value{num@cols} - + % \value{cols@done}) ampersands. + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \fi + \fi + \\ + \hline + % Point values go here! + \setcounter{cols@done}{0}% + \if@bonus + \@bhpword + \do@bptloop@h + \else + \@hpword + \do@ptloop@h + \fi + % When we finish \do@ptloop@h or \do@bptloop@h, either + % we've finished a complete row of point values, or we've done all + % the question (or page) numbers through \last@pq@index, or both: + \ifnum \value{cols@done} < \value{num@cols}\relax + % We've inserted all the point values, and there's room + % remaining on the current line for Total Points: + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last row; put in the total: + \if@bonus + \do@totalbpts@h + \else + \do@totalpts@h + \fi + \else + % This isn't the last row. We insert (\value{num@cols} - + % \value{cols@done}) ampersands. + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \fi + \fi + % We hold off on putting in the "\\ \hline" because we may want to + % immediately follow it with either an "\end{tabular}" or another + % "\hline". + % Scores? + \if@scores + \\ + \hline + \if@bonus + \@bhsword \hidden@ampersand + \else + \@hsword \hidden@ampersand + \fi + \setcounter{cols@done}{0}% + \do@sloop@h + \fi + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last line! End the tabular: + \\ + \hline + \end{tabular}% + \else + % Don't end the tabular: + \\ + \hline\hline + \fi + % Check if we should repeat: + \ifnum \value{current@row} < \value{num@rows}\relax + \let\nextdo@lines@h=\do@lines@h + \else + \let\nextdo@lines@h=\relax + \fi + \nextdo@lines@h +}% do@lines@h + +\def\do@comblines@h{% + % Called only by \@multirowtable. + % Combined tables. + \addtocounter{current@row}{1}% Set to the number of the current row + \iftbl@pgs + \@chpgword + \else + \@chqword + \fi + \setcounter{cols@done}{0}% + \do@pq@indexloop@h + % When we finish \do@pq@indexloop@h, either we've finished a + % complete row of page (or question) numbers, or we've done all + % the page (or question) numbers through \last@pq@index, or both: + \ifnum \value{cols@done} < \value{num@cols}\relax + % We've inserted all the question (or page) numbers, and there's + % room remaining on the current line for \@chtword: + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last row; put in the total: + \do@htword@h + \else + % This isn't the last row. We insert (\value{num@cols} - + % \value{cols@done}) ampersands. + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \fi + \fi + \\ + \hline + % Point values go here! + \@chpword + \setcounter{cols@done}{0}% + \do@ptloop@h + % When we finish \do@ptloop@h, either we've finished a complete + % row of point values, or we've done all the question (or page) + % numbers through \last@pq@index, or both: + \ifnum \value{cols@done} < \value{num@cols}\relax + % We've inserted all the point values, and there's room + % remaining on the current line for Total Points: + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last row; put in the total: + \do@totalpts@h + \else + % This isn't the last row. We insert (\value{num@cols} - + % \value{cols@done}) ampersands. + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \fi + \fi + \\ + \hline + % Bonus point values go here! + \@chbpword + \setcounter{cols@done}{0}% + \do@bptloop@h + % When we finish \do@bptloop@h, either + % we've finished a complete row of point values, or we've done all + % the question (or page) numbers through \last@pq@index, or both: + \ifnum \value{cols@done} < \value{num@cols}\relax + % We've inserted all the point values, and there's room + % remaining on the current line for Total Points: + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last row; put in the total: + \do@totalbpts@h + \else + % This isn't the last row. We insert (\value{num@cols} - + % \value{cols@done}) ampersands. + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \fi + \fi + % We hold off on putting in the "\\ \hline" because we may want to + % immediately follow it with either an "\end{tabular}" or another + % "\hline". + % Scores? + \if@scores + \\ + \hline + \@chsword \hidden@ampersand + \setcounter{cols@done}{0}% + \do@sloop@h + \fi + \ifnum \value{current@row} = \value{num@rows}\relax + % This is the last line! End the tabular: + \\ + \hline + \end{tabular}% + \else + % Don't end the tabular: + \\ + \hline\hline + \fi + % Check if we should repeat: + \ifnum \value{current@row} < \value{num@rows}\relax + \let\nextdo@comblines@h=\do@comblines@h + \else + \let\nextdo@comblines@h=\relax + \fi + \nextdo@comblines@h +}% do@comblines@h + +\def\do@pq@indexloop@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert at most one row of pq@index: + \increment@index{pq@index}% + \ifnum \value{pq@index} > \last@pq@index\relax + % Do nothing! + \else + \hidden@ampersand + \refto@index{pq@index}% + \addtocounter{cols@done}{1}% + \fi + \ifnum \value{pq@index} < \last@pq@index\relax + \ifnum \value{cols@done} < \value{num@cols}\relax + \let\nextdo@pq@indexloop@h=\do@pq@indexloop@h + \else + \let\nextdo@pq@indexloop@h=\relax + \fi + \else + \let\nextdo@pq@indexloop@h=\relax + \fi + \nextdo@pq@indexloop@h +}% do@pq@indexloop@h + +\def\do@ptloop@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert at most one row of non-bonus point values: + \increment@index{pq@index@pts}% + \ifnum \value{pq@index@pts} > \last@pq@index\relax + % Do nothing! + \else + \hidden@ampersand + \addtocounter{cols@done}{1}% + \pointsof@index{pq@index@pts}% + \addto@hlfcntr{tbl@points}{\pointsof@index{pq@index@pts}}% + \fi + \ifnum \value{pq@index@pts} < \last@pq@index\relax + \ifnum \value{cols@done} < \value{num@cols}\relax + \let\nextdo@ptloop@h=\do@ptloop@h + \else + \let\nextdo@ptloop@h=\relax + \fi + \else + \let\nextdo@ptloop@h=\relax + \fi + \nextdo@ptloop@h +}% do@ptloop@h + +\def\do@bptloop@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert at most one row of bonus point values: + \increment@index{pq@index@bpts}% + \ifnum \value{pq@index@bpts} > \last@pq@index\relax + % Do nothing! + \else + \hidden@ampersand + \addtocounter{cols@done}{1}% + \bonuspointsof@index{pq@index@bpts}% + \addto@hlfcntr{tbl@bonuspoints}{\bonuspointsof@index{pq@index@bpts}}% + \fi + \ifnum \value{pq@index@bpts} < \last@pq@index\relax + \ifnum \value{cols@done} < \value{num@cols}\relax + \let\nextdo@bptloop@h=\do@bptloop@h + \else + \let\nextdo@bptloop@h=\relax + \fi + \else + \let\nextdo@bptloop@h=\relax + \fi + \nextdo@bptloop@h +}% do@bptloop@h + +\def\do@htword@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert (\value{num@cols} - \value{cols@done}) ampersands, + % and then either \@htword or \@bhtword or \@chtword: + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \if@combined + \@chtword + \else + \if@bonus + \@bhtword + \else + \@htword + \fi + \fi +}% do@htword@h + +\def\do@totalpts@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert (\value{num@cols} - \value{cols@done}) ampersands + % and then the total points: + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \prt@tablepoints +}% do@totalpts@h + +\def\do@totalbpts@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We insert (\value{num@cols} - \value{cols@done}) ampersands, + % and then the total bonus points: + \setcounter{@iterator}{\value{num@cols}}% + \addtocounter{@iterator}{-\value{cols@done}}% + \do@emptycols@h + \prt@tablebonuspoints +}% do@totalbpts@h + +\def\do@emptycols@h{% + % Called by \do@lines@h, \do@comblines@h, \do@htword@h, + % \do@totalpts@h, and \do@totalbpts@h. + % We insert \value{@iterator} ampersands: + \ifnum \value{@iterator} > 0\relax + \hidden@ampersand + \addtocounter{@iterator}{-1}% + \let\nextdo@emptycols@h=\do@emptycols@h + \else + \let\nextdo@emptycols@h=\relax + \fi + \nextdo@emptycols@h +}% do@emptycols@h + +\def\do@sloop@h{% + % Called by both \do@lines@h and \do@comblines@h. + % We assume that cols@done has been set to zero. + % We insert num@cols \hbox to \@cellwidth, + % separated by ampersands. + \addtocounter{cols@done}{1}% + \hbox to \@cellwidth{\hfill}% + \ifnum \value{cols@done} < \value{num@cols}\relax + \hidden@ampersand + \let\nextdo@sloop@h=\do@sloop@h + \else + \let\nextdo@sloop@h=\relax + \fi + \nextdo@sloop@h +}% do@sloop@h + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Multicolumn tables + + +%-------------------------------------------------------------------- +% Here's an example of a multicolumn grade table indexed by questions. + +% Every line of \cline's is followed by a +% \noalign{\vskip\arrayrulewidth} to cancel the +% \noalign{\vskip-\arrayrulewidth} that ends the definition of +% \cline. + +% \begin{tabular}{*2{|c|c|c|c}} +% \cline{1-3} \cline{5-7} +% \noalign{\vskip\arrayrulewidth} +% Question% +% & Points% +% & Score% +% & \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% +% & Question% +% & Points% +% & Score% +% \\ +% \cline{1-3} \cline{5-7} +% \noalign{\vskip\arrayrulewidth} +% 1% +% & 5% +% & \hbox to \@cellwidth{\hfill}% +% & \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% +% & 4% +% & 20% +% & \hbox to \@cellwidth{\hfill}% +% \\ +% \cline{1-3} \cline{5-7} +% \noalign{\vskip\arrayrulewidth} +% 2% +% & 10% +% & \hbox to \@cellwidth{\hfill}% +% & \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% +% & 5% +% & 25% +% & \hbox to \@cellwidth{\hfill}% +% \\ +% \cline{1-3} \cline{5-7} +% \noalign{\vskip\arrayrulewidth} +% 3% +% & 15% +% & \hbox to \@cellwidth{\hfill}% +% & \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% +% & Total:% +% & 75% +% & \hbox to \@cellwidth{\hfill}% +% \\ +% \cline{1-3} \cline{5-7} +% \noalign{\vskip\arrayrulewidth} +% \end{tabular} +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Check that the number of cols is OK, and compute the number of rows: + +\def\check@num@cols@v{% + % We get here from \tbl@v@or@h. + % We make sure the number of cols is between 1 and 10 (since we + % can't handle more than 10 cols in a multicolumn table). + % If it is, we go on to \@computenumrows@v + \ifnum \value{num@cols} < 1\relax + \ClassError{exam}{% + The number of columns in a table must be positive.\MessageBreak + }{% + The number of columns must be a positive integer.\MessageBreak + }% + \fbox{\textbf{Error:} Multicolumn table with no columns!}% + \else + \ifnum \value{num@cols} > 10\relax + \ClassError{exam}{% + Multicolumn tables can have at most 10 columns.\MessageBreak + }{% + Multicolumn tables can have at most 10 columns.\MessageBreak + }% + \fbox{\textbf{Error:} Multicolumn table with more than 10 columns!}% + \else + \@computenumrows@v + \fi + \fi +}% check@num@cols@v + +\def\@computenumrows@v{% + % We get here from \check@num@cols@v. + % Compute the number of rows. + % First: set num@rows to one more than the number of either + % (questions) or (pages with the appropriate type of points), to + % have slots for the total along with the questions or page numbers: + \iftbl@pgs + \count@pgswpts{num@rows}% + \addtocounter{num@rows}{1}% + \else + \setcounter{num@rows}{\last@pq@index}% + \addtocounter{num@rows}{-\first@pq@index}% + \addtocounter{num@rows}{2}% + \fi + % Save the number of slots needed, using pq@index@bpts as a scratch + % counter, to check for truncation on division: + \setcounter{pq@index@bpts}{\value{num@rows}}% + % Divide the number of slots needed by num@cols: + \divide \csname c@num@rows\endcsname by + \csname c@num@cols\endcsname + % Division truncates: See if there was truncation. + % Use the counter @iterator as a scratch counter: + \setcounter{@iterator}{\value{num@rows}}% + \multiply \csname c@@iterator\endcsname by + \csname c@num@cols\endcsname + \ifnum \value{@iterator} < \value{pq@index@bpts}\relax + % There was truncation; add one to num@rows: + \addtocounter{num@rows}{1}% + \fi + \@multicolumntable +}% @computenumrows@v + +%-------------------------------------------------------------------- +% Construct the actual table: + +\def\@multicolumntable{% + % We get here from \@computenumrows@v. + % Set \cline@stuff@v equal to the line of \cline's: + \create@cline@stuff@v + \renewcommand\arraystretch{\@gtblstretch}% + \set@hlfcntr{tbl@points}{0}% + \set@hlfcntr{tbl@bonuspoints}{0}% + \if@combined + \if@scores + % combinedgradetable, possibly partial. + % Note: We'll never use the final "c" in the format of the + % tabular, but there's no harm in that. + \begin{tabular}{*{\value{num@cols}}{|c|c|c|c|c}} + % We need to make sure that the \cline@stuff@v commands come + % *immediately* following the \\ or \begin{tabular} (with no + % conditionals evaluated, even if those conditionals expand to + % the empty string)! + % Put in the row of column headings, with \cline@stuff@v above and + % below: + \cline@stuff@v + \setcounter{@iterator}{0}% + \docolumn@heads@comb@v + \\ + \cline@stuff@v + \else + % combinedpointtable, possibly partial. + % Note: We'll never use the final "c" in the format of the + % tabular, but there's no harm in that. + \begin{tabular}{*{\value{num@cols}}{|c|c|c|c}} + % We need to make sure that the \cline@stuff@v commands come + % *immediately* following the \\ or \begin{tabular} (with no + % conditionals evaluated, even if those conditionals expand to + % the empty string)! + % Put in the row of column headings, with \cline@stuff@v above and + % below: + \cline@stuff@v + \setcounter{@iterator}{0}% + \docolumn@heads@comb@noscores@v + \\ + \cline@stuff@v + \fi + % pq@index@pts will hold the question number (or page number) in + % the first column of the row. + \setcounter{pq@index@pts}{\first@pq@index}% + \iftbl@pgs + % If we're indexed by pages, we need to make sure there are + % points of the appropriate type on the first page listed: + \addtocounter{pq@index@pts}{-1}% + \find@nextpagewithpoints{pq@index@pts}% + \fi + \setcounter{current@row}{0}% + \do@lines@v + \else + % It's not combined: + \if@scores + % Note: We'll never use the final "c" in the format of the + % tabular, but there's no harm in that. + \begin{tabular}{*{\value{num@cols}}{|c|c|c|c}} + % We need to make sure that the \cline@stuff@v commands come + % *immediately* following the \\ or \begin{tabular} (with no + % conditionals evaluated, even if those conditionals expand to + % the empty string)! + % Put in the row of column headings, with \cline@stuff@v above and + % below: + \cline@stuff@v + \setcounter{@iterator}{0}% + \docolumn@heads@v + \\ + \cline@stuff@v + \else + % Note: We'll never use the final "c" in the format of the + % tabular, but there's no harm in that. + \begin{tabular}{*{\value{num@cols}}{|c|c|c}} + % We need to make sure that the \cline@stuff@v commands come + % *immediately* following the \\ or \begin{tabular} (with no + % conditionals evaluated, even if those conditionals expand to + % the empty string)! + % Put in the row of column headings, with \cline@stuff@v above and + % below: + \cline@stuff@v + \setcounter{@iterator}{0}% + \docolumn@heads@noscores@v + \\ + \cline@stuff@v + \fi + % pq@index@pts will hold the question number (or page number) in + % the first column of the row. + \setcounter{pq@index@pts}{\first@pq@index}% + \iftbl@pgs + % If we're indexed by pages, we need to make sure there are + % points of the appropriate type on the first page listed: + \addtocounter{pq@index@pts}{-1}% + \find@nextpagewithpoints{pq@index@pts}% + \fi + \setcounter{current@row}{0}% + \do@lines@v + \fi +}% @multicolumntable + +%-------------------------------------------------------------------- +% \create@cline@stuff@v + +% The function \create@cline@stuff@v defines \cline@stuff@v to be whatever's +% appropriate given the values of num@cols, \if@bonus, \if@combined, and +% \if@scores. + +% We wimped out of generating \cline@stuff@v on the fly because we didn't +% see how to get the correct expansions/nonexpansions without using a +% primitive of e-TeX. + +% \clines@ii@whatever is for tables in which a logical column consists +% of two columns; it's used for pointtable and bonuspointtable. + +\def\clines@ii@i{\cline{1-2}} +\def\clines@ii@ii{\cline{1-2} \cline{4-5}} +\def\clines@ii@iii{\cline{1-2} \cline{4-5} \cline{7-8}} +\def\clines@ii@iv{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11}} +\def\clines@ii@v{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14}} +\def\clines@ii@vi{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14} \cline{16-17}} +\def\clines@ii@vii{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14} \cline{16-17} \cline{19-20}} +\def\clines@ii@viii{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14} \cline{16-17} \cline{19-20} \cline{22-23}} +\def\clines@ii@vix{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14} \cline{16-17} \cline{19-20} \cline{22-23} + \cline{25-26}} +\def\clines@ii@x{\cline{1-2} \cline{4-5} \cline{7-8} \cline{10-11} + \cline{13-14} \cline{16-17} \cline{19-20} \cline{22-23} + \cline{25-26} \cline{28-29}} + +% \clines@iii@whatever is for tables in which a logical column consists +% of three columns; it's are used for gradetable, bonusgradetable, and +% combinedpointtable: + +\def\clines@iii@i{\cline{1-3}} +\def\clines@iii@ii{\cline{1-3} \cline{5-7}} +\def\clines@iii@iii{\cline{1-3} \cline{5-7} \cline{9-11}} +\def\clines@iii@iv{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}} +\def\clines@iii@v{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19}} +\def\clines@iii@vi{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19} \cline{21-23}} +\def\clines@iii@vii{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19} \cline{21-23} \cline{25-27}} +\def\clines@iii@viii{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19} \cline{21-23} \cline{25-27} \cline{29-31}} +\def\clines@iii@ix{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19} \cline{21-23} \cline{25-27} \cline{29-31} + \cline{33-35}} +\def\clines@iii@x{\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15} + \cline{17-19} \cline{21-23} \cline{25-27} \cline{29-31} + \cline{33-35} \cline{37-39}} + + +% \clines@iv@whatever is for tables in which a logical column +% consists of four columns; it's used for combinedgradetable. + +\def\clines@iv@i{\cline{1-4}} +\def\clines@iv@ii{\cline{1-4} \cline{6-9}} +\def\clines@iv@iii{\cline{1-4} \cline{6-9} \cline{11-14}} +\def\clines@iv@iv{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19}} +\def\clines@iv@v{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24}} +\def\clines@iv@vi{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24} \cline{26-29}} +\def\clines@iv@vii{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24} \cline{26-29} \cline{31-34}} +\def\clines@iv@viii{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24} \cline{26-29} \cline{31-34} \cline{36-39}} +\def\clines@iv@ix{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24} \cline{26-29} \cline{31-34} \cline{36-39} + \cline{41-44}} +\def\clines@iv@x{\cline{1-4} \cline{6-9} \cline{11-14} \cline{16-19} + \cline{21-24} \cline{26-29} \cline{31-34} \cline{36-39} + \cline{41-44} \cline{46-49}} + +% The definition of \cline ends with \noalign{\vskip-\arrayrulewidth}, +% and so we want to throw in a \noalign{\vskip\arrayrulewidth} to +% cancel that. +\def\cline@correction{\noalign{\vskip\arrayrulewidth}} + +\def\create@cline@stuff@v{% + % Called by \@multicolumntable. + \if@combined + \if@scores + \edef\cline@stuff@v{\expandafter\noexpand\csname + clines@iv@\romannumeral \c@num@cols\endcsname + \noexpand\cline@correction}% + \else + \edef\cline@stuff@v{\expandafter\noexpand\csname + clines@iii@\romannumeral \c@num@cols\endcsname + \noexpand\cline@correction}% + \fi + \else + \if@scores + \edef\cline@stuff@v{\expandafter\noexpand\csname + clines@iii@\romannumeral \c@num@cols\endcsname + \noexpand\cline@correction}% + \else + \edef\cline@stuff@v{\expandafter\noexpand\csname + clines@ii@\romannumeral \c@num@cols\endcsname + \noexpand\cline@correction}% + \fi + \fi +}% create@cline@stuff@v + +%-------------------------------------------------------------------- +% The various \docolumn@heads@something@v + +\def\docolumn@heads@v{% + % Called by \@multicolumntable. + % multicolumngradetable or multicolumnbonusgradetable, possibly + % partial. + \iftbl@pgs + \if@bonus + \@bvpgword + \else + \@vpgword + \fi + \else + \if@bonus + \@bvqword + \else + \@vqword + \fi + \fi + & \if@bonus + \@bvpword + \else + \@vpword + \fi + & \if@bonus + \@bvsword + \else + \@vsword + \fi + \addtocounter{@iterator}{1}% + \ifnum \value{@iterator} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \hidden@ampersand + \let\nextdocolumn@heads@v=\docolumn@heads@v + \else + \let\nextdocolumn@heads@v=\relax + \fi + \nextdocolumn@heads@v +}% docolumn@heads@v + +\def\docolumn@heads@noscores@v{% + % Called by \@multicolumntable. + % multicolumnpointtable or multicolumnbonuspointtable, possibly + % partial. + \iftbl@pgs + \if@bonus + \@bvpgword + \else + \@vpgword + \fi + \else + \if@bonus + \@bvqword + \else + \@vqword + \fi + \fi + & + \if@bonus + \@bvpword + \else + \@vpword + \fi + \addtocounter{@iterator}{1}% + \ifnum \value{@iterator} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \hidden@ampersand + \let\nextdocolumn@heads@noscores@v=\docolumn@heads@noscores@v + \else + \let\nextdocolumn@heads@noscores@v=\relax + \fi + \nextdocolumn@heads@noscores@v +}% docolumn@heads@noscores@v + +\def\docolumn@heads@comb@v{% + % Called by \@multicolumntable. + % multicolumncombinedgradetable, possibly partial. + \iftbl@pgs + \@cvpgword + \else + \@cvqword + \fi + & \@cvpword + & \@cvbpword + & \@cvsword + \addtocounter{@iterator}{1}% + \ifnum \value{@iterator} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \hidden@ampersand + \let\nextdocolumn@heads@comb@v=\docolumn@heads@comb@v + \else + \let\nextdocolumn@heads@comb@v=\relax + \fi + \nextdocolumn@heads@comb@v +}% docolumn@heads@comb@v + +\def\docolumn@heads@comb@noscores@v{% + % Called by \@multicolumntable. + % multicolumncombinedpointtable, possibly partial. + \iftbl@pgs + \@cvpgword + \else + \@cvqword + \fi + & \@vpword + & \@bvpword + \addtocounter{@iterator}{1}% + \ifnum \value{@iterator} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \hidden@ampersand + \let\nextdocolumn@heads@comb@noscores@v=\docolumn@heads@comb@noscores@v + \else + \let\nextdocolumn@heads@comb@noscores@v=\relax + \fi + \nextdocolumn@heads@comb@noscores@v +}% docolumn@heads@comb@noscores@v + +%-------------------------------------------------------------------- +% \do@lines@v is used by *all* multicolumn tables. +% It calls \do@oneline@v for all non-combined tables and +% \do@oneline@comb@v for all combined tables. + +\def\do@lines@v{% + % We get here from \@multicolumntable. + % ALL MULTICOLUMN TABLES!!!! + % pq@index@pts holds the question number or page number in the first + % column of the current row. + \addtocounter{current@row}{1}% + \setcounter{pq@index}{\value{pq@index@pts}}% + \setcounter{cols@done}{0}% Number of columns done + % We're doing both grade tables and point tables!! + \if@combined + \do@oneline@comb@v + \else + \do@oneline@v + \fi + \increment@index{pq@index@pts}% + % We need the "\\ \cline@stuff@v" to *immediately* precede the + % \end{tabular} (i.e., with no \ifnum separating them), to avoid + % having crap after the \cline@stuff@v that + % causes there to be an extra row at the end of the table. We also + % need there to be nothing between \\ and \cline@stuff@v. + \ifnum \value{current@row} = \value{num@rows}\relax + \\ + \cline@stuff@v + \end{tabular}% + \let\nextdo@lines@v=\relax + \else + \\ + \cline@stuff@v + \let\nextdo@lines@v=\do@lines@v + \fi + \nextdo@lines@v +}% do@lines@v + +\def\do@oneline@v{% + % Called by \do@lines@v. + % Used for all multicolumn non-combined tables. + % pq@index holds the question or page number we're about to do. + \ifnum \value{pq@index} > \last@pq@index\relax + % See if we're in the last column; use pq@index@bpts as a scratch + % counter: + \setcounter{pq@index@bpts}{\value{cols@done}}% + \addtocounter{pq@index@bpts}{1}% + \ifnum \value{pq@index@bpts} = \value{num@cols}\relax + % We're in the last column; are we in the last row? + \ifnum \value{current@row} = \value{num@rows}\relax + % We're in the last column, last row! + % Print the total: + \if@bonus + \@bvtword + \else + \@vtword + \fi + \hidden@ampersand + \if@scores + \if@bonus + \prt@tablebonuspoints + \else + \prt@tablepoints + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \else + \hspace*{\fill}% + \if@bonus + \prt@tablebonuspoints + \else + \prt@tablepoints + \fi + \fi + \else + % Not last column last row; insert empty space: + \hbox to \@cellwidth{\hfill}% + \if@scores + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \else + % Not last column; insert empty space: + \hbox to \@cellwidth{\hfill}% + \if@scores + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \else + % We need to do question (or page) number pq@index: + \refto@index{pq@index}% + \hidden@ampersand + \if@scores + \if@bonus + \bonuspointsof@index{pq@index}% + \addto@hlfcntr{tbl@bonuspoints}{\bonuspointsof@index{pq@index}}% + \else + \pointsof@index{pq@index}% + \addto@hlfcntr{tbl@points}{\pointsof@index{pq@index}}% + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \else + \if@bonus + \bonuspointsof@index{pq@index}% + \addto@hlfcntr{tbl@bonuspoints}{\bonuspointsof@index{pq@index}}% + \else + \pointsof@index{pq@index}% + \addto@hlfcntr{tbl@points}{\pointsof@index{pq@index}}% + \fi + \fi + \fi + \addtocounter{cols@done}{1}% Number of columns done + \ifnum \value{cols@done} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \nextcolumn@index@v{pq@index}% + \hidden@ampersand + \let\nextdo@oneline@v=\do@oneline@v + \else + \let\nextdo@oneline@v=\relax + \fi + \nextdo@oneline@v +}% do@oneline@v + +\def\do@oneline@comb@v{% + % Called by \do@lines@v. + % All combined multicolumn tables. + % pq@index holds the question (or page) we're about to do. + \ifnum \value{pq@index} > \last@pq@index\relax + % See if we're in the last column; use pq@index@bpts as a scratch + % counter: + \setcounter{pq@index@bpts}{\value{cols@done}}% + \addtocounter{pq@index@bpts}{1}% + \ifnum \value{pq@index@bpts} = \value{num@cols}\relax + % We're in the last column; are we in the last row? + \ifnum \value{current@row} = \value{num@rows}\relax + % We're in the last column, last row! + % Print the total: + \@cvtword + \hidden@ampersand + \prt@tablepoints + \hidden@ampersand + \if@scores + \prt@tablebonuspoints + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \else + \prt@tablebonuspoints + \fi + \else + % Last column, but not last row; insert empty space: + \hbox to \@cellwidth{\hfill}% + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \if@scores + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \else + % Not last column; insert empty space: + \hbox to \@cellwidth{\hfill}% + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \if@scores + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \fi + \else + % We need to do question number pq@index: + \refto@index{pq@index}% + \hidden@ampersand + \pointsof@index{pq@index}% + \addto@hlfcntr{tbl@points}{\pointsof@index{pq@index}}% + \hidden@ampersand + \if@scores + \bonuspointsof@index{pq@index}% + \addto@hlfcntr{tbl@bonuspoints}{\bonuspointsof@index{pq@index}}% + \hidden@ampersand + \hbox to \@cellwidth{\hfill}% + \else + \bonuspointsof@index{pq@index}% + \addto@hlfcntr{tbl@bonuspoints}{\bonuspointsof@index{pq@index}}% + \fi + \fi + \addtocounter{cols@done}{1}% Number of columns done + \ifnum \value{cols@done} < \value{num@cols}\relax + \hidden@ampersand + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}% + \nextcolumn@index@v{pq@index}% + \hidden@ampersand + \let\nextdo@oneline@comb@v=\do@oneline@comb@v + \else + \let\nextdo@oneline@comb@v=\relax + \fi + \nextdo@oneline@comb@v +}% do@oneline@comb@v + +%-------------------------------------------------------------------- +% \find@nextpagewithpoints and \find@nextcolumnpage@v: + +\def\find@nextpagewithpoints#1{% + % Called by \dofind@nextcolumnpage@v, \increment@index, and + % \@multicolumntable. + % The argument #1 should be the name of a counter with a nonnegative + % value. + % We increase #1 by at least 1 to either the number of the + % next page containing the appropriate kind of points, or to something + % greater than \tbl@lastp. + \addtocounter{#1}{1}% + \if@combined + \set@hlfcntr{tmp@hlfcntr}{\pointsonpage{\value{#1}}}% + \addto@hlfcntr{tmp@hlfcntr}{\bonuspointsonpage{\value{#1}}}% + % The sum is positive when at least one of them is positive. + \else + \if@bonus + \set@hlfcntr{tmp@hlfcntr}{\bonuspointsonpage{\value{#1}}}% + \else + \set@hlfcntr{tmp@hlfcntr}{\pointsonpage{\value{#1}}}% + \fi + \fi + \ifhlfcntr@pos{tmp@hlfcntr}% + \let\nextfind@nextpagewithpoints=\relax + \else + \ifnum \value{#1} > \tbl@lastp\relax + \let\nextfind@nextpagewithpoints=\relax + \else + \def\nextfind@nextpagewithpoints{\find@nextpagewithpoints{#1}}% + \fi + \fi + \nextfind@nextpagewithpoints +}% find@nextpagewithpoints + +\def\find@nextcolumnpage@v#1{% + % Called by \nextcolumn@index@v. + % This is used for all multicolumn tables that are indexed by + % pages. + % We use \find@nextpagewithpoints to increment #1 to either + % the (num@rows)'th page number after #1 that contains the + % appropriate kind of points or to a value greater than \tbl@lastp. + % We use pq@index@bpts as a scratch counter. + \setcounter{pq@index@bpts}{0}% + \dofind@nextcolumnpage@v{#1}% +}% find@nextcolumnpage@v +\def\dofind@nextcolumnpage@v#1{% + % Called only by \find@nextcolumnpage@v. + \addtocounter{pq@index@bpts}{1}% + \find@nextpagewithpoints{#1}% + \ifnum \value{pq@index@bpts} = \value{num@rows}\relax + \let\nextdofind@nextcolumnpage@v=\relax + \else + % The following test shouldn't be needed, in theory, because the + % computation of num@cols should prevent trouble, but we're being + % paranoid. + \ifnum \value{#1} > \tbl@lastp\relax + \let\nextdofind@nextcolumnpage@v=\relax + \else + % Note: this is a \def, and not a \let, because we need to put + % in the argument #1: + \def\nextdofind@nextcolumnpage@v{\dofind@nextcolumnpage@v{#1}}% + \fi + \fi + \nextdofind@nextcolumnpage@v +}% dofind@nextcolumnpage@v + +%-------------------------------------------------------------------- +% \pointsinrange and \bonuspointsinrange, and then +% \firstqinrange, \lastqinrange, and \numqinrange. + + +% We say either \@bonusfalse or \@bonustrue, and then we check it only +% in \do@countloop: +\def\pointsinrange#1{% + \@bonusfalse + \def\tbl@range{#1}% + \@ifundefined{exam@numpoints}% + {\mbox{\normalfont\bfseries ??}}% + {\read@range}% +}% pointsinrange + +\def\bonuspointsinrange#1{% + \@bonustrue + \def\tbl@range{#1}% + \@ifundefined{exam@numpoints}% + {\mbox{\normalfont\bfseries ??}}% + {\read@range}% +}% bonuspointsinrange + +\def\bad@range{% + % Called by \read@range, \firstqinrange, \lastqinrange, and + % \numqinrange. + {\mbox{\normalfont\bfseries ??}}% + \ClassWarning{exam}{% + Grading range `\tbl@range' not defined.\MessageBreak + \space\space Run LaTeX again.\MessageBreak + }% +}% bad@range + +\def\read@range{% + % Called by \pointsinrange and \bonuspointsinrange. + \@ifundefined{range@\tbl@range @firstq}% + {% + \bad@range + }% + {% + \@ifundefined{range@\tbl@range @lastq}% + {% + \bad@range + }% + {% + \edef\tbl@firstq{\csname range@\tbl@range @firstq\endcsname}% + \edef\tbl@lastq{\csname range@\tbl@range @lastq\endcsname}% + % Check that firstq precedes or equals lastq: + \ifnum \tbl@firstq > \tbl@lastq\relax + \fbox{\textbf{Error:} Grading Range `\tbl@range ': + Last question precedes first question.}% + \ClassError{exam}{% + In grading range `\tbl@range ', + the last question\MessageBreak + \space\space comes before the first question.\MessageBreak + }{% + \string\begingradingrange \space must precede + \string\endgradingrange \space by at + least one question.\MessageBreak + }% + \else + \count@pointsinrange + \fi + }% + }% +}% read@range + +\def\count@pointsinrange{% + % Used for both \pointsinrange and \bonuspointsinrange: + \set@hlfcntr{tbl@points}{0}% + \setcounter{@iterator}{\tbl@firstq}% + \addtocounter{@iterator}{-1}\do@countloop + \prt@hlfcntr{tbl@points}% +}% count@pointsinrange +\def\do@countloop{% + % We check \if@bonus here when needed: + \addtocounter{@iterator}{1}% + \if@bonus + \@ifundefined{bonuspointsofq@\romannumeral \c@@iterator}% + {}% + {\addto@hlfcntr{tbl@points} + {\csname bonuspointsofq@\romannumeral \c@@iterator\endcsname}}% + \else + \@ifundefined{pointsofq@\romannumeral \c@@iterator}% + {}% + {\addto@hlfcntr{tbl@points} + {\csname pointsofq@\romannumeral \c@@iterator\endcsname}}% + \fi + \ifnum \value{@iterator} < \tbl@lastq\relax + \let\next@countloop=\do@countloop + \else + \let\next@countloop=\relax + \fi + \next@countloop +}% do@countloop + +%-------------------------------------------------------------------- +% \firstqinrange, \lastqinrange, and \numqinrange. + +\newcommand{\firstqinrange}[1]{% + \def\tbl@range{#1}% + \@ifundefined{range@\tbl@range @firstq}% + {\bad@range}% + {\csname range@#1@firstq\endcsname}% +}% firstqinrange + +\newcommand{\lastqinrange}[1]{% + \def\tbl@range{#1}% + \@ifundefined{range@\tbl@range @lastq}% + {\bad@range}% + {\csname range@#1@lastq\endcsname}% +}% lastqinrange + +\newcommand{\numqinrange}[1]{% + \def\tbl@range{#1}% + \@ifundefined{range@#1@firstq}% + {% + \bad@range + }% + {% + \@ifundefined{range@#1@lastq}% + {% + \bad@range + }% + {% + \setcounter{@iterator}{\csname range@#1@lastq\endcsname}% + \addtocounter{@iterator}{-\csname range@#1@firstq\endcsname}% + \stepcounter{@iterator}% + \arabic{@iterator}% + }% + }% +}% numqinrange + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% +% *************************** +% ** SOLUTION ENVIRONMENTS ** +% *************************** + + + +% If the documentclass options include ``answers'', then the command +% \printanswerstrue is given at the beginning of the run. + +% If the documentclass options include ``noanswers'', then the command +% \printanswersfalse is given at the beginning of the run. + +\def\printanswers{\printanswerstrue} +\def\noprintanswers{\printanswersfalse} + +% If the documentclass options include ``cancelspace'', then the +% command \cancelspacetrue is given at the beginning of the run. + +% If the documentclass options include ``nocancelspace'', then the +% command \cancelspacefalse is given at the beginning of the run. + +\def\cancelspace{\cancelspacetrue} +\def\nocancelspace{\cancelspacefalse} + +% \if@insolution will be true while we're inside of any of the +% solution environments. This is used to supress \PgInfo@write and +% \label commands generated if there's a parts (or subparts, or +% subsubparts) environment inside of a solution. (It won't suppress +% the labels for the question objects, since a question object is +% never a label that's been used before.) +\newif\if@insolution +\@insolutionfalse + +\newcommand\SolutionEmphasis[1]{% + \def\Solution@Emphasis{#1}% +} +\SolutionEmphasis{} + +% If printanswers is true, we print the solution using a TheSolution +% environment. If printanswers is false and cancelspace is false, we +% insert blank vertical space equal to the optional argument (the +% default value of which is 0pt). +\newenvironment{solution}[1][0pt]% + {% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \ifprintanswers + \begingroup + \Solution@Emphasis + \begin{TheSolution}% + \else + \ifcancelspace + % Do nothing + \else + \par + \penalty 0 + \vspace*{#1}% + \fi + \setbox\z@\vbox\bgroup + \fi + }{% + \ifprintanswers + \end{TheSolution}% + \endgroup + \else + \egroup + \fi + }% + +% If printanswers is true, we print the solution using a TheSolution +% environment. If printanswers is false and cancelspace is false, +% we insert an empty box of width the current line width and of +% height equal to the optional argument, which can be a length, or +% \fill, or \stretch{number}. If the optional argument is omitted, +% then the box is entirely omitted when printanswers is false. +\newenvironment{solutionorbox}[1][-1pt]% + {% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \ifprintanswers + \begingroup + \Solution@Emphasis + \begin{TheSolution}% + \else + \ifcancelspace + % Do nothing + \else + \par + % Note: It's important that the following test be + % ``\ifdim 0pt > #1'' rather than ``\ifdim #1 < 0pt'' + % That's because if the user says + % ``\begin{solutionorbox}{\stretch{1}}'' + % (or \stretch{anythingelse}), then this will expand to + % ``\ifdim 0pt > \z@ plus 1fill\relax''. + % The \ifdim will be ``\ifdim 0pt > \z@'', and we'll have + % ``plus 1fill\relax'' left over. This is OK because if the + % \ifdim is false, that leftover stuff will be ignored, + % and it will only be true if the user omitted the optional + % argument, in which case there's no \stretch and thus no + % left over part. + % If we said ``\ifdim #1 < 0pt'', then we'd get an error + % when the user used \stretch, since the leftover stuff + % would appear when TeX was looking for <, =, or >. + \ifdim 0pt > #1 + % do nothing + \else + \makeemptybox{#1}% + \fi + \fi + \setbox\z@\vbox\bgroup + \fi + }{% + \ifprintanswers + \end{TheSolution}% + \endgroup + \else + \egroup + \fi + }% + +% If printanswers is true, we print the solution using a TheSolution +% environment. If printanswers is false and cancelspace is false, +% we insert lined vertical space equal to the optional argument (the +% default value of which is 0pt). +\newenvironment{solutionorlines}[1][0pt]% + {% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \ifprintanswers + \begingroup + \Solution@Emphasis + \begin{TheSolution}% + \else + \ifcancelspace + % Do nothing + \else + \par + \penalty 0 + \fillwithlines{#1}% + \fi + \setbox\z@\vbox\bgroup + \fi + }{% + \ifprintanswers + \end{TheSolution}% + \endgroup + \else + \egroup + \fi + }% + +% If printanswers is true, we print the solution using a TheSolution +% environment. If printanswers is false and cancelspace is false, +% we insert dotted lined vertical space equal to the optional +% argument (the default value of which is 0pt). +\newenvironment{solutionordottedlines}[1][0pt]% + {% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \ifprintanswers + \begingroup + \Solution@Emphasis + \begin{TheSolution}% + \else + \ifcancelspace + % Do nothing + \else + \par + \penalty 0 + \fillwithdottedlines{#1}% + \fi + \setbox\z@\vbox\bgroup + \fi + }{% + \ifprintanswers + \end{TheSolution}% + \endgroup + \else + \egroup + \fi + }% + +% If printanswers is true, we print the solution using a TheSolution +% environment. If printanswers is false and cancelspace is false, +% we insert a grid occupying vertically the optional argument (the +% default value of which is 0pt). +\newenvironment{solutionorgrid}[1][0pt]% + {% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \ifprintanswers + \begingroup + \Solution@Emphasis + \begin{TheSolution}% + \else + \ifcancelspace + % Do nothing + \else + \par + \penalty 0 + \fillwithgrid{#1}% + \fi + \setbox\z@\vbox\bgroup + \fi + }{% + \ifprintanswers + \end{TheSolution}% + \endgroup + \else + \egroup + \fi + }% + + +% The environment TheSolution is called from the solution, +% solutionorbox, solutionorlines, solutionordottedlines, and +% solutionorgrid environments when printanswers is true. It uses +% Donald Arseneau's framed.sty macros (included at the end of this +% file) to allow the solution to be broken across pages and have each +% piece enclosed in an fbox (or a colorbox, if the user has given the +% command \shadedsolutions), (or no box at all, if the user has given +% the command \unframedsolutions). + +% Of course, the user can change TheSolution with a \renewenvironment +% command. +\newcommand{\solutiontitle}{\noindent\textbf{Solution:}\enspace} +\newenvironment{TheSolution}% + {% + \vspace{\parskip}% + % If we don't set \leftskip and \rightskip to 0pt, then if we + % appear inside of an \uplevel command we'd have indentation + % inside of the solution box: + \leftskip=0pt + \rightskip=0pt + % If the user said \unframedsolutions, then both + % \if@framedsolutions and \if@shadedsolutions are false: + \if@framedsolutions + % We'll use the default \exam@FrameCommand + \else + \if@shadedsolutions + \def\exam@FrameCommand{\colorbox{SolutionColor}}% + \else + % It's \unframedsolutions: + \def\exam@FrameCommand{}% + \fi + \fi + \exam@MakeFramed{\advance\hsize-\exam@width}% + \solutiontitle + \ignorespaces + }% + {% + \unskip + \endexam@MakeFramed + }% + +\newif\if@framedsolutions +\@framedsolutionstrue +\newif\if@shadedsolutions +\@shadedsolutionsfalse +% If the user said \unframedsolutions, then both +% \if@framedsolutions and \if@shadedsolutions are false. + +\def\framedsolutions{\@framedsolutionstrue\@shadedsolutionsfalse} +\def\shadedsolutions{% + \@ifundefined{definecolor} + {% + \ClassError{exam}{% + You must load the color package with the command\MessageBreak + \space\space\protect\usepackage{color}\MessageBreak + in order to use the command \protect\shadedsolutions + \MessageBreak + }{% + This command makes use of the package color.sty,\MessageBreak + and so you have to load color.sty before your\MessageBreak + \protect\begin{document} command.\MessageBreak + }% + }% + {% + \definecolor{SolutionColor}{gray}{0.8} + \@shadedsolutionstrue + \@framedsolutionsfalse + }% +} +\def\unframedsolutions{\@framedsolutionsfalse\@shadedsolutionsfalse} + + +% The solutionbox environment is different from the other solution +% environments (solution, solutionorbox, solutionorlines, +% solutionordottedlines, and solutionorgrid), in that +% +% (1) The box is always printed, whether answers are being printed +% or not. +% +% (2) The argument giving the size of the box is a required +% argument, not an optional argument, and so it should be enclosed +% in braces, not in brackets. It can be either a length or +% \stretch{number}. +% +% (3) We make no use of the TheSolution environment; the solutionbox +% environment is completely freestanding. +% +% If answers are not being printed then only the box is printed, with +% nothing in it. If answers are being printed, then the solution is +% printed inside of the box. +% +% Note: It's the user's responsibility to be sure that the box is +% large enough to hold the solution! If the solution takes up too +% much vertical space, then it will spill out of the bottom of the +% box, overwriting whatever follows the box. + +% 2016/02/08: The solutionbox frame can now be printed in color, as +% long as you load color.sty in the preamble. +% +% Usage: Say +% +% \usepackage{color} +% +% in the preamble, and then give the command +% +% \colorsolutionboxes +% +% to have the frame around a solutionbox in color. The default color +% was created by the command +% +% \definecolor{SolutionBoxColor}{gray}{0.8} +% +% and you can change the color by giving a new \definecolor command +% (which must be done *after* the \colorsolutionboxes command). +% +% To cancel color solutionbox frames and return to black, give the +% command +% +% \nocolorsolutionboxes + +\newif\if@colorsolutionboxes +\@colorsolutionboxesfalse +\def\colorsolutionboxes{% + \@ifundefined{definecolor} + {% + \ClassError{exam}{% + You must load the color package with the command\MessageBreak + \space\space\protect\usepackage{color}\MessageBreak + in order to use the command \protect\colorsolutionboxes + \MessageBreak + }{% + This command makes use of the package color.sty,\MessageBreak + and so you have to load color.sty before your\MessageBreak + \protect\begin{document} command.\MessageBreak + }% + }% + {% + \definecolor{SolutionBoxColor}{gray}{0.8} + \@colorsolutionboxestrue + }% +} +\def\nocolorsolutionboxes{\@colorsolutionboxesfalse} + +\newbox\exam@box +\newenvironment{solutionbox}[1]{% + \@insolutiontrue % cancelled by the end of the environment + \@addpointsfalse % cancelled by the end of the environment + \def\solutionbox@size{#1}% saved for end of environment +% Change, 2016/02/08: So that the solutionbox environment will work +% correctly inside of a tabular environment, we use \hsize instead of +% \textwidth: +% \@tempdima=\textwidth + \@tempdima=\hsize + \advance\@tempdima -\@totalleftmargin + \advance\@tempdima -6\fboxsep + \advance\@tempdima -2\fboxrule + % Confine the \Solution@Emphasis, as well as anything the user puts + % into the solution (e.g., \color{red}, or whatever); don't say + % \endgroup until after using \box\exam@box: + \begingroup + \Solution@Emphasis + % We save the solution in a box of the proper width. We'll either + % print it (if we're printing solutions) or throw it away by just + % not using it before the environment ends: + \setbox\exam@box=\vtop\bgroup + \hsize=\@tempdima + \leftskip=0pt + \rightskip=0pt + \vskip 2\fboxsep +% Change, 2016/05/09: We change \@totalleftmargin and \linewidth in +% case there are enumerate, itemize, or description environments +% inside the solution: + \@totalleftmargin=0pt + \linewidth=\hsize + \solutiontitle + \ignorespaces + }% + {% + \unskip + \egroup + % OK, the solution is now inside \box\exam@box. + % Set the height and depth to 0pt, so that if we use it we won't + % be advancing our position on the page: + \ht\exam@box=0pt + \dp\exam@box=0pt + \par + \vspace{\parskip} + \ifprintanswers + % We enclose the \vtop in an \hbox to avoid having the + % indentation of the enclosing list environment (implemented via + % \parshape) shift us to the right when we enter horizontal + % mode. If we don't use this \hbox, then we'd have to comment + % out the \hskip \@totalleftmargin: + % 2016/02/08: Changed \textwidth to \hsize: + \hbox to \hsize{% + \noindent + \hskip\@totalleftmargin + \hskip3\fboxsep\hskip\fboxrule + \box\exam@box\hfill + }% + \par\nointerlineskip + \fi + \endgroup % Finish confining the \Solution@Emphasis +% Starting in version 2.502, 2016/03/23,the decision of whether to +% color the box is made in the \makeemptybox command: + \makeemptybox{\solutionbox@size} + }% End of the second argument of \newenvironment{solutionbox} + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% Added in version 2.502: 2016/03/23, \colorfbox + +% The \colorfbox command is used in our modification of framed.sty +% that allows us to print the frame around the solution in color when +% the user has given the command \colorsolutionboxes. It takes two +% arguments, the first being the color for the frame, and the second +% being the stuff to be framed. + +% If we had assumed that xcolor.sty was used (instead of just +% color.sty), then the line that saves the current color in +% saved@color could have been just + +% \colorlet{saved@color}{.} + +% but we wanted to make this work even if color.sty is being used. + +% When you define a color mycolor using either color.sty or +% xcolor.sty, a macro \csname\string\color@ mycolor\endcsname is +% defined (i.e., the macro name is \\color@mycolor). +\newcommand{\colorfbox}[2]{% + % Save the current color in saved@color: + \expandafter\let\csname\string\color@saved@color\endcsname\current@color + % Create the box in color #1, with the text in saved@color + % (the braces are to confine the color change commands): + {\color{#1}\fbox{\color{saved@color}#2}}% +}% colorfbox + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +% The following stuff is lifted from: +% +% framed.sty v 0.8a 21-Jul-2003 +% Copyright (C) 1992-2003 by Donald Arseneau +% These macros may be freely transmitted, reproduced, or modified +% provided that this notice is left intact. +% +% The modifications I made are marked with ``psh'' in a comment: +% +% Further modifications, 2017-09-21 +% I changed the names of many commands by prepending ``exam@'', so +% that the user can use the framed.sty package with exam.cls and not +% have conflicts. (I also renamed the framed, shaded, and leftbar +% environments to examframed, examshaded, and examleftbar.) I didn't +% mark these name changes. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Create framed or shaded regions that can break across pages using +% \begin{examframed} ... \end{examframed} -- ordinary frame box +% (box at margin) +% \begin{examshaded} ... \end{examshaded} -- shaded background +% (into margin) +% ... examleftbar ... -- line on left side +% \begin{MakeFramed}{settings} ... \end{MakeFramed} +% -- generic frame (for new environments) +% +% The "examframed" environment puts the text into "\fbox" with the +% settings "\fboxrule=\exam@FrameRule" and "\fboxsep=\exam@FrameSep". +% You can change these lengths (using "\setlength") and you +% can even change the definition of "\exam@FrameCommand" to use +% much fancier boxes. +% +% In fact, the "shaded" environment just redefines "\exam@FrameCommand" +% to use "\colorbox{shadecolor}" (and you have to define the +% color "shadecolor": \newcolor{shadecolor}...). +% +% A page break is allowed, and even encouraged, before the framed +% environment. If you want to attach some text (a box title) to the +% frame, then the text should be inserted by \exam@FrameCommand +% +% The contents of the framed regions are restricted: +% Floats, footnotes, marginpars and head-line entries will be lost. +% (Some of these may be handled in a later version.) +% This package will not work with the page breaking of multicol.sty, +% or other systems that perform column-balancing. +% +% The MakeFramed environment does the work. Its "settings" argument +% should contain any adjustments to the text width (applied to \hsize, +% and using the "\exam@width" of the frame itself) as well as a `restore' +% command -- \@parboxrestore or \exam@FrameRestore or something similar. +% +% Expert commands: +% \exam@MakeFramed, \endexam@MakeFramed: the "MakeFramed" environment +% \exam@FrameCommand: command to draw the frame around its argument +% \exam@FrameRestore: restore some text settings, but fewer than +% \@parboxrestore +% \exam@FrameRule: length register; \fboxrule for default "framed". +% \exam@FrameSep: length register; \fboxsep for default "framed". +% \exam@frameHeightAdjust: macro; height of frame above baseline at +% top of page +% +% This is still a `pre-production' version because I can think of many +% features/improvements that should be made. Nevertheless, starting +% with version 0.5 it should be bug-free. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%psh: Commented out \ProvidesPackage: +%\ProvidesPackage{framed}[2003/07/21 v 0.8a: +% framed or shaded text with page breaks] + +%psh: Created \saved@totalleftmargin and \@sollistdepth: +\newdimen\saved@totalleftmargin +\newcount\@sollistdepth + +\newenvironment{examframed}% using default \exam@FrameCommand + {\exam@MakeFramed {\advance\hsize-\exam@width \exam@FrameRestore}}% + {\endexam@MakeFramed} + +\newenvironment{examshaded}{% + \def\exam@FrameCommand{\colorbox{shadecolor}}% + \exam@MakeFramed {\exam@FrameRestore}}% + {\endexam@MakeFramed} + +\newenvironment{examleftbar}{% + \def\exam@FrameCommand{\vrule width 3pt \hspace{10pt}}% + \exam@MakeFramed {\advance\hsize-\exam@width \exam@FrameRestore}}% + {\endexam@MakeFramed} + +\chardef\exam@FrameRestore=\catcode`\| % for debug +\catcode`\|=\catcode`\% % (debug: insert space after backslash) + +\def\exam@MakeFramed#1{\par + % measure added width and height; call result \exam@width and \exam@height + \setbox\z@\vbox{\vskip-1in \hbox{\hskip-1in + \exam@FrameCommand{\hbox{\vrule \@height .7in \@depth.3in \@width 1in}}}% + \vskip\z@skip}% + \def\exam@width{\wd\z@}\def\exam@height{\ht\z@}% + \edef\exam@fb@frw{\the\exam@width}\edef\exam@fb@frh{\the\exam@height}% + % insert pre-penalties and skips + \begingroup + \skip@\lastskip + \if@nobreak\else + \penalty9999 % updates \page parameters + \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@ + \edef\@tempa{\the\skip@}% + \ifx\@tempa\exam@zero@glue \penalty-30 + \else \vskip-\skip@ \penalty-30 \vskip\skip@ + \fi\fi\fi + \penalty\z@ + % Give a stretchy breakpoint that will always be taken in preference + % to the \penalty 9999 used to update page parameters. The cube root + % of 10000/100 indicates a multiplier of 0.21545, but the maximum + % calculated badness is really 8192, not 10000, so the multiplier + % is 0.2301. + \advance\skip@ \z@ plus-.5\baselineskip + \advance\skip@ \z@ plus-.231\exam@height + \advance\skip@ \z@ plus-.231\skip@ + \advance\skip@ \z@ plus-.231\topsep + \vskip-\skip@ \penalty 1800 \vskip\skip@ + \fi + \addvspace{\topsep}% + \endgroup + % clear out pending page break + \penalty\@M \vskip 2\baselineskip \vskip\exam@height + \penalty9999 \vskip -2\baselineskip \vskip-\exam@height + \penalty9999 % updates \pagetotal +|\message{After clearout, \pagetotal=\the\pagetotal, \pagegoal=\the\pagegoal. }% + \exam@fb@adjheight +%psh: Added commands: + \advance\hsize-\@totalleftmargin + \saved@totalleftmargin=\@totalleftmargin + \@totalleftmargin=0pt + \parshape 0 + \let\@listdepth=\@sollistdepth + \@sollistdepth=0 + \leftmargin=0pt +%psh: end of added commands + \setbox\@tempboxa\vbox\bgroup + #1% Modifications to \hsize (can use \exam@width and \exam@height) + \textwidth\hsize \columnwidth\hsize +%psh: added one line: + \linewidth=\hsize +} + +\def\endexam@MakeFramed{\par + \kern\z@ \penalty-100 % put depth into height + \egroup + \begingroup \exam@put@frame \endgroup +%psh: Added one line: + \@totalleftmargin=\saved@totalleftmargin +} + +% \exam@put@frame takes the contents of \@tempboxa and puts all, or a +% piece, of it on the page with a frame (\exam@FrameCommand). It +% recurses until all of \@tempboxa has been used up. (\@tempboxa must +% have zero depth.) + +\def\exam@put@frame{\relax + \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi +| \message{=============== Entering putframe ====================^^J +| \pagegoal=\the\pagegoal, \pagetotal=\the\pagetotal. }% + \ifinner \else + \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page + \ifdim\dimen@<2\baselineskip +| \message{Page has only \the\dimen@\space room left; eject. }% + \eject \exam@fb@adjheight \exam@put@frame + \else % there's appreciable room left on the page +| \message{\string\pagetotal=\the\pagetotal, +| \string\pagegoal=\the\pagegoal, +| \string\pagestretch=\the\pagestretch, +| \string\pageshrink=\the\pageshrink, +| \string\exam@fb@frh=\exam@fb@frh. \space} +| \message{Box of size \the\ht\@tempboxa\space + \exam@fb@frh}% + \begingroup % temporarily set \dimen@ to be... + \advance\dimen@.8\pageshrink % maximum space available on page + \advance\dimen@-\exam@fb@frh\relax % space available for frame's contents + \expandafter\endgroup + % restore \dimen@ to real room left on page + \ifdim\dimen@>\ht\@tempboxa % whole box does fit +| \message{fits in \the\dimen@. }% + \else % box must be split +| \message{must be split to fit in \the\dimen@. }% + \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page: + \vskip \exam@fb@frh \@plus\pagestretch \@minus.8\pageshrink + \kern137sp\kern-137sp\penalty-30 + \unvbox\@tempboxa}% + \edef\exam@fb@resto@set{\boxmaxdepth\the\boxmaxdepth + \splittopskip\the\splittopskip}% + \boxmaxdepth\z@ \splittopskip\z@ + \setbox\tw@\vsplit\@tempboxa to\dimen@ + \setbox\tw@\vbox{\unvbox\tw@}% natural-sized +| \message{Box of size \the\ht\@tempboxa\space split to \the\dimen@. +| Natural height of split box is \the\ht\tw@. }% + % If the split-to size > (\vsize-\topskip), then set box to full size + \begingroup + \advance\dimen@\topskip + \expandafter\endgroup + \ifdim\dimen@>\pagegoal +| \message{Frame is big -- Use up the full column. }% + \dimen@ii\pagegoal + \advance\dimen@ii -\topskip + \advance\dimen@ii \exam@frameHeightAdjust\relax + \else % suspect this is wrong: + % If the split-to size > feasible room_on_page, rebox it smaller. + \advance\dimen@.8\pageshrink + \ifdim\ht\tw@>\dimen@ +| \message{Box too tall; rebox it to \the\dimen@. }% + \dimen@ii\dimen@ + \else % use natural size + \dimen@ii\ht\tw@ + \fi + \fi + % Re-box contents to desired size \dimen@ii + \advance\dimen@ii -\exam@fb@frh + \setbox\tw@\vbox to\dimen@ii \bgroup + % remove simulated frame and page flexibility: + \vskip -\exam@fb@frh \@plus-\pagestretch \@minus-.8\pageshrink + \unvbox\tw@ \unpenalty\unpenalty + \ifdim\lastkern=-137sp % whole box went to next page +| \message{box split at beginning! }% + \egroup \exam@fb@resto@set \eject % (\vskip for frame size + % was discarded) + \exam@fb@adjheight + \else % + \egroup \exam@fb@resto@set + \ifvoid\@tempboxa % it all fit after all +| \message{box split at end! }% + \setbox\@tempboxa\box\tw@ + \else % it really did split +| \message{box split as expected. Its reboxed height is \the\ht\tw@. }% + \ifdim\wd\tw@>\z@ +%psh: Changed the command that inserts the box: +% Instead of \centerline, we shift right by \saved@totalleftmargin: +% \centerline{\exam@FrameCommand{\box\tw@}}% ??? \centerline bad idea + \hbox{\hskip \saved@totalleftmargin\exam@FrameCommand{\box\tw@}}% + \else +| \message{Zero width means likely blank. Don't frame it (guess)}% + \box\tw@ + \fi + \hrule \@height\z@ + \eject + \exam@fb@adjheight + \exam@put@frame + \fi\fi\fi\fi\fi + \ifvoid\@tempboxa\else +%psh: Changed the command that inserts the box: +% Instead of \centerline, we shift right by \saved@totalleftmargin: +% \centerline{\exam@FrameCommand{\box\@tempboxa}}% + \hbox{\hskip\saved@totalleftmargin\exam@FrameCommand{\box\@tempboxa}}% + \nointerlineskip \null %{\showoutput \showlists} + \penalty-30 \vskip\topsep + \fi} + +\def\exam@fb@adjheight{% + \vbox to\exam@frameHeightAdjust{}% get proper baseline skip from above. + \penalty\@M \nointerlineskip + \vskip-\exam@frameHeightAdjust + \penalty\@M} % useful for tops of pages + +\edef\exam@zero@glue{\the\z@skip} + +\catcode`\|=\exam@FrameRestore + +% Provide configuration commands: +%psh: Version 2.502, 2016/03/23, changed \exam@FrameCommand so that the +% frame is printed in color if the user has said +% \colorsolutionboxes: +%\providecommand\exam@FrameCommand{\fboxrule=\exam@FrameRule +%\fboxsep=\exam@FrameSep \fbox} +\def\exam@FrameCommand{\fboxrule=\exam@FrameRule \fboxsep=\exam@FrameSep + \if@colorsolutionboxes + \def\box@it{\colorfbox{SolutionBoxColor}}% + \else + \def\box@it{\fbox}% + \fi + \box@it +}% \exam@FrameCommand + +\@ifundefined{FrameRule}{\newdimen\exam@FrameRule \exam@FrameRule=\fboxrule}{} +\@ifundefined{FrameSep} {\newdimen\exam@FrameSep \exam@FrameSep =3\fboxsep}{} + +% Height of frame above first baseline when frame starts a page: +\providecommand\exam@frameHeightAdjust{6pt} + +% \exam@FrameRestore has parts of \@parboxrestore. See how it is used in the +% "settings" argument of \MakeFrame. Previous behavior can be restored by +% using \@parboxrestore there, or redefining: +% \makeatletter \renewcommand\exam@FrameRestore{\@parboxrestore} \makeatother +\def\exam@FrameRestore{% + \let\if@nobreak\iffalse + \let\if@noskipsec\iffalse +% \let\par\@@par ?? + \let\-\@dischyph + \let\'\@acci\let\`\@accii\let\=\@acciii +% \parindent\z@ \parskip\z@skip Definitely omit! +% \everypar{}% ?? + \linewidth\hsize +% \@totalleftmargin\z@ +% \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip +% \parfillskip\@flushglue \lineskip\normallineskip +% \baselineskip\normalbaselineskip + \sloppy +% \let\\\@normalcr +} + +% Compatibility with previous versions (temporary!): +% psh: we'll remove this 2017-09-21 +%\let\fram@d=\MakeFramed \let\endfram@d=\endMakeFramed + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% This ends the stuff that's lifted from: +% % framed.sty v 0.8a 21-Jul-2003 +% % Copyright (C) 1992-2003 by Donald Arseneau + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +\endinput +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- diff --git a/macros/latex/contrib/exam/exam.md5 b/macros/latex/contrib/exam/exam.md5 new file mode 100644 index 0000000000..38fd1b65a1 --- /dev/null +++ b/macros/latex/contrib/exam/exam.md5 @@ -0,0 +1,3 @@ +08a9755a8f51d31edf6b4124c9b710f9 exam.cls +a9273b3443c367000e4a71b572c58a62 examdoc.pdf +a9a481f4f36ec3dbf90ffe63f57ce803 examdoc.tex diff --git a/macros/latex/contrib/exam/examdoc.pdf b/macros/latex/contrib/exam/examdoc.pdf Binary files differnew file mode 100644 index 0000000000..9386d25eac --- /dev/null +++ b/macros/latex/contrib/exam/examdoc.pdf diff --git a/macros/latex/contrib/exam/examdoc.tex b/macros/latex/contrib/exam/examdoc.tex new file mode 100644 index 0000000000..cbcfb377a5 --- /dev/null +++ b/macros/latex/contrib/exam/examdoc.tex @@ -0,0 +1,8770 @@ +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +% examdoc.tex +% +% This is the user's guide for the exam documentclass, +% by Philip Hirschhorn. +% +% The exam documentclass itself is in the file exam.cls. + + +%%% Copyright (c) 1997, 2000, 2004, 2008, 2011, 2015, 2017 +% Philip S. Hirschhorn +% +% This work 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 2003/12/01 or later. +% +% This work consists of the files exam.cls and examdoc.tex + +% The user's guide for exam.cls is in the file examdoc.tex. + + +%%% Philip Hirschhorn +%%% Department of Mathematics +%%% Wellesley College +%%% Wellesley, MA 02481 +%%% psh@math.mit.edu + +% The newest version of this documentclass should always be available +% from my web page: http://www-math.mit.edu/~psh/ + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- + +\documentclass[12pt]{exam} +\usepackage{amssymb} + +\usepackage{makeidx} + +\usepackage[colorlinks]{hyperref} + +% In case we're not using hyperref.sty: +\providecommand{\texorpdfstring}[2]{#1} +% The following can be used in \section commands +% without generating pdf warnings: +\newcommand{\bs}{\texorpdfstring{\char`\\}{}} + +\newcommand{\docversion}{2.6} +\newcommand{\docdate}{November 5, 2017} +%\newcommand{\docdate}{Draft: \today} + +%-------------------------------------------------------------------- +% +% Changes since version 2.4 are described in the comments +% near the beginning of the file exam.cls. +% +%-------------------------------------------------------------------- + +\makeindex + +\newcommand{\indc}[1]{\index{#1@\texttt{\char`\\#1}}} +\newcommand{\indcsub}[2]{\index{#1@\texttt{\char`\\#1}!#2}} +\newcommand{\indcstart}[1]{\index{#1@\texttt{\char`\\#1}|(}} +\newcommand{\indcstop}[1]{\index{#1@\texttt{\char`\\#1}|)}} + +\newcommand{\indt}[1]{\index{#1@\texttt{#1}}} +\newcommand{\indtsub}[2]{\index{#1@\texttt{#1}!#2}} +\newcommand{\indtstart}[1]{\index{#1@\texttt{#1}|(}} +\newcommand{\indtstop}[1]{\index{#1@\texttt{#1}|)}} + +%--------------------------------------------------------------------- +\newenvironment{example}% + {\bigskip\filbreak + \subsubsection{Example:} + }% + {} + +\def\samplehead#1#2#3#4{% + \begin{trivlist} + \item[] + \leavevmode + \hbox to \textwidth{% + \rlap{\parbox[b]{\textwidth}{\raggedright#1\strut}}% + \hfil\parbox[b]{\textwidth}{\centering#2\strut}\hfil + \llap{\parbox[b]{\textwidth}{\raggedleft#3\strut}}% + }% hbox + #4 + \end{trivlist} +} + +\def\samplefoot#1#2#3#4{% + \begin{trivlist} + \item[] + \leavevmode + #1 + \vskip 3pt + + \hbox to \textwidth{% + \rlap{\parbox[t]{\textwidth}{\raggedright#2}}% + \hfil\parbox[t]{\textwidth}{\centering#3}\hfil + \llap{\parbox[t]{\textwidth}{\raggedleft#4}}% + }% hbox + \end{trivlist} +} + +% \makeatletter +% \@ifundefined{AmS}{\def\AmS{{\protect\the\textfont\tw@ +% A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}} +% {} +% \makeatother + + +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- +%--------------------------------------------------------------------- + +\begin{document} + +\title{Using the exam document class} + +\author{Philip Hirschhorn\\ + Department of Mathematics\\ + Wellesley College\\ + Wellesley, MA 02481\\ + psh@math.mit.edu\\[\bigskipamount] + Copyright \copyright~1994, 1997, 2000, 2004, 2008, 2011, 2015, 2017\\ + Philip Hirschhorn\\ + All rights reserved} + +\date{\docdate} + +\maketitle + +\begin{center} + \small + This is the user's guide for version~\docversion{} of the + \verb"exam" document class. +\end{center} + +\tableofcontents + +%-------------------------------------------------------------------- +\section{Introduction} + +The file \verb"exam.cls" provides the \verb"exam" document class, +which attempts to make it easy for even a \LaTeX{} novice to prepare +exams. Specifically, \verb"exam.cls" sets the page layout so that +there are one inch margins\index{margins} all around (no matter what +size paper you're using) and provides commands that make it easy to +format questions, create flexible headers and footers, change the +margins, and create grading tables. In more detail: +\begin{itemize} +\item The class will automatically format and number the questions, + parts of questions, subparts of parts, and subsubparts of subparts + (see sections \ref{sec:Questions} and~\ref{sec:parts}). +\item You can include the point value\index{points} of each question + (or part, or subpart, or subsubpart), with your choice of having the + point values printed at the beginning of the text of the question, + opposite that in the left margin, opposite that in the right margin, + or in the right margin opposite the end of the question (see + section~\ref{sec:points}). +\item The class will add up the total points for each question (and + all of its parts, subparts, and subsubparts) and the total + points\index{points!total} on each page, and make those totals + available in macros (see sections \ref{sec:addup}, + \ref{sec:pointsofq} and~\ref{sec:pointsonp}). +\item You can have the class print a grading table, indexed either by + question number or by page number (see + section~\ref{sec:GradeTables}). +\item You specify the header in three parts: One part to be left + justified, one part to be centered, and one part to be right + justified, and one or all of these can be omitted (see + section~\ref{sec:header}). +\item The footer is also specified in three parts: Left justified, + centered, and right justified (see section~\ref{sec:footer}). +\item The header and footer for the first page can be different from + the ones used on other pages (see sections \ref{sec:runningheader}, + \ref{sec:lhead}, \ref{sec:runningfooter}, and \ref{sec:lfoot}). +\item Both headers and footers can contain more than one line. To + accommodate headers and footers with several lines, simple commands + are provided to enlarge the part of the page devoted to the header + and/or footer, and these commands can give one amount of space on + the first page and a different amount of space on all other pages + (see section~\ref{sec:extra-room}). +\item Macros are defined to enable you to state the total number of + pages in the exam (see section~\ref{sec:numpages}) and to change the + header and/or footer that appears on the last page of the exam (see + section~\ref{sec:lastpage}). +\item Macros are defined so that the headers and footers can vary + depending on whether the current page begins a new question or + continues a question that started on an earlier page (and, if one + continues onto the current page, to say what the number of that + question is). Macros are also defined so that the headers and + footers can vary depending on whether a question is complete on the + current page or continues on to the next page (and, if one + continues, to say what the number of that question is) (see + section~\ref{sec:QuesSpan}). +\item You can have a horizontal rule at the base of the header and/or + at the top of the footer (see section~\ref{sec:rules}). +\item The exam can begin with one or more cover pages, which are + numbered separately from the main pages of the exam and which can + have headers and footers different from the ones in the main pages + of the exam (see section~\ref{sec:coverpages}). +\item You can include solutions in your \LaTeX{} file and have these + solutions either printed or ignored (or replaced automatically by + space in which the students can write their answers) depending on a + single command (see section~\ref{sec:solutions}, + section~\ref{sec:CorrectChoice}, and section~\ref{sec:AnsShortAns}). +\end{itemize} + +The latest version of \verb"exam.cls" (possibly a +% +beta\index{beta test} test version) should always be available at +\verb"http://www-math.mit.edu/~psh/"\index{web page}. + +%-------------------------------------------------------------------- +\subsection{License} + +\begin{itemize} +\item This work may be distributed and/or modified under the + % + \index{Latex Project Public License@\LaTeX{} Project Public License} + % + conditions of the \LaTeX{} Project Public + License\index{license},\index{LPPL} either version~1.3 of this + license or (at your option) any later version. The latest version + of this license is in \verb"http://www.latex-project.org/lppl.txt" + and version 1.3 or later is part of all distributions of \LaTeX{} + version 2003/12/01 or later. +\item This work has the LPPL maintenance status ``author-maintained''. +\item This work consists of the files \verb"exam.cls" and + \verb"examdoc.tex". +\end{itemize} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Simple instructions for a basic exam} +\label{sec:Basic} + +Producing a basic exam with the \texttt{exam} document class is fairly +easy. After you learn to do that, you can read the parts of this +user's guide that describe how to customize whatever you want to +change. +%-------------------------------------------------------------------- +\subsection{The \texttt{\bs documentclass} command} +\label{sec:BasicDocumentclass} + +To use the \texttt{exam} document class, your \verb"\documentclass" +command should be\indc{documentclass} +\begin{center} + \verb"\documentclass[addpoints]{exam}" +\end{center} +or, if you want to use 12~point type, +\begin{center} + \verb"\documentclass[addpoints,12pt]{exam}" +\end{center} +There are other options; for the full story, see +section~\ref{sec:Documentclass}. + +%-------------------------------------------------------------------- +\subsection{Asking for the student's name} +\label{sec:BasicName} + +If you'll be leaving space for the answers on the question pages (see +sections~\ref{sec:BasicSpace} and \ref{sec:LeaveSpace}), then you'll +probably also want to leave space for the student's name% +\index{name}\index{student's name}. If you type +\begin{verbatim} +\begin{center} + \fbox{\fbox{\parbox{5.5in}{\centering + Answer the questions in the spaces provided on the + question sheets. If you run out of room for an answer, + continue on the back of the page.}}} +\end{center} + +\vspace{0.1in} + +\makebox[\textwidth]{Name and section:\enspace\hrulefill} + +\vspace{0.2in} + +\makebox[\textwidth]{Instructor's name:\enspace\hrulefill} +\end{verbatim} +after the \verb"\begin{document}" command and before the +\verb"\begin{questions}" command (see section~\ref{sec:Questions}), +then you'll get\\ +\noindent +\parbox{\textwidth}{ +\begin{center} + \fbox{\fbox{\parbox{5.5in}{\centering + Answer the questions in the spaces provided on the + question sheets. If you run out of room for an answer, + continue on the back of the page.}}} +\end{center} + +\vspace{0.1in} + +\makebox[\textwidth]{Name and section:\enspace\hrulefill} + +\vspace{0.2in} + +\makebox[\textwidth]{Instructor's name:\enspace\hrulefill} +} + +%-------------------------------------------------------------------- +\subsection{Asking questions} +\label{sec:BasicQuestions} + +Once you've typed \verb"\begin{document}" and (if the students will be +writing their answers on the question pages) asked for the student's +name (see section~\ref{sec:BasicName}), you can list the questions +on the exam in a \texttt{questions} environment. You begin each +question with a \verb"\question"\indc{question} command, which is +optionally followed by a number of points inside of square brackets. +For example, if you type +% +\index{questions environment}\index{environment!questions} +\indt{questions} +\begin{verbatim} +\begin{questions} + +\question[10] +Why is there air? + +\question[15] + +How much wood would a woodchuck chuck if a woodchuck could chuck +wood? + +\question[10] Compute $\displaystyle\int_0^1 x^2 \, dx$. +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + +\question[10] +Why is there air? + +\question[15] + +How much wood would a woodchuck chuck if a woodchuck could chuck +wood? + +\question[10] Compute $\displaystyle\int_0^1 x^2 \, dx$. +\end{questions} + +\bigskip + +As the above example illustrates, you can leave blank lines +% +\index{blank lines} between the \verb"\question" command and the +actual beginning of the question, or before the first \verb"\question" +command in the environment, and they will be ignored. The point +values are entirely optional; if you omit the point values, you should +also omit the square brackets containing them. + +If you give the command \verb"\marksnotpoints"\indc{marksnotpoints}, +then the words ``point'' and ``points'' will be replaced by the words +``mark'' and ``marks''. There are many other customizations possible +for the points, including using a different language, changing the way +the points are printed, and by having them printed in one of the +margins. For the full story, see section~\ref{sec:points}. + + +%-------------------------------------------------------------------- +\subsection{Questions with parts, and subparts, and subsubparts} +\label{sec:BasicParts} + +If you want to create a question with parts, you use a +\texttt{parts}\indt{parts} environment and begin each part with the +command \verb"\part"\indc{part}. The \texttt{parts} environment can +be at the beginning of a question or after some text that begins the +question. (There are also \texttt{subparts} and \texttt{subsubparts} +environments; for the full details, see section~\ref{sec:parts}.) For +example, if you type +% +\index{parts environment}\index{environment!parts} +\begin{verbatim} +\begin{questions} +\question[10] +Why is there air? + +\question +What if there were no air? + +\begin{parts} +\part[5] +Describe the effect on the balloon industry. + +\part[5] +Describe the effect on the aircraft industry. +\end{parts} + +\question[20] + +\begin{parts} +\part +Define the universe. Give three examples. + +\part +If the universe were to end, how would you know? + +\end{parts} + + +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} +\question[10] +Why is there air? + +\question +What if there were no air? + +\begin{parts} +\part[5] +Describe the effect on the balloon industry. + +\part[5] +Describe the effect on the aircraft industry. +\end{parts} + +\question[20] + +\begin{parts} +\part +Define the universe. Give three examples. + +\part +If the universe were to end, how would you know? + +\end{parts} + + +\end{questions} + +\bigskip + +The above example illustrates several things: +\begin{itemize} +\item Parts of a question should be put into a + \verb"parts"\indt{parts}\index{parts environment}% + \index{environment!parts} environment. +\item If a question begins with a \verb"parts" environment, then the + first part will appear on the same line with the question number. +\item You can leave blank + % + lines\index{blank lines} before and after the \verb"\part" command, + and they will be ignored. +\item You can assign points either to the question or to the parts of + a question. +\end{itemize} + +%-------------------------------------------------------------------- +\subsection{Leaving space for the answers} +\label{sec:BasicSpace} +\index{space!for answers} +\index{answer space} + +To leave blank space after a question you use the \verb"\vspace" +command, and you end a page with the \verb"\newpage" command. For +example, if you wanted to leave 3~inches of space after the first +question and 2~inches of space after each of the parts of the second +question, your \texttt{questions} environment would contain the +following: +% +\index{blank space}\index{space!blank} +\begin{verbatim} +\question[10] +Why is there air? + +\vspace{3in} + +\question +What if there were no air? + +\begin{parts} +\part[5] +Describe the effect on the balloon industry. +\vspace{2in} + +\part[5] +Describe the effect on the aircraft industry. +\vspace{2in} +\end{parts} +\newpage +\end{verbatim} +If you want to equally distribute the space on a page among several +questions (or parts, or subparts, or subsubparts), you should +type\indc{stretch}\index{space!allocating} +% +\index{allocating space} +\begin{center} + \verb"\vspace{\stretch{1}}" +\end{center} +after each of the questions (or parts, etc.\@) and end the page with +\verb"\newpage". If you'd like one of those questions to receive +twice as much space as each of the others, then follow that one +question with \verb"\vspace{\stretch{2}}" and follow each of the +others with \verb"\vspace{\stretch{1}}". (You can use any decimal +number for the \verb"\stretch" value. For example, +\verb"\vspace{\stretch{1.5}}" will allocate 1.5 times the amount of +space allocated by \verb"\vspace{\stretch{1}}".) + +In addition to leaving blank space, it's also possible to leave lined +space, dotted lined space, space printed with a grid, or an empty box. +For the full story, see section~\ref{sec:LeaveSpace}. + +%-------------------------------------------------------------------- +\subsection{Headers and footers} +\label{sec:BasicHeadFoot} +\index{header|(} +\index{footer|(} + +To produce headers and footers, you give the command\indc{pagestyle} +\begin{center} + \verb"\pagestyle{headandfoot}" +\end{center} +in the preamble (i.e., after the \verb"\documentclass" command and +before the \verb"\begin{document}" command), followed by the commands +that say what will be in the headers and footers. Headers and +footers each have three parts: One part on the left, one centered +part, and one part on the right, and any of these can be empty. + +The headers and footers are determined by the commands% +\indc{firstpageheader}\indc{firstpagefooter}\indc{firstpageheadrule}% +\indc{firstpagefootrule}\indc{runningheader}\indc{runningfooter}% +\indc{runningheadrule}\indc{runningfootrule} +\begin{center} + \begin{tabular}{l@{\qquad}l} + \verb"\firstpageheader"& for the header on the first page,\\ + \verb"\firstpagefooter"& for the footer on the first page,\\ + \verb"\firstpageheadrule"& to put a horizontal rule in the head of + the first page,\\ + \verb"\firstpagefootrule"& to put a horizontal rule in the foot of + the first page,\\[0.5ex] + \verb"\runningheader"& for the header after the first page,\\ + \verb"\runningfooter"& for the footer after the first page\\ + \verb"\runningheadrule"& to put a horizontal rule in the head + after the first page, and\\ + \verb"\runningfootrule"& to put a horizontal rule in the foot + after the first page.\\ + \end{tabular} +\end{center} + +For example, to have the header +% +\samplehead{Math 115}{First Exam}{July 4, 1776}{} +% +on the first page, the header +% +\samplehead{Math 115}{First Exam, Page 2 of 5}{July 4, 1776}{\hrule} +% +on all pages after the first, and no footer on any page, give the +commands +\begin{verbatim} +\pagestyle{headandfoot} +\runningheadrule +\firstpageheader{Math 115}{First Exam}{July 4, 1776} +\runningheader{Math 115} + {First Exam, Page \thepage\ of \numpages} + {July 4, 1776} +\firstpagefooter{}{}{} +\runningfooter{}{}{} +\end{verbatim} + +For another example, to have the header +% +\samplehead{Math 115}{First Exam}{July 4, 1776}{} +% +on the first page, no header on the pages after the first, no footer +on the first page, and the footer +% +\samplefoot{\hrule}{Math 115}{First Exam}{Page 2 of 5} +% +on all pages after the first, give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\firstpageheader{Math 115}{First Exam}{July 4, 1776} +\runningheader{}{}{} +\firstpagefooter{}{}{} +\runningfooter{Math 115}{First Exam}{Page \thepage\ of \numpages} +\runningfootrule +\end{verbatim} + +Sections~\ref{sec:beginexamples} through \ref{sec:endexamples} contain +many other examples of headers and footers, and the full explanation +of the commands for headers and footers is in +sections~\ref{sec:pagestyle}--\ref{sec:QuesSpan}. + +\index{header|)} +\index{footer|)} + +%--------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{The \texttt{\bs documentclass} command} +\label{sec:Documentclass} + +To use the \verb"exam" document class, you should specify \verb"exam" +as the required argument to your +\verb"\documentclass"\indc{documentclass} +command, as in +\begin{center} + \verb"\documentclass{exam}" +\end{center} +or, e.g., if you want to use 12~point type, +\begin{center} + \verb"\documentclass[12pt]{exam}" +\end{center} +There are two possible optional arguments that are specific to the +\verb"exam" document class: +\verb"addpoints"\indcsub{documentclass}{options} and \verb"solutions". +Most documents that use the \verb"exam" document class should use the +option \verb"addpoints" (see section~\ref{sec:addpoints}); the option +\verb"answers" is used when you want to print solutions to the +questions (see section~\ref{sec:answers}). + +%-------------------------------------------------------------------- +\subsection{The option \texttt{addpoints}} +\label{sec:addpoints} + +The \verb"\documentclass" option +\verb"addpoints"\indt{addpoints}\indcsub{documentclass}{options}, used +as in +\begin{center} + \verb"\documentclass[addpoints]{exam}" +\end{center} +or +\begin{center} + \verb"\documentclass[12pt,addpoints]{exam}" +\end{center} +enables the commands that add up the points (see sections +\ref{sec:addup}, \ref{sec:Count}, \ref{sec:pointsofq}, +and~\ref{sec:pointsonp}) and that produce grading tables and point +tables (see sections \ref{sec:GradeTables} and~\ref{sec:PointTables}). +This is an option, rather than the default, mainly for the sake of +maintaining backward compatibility; most documents that use the +\verb"exam" document class should use this option. The only reason +\emph{not} to use the \verb"addpoints" option is that this option +creates an error if you include any words in an argument that assigns +points to a question (see section~\ref{sec:points}). If +\verb"addpoints" is not in effect you can put whatever you want in the +argument for the points, but if \verb"addpoints" \emph{is} in effect +then the argument that contains the points must contain only digits +and the command \verb"\half" (see section~\ref{sec:Half}). + +You can also turn \verb"addpoints" on and off wherever you like in the +exam by using the commands\indc{addpoints}\indc{noaddpoints} +\begin{center} + \begin{tabular}{l} + \verb"\addpoints"\\ + \verb"\noaddpoints" + \end{tabular} +\end{center} +Using the document class option \verb"addpoints" is equivalent to +giving the command \verb"\addpoints" at the beginning of the exam. + +%-------------------------------------------------------------------- +\subsection{The option \texttt{answers}} +\label{sec:answers} + +If you will be typing solutions into the exam (see sections +\ref{sec:solutions}, \ref{sec:CorrectChoice}, +and~\ref{sec:AnsShortAns}) and you'd like the solutions to be printed +on the next run of \LaTeX, you should include the document class +option \verb"answers"\indt{answers}\indcsub{documentclass}{options}, +as in +\begin{center} + \verb"\documentclass[answers]{exam}" +\end{center} +or +\begin{center} + \verb"\documentclass[answers,12pt]{exam}" +\end{center} +or +\begin{center} + \verb"\documentclass[12pt,addpoints,answers]{exam}" +\end{center} +Using the document class option \verb"answers" is equivalent to giving +the command \verb"\printanswers"\indc{printanswers} at the beginning +of the exam (see section~\ref{sec:solutions}). The effect of this is +that +\begin{itemize} +\item the contents of the environments + % + \index{solution environment@\texttt{solution} environment}% + % + \indt{solutionorbox}% + \indt{solutionorlines}\indt{solutionordottedlines}% + \indt{solutionorgrid}\indt{solutionbox} + \begin{center} + \begin{tabular}{l} + \verb"solution",\\ + \verb"solutionorbox",\\ + \verb"solutionorlines",\\ + \verb"solutionordottedlines",\\ + \verb"solutionorgrid", and\\ + \verb"solutionbox" + \end{tabular} + \end{center} + (see section~\ref{sec:solutions}) will be printed, +\item any choices of a \texttt{choices}\indt{choices}, + \texttt{oneparchoices}\indt{oneparchoices}, + \texttt{checkboxes}\indt{checkboxes}, or + \texttt{oneparcheckboxes}\indt{oneparcheckboxes} environment (see + section~\ref{sec:MulChc}) that are created using a + \verb"\CorrectChoice"\indc{CorrectChoice} command (see + section~\ref{sec:CorrectChoice}) instead of a + \verb"\choice"\indc{choice} command will be printed with emphasis as + determined by the argument of the most recent + \verb"\CorrectChoiceEmphasis"\indc{CorrectChoiceEmphasis} command + (which by default is \verb"\bfseries"), and +\item any \verb"\answerline"\indc{answerline} commands (see + section~\ref{sec:ShortAns})\indcsub{answerline}{optional~argument} + that include an optional argument containing the answer (see + section~\ref{sec:AnsShortAns}) will have the answer printed on the + answer line. +\end{itemize} + + +%--------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Questions and points} +\label{sec:QuestionsPoints} + +To create questions, you use a \verb"questions"\indt{questions} +% +environment\index{questions environment}\index{environment!questions} +(see section~\ref{sec:Questions}); each question is begun with a +\verb"\question"\indc{question} command, which takes an optional +argument to assign some number of points\index{points} to the question +(see section~\ref{sec:points}). The questions are numbered +automatically. Point values can include half points (see +section~\ref{sec:Half}). + +If you want a question to have several parts, you use a +% +\verb"parts"\indt{parts}% +\index{parts environment}\index{environment!parts} environment (see +section~\ref{sec:parts}); each part is begun with a +\verb"\part"\indc{part} command, which takes an optional argument to +assign some number of points to the part (see +section~\ref{sec:points}). The parts are numbered automatically. +Similarly, parts can have subparts, and subparts can have subsubparts +(see section~\ref{sec:parts}). + +The points for a question (or part, or subpart, or subsubpart) appear +by default at the beginning of the question (or part, etc.), but there +are commands to have the points appear instead in either the left +margin or in the right margin (see section~\ref{sec:whereprint} and +section~\ref{sec:DrpPts}). The formatting of the points can also be +customized (see sections \ref{sec:Boxed}, \ref{sec:pointname}, +\ref{sec:margins}, and~\ref{sec:pointformat}). It's also possible to +have questions (or parts, etc.) that are worth ``bonus points'', which +are added up separately from the non-bonus points (see +section~\ref{sec:Bonus}). + + +%-------------------------------------------------------------------- +\subsection{Questions} +\label{sec:Questions} + +To type the questions on the exam you use the +% +\verb"questions"\indt{questions}\index{questions environment}% +\index{environment!questions} environment. Each question is then +begun with the command \verb"\question"\indc{question}, and the +questions are numbered automatically. + +For example, if you type +\begin{verbatim} +\begin{questions} + +\question +Why is there air? + +\question + +How much wood would a woodchuck chuck if a woodchuck could chuck +wood? + +\question Compute $\displaystyle\int_0^1 x^2 \, dx$. +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + +\question +Why is there air? + +\question + +How much wood would a woodchuck chuck if a woodchuck could chuck +wood? + +\question Compute $\displaystyle\int_0^1 x^2 \, dx$. +\end{questions} + +\bigskip + +As the above example illustrates, you can leave blank lines +% +\index{blank lines} between the \verb"\question" command and the +actual beginning of the question, or before the first \verb"\question" +command in the environment, and they will be ignored. + + +%--------------------------------------------------------------------- +\subsection{Questions with parts and subparts (and subsubparts)} +\label{sec:parts} + +If you want a question to have several parts, then you use the +% +\verb"parts"\indt{parts}\index{parts environment}% +\index{environment!parts} environment. For example, if you type +\begin{verbatim} +\begin{questions} +\question +Why is there air? + +\question +What if there were no air? + +\begin{parts} +\part +Describe the effect on the balloon industry. + +\part +Describe the effect on the aircraft industry. +\end{parts} + +\question + +\begin{parts} +\part +Define the universe. Give three examples. + +\part +If the universe were to end, how would you know? + +\end{parts} + + +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} +\question +Why is there air? + +\question +What if there were no air? + +\begin{parts} +\part +Describe the effect on the balloon industry. + +\part +Describe the effect on the aircraft industry. +\end{parts} + +\question + +\begin{parts} +\part +Define the universe. Give three examples. + +\part +If the universe were to end, how would you know? + +\end{parts} + + +\end{questions} + +\bigskip + +The above example illustrates several things: +\begin{itemize} +\item Parts of a question should be put into a + \verb"parts"\indt{parts}\index{parts environment}% + \index{environment!parts} environment. +\item If a question begins with a \verb"parts" environment, then the + first part will appear on the same line with the question number. +\item You can leave blank + % + lines\index{blank lines} before and after the \verb"\part" command, + and they will be ignored. +\end{itemize} + +\bigskip + +There is also a \verb"subparts"\indt{subparts}% +\index{subparts environment}\index{environment!subparts} environment, +and even a \verb"subsubparts"\indt{subsubparts}% +\index{subsubparts environment}\index{environment!subsubparts} +environment, and they work just as you would expect. For example, if +you type\indc{subpart}\indc{subsubpart} +\begin{verbatim} +\begin{questions} +\question +\begin{parts} +\part +What do you do with a drunken sailor? + +\part +Is your answer different if it is before noon? + +\end{parts} + +\question +This is the second question. + +\begin{parts} +\part +This is a part. + +\part +This is also a part. + +\begin{subparts} +\subpart +This is a subpart. + +\subpart +This is a periscope. + +\subpart +This is a pair of diving planes. + +\subpart +\begin{subsubparts} +\subsubpart +This is a subsubpart. + +\subsubpart +The lower surface of a diving plane? + +\subsubpart +The ocean floor, perhaps? + +\end{subsubparts} +\end{subparts} + +\part +It's sad to be apart. + +\end{parts} + +\question +\begin{parts} +\part +\begin{subparts} +\subpart +This is a subpart. + +\subpart +This is another subpart. +\end{subparts} +\part +This is another part. + +\end{parts} + + +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} +\question +\begin{parts} +\part +What do you do with a drunken sailor? + +\part +Is your answer different if it is before noon? + +\end{parts} + +\question +This is the second question. + +\begin{parts} +\part +This is a part. + +\part +This is also a part. + +\begin{subparts} +\subpart +This is a subpart. + +\subpart +This is a periscope. + +\subpart +This is a pair of diving planes. + +\subpart +\begin{subsubparts} +\subsubpart +This is a subsubpart. + +\subsubpart +The lower surface of a diving plane? + +\subsubpart +The ocean floor, perhaps? + +\end{subsubparts} +\end{subparts} + +\part +It's sad to be apart. + +\end{parts} + +\question +\begin{parts} +\part +\begin{subparts} +\subpart +This is a subpart. + +\subpart +This is another subpart. +\end{subparts} +\part +This is another part. + +\end{parts} + + +\end{questions} + +The numbers and letters used to number questions, parts, subparts, and +subsubparts can be customized; see section~\ref{sec:CustNumb}. + +%--------------------------------------------------------------------- +\subsection{Point values for the questions} +\label{sec:points} +\indcsub{question}{optional argument} +\indcsub{part}{optional argument} +\indcsub{subpart}{optional argument} +\indcsub{subsubpart}{optional argument} +\index{points|(} + +Each of the commands \verb"\question", \verb"\part", \verb"\subpart", +and \verb"\subsubpart" takes an optional argument, which is the number +of points for that question, part, subpart, or subsubpart. The +default setup is that +\begin{itemize} +\item the point value is printed at the beginning of the question (or + part, or subpart, or subsubpart) (this can be changed to printing in + either the left or right margins on the first line of the question + or in the right margin at the end of the question; see + section~\ref{sec:whereprint} and section~\ref{sec:DrpPts}), and +\item the point value is enclosed in parentheses (this can be changed + to either square brackets or a box; see section~\ref{sec:Boxed}). +\end{itemize} +Both of these things can be further customized; see +section~\ref{sec:qformat} and section~\ref{sec:pointformat}. + +%-------------------------------------------------------------------- +\subsubsection{Where the points will be printed} +\label{sec:whereprint} +\index{points!where printed|(} + +The default is that the point value will be inserted at the beginning +of the question (or part, or subpart, or subsubpart) in parentheses, +but +\begin{itemize} +\item the command \verb"\pointsinmargin"\indc{pointsinmargin} (or, + equivalently, the command + \verb"\pointsinleftmargin"\indc{pointsinleftmargin}) will cause the + point values to be set in the left margin, +\item the command + \verb"\pointsinrightmargin"\indc{pointsinrightmargin} will cause the + point values to be set in the right margin, +\item the command + \verb"\pointstwosided"\indc{pointstwosided} will cause the + point values to be set + \begin{itemize} + \item in the right margin on odd numbered pages and + \item in the left margin on even numbered pages, + \end{itemize} +\item the command + \verb"\pointstwosidedreversed"\indc{pointstwosidedreversed} will + cause the point values to be set + \begin{itemize} + \item in the left margin on odd numbered pages and + \item in the right margin on even numbered pages, and + \end{itemize} +\item the commands \verb"\nopointsinmargin"\indc{nopointsinmargin} and + \verb"\nopointsinrightmargin"\indc{nopointsinrightmargin} are + equivalent, and either of them will revert to the default situation. +\end{itemize} +All of these print the point values on the first line of the question +(or part, or subpart, or subsubpart). There is also a way to print +the point values on the \emph{last} line of the question (or part, +etc.); for this, see section~\ref{sec:DrpPts}. + +\medbreak + +For example, if you type +\begin{verbatim} +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +\end{verbatim} +then, with the default setup, you'll get +\nopointsinmargin +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +(To change the word ``points'', see the commands described in +section~\ref{sec:pointname}.) + +\bigskip If you give the command +\verb"\pointsinmargin"\indc{pointsinmargin} (or, equivalently, +\verb"\pointsinleftmargin"\indc{pointsinleftmargin}), then the above input +will produce instead \pointsinmargin +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +(To have a word (e.g., ``points'', or ``\%'') inside the parentheses +with the point values, see the +\verb"\marginpointname"\indc{marginpointname} command in +section~\ref{sec:pointname}.) + + +\bigskip + +If you give the command +\verb"\pointsinrightmargin"\indc{pointsinrightmargin}, then the above +input will produce instead +% +\pointsinrightmargin +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} + +%-------------------------------------------------------------------- +\subsubsection{Printing the points at the end of the question} +\label{sec:DrpPts} +\index{points!at the end of the question|(} +\indcstart{pointsdroppedatright} +\indcstart{droppoints} + + +Instead of having the point value of a question (or part, or subpart, +or subsubpart) printed on the first line of a question, you can have +it printed in the right margin opposite the \emph{last} line, or even +opposite a blank line following the paragraph. This is done with the +\begin{center} + \verb"\pointsdroppedatright" + \quad and \quad + \verb"\droppoints" +\end{center} +commands. + +If you give the command +\begin{center} + \verb"\pointsdroppedatright" +\end{center} +then point values are not printed until you give the command +\verb"\droppoints" (and they're not printed at all if you don't give +the command \verb"\droppoints"). The only exception to this rule is +that if you've given a \verb"\qformat"\indc{qformat} command (see +section~\ref{sec:qformat}), then question number lines are printed as +specified by the argument to the \verb"\qformat" command even if you +have given the command +\verb"\pointsdroppedatright" + +The command \verb"\droppoints" should be given only at the end of a +paragraph or between paragraphs; if you give it within a paragraph, it +causes the paragraph to end. \verb"\droppoints" prints the point +value in the right margin, formatted as it is when you give the +command \verb"\pointsinrightmargin"\indc{pointsinrightmargin}, except +that the points appear opposite the last line of the paragraph (or, if +the command \verb"\droppoints" is given between paragraphs, then +additional vertical space is left between the paragraphs and the +points are printed opposite the blank space). The formatting can be +changed by giving the commands +\verb"\bracketedpoints"\indc{bracketedpoints}, +\verb"\boxedpoints"\indc{boxedpoints}, or +\verb"\marginpointname"\indc{marginpointname} (see +section~\ref{sec:pointname}) just as if \verb"\pointsinrightmargin" +were in effect. The command \verb"\droppoints" actually works this +way even if one of the commands +\begin{center} + \verb"\nopointsinmargin",\quad \verb"\pointsinmargin",\quad or\quad + \verb"\pointsinrightmargin" +\end{center} +is in effect, but if you use it that way the points will appear twice +on the page, which is probably not what you want. + + +For example, if you give the command \verb"\pointsdroppedatright" and +then type +\begin{verbatim} +\begin{questions} +\question[10] +Describe the implications of the Michelson-Morley ink drop experiment +for the use of punctuation marks such as colons and semicolons that +require multiple drops of ink. +\droppoints + +\question[10] +Prove that the second dual of a finite dimensional real vector space +is naturally isomorphic to the given vector space, except when the +weapon chosen is a single shot pistol.\droppoints + +\end{questions} +\end{verbatim} +then you'll get +\pointsdroppedatright +\begin{questions} +\question[10] +Describe the implications of the Michelson-Morley ink drop experiment +for the use of punctuation marks such as colons and semicolons that +require multiple drops of ink. +\droppoints + +\question[10] +Prove that the second dual of a finite dimensional real vector space +is naturally isomorphic to the given vector space, except when the +weapon chosen is a single shot pistol.\droppoints + +\end{questions} +and if you type +\begin{verbatim} +\begin{questions} +\question[10] +Describe the implications of the Michelson-Morley ink drop experiment +for the use of punctuation marks such as colons and semicolons that +require multiple drops of ink. + +\droppoints + +\question[10] +Prove that the second dual of a finite dimensional real vector space +is naturally isomorphic to the given vector space, except when the +weapon chosen is a single shot pistol. + +\droppoints +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} +\question[10] +Describe the implications of the Michelson-Morley ink drop experiment +for the use of punctuation marks such as colons and semicolons that +require multiple drops of ink. + +\droppoints + +\question[10] +Prove that the second dual of a finite dimensional real vector space +is naturally isomorphic to the given vector space, except when the +weapon chosen is a single shot pistol. + +\droppoints +\end{questions} +\nopointsinmargin + +\indcstop{droppoints} +\indcstop{pointsdroppedatright} +\index{points!at the end of the question|)} +\index{points!where printed|)} + +%-------------------------------------------------------------------- +\subsubsection{Half points} +\label{sec:Half} +\index{points!half|(} +\index{half points|(} + +The point values of questions, parts, subparts, and subsubparts can +include half points. To specify half points, you either +type\indc{half} +\begin{center} + \verb"\half" +\end{center} +immediately following the integer part of the point value or just type +\verb"\half" as the entire point value. That is, the valid point +values and their (default) printed appearances are:\indc{half} +\begin{center} + \begin{tabular}{@{\extracolsep{0.1in}}rccccccc} + Typed:& \verb"0"& \verb"\half"& \verb"1"& \verb"1\half"& \verb"2"& + \verb"2\half"& $\cdots$\\[1ex] + Printed:& 0& \half& 1& 1\half& 2& 2\half& $\cdots$ + \end{tabular} +\end{center} +If you prefer, you can cause the fraction \half{} to be printed as +\makeatletter +\horiz@half. +\makeatother +To do this, you give the +command\indc{usehorizontalhalf}% +\index{customization!\texttt{\char`\\half}}% +\indcsub{half}{customization} +\begin{center} + \verb"\usehorizontalhalf" +\end{center} +after which the printed appearance of point values will be +\usehorizontalhalf +\begin{center} + \begin{tabular}{@{\extracolsep{0.1in}}rccccccc} + Typed:& \verb"0"& \verb"\half"& \verb"1"& \verb"1\half"& \verb"2"& + \verb"2\half"& $\cdots$\\[1ex] + Printed:& 0& \half& 1& 1\half& 2& 2\half& $\cdots$ + \end{tabular} +\end{center} +If you want to return to using the default appearance, you can do that +by giving the command\indc{useslantedhalf} +\begin{center} + \verb"\useslantedhalf" +\end{center} +\useslantedhalf + +\index{half points|)} +\index{points!half|)} + + +%-------------------------------------------------------------------- +\subsubsection{Surrounding the points: Parentheses, brackets, or a box} +\label{sec:Boxed} +\index{customization!points|(} +\index{points!customization|(} + +If you prefer having the points enclosed in brackets instead of in +parentheses, give the command\indc{bracketedpoints} +\begin{center} + \verb"\bracketedpoints" +\end{center} +For example, if you give the command \verb"\bracketedpoints", then the +questions typed above will produce +\nopointsinmargin +\bracketedpoints +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} + + +If you prefer having the points enclosed in a box instead of in +parentheses, give the command\indc{boxedpoints} +\begin{center} + \verb"\boxedpoints" +\end{center} +For example, if you give the command \verb"\boxedpoints", then the +questions typed above will produce +\nopointsinmargin +\boxedpoints +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +If you give the commands \verb"\boxedpoints"\indc{boxedpoints} and +\verb"\pointsinmargin"\indc{pointsinmargin}, then the above questions +will produce +% +\boxedpoints \pointsinmargin +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +If you give the commands \verb"\bracketedpoints"\indc{bracketedpoints} +and \verb"\pointsinrightmargin"\indc{pointsinrightmargin}, then the +above questions will produce +% +\bracketedpoints +\pointsinrightmargin +\begin{questions} +\question[20] +Why is there air? + + +\question +What if there were no air? + +\begin{parts} +\part[10] +Describe the effect on the balloon industry. + +\part[10] +Describe the effect on the aircraft industry. +\end{parts} + +\end{questions} +Other combinations of these commands will produce similar effects. + +If you want to switch back and forth between formats during the exam, +you can do so by giving one of the +commands\indc{boxedpoints}\indc{bracketedpoints}\indc{noboxedpoints} +\indc{nobracketedpoints} +\begin{center} + \begin{tabular}{l} + \verb"\boxedpoints"\\ + \verb"\bracketedpoints"\\ + \verb"\noboxedpoints"\\ + \verb"\nobracketedpoints" + \end{tabular} +\end{center} +whenever you want to switch. (The commands +\verb"\nobracketedpoints" and \verb"\noboxedpoints" are equivalent; +they both return to the default of putting parentheses around the +points.) + +If you want some text (e.g., `` points'', or ``\%'') automatically +inserted along with the point values when using either +\verb"\pointsinmargin", \verb"\pointsinrightmargin", +\verb"\pointstwosided", or \verb"\pointstwosidedreversed", see the +command \verb"\marginpointname" in section~\ref{sec:pointname}. + + + +%--------------------------------------------------------------------- +\subsubsection{Using a substitute for the word ``points''} +\label{sec:pointname} +\index{points!substitute words|(} +\index{points!language|(} + +With the default setup, the number of points is inserted before the +text of the question followed by a single space and the word ``point'' +if the number of points is either \half{} or 1 and by the word +``points'' otherwise. That is, the default is +\verb"\nopointsinmargin"\indc{nopointsinmargin} and +\verb"\noboxedpoints"\indc{noboxedpoints} (see sections +\ref{sec:whereprint} and \ref{sec:Boxed}), and if you type +% +\nopointsinmargin +\noboxedpoints +\begin{verbatim} +\begin{questions} + \question[1] + This is a short question. + + \question[5] + This is a longer question, requiring more thought. +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question[1] + This is a short question. + + \question[5] + This is a longer question, requiring more thought. +\end{questions} +The way this is achieved is: +\begin{itemize} +\item There is a command\indc{points} + \begin{center} + \verb"\points" + \end{center} + whose default definition expands to the word `point' if the number + of points is either \half{} or 1 and to `points' otherwise. (This + behavior can be modified by the command + \verb"\pointpoints"\indc{pointpoints}; see below.) +\item There is a command\indc{pointname} + \begin{center} + \verb"\pointname{Text}" + \end{center} + that causes `Text' to be inserted following the number of points of + a question, part, subpart, or subsubpart. The default setup is the + result of the command\indc{pointname}\indc{points} + \begin{center} + \verb"\pointname{ \points}" + \end{center} + (Note the single space before the command \verb"\points".) +\end{itemize} + +There is also a command\indc{pointpoints} +\begin{center} + \verb"\pointpoints{SingularText}{PluralText}" +\end{center} +that changes the behavior of the \verb"\points" command so that it +expands to `SingularText' if the number of points is \half{} or 1 and +to `PluralText' otherwise. (The default is the result of the command +\verb"\pointpoints{point}{points}"\indc{pointpoints}.) Thus, if you +give the command +\begin{center} + \verb"\pointpoints{Punkt}{Punkte}" +\end{center} +then typing the questions above would result in +\pointpoints{Punkt}{Punkte} +\begin{questions} + \question[1] + This is a short question. + + \question[5] + This is a longer question, requiring more thought. +\end{questions} +There is also a command\indc{marksnotpoints}\index{marks} +\begin{center} + \verb"\marksnotpoints" +\end{center} +that is equivalent to the two +commands\indc{pointpoints}\indc{bonuspointpoints}\index{marks} +\begin{center} + \begin{tabular}{l} + \verb"\pointpoints{mark}{marks}"\\ + \verb"\bonuspointpoints{mark (bonus)}{marks (bonus)}" + \end{tabular} +\end{center} +(the command \verb"\bonuspointpoints" is described in +section~\ref{sec:Bonus}). That command would cause the above +questions to be printed as +% +\pointpoints{mark}{marks} +\begin{questions} + \question[1] + This is a short question. + + \question[5] + This is a longer question, requiring more thought. +\end{questions} + +\bigskip + +For another example, if you give the command\indc{pointname} +\begin{center} +\verb"\pointname{\%}" +\end{center} +then the above questions would be printed as +% +\pointname{\%} +\nopointsinmargin +\noboxedpoints +\begin{questions} + \question[1] + This is a short question. + + \question[5] + This is a longer question, requiring more thought. +\end{questions} +\pointname{ \points} + + +\subsubsection*{Using \texttt{\char`\\marginpointname}} + +Similarly, the command \verb"\marginpointname"\indc{marginpointname} +can be used to affect the text set with the number of points when +\verb"\pointsinmargin"\indc{pointsinmargin} or +\verb"\pointsinrightmargin"\indc{pointsinrightmargin} is in effect. +For example, if you give the commands +\begin{center} + \begin{tabular}{l} + \verb"\pointsinmargin"\\ + \verb"\marginpointname{\%}" + \end{tabular} +\end{center} +and then type +\begin{verbatim} +\question[25] +Where, oh where, has my little dog gone? +\end{verbatim} +then you'll get +\pointsinmargin +\noboxedpoints +\marginpointname{\%} +\begin{questions} +\question[25] +Where, oh where, has my little dog gone? +\end{questions} +unless, e.g., you've also given the command +\verb"\boxedpoints"\indc{boxedpoints} (see section~\ref{sec:Boxed}), +in which case you'll get +% +\pointsinmargin +\boxedpoints +\marginpointname{\%} +\begin{questions} +\question[25] +Where, oh where, has my little dog gone? +\end{questions} +If you give the commands +\begin{center} + \begin{tabular}{l} + \verb"\marksnotpoints"\\ + \verb"\marginpointname{ \points}" + \end{tabular} +\end{center} +then the above will print +\noboxedpoints +\marginpointname{ \points} +\marksnotpoints +\begin{questions} +\question[25] +Where, oh where, has my little dog gone? +\end{questions} +\nopointsinmargin +\marginpointname{} +\pointpoints{point}{points} +\bonuspointpoints{point (bonus)}{points (bonus)} + +Using the default is equivalent to giving the +command\indc{marginpointname} +\begin{center} + \verb"\marginpointname{}" +\end{center} + + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs marginpointname} and enlarging the + margins} +\label{sec:margins} + +The default margins are not very large, and so if you use +\verb"\marginpointname"\indc{marginpointname} (see +section~\ref{sec:pointname}) to place any words along with the point +values in the margin, you may run out of room. The solution to this +problem is to enlarge the margins\index{margins!enlarge} by using the +\verb"\extrawidth"\indc{extrawidth} command with a negative argument +to \emph{decrease} the width of the text area, and thus +\emph{increase} the width of the margins. For example, the commands +\begin{center} + \begin{tabular}{ll} + \verb"\extrawidth{-1in}"\\ + \verb"\marginpointname{ \points}" + \end{tabular} +\end{center} +will increase each of the left and right margins by one half inch, +which will easily leave room for the word ``points''. (See +section~\ref{sec:pagesize} for a discussion of the \verb"\extrawidth" +command.) + +%-------------------------------------------------------------------- +\subsubsection{Completely customizing the points} +\label{sec:pointformat} + +If the customizations described in section~\ref{sec:Boxed} and +section~\ref{sec:pointname} (using \verb"\bracketedpoints", +\verb"\boxedpoints", \verb"\pointpoints", \verb"\pointname", and +\verb"\marginpointname") aren't sufficient, and you don't want to use +the \verb"\qformat" command to create a customized question number +line (see section~\ref{sec:qformat}), you can completely customize the +way the points are printed by using the +commands\indc{pointformat}\indc{bonuspointformat} +\begin{center} + \begin{tabular}{l} + \verb"\pointformat"\\ + \verb"\bonuspointformat" +\end{tabular} +\end{center} +The \verb"\pointformat" command controls the printing of ``regular'' +points (i.e., non-bonus points) and the \verb"\bonuspointformat" +command controls the printing of bonus points (see +section~\ref{sec:Bonus}). + +Each of the commands \verb"\pointformat" and \verb"\bonuspointformat" +takes one argument, and that argument is what actually appears on the +page whether the points are being printed at the beginning of the +question (the default), in the left margin (because of +\verb"\pointsinmargin"), in the right margin (because of +\verb"\pointsinrightmargin"), or dropped in the right margin at the +end of the question (because of \verb"\pointsdroppedatright"). The +arguments to \verb"\pointformat" and \verb"\bonuspointformat" should +contain either the command\indc{thepoints} +\begin{center} + \verb"\thepoints" +\end{center} +(which for non-bonus points prints the number of points followed by +the argument to the last \verb"\pointname"\indc{pointname} command and +for bonus points prints the number of bonus points followed by the +argument to the last \verb"\bonuspointname"\indc{bonuspointname} +command; see section~\ref{sec:pointname}) or the +command\indc{themarginpoints} +\begin{center} + \verb"\themarginpoints" +\end{center} +(which for non-bonus points prints the number of points followed by +the argument to the last \verb"\marginpointname"\indc{marginpointname} +command and for bonus points prints the number of bonus points +followed by the argument to the last +\verb"\marginbonuspointname"\indc{marginbonuspointname} command; see +section~\ref{sec:pointname}). If the argument doesn't contain either +\verb"\thepoints" or \verb"\themarginpoints", then the number of +points will not appear. + +For example, the command \verb"\bracketedpoints" is equivalent to +either\indc{bracketedpoints}\indc{pointformat}% +\indc{bonuspointformat}\indc{thepoints} +\begin{center} + \begin{tabular}{l} + \verb"\pointformat{[\thepoints]}"\\ + \verb"\bonuspointformat{[\thepoints]}" + \end{tabular} +\end{center} +if the points are being printed at the beginning of the question, or +\indc{pointformat}\indc{bonuspointformat}\indc{themarginpoints} +\begin{center} + \begin{tabular}{l} + \verb"\pointformat{[\themarginpoints]}"\\ + \verb"\bonuspointformat{[\themarginpoints]}" + \end{tabular} +\end{center} +if the points are being printed in one of the margins. + +For another example, the command \verb"\boxedpoints" is equivalent to +either\indc{pointformat}\indc{bonuspointformat}\indc{thepoints} +\begin{center} + \begin{tabular}{l} + \verb"\pointformat{\fbox{\thepoints}}"\\ + \verb"\bonuspointformat{\fbox{\thepoints}}" + \end{tabular} +\end{center} +if the points are being printed at the beginning of the question, or +\indc{pointformat}\indc{bonuspointformat}\indc{themarginpoints} +\begin{center} + \begin{tabular}{l} + \verb"\pointformat{\fbox{\themarginpoints}}"\\ + \verb"\bonuspointformat{\fbox{\themarginpoints}}" + \end{tabular} +\end{center} +if the points are being printed in one of the margins. + +For another example, the +commands\indc{marginpointname}\indc{pointsinmargin}\indc{pointformat}% +\indc{pointsinmargin} +\begin{verbatim} +\begin{questions} + \pointsinmargin + \marginpointname{\%} + \pointformat{\slshape (\themarginpoints)} + \question[3] What is the point? +\end{questions} +\end{verbatim} +will produce +\begin{questions} + \pointsinmargin + \marginpointname{\%} + \pointformat{\slshape (\themarginpoints)} + \question[3] What is the point? +\end{questions} + +For another example, the +commands\indc{marginpointname}\indc{pointsinmargin}\indc{pointformat}% +\indc{pointsinrightmargin} +\begin{verbatim} +\begin{questions} + \pointsinrightmargin + \marginpointname{\%} + \pointformat{\fbox{\bfseries\boldmath\themarginpoints}} + \question[3\half] What is the point? +\end{questions} +\end{verbatim} +will produce +\begin{questions} + \pointsinrightmargin + \marginpointname{\%} + \pointformat{\fbox{\bfseries\boldmath\themarginpoints}} + \question[3\half] What is the point? +\end{questions} +\nopointsinmargin (Note: The commands \verb"\bfseries" and +\verb"\boldmath"\indc{boldmath} are both needed here because the +\half{} printed when you use half points is printed in math mode while +the rest of the points are printed in text mode.) + +For another example, the commands\indc{pointformat}\indc{boldmath} +\begin{verbatim} +\begin{questions} + \pointname{} + \pointformat{\bfseries\boldmath(Points for this problem: \thepoints)} + \question[3\half] What is the point? +\end{questions} +\end{verbatim} +will produce +\begin{questions} + \pointname{} + \pointformat{\bfseries\boldmath(Points for this problem: \thepoints)} + \question[3\half] What is the point? +\end{questions} +% Put things back to the default situation, so we don't mess up +% later examples: +\noboxedpoints +\nopointsinmargin +\pointname{ \points} + +\index{points!language|)} +\index{points!substitute words|)} +\index{points!customization|)} +\index{customization!points|)} + +%--------------------------------------------------------------------- +\subsubsection{Questions that begin with a parts environment} +\index{questions!that begin with a parts environment} +\index{points!for both question and part} + +If a question begins with a parts environment, then the question +number and the number of the first part in the parts environment will +be printed on the same line (see section~\ref{sec:parts}). Thus, if +points are assigned to both the question and to the first part, both +of those point values will be printed on the same line. (Note: This +was not true in versions of the \verb"exam" document class earlier +than 2.3. In those versions, only the later of the two point values +would actually be printed.) If \verb"\pointsinmargin" or +\verb"\pointsinrightmargin" are in effect (see +section~\ref{sec:whereprint}), then the two point values will be +printed on top of each other, which is probably not what you want. +The same problem arises if a part begins with a subparts environment +or if a subpart begins with a subsubparts environment. + +If you want to assign points to both a question and to each part of a +parts environment, and if the first part will begin on the same line +as the question, the solution is to either use the default location +(i.e., \verb"\nopointsinmargin") or to put some of the points in the +margin and others not. For example, if you type +\begin{verbatim} +\begin{questions} + \pointsinmargin + \noaddpoints + \question[10] + \begin{parts} + \nopointsinmargin + \addpoints + \part[5] Who put the ``bop'' in the ``bop, sh-bop, sh-bop''? + \part[5] Who put the ``ram'' in the ``rama, rama ding-dong''? + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \pointsinmargin + \noaddpoints + \question[10] + \begin{parts} + \nopointsinmargin + \addpoints + \part[5] Who put the ``bop'' in the ``bop, sh-bop, sh-bop''? + \part[5] Who put the ``ram'' in the ``rama, rama ding-dong''? + \end{parts} +\end{questions} + + + + +%-------------------------------------------------------------------- +\subsubsection{Adding up the points for a question} +\label{sec:addup} +\indt{addpoints} +\indc{addpoints} + +If you use the document class option \verb"addpoints" (as in +\verb"\documentclass[addpoints]{exam}") or give the command +\verb"\addpoints" (see section~\ref{sec:addpoints}), then you can use +the command\indc{droptotalpoints} +\begin{center} + \verb"\droptotalpoints" +\end{center} +to put into the right margin the total number of points for the +current question (including the points for all parts, subparts, and +subsubparts). (Section~\ref{sec:adding} describes a different way to +print the total number of points for a question.) The command +\verb"\droptotalpoints" should be used only at the end of a paragraph +or between paragraphs; if you use it within a paragraph, it causes the +paragraph to end. \verb"\droptotalpoints" prints the total points for +the current question in the right margin, formatted by default as: +% +\par\nobreak\medskip +\makeatletter +\leavevmode\nobreak\hfill +\rlap{%\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{Total for Question 2: 25}% +}% rlap +\makeatother +\par\medskip\noindent +% +(Note: The number of points is followed by the argument to the most +recently executed \verb"\marginpointname"\indc{marginpointname} +command (see section~\ref{sec:pointname}), which by default is empty.) + +If the current question is worth any bonus points (see +section~\ref{sec:Bonus}), then those bonus points will not be counted +by the \verb"\droptotalpoints" command, but they will be counted by +the\indc{droptotalbonuspoints} +\begin{center} + \verb"\droptotalbonuspoints" +\end{center} +command, which puts into the right margin the total number of bonus +points for the current question, formatted by default as: +\par\nobreak\medskip +\makeatletter +\leavevmode\nobreak\hfill +\rlap{%\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{Total for Question 2: 10 (bonus)}% +}% rlap +\makeatother +\par\medskip\noindent +(Note: The number of bonus points is followed by the argument to the +most recently executed +\verb"\marginbonuspointname"\indc{marginbonuspointname} command (see +section~\ref{sec:Bonus}), which by default is `` (bonus)''.) + +You can change the format used by the +\verb"\droptotalpoints"\indc{droptotalpoints} command with +the\indc{totalformat} +\begin{center} + \verb"\totalformat" +\end{center} +command. It takes one argument, and that argument becomes the command +to print the total points, right justified a distance of +\verb"\rightpointsmargin"\indc{rightpointsmargin} from the right edge +of the paper. The argument can contain the +command\indc{totalpoints}\indc{thequestion} +\begin{center} + \begin{tabular}{ll} + \verb"\totalpoints"& to print the number of points, and\\ + \verb"\thequestion"& to print the question number. + \end{tabular} +\end{center} +(\verb"\totalpoints" expands to +\verb"\pointsofquestion{\arabic{question}}"\indc{pointsofquestion}; +see section~\ref{sec:pointsofq} for a discussion of the +\verb"\pointsofquestion" command.) For example, if you give the +command\indc{totalformat}\indc{thequestion}\indc{totalpoints} +\begin{center} + \verb"\totalformat{Question \thequestion: \totalpoints}" +\end{center} +then the total number of points will be printed in the format +% +\par\nobreak\medskip +\makeatletter +\leavevmode\nobreak\hfill +\rlap{%\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{Question 2: 25}% +}% rlap +\makeatother +\par\medskip\noindent +% +and if you give the command\indc{totalformat}\indc{totalpoints} +\begin{center} +\verb"\totalformat{\fbox{Total: \totalpoints}}" +\end{center} +then the total number of points will be printed as +% +\par\nobreak\medskip +\makeatletter +\leavevmode\nobreak\hfill +\rlap{%\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{\fbox{Total: 25}}% +}% rlap +\makeatother +\par\medskip\noindent + +Thus, if you've given the +commands\indc{addpoints}\indc{bracketedpoints}\indc{pointsdroppedatright} +\begin{center} + \begin{tabular}{l} + \verb"\addpoints"\\ + \verb"\bracketedpoints"\\ + \verb"\pointsdroppedatright" + \end{tabular} +\end{center} +and you type +\begin{verbatim} +\question +\begin{parts} +\part[10] +In no more than one paragraph, explain why the earth is round. +\droppoints +\part[10] +What changes to the van Allen radiation belt are needed to +make the earth into a regular icosahedron? +\droppoints +\end{parts} +\droptotalpoints +\end{verbatim} +then you'll get +\addpoints +\pointsdroppedatright +\bracketedpoints +\begin{questions} +\question +\begin{parts} +\part[10] +In no more than one paragraph, explain why the earth is round. +\droppoints +\part[10] +What changes to the van Allen radiation belt are needed to +make the earth into a regular icosahedron? +\droppoints +\end{parts} + \leavevmode\unskip\nobreak\hfill +\makeatletter + \rlap{\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{Total for Question 1: 20}% + }% rlap +\makeatother + \par +%\droptotalpoints +\end{questions} +\noaddpoints \nopointsinmargin \nobracketedpoints If you've also given +the command\indc{totalformat}\indc{totalpoints}\indc{thequestion} +\begin{center} + \verb"\totalformat{Total for Question \thequestion: [\totalpoints]}" +\end{center} +then you'll get +\addpoints +\pointsdroppedatright +\bracketedpoints +\begin{questions} +\question +\begin{parts} +\part[10] +In no more than one paragraph, explain why the earth is round. +\droppoints +\part[10] +What changes to the van Allen radiation belt are needed to +make the earth into a regular icosahedron? +\droppoints +\end{parts} +%\droptotalpoints + \leavevmode\unskip\nobreak\hfill +\makeatletter + \rlap{\hskip\rightmargin % Defined by the list environment + \hskip\@rightmargin % Defined by exam.cls + \hskip-\rightpointsmargin + \llap{Total for Question 1: [20]}% + }% rlap +\makeatother + \par +\end{questions} +\noaddpoints +\nopointsinmargin +\nobracketedpoints + +To change the format used by the +\verb"\droptotalbonuspoints"\indc{droptotalbonuspoints} command, you +use the command\indc{bonustotalformat} +\begin{center} + \verb"\bonustotalformat" +\end{center} +which is analogous to the \verb"\totalformat" command. The argument +to \verb"\bonustotalformat" can contain the +command\indc{totalbonuspoints}\indc{thequestion} +\begin{center} + \begin{tabular}{ll} + \verb"\totalbonuspoints"& to print the number of bonus points, and\\ + \verb"\thequestion"& to print the question number. + \end{tabular} +\end{center} +(\verb"\totalbonuspoints" expands to +\verb"\bonuspointsofquestion{\arabic{question}}"; see +section~\ref{sec:BonusTables} for a discussion of the +\verb"\bonuspointsofquestion"\indc{bonuspointsofquestion} command.) + +\index{points|)} + +%-------------------------------------------------------------------- +\subsubsection{Margin sizes when using \texttt{\bs pointsinmargin} and + \texttt{\bs pointsinrightmargin}} +\index{margins!enlarge|(} + +\begin{itemize} +\item If you give the command + \verb"\pointsinmargin"\indc{pointsinmargin}, then the points are + printed right justified in the left margin, with the right edge a + distance of \verb"\marginpointssep"\indc{marginpointssep} from the + left edge of the text area. The default value of + \verb"\marginpointssep" is the result of the command + \begin{center} + \verb"\setlength{\marginpointssep}{5pt}" + \end{center} + and you can change it by giving a new \verb"\setlength" command. + +\item If you give the command + \verb"\pointsinrightmargin"\indc{pointsinrightmargin}, then the + points are printed right justified in the right margin, with the + right edge a distance of + \verb"\rightpointsmargin"\indc{rightpointsmargin} from the right + edge of the paper. The default value of \verb"\rightpointsmargin" + is the result of the command + \begin{center} + \verb"\setlength{\rightpointsmargin}{1cm}" + \end{center} + and you can change it by giving a new \verb"\setlength" command. +\end{itemize} + +You can change the width of the text area (and, thus, change the width +of the margins) with the \verb"\extrawidth"\indc{extrawidth} command +(see section~\ref{sec:margins}). + +\index{margins!enlarge|)} + +%-------------------------------------------------------------------- +\subsection{Custom question number lines: The \texttt{\bs qformat} + command} +\label{sec:qformat} +\indc{qformat} +\index{questions!customization|(} + +The default setup is for the question number to appear in the left +margin and for the text of the question to begin on that line. It's +possible to change this so that the text of the question starts on the +line following the question number, and the format of the line +containing the question number is determined by the user. This is +done using the \verb"\qformat" command. There is also a +\verb"\noqformat"\indc{noqformat} command, which reverts to the +default setup. + +To use the \verb"\qformat"\indc{qformat} command, you give the command +\begin{center} + \verb"\qformat{Format specification}" +\end{center} +where \texttt{Format specification} must contain some stretchability +(e.g., at least one \verb"\hfill" or \verb"\dotfill" or +\verb"\hrulefill" or \ldots) and can contain the commands +\begin{itemize} +\item \verb"\thequestion"\indc{thequestion}, which expands to the + question number, +\item \verb"\thequestiontitle"\indc{thequestiontitle} (see + section~\ref{sec:questiontitle}), which expands to + \begin{itemize} + \item the title of the question, if this question was defined using + a \verb"\titledquestion"\indc{titledquestion} command (see + section~\ref{sec:TitledQues}) instead of a \verb"\question" + command, or + \item the number of the question, if this question was defined using + a \verb"\question" command, + \end{itemize} +\item \verb"\thepoints"\indc{thepoints}, which expands to + \begin{itemize} + \item the number of points followed by the argument to the last + \verb"\pointname"\indc{pointname} command, if there were points + specified for the question, or + \item nothing, if no points were specified for the question + \end{itemize} + (see section~\ref{sec:pointname} for a discussion of the + \verb"\pointname" command), and +\item \verb"\totalpoints"\indc{totalpoints}, which expands to the + total number of points specified for the question and all of its + parts, subparts, and subsubparts (see section~\ref{sec:addup}). The + command \verb"\totalpoints" expands to + \verb"\pointsofquestion{\arabic{question}}"\indc{pointsofquestion} + (see section~\ref{sec:pointsofq}). +\end{itemize} +For example, if you give the +commands\indc{pointpoints}\indc{points}\indc{thepoints}\indc{thequestion} +% +\pointname{ \points} +\pointpoints{point}{points} +\begin{verbatim} +\qformat{Question \thequestion \dotfill \thepoints} +\begin{questions} +\question[10] +What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +\end{verbatim} +then you'll get +\qformat{Question \thequestion \dotfill \thepoints} +\begin{questions} +\question[10] +What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +% +\medskip +If you instead use the command +\begin{verbatim} +\qformat{\textbf{Question \thequestion}\quad (\thepoints)\hfill} +\end{verbatim} +then you'll get +\begin{questions} +\qformat{\textbf{Question \thequestion}\quad (\thepoints)\hfill} +\question[10] +What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +% +\medskip If you instead use the +command\indc{qformat}\indc{thequestion}\indc{thepoints} +\begin{verbatim} +\qformat{\hfill Question \thequestion\hfill (\thepoints)} +\end{verbatim} +then you'll get +\begin{questions} +\qformat{\hfill Question \thequestion\hfill (\thepoints)} +\question[10] +What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +\noqformat + +If you use a \verb"\qformat"\indc{qformat} (and, if there are any +bonus questions, also a \verb"\bonusqformat"\indc{bonusqformat}; see +section~\ref{sec:Bonus}), so that there are no labels on any of the +questions, and you'd like to remove the +indentation\index{indentation!remove} of the questions, you should +give the command +\begin{verbatim} +\renewcommand{\questionshook}{% + \setlength{\leftmargin}{0pt}% + \setlength{\labelwidth}{-\labelsep}% +} +\end{verbatim} +(see section~\ref{sec:CustList}) before the \texttt{questions} +environment. + +\index{questions!customization|)} + +%-------------------------------------------------------------------- +\subsubsection{Adding up the points for a question} +\label{sec:adding} +\index{points!adding} + +You can combine \verb"\qformat"\indc{qformat} with the +\verb"\totalpoints"\indc{totalpoints} command (see +section~\ref{sec:addup}): If you assign points only to parts, +subparts, and subsubparts of questions, but none to the questions +themselves, and you give the +command\indc{thequestion}\indc{totalpoints} +\begin{verbatim} +\qformat{Question \thequestion\dotfill \emph{\totalpoints\ points}} +\end{verbatim} +(you must have used the document class option +\verb"addpoints"\indt{addpoints} or given the command +\verb"\addpoints"\indc{addpoints} in order to use the +\verb"\totalpoints" command; see section~\ref{sec:addpoints}), then +you can type +\begin{verbatim} +\begin{questions} + \question + \begin{parts} + \part[10] + In no more than one paragraph, explain why the earth is round. + \part[10] + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + \end{parts} +\end{questions} +\end{verbatim} +and you'll get +% +\nopointsinmargin +\qformat{Question \thequestion\dotfill \emph{20 points}} +\begin{questions} + \question + \begin{parts} + \part[10] + In no more than one paragraph, explain why the earth is round. + \part[10] + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + \end{parts} +\end{questions} +\noqformat + +For another method of printing the total points for a question, see +the \verb"\droptotalpoints" command in section~\ref{sec:addup}. + + +%-------------------------------------------------------------------- +\subsection{Titled questions} +\label{sec:Titled} + +The \verb"\titledquestion"\indc{titledquestion} command (see +section~\ref{sec:TitledQues}) allows you to assign a \emph{title} to a +question, and to have the question title replace the question number +in a grading table or point table indexed by question number (see +sections \ref{sec:GradeTables} and~\ref{sec:PointTables}). If you use +a \verb"\qformat"\indc{qformat} (see section~\ref{sec:qformat}) then +you can include the question title in the question by using the +\verb"\thequestiontitle"\indc{thequestiontitle} command (see the +example in section~\ref{sec:questiontitle}). + + +%-------------------------------------------------------------------- +\subsubsection{\texttt{\bs titledquestion}} +\label{sec:TitledQues} + +The command \verb"\titledquestion"\indc{titledquestion} is a +replacement for \verb"\question"\indc{question}; it takes one required +argument, the title, and one optional argument, the point value, as in +\begin{center} + \verb"\titledquestion{Question \thequestion: Concepts}" +\end{center} +which sets the question title to ``Question 2: Concepts'' (if this is +the second question) and doesn't set any point values, or +\begin{center} + \verb"\titledquestion{Design}[10]" +\end{center} +which sets the question title to ``Design'' and sets the point value +to ``10''. Note that the question title doesn't include the number of +the question unless you put it there using the +\verb"\thequestion"\indc{thequestion} command. + +Using \verb"\titledquestion"\indc{titledquestion} instead of +\verb"\question" doesn't change the appearance of the question (unless +you use \verb"\thequestiontitle"\indc{thequestiontitle} in the +argument of a \verb"\qformat"\indc{qformat} command; see +section~\ref{sec:questiontitle}). The only direct effect of using +\verb"\titledquestion" instead of \verb"\question" is that if you +print a grading table or point table indexed by question number (see +section~\ref{sec:GradeTables}), then the title of the question will +replace the number of the question in the table. To have the title of +the question appear in the question itself, see the example in +section~\ref{sec:questiontitle}. + +If you create a grading table or point table indexed by question +number and you create a question using the +\verb"\titledquestion"\indc{titledquestion} command, then the number +of the +% +question\index{question number} won't appear in the table unless you +include \verb"\thequestion"\indc{thequestion} in the title of the +question. + +%-------------------------------------------------------------------- +\subsubsection{\texttt{\bs thequestiontitle}} +\label{sec:questiontitle} + +The command \verb"\thequestiontitle"\indc{thequestiontitle} expands to +\begin{itemize} +\item the title of the question (if the question was defined using a + \verb"\titledquestion"\indc{titledquestion} command) or +\item the number of the +% + question\index{question number} (if the question was defined using a + \verb"\question"\indc{question} command). +\end{itemize} +This is for use in the argument of a \verb"\qformat"\indc{qformat} +command (see section~\ref{sec:qformat}), so that you can have the +question title appear in the question itself, and not just in a +grading table or point table. + +The contents of \verb"\thequestiontitle"\indc{thequestiontitle} don't +appear anywhere in the question itself unless you do something to make +them appear. For example, if you give the command +\begin{center} +\verb"\qformat{Question \thequestion: \thequestiontitle\dotfill\thepoints}" +\end{center} +and then type\indc{titledquestion} +\begin{verbatim} +\begin{questions} + \titledquestion{History of Empirical Aerodynamics}[10] + What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \qformat{Question \thequestion: \thequestiontitle\dotfill\thepoints} + \titledquestion{History of Empirical Aerodynamics}[10] + What did Billy Joe MacAllister throw off the Tallahatchie Bridge? +\end{questions} +\noqformat + +If the command \verb"\thequestiontitle" is never used, then the only +effect of using the command \verb"\titledquestion" instead of the +command \verb"\question" is that, in a grading table or point table +indexed by question number, this question will be indexed by the title +of the question rather than by the question number, and the title of +the question will never appear except in the table. + +%-------------------------------------------------------------------- +\subsection{Bonus points} +\label{sec:Bonus} +\index{bonus points|(} +\index{points!bonus|(} + +It's possible to create questions, parts, subparts, or subsubparts +that are worth \emph{bonus points}, instead of regular points. To do +this, you use the +command\indc{bonusquestion}\indc{bonustitledquestion}% +\indc{bonuspart}\indc{bonussubpart}\indc{bonussubsubpart} +\begin{center} + \begin{tabular}{l@{\qquad instead of\qquad}l} + \verb"\bonusquestion"& \verb"\question",\\ + \verb"\bonustitledquestion"& \verb"\titledquestion",\\ + \verb"\bonuspart"& \verb"\part",\\ + \verb"\bonussubpart"& \verb"\subpart", and\\ + \verb"\bonussubsubpart"& \verb"\subsubpart". + \end{tabular} +\end{center} +There is also a \verb"\bonusqformat"\indc{bonusqformat} command that +affects the \verb"\bonusquestion"\indc{bonusquestion} command in the +same way that the \verb"\qformat"\indc{qformat} command affects the +\verb"\question" command (see section~\ref{sec:qformat}), and a +\verb"\nobonusqformat"\indc{nobonusqformat} command that cancels the +effect of \verb"\bonusqformat" in the same way that +\verb"\noqformat"\indc{noqformat} cancels the effect of +\verb"\qformat". Note that the command +\verb"\thepoints"\indc{thepoints} is defined so that it works equally +well in \verb"\qformat" and \verb"\bonusqformat"\indc{bonusqformat} +commands (see section~\ref{sec:qformat}). + +If \indc{bonusquestion}\indc{bonustitledquestion}% +\indc{bonuspart}\indc{bonussubpart}\indc{bonussubsubpart}% +you don't assign any points to a \verb"\bonusquestion", +\verb"\bonuspart", \verb"\bonussubpart", or \verb"\bonussubsubpart" +then, aside from the fact that \verb"\bonusqformat" alters +\verb"\bonusquestion" while \verb"\qformat" alters \verb"\question", +then they're printed in the same way that they would be printed if you +had used the corresponding non-bonus command. However, if you assign +points, then +\begin{itemize} +\item the points are typeset differently (see below), +\item {\sloppy the points are not counted by the + \verb"\gradetable"\indc{gradetable}\indc{pointtable}% + \indc{bonusgradetable}\indc{bonuspointtable}% + \indc{combinedgradetable}\indc{combinedpointtable}% + or \verb"\pointtable" commands (see sections \ref{sec:GradeTables} + and~\ref{sec:PointTables}) or their partial variants (see + section~\ref{sec:PartialTable}), though they \emph{are} counted by + the \verb"\bonusgradetable", \verb"\bonuspointtable", + \verb"\combinedgradetable", and \verb"\combinedpointtable" + commands and their partial variants (see + sections~\ref{sec:BonusTables} and \ref{sec:CombinedTables}),\par} +\item the points are not counted by the + \verb"\droptotalpoints"\indc{droptotalpoints} command (see + section~\ref{sec:addup}), though they are counted by the + \verb"\droptotalbonuspoints"\indc{droptotalbonuspoints} command (see + below), +\item the points are not counted by the + \verb"\pointsofquestion"\indc{pointsofquestion} (see + section~\ref{sec:pointsofq}) or + \verb"\pointsonpage"\indc{pointsonpage} (see + section~\ref{sec:pointsonp}) commands, though they \emph{are} + counted by the + \verb"\bonuspointsofquestion"\indc{bonuspointsofquestion} and + \verb"\bonuspointsonpage"\indc{bonuspointsonpage} (see + section~\ref{sec:BonusTables}) commands, and +\item the points are not counted by the + \verb"\numpoints"\indc{numpoints} command (see + section~\ref{sec:Count}), though they \emph{are} counted by the + \verb"\numbonuspoints"\indc{numbonuspoints} command (see + section~\ref{sec:Count}). +\end{itemize} + +The default setup is that if you type +\begin{verbatim} +\begin{questions} + \question[10] Who discovered America? + \bonusquestion[1] On what day of the week did he do it? + \bonusquestion[2] What color shirt was he wearing? +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question[10] Who discovered America? + \bonusquestion[1] On what day of the week did he do it? + \bonusquestion[2] What color shirt was he wearing? +\end{questions} + +There is also a command +\verb"\bonuspointpoints"\indc{bonuspointpoints} that is analogous to +\verb"\pointpoints" (see section~\ref{sec:pointname}); the default +setup was created by the command +\begin{center} + \verb"\bonuspointpoints{point (bonus)}{points (bonus)}" +\end{center} +and if you give the command +\begin{center} + \verb"\bonuspointpoints{bonus point}{bonus points}" +\end{center} +then typing the above would produce\indc{bonuspointpoints} +\begin{questions} + \bonuspointpoints{bonus point}{bonus points} + \question[10] Who discovered America? + \bonusquestion[1] On what day of the week did he do it? + \bonusquestion[2] What color shirt was he wearing? +\end{questions} +There are also +commands\indc{bonuspointname}\indc{marginbonuspointname} +\begin{center} + \begin{tabular}{l} + \verb"\bonuspointname" and\\ + \verb"\marginbonuspointname" + \end{tabular} + \qquad that are analogous to\qquad + \begin{tabular}{l} + \verb"\pointname" and\\ + \verb"\marginpointname" + \end{tabular} +\end{center} +(see section~\ref{sec:pointname}), and +commands\indc{droptotalpoints}\indc{bonustotalformat}% +\indc{totalbonuspoints} +\begin{center} + \begin{tabular}{l} + \verb"\droptotalbonuspoints",\\ + \verb"\bonustotalformat", and\\ + \verb"\totalbonuspoints" + \end{tabular} + \qquad that are analogous to\qquad + \begin{tabular}{l} + \verb"\droptotalpoints",\\ + \verb"\totalformat", and\\ + \verb"\totalpoints" + \end{tabular} +\end{center} +(see section~\ref{sec:addup}). + +\index{points!bonus|)} +\index{bonus points|)} + + +%-------------------------------------------------------------------- +\subsection{Counting the questions and adding up the points} +\label{sec:Count} +\index{questions!counting|(} + + +The \verb"exam" document class automatically counts the numbers of +questions, parts, and subparts, and makes these numbers available as +the macros\indc{numquestions}\indc{numparts}\indc{numsubparts}% +\indc{numsubsubparts} +\begin{center} + \begin{tabular}{l} + \verb"\numquestions"\\ + \verb"\numparts"\\ + \verb"\numsubparts"\\ + \verb"\numsubsubparts" + \end{tabular} +\end{center} +These numbers are also printed on the screen when you run \LaTeX{} and +they are placed into the \verb".log" file as well. If you have more +than one \verb"questions" environment (for example, if your exam has +several parts, with the questions in each part numbered beginning with +``1''), then \verb"\numquestions" will hold the total number of +questions on the exam. If you do have more than one \verb"questions" +environment, though, you won't be able to use the +\verb"\gradetable"\indc{gradetable} or +\verb"\pointtable"\indc{pointtable} commands (see +section~\ref{sec:Tables}). + +If you use the document class option \verb"addpoints"\indt{addpoints} +or give the command \verb"\addpoints"\indc{addpoints} (see +section~\ref{sec:addpoints}), then the class will add the total number +of points and the total number of bonus points (see +section~\ref{sec:Bonus}) that you've given to all of the questions, +parts, subparts, and subsubparts of the exam, and make those totals +available in the macros\indc{numpoints}\indc{numbonuspoints} +\begin{center} + \begin{tabular}{l} + \verb"\numpoints"\\ + \verb"\numbonuspoints" + \end{tabular} +\end{center} +as well as displaying those totals on the screen when you run \LaTeX{} +and placing them into the \texttt{.log} file. You can then type +\begin{verbatim} +\begin{center} + This exam has \numquestions\ questions, for a total of \numpoints\ + points and \numbonuspoints\ bonus points. +\end{center} +\end{verbatim} +and you'll get +\begin{center} + This exam has 8 questions, for a total of 120 points and 10 bonus + points. +\end{center} + +\emph{Warning}: If \verb"addpoints"\indt{addpoints} is in effect, your +point values for questions, parts, subparts, and subsubparts must not +contain anything other than digits and the command \verb"\half" (see +section~\ref{sec:Half}). For example, if you \emph{don't} give the +command \verb"\addpoints", then you can +% +type\index{points!acceptable entries} +\begin{center} + \verb"\question[10\%]" +\end{center} +with no problems, but this will cause errors if you've given the +command \verb"\addpoints"\indc{addpoints}. The correct way to +accomplish what you want is to give the command +\verb"\marginpointname{\%}"\indc{marginpointname} or +\verb"\pointname{\%}"\indc{pointname} and then type +\verb"\question[10]" (see section~\ref{sec:pointname}). + +If you want to temporarily turn off the adding of points (for example, +if you list both the total points for each question and the points for +each part, but you don't want to count the points twice), you can give +the command\indc{noaddpoints} +\begin{center} + \verb"\noaddpoints" +\end{center} +to turn off the adding of points and the command \verb"\addpoints" to +turn it back on. + +If \verb"addpoints"\indc{addpoints} is in effect, then you can create +grading tables (see section~\ref{sec:GradeTables}) and point tables +(see section~\ref{sec:PointTables}) and use the commands +\verb"\pointsofquestion" (see section~\ref{sec:pointsofq}) and +\verb"\pointsonpage" (see section~\ref{sec:pointsonp}). + +\index{questions!counting|)} + +%--------------------------------------------------------------------- +\subsection{Referring to specific questions by number (cross + references)} +\index{cross references|(} + +You can use the standard \LaTeX{} commands \verb"\label" and +\verb"\ref" to refer to questions (or parts, or subparts, or +subsubparts) by number. For example, if you type +\begin{verbatim} +The first question is question number~\ref{ques:first}. +Question number~\ref{ques:second} has both a good part +(part~\ref{part:good}) and a bad part (part~\ref{part:bad}). + +\begin{questions} +\question +\label{ques:first} +This is the first question. + +\question +\label{ques:second} +\begin{parts} +\part +\label{part:good} +This is the good part. + +\part +\label{part:bad} +This is the \emph{bad} part. +\end{parts} + +\question +Is there a question? +\end{questions} +\end{verbatim} +then you'll get: + +\medskip + +The first question is question number~\ref{ques:first}. +Question number~\ref{ques:second} has both a good part +(part~\ref{part:good}) and a bad part (part~\ref{part:bad}). + +\begin{questions} +\question +\label{ques:first} +This is the first question. + +\question +\label{ques:second} +\begin{parts} +\part +\label{part:good} +This is the good part. + +\part +\label{part:bad} +This is the \emph{bad} part. +\end{parts} + +\question +Is there a question? +\end{questions} + + + +\bigskip + +As with all other cross references in \LaTeX, you'll have to run your +file through \LaTeX{} \emph{twice} to be sure that all the cross +references are correct. + +\index{cross references|)} + +%-------------------------------------------------------------------- +\subsection{Customizing the numbers} +\label{sec:CustNumb} +\index{customization!question numbers|(} + + +The default setup is that: +\begin{questions} + \question Question numbers are arabic, and are followed by a period. + \begin{parts} + \part Part numbers are lower case letters, and are enclosed in + parentheses. + \begin{subparts} + \subpart Subpart numbers are lower case roman, and are followed + by a period. + \begin{subsubparts} + \subsubpart Subsubpart numbers are greek, and are followed by + a right parenthesis. + \begin{choices} + \choice Choices are upper case letters, and are followed by + a period. + \end{choices} + \end{subsubparts} + \end{subparts} + \end{parts} +\end{questions} +All of this can be changed. + +\bigskip + +To change the type of numbering, you would redefine the +commands\indc{thequestion}\indc{thepartno}\indc{thesubpart}% +\indc{thesubsubpart}\indc{thechoice} +\begin{center} + \begin{tabular}{l} + \verb"\thequestion"\\ + \verb"\thepartno"\\ + \verb"\thesubpart"\\ + \verb"\thesubsubpart"\\ + \verb"\thechoice" + \end{tabular} +\end{center} +(Note: The second one listed there is \verb"\thepartno", \emph{not} +\verb"\thepart". The command \verb"\thepart" refers to the counter +used in the article document class standard sectioning command +\verb"\part".) The numbering commands available +are\indc{arabic}\indc{alph}\indc{Alph}\indc{roman}% +\indc{Roman}\indc{greeknum} +\begin{center} + \begin{tabular}{ll} + \verb"\arabic"& Regular arabic integers\\ + \verb"\alph"& Lower case letters\\ + \verb"\Alph"& Upper case letters\\ + \verb"\roman"& Lower case roman numbers\\ + \verb"\Roman"& Upper case roman numbers\\ + \verb"\greeknum"& Greek letters + \end{tabular} +\end{center} +and any of these can be applied to the +counters\index{question counter}\index{part counter}% +\index{subpart counter}\index{subsubpart counter}% +\index{choice counter}% +\verb"question"\indt{question}, \verb"partno"\indt{partno}, +\verb"subpart"\indt{subpart}, \verb"subsubpart"\indt{subsubpart}, and +\verb"choice"\indt{choice}. (The \verb"\greeknum"\indc{greeknum} +command is defined by the exam document class, but all of the others +are standard \LaTeX{} commands.) + +For example, to have questions numbered using upper case roman numbers +and parts numbered using upper case letters, you would give the +commands\indc{thequestion}\indc{thepartno} +\begin{center} + \begin{tabular}{l} + \verb"\renewcommand{\thequestion}{\Roman{question}}"\\ + \verb"\renewcommand{\thepartno}{\Alph{partno}}" + \end{tabular} +\end{center} + +\bigskip + + +The ``decorations'' around the numbers (i.e., the periods, or +parentheses, or \ldots) are determined by the +commands\indc{questionlabel}\indc{partlabel}\indc{subpartlabel}% +\indc{subsubpartlabel}\indc{choicelabel} +\begin{center} + \begin{tabular}{l} + \verb"\questionlabel"\\ + \verb"\partlabel"\\ + \verb"\subpartlabel"\\ + \verb"\subsubpartlabel"\\ + \verb"\choicelabel" + \end{tabular} +\end{center} +the default definitions of which are: +\begin{center} + \begin{tabular}{l} + \verb"\newcommand{\questionlabel}{\thequestion.}"\\ + \verb"\newcommand{\partlabel}{(\thepartno)}"\\ + \verb"\newcommand{\subpartlabel}{\thesubpart.}"\\ + \verb"\newcommand{\subsubpartlabel}{\thesubsubpart)}"\\ + \verb"\newcommand{\choicelabel}{\thechoice.}" + \end{tabular} +\end{center} +You can change any of these by giving \verb"\renewcommand" commands to +redefine them. This can, of course, be used to change the +``decorations'' around the numbers, but there are other uses as well. +For example, if you use the Fourier project's Utopia +font\index{Utopia~font} by including the commands +\begin{center} + \begin{tabular}{l} + \verb"\usepackage[T1]{fontenc}"\\ + \verb"\usepackage{fourier}" + \end{tabular} +\end{center} +after your \verb"\documentclass" command, then you'll see that the +kerning\index{kerning} makes ``\verb"F."" look so much like +``\verb"E"" that a student could confuse the two. You can turn off +the kerning with the command +\verb"\renewcommand{\choicelabel}{\thechoice{}.}"\indc{choicelabel}. + +\index{customization!question numbers|)} + + +%-------------------------------------------------------------------- +\subsection{Customizing the list parameters} +\label{sec:CustList} +\index{list environment|(} +\index{environment!list|(} +\index{customization!list parameters|(} + +The environments \texttt{questions}, \texttt{parts}, +\texttt{subparts}, \texttt{subsubparts}, \texttt{choices}, and +\texttt{checkboxes} are all implemented as \LaTeX{} \texttt{list} +environments. This section describes commands for advanced users who +want to customize the list parameters (\verb"\topsep"\indc{topsep}, +\verb"\partopsep"\indc{partopsep}, \verb"\itemsep"\indc{itemsep}, +\verb"\parsep"\indc{parsep}, etc.) for the lists that those +environments create. + +The \verb"exam" document class includes the expansion +of\indc{questionshook}\indc{partshook}\indc{subpartshook}% +\indc{subsubpartshook}\indc{choiceshook}\indc{checkboxeshook} +\begin{center} + \begin{tabular}{l@{\qquad when creating a\qquad}l@{\qquad}l} + \verb"\questionshook"&\verb"questions"&environment,\\ + \verb"\partshook"&\verb"parts"&environment,\\ + \verb"\subpartshook"&\verb"subparts"&environment,\\ + \verb"\subsubpartshook"&\verb"subsubparts"&environment,\\ + \verb"\choiceshook"&\verb"choices"&environment, and\\ + \verb"\checkboxeshook"&\verb"checkboxes"&environment. + \end{tabular} +\end{center} +The \verb"exam" document class defines these as follows: +\begin{center} + \begin{tabular}{ll} + \verb"\newcommand{\questionshook}{}"\\ + \verb"\newcommand{\partshook}{}"\\ + \verb"\newcommand{\subpartshook}{}"\\ + \verb"\newcommand{\subsubpartshook}{}"\\ + \verb"\newcommand{\choiceshook}{}"\\ + \verb"\newcommand{\checkboxeshook}{}" + \end{tabular} +\end{center} +Thus, the default is that these commands have no effect, but you can +change any of them with a \verb"\renewcommand" command. Thus, if you +redefine, e.g., \verb"\questionshook" to expand to commands that set +values for some of the list parameters, then those values will be used +in the \verb"questions" environment. + +For example, if you give the command\indc{questionshook} +\begin{center} + \verb"\renewcommand{\questionshook}{\setlength{\itemsep}{1in}}" +\end{center} +then there will be an additional one inch of blank space inserted +between questions (since the questions are the items in a +\verb"questions" environment). For another example, if you give the +command\indc{partshook} +\begin{center} + \verb"\renewcommand{\partshook}{\setlength{\topsep}{0.5in}}" +\end{center} +then each parts environment will have an additional one half inch of +space before and after the environment. + +For another example, if you're using a \verb"\qformat"\indc{qformat} +(see section~\ref{sec:qformat}) (and, if there are any bonus +questions, also a \verb"\bonusqformat"\indc{bonusqformat}; see +section~\ref{sec:Bonus}), so that there are no labels on any of the +questions, and you'd like to remove the indentation of the questions, +give the +command\index{indentation!remove}\indc{leftmargin}\indc{labelsep} +\begin{verbatim} +\renewcommand{\questionshook}{% + \setlength{\leftmargin}{0pt}% + \setlength{\labelwidth}{-\labelsep}% +} +\end{verbatim} + +\index{customization!list parameters|)} +\index{environment!list|)} +\index{list environment|)} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Multiple choice and fill in the blank questions} +\label{sec:MulChc} +\index{multiple choice} + +There are four environments for listing the possible answers to a +multiple choice question: two of them label the choices, and the other +two print checkboxes in front of the choices for the student to place +checks next to the chosen answers. +\begin{itemize} +\item The first two environments use upper case letters (i.e., ``A'', + ``B'', ``C'', \ldots) to label the choices. (To change the + appearance of the labels, see section~\ref{sec:CustNumb}.) + \begin{itemize} + \item The \verb"choices"\indt{choices}\index{choices environment}% + \index{environment!choices} environment creates a list environment + with the choices as the items in the list (see + section~\ref{sec:choices}). + \item The \verb"oneparchoices"\indt{oneparchoices}% + \index{oneparchoices environment}% + \index{environment!oneparchoices} environment lists all of the + choices in a single paragraph which is a continuation of the + paragraph preceding the environment unless you leave a blank line + before beginning the environment (see + section~\ref{sec:oneparchoices}). + \end{itemize} + If you don't want the students to just circle the correct choices, + you can use the \verb"\answerline"\indc{answerline} command to print + a line on which the answer should be written (see + section~\ref{sec:ShortAns}). The + \verb"\anwerline"\indcsub{answerline}{optional~argument} + command allows you to include as an optional argument the answer to + the question, and the answer will be printed on the line when + solutions are bing printed (see section~\ref{sec:AnsShortAns}). +\item The last two environments print checkboxes in front of the + choices for the students to use to place checks next to the chosen + answers. + \begin{itemize} + \item The \verb"checkboxes"\indt{checkboxes}% + \index{checkboxes environment}% + \index{environment!checkboxes} environment creates a list + environment with the choices as the items in the list (see + section~\ref{sec:checkboxes}). + \item The \verb"oneparcheckboxes"\indt{oneparcheckboxes}% + \index{oneparcheckboxes environment}% + \index{environment!oneparcheckboxes} environment lists all of the + choices in a single paragraph which is a continuation of the + paragraph preceding the environment unless you leave a blank line + before beginning the environment (see + section~\ref{sec:oneparcheckboxes}). + \end{itemize} +\end{itemize} +All of those environments allow you to designate one or more choices +as correct choices and to have the correct choices printed with +emphasis when solutions are being printed (see +section~\ref{sec:CorrectChoice}). + +%-------------------------------------------------------------------- +\subsection{The \texttt{choices} environment} +\label{sec:choices} +\indt{choices} +\indc{choice} +\index{choices environment} +\index{environment!choices} + +For example, if you type +\begin{verbatim} +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? +\begin{choices} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{choices} + +\end{questions} +\end{verbatim} +Then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? +\begin{choices} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{choices} + +\end{questions} +As that example illustrates, you can leave blank lines between the +\verb"\choice" command and the text of the choice, or between the +various choices, and those blank lines will be ignored. + +%-------------------------------------------------------------------- +\subsection{The \texttt{oneparchoices} environment} +\label{sec:oneparchoices} +\indt{oneparchoices} +\indc{choice} +\index{oneparchoices environment} +\index{environment!oneparchoices} + +If you use a \verb"oneparchoices" environment instead of the +\verb"choices" environment in the example of +section~\ref{sec:choices}, then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? +\begin{oneparchoices} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{oneparchoices} + +\end{questions} + +If you insert a blank line before the \verb"\begin{oneparchoices}", + then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? + +\begin{oneparchoices} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{oneparchoices} + +\end{questions} + + +If you insert a blank line before the \verb"\begin{oneparchoices}" and + \verb"\answerline" after the \verb"\end{oneparchoices}" (see +section~\ref{sec:ShortAns} for a description of the +\verb"\answerline"\indc{answerline} command), then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? + +\begin{oneparchoices} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{oneparchoices} +\answerline + +\end{questions} + +%-------------------------------------------------------------------- +\subsection{The \texttt{checkboxes} environment} +\label{sec:checkboxes} +\indt{checkboxes} +\indc{choice} +\index{checkboxes environment} +\index{environment!checkboxes} + +If you use a \texttt{checkboxes} environment instead of the +\texttt{choices} environment in the example of +section~\ref{sec:choices}, then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? +\begin{checkboxes} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{checkboxes} + +\end{questions} +The appearance of the checkbox can be customized (see +section~\ref{sec:MulChceCust}). + + +%-------------------------------------------------------------------- +\subsection{The \texttt{oneparcheckboxes} environment} +\label{sec:oneparcheckboxes} +\indt{oneparcheckboxes} +\indc{choice} +\index{oneparcheckboxes environment} +\index{environment!oneparcheckboxes} + +If you use a \verb"oneparcheckboxes" environment instead of the +\verb"choices" environment in the example of +section~\ref{sec:choices}, then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? +\begin{oneparcheckboxes} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{oneparcheckboxes} + +\end{questions} + +If you insert a blank line before the \verb"\begin{oneparcheckboxes}", + then you'll get +\begin{questions} +\question +One of these things is not like the others; one of these things is not +the same. Which one is different? + +\begin{oneparcheckboxes} +\choice John +\choice Paul + +\choice + +George + +\choice Ringo + +\choice Socrates + +\end{oneparcheckboxes} + +\end{questions} +The appearance of the checkbox can be customized (see +section~\ref{sec:MulChceCust}). + + + +%-------------------------------------------------------------------- +\subsection{Solutions to multiple choice questions} +\label{sec:CorrectChoice} +\index{solutions} +\index{choices environment!correct choice} +\index{environment!choices!correct choice} +\index{oneparchoices environment!correct choice} +\index{environment!oneparchoices!correct choice} +\index{checkboxes environment!correct choice} +\index{environment!checkboxes!correct choice} +\index{oneparcheckboxes environment!correct choice} +\index{environment!oneparcheckboxes!correct choice} + + +The \verb"exam" document class defines several environments for +solutions (see section~\ref{sec:solutions}), the contents of which +will be printed only if you use the document class option +\verb"answers"\indt{answers} (as in +\verb"\documentclass[answers]{exam}") or give the command +\verb"\printanswers"\indc{printanswers} (see +section~\ref{sec:answers}). Each of the environments for multiple +choice questions (see +sections~\ref{sec:choices}--\ref{sec:oneparcheckboxes}) allows you to +designate one or more of the choices as \emph{correct choices}, and to +have the correct choices printed with emphasis when solutions are +being printed. + +The command to define a correct choice is +\verb"\CorrectChoice"\indc{CorrectChoice}, which is used in place of +the command \verb"\choice"\indc{choice}. (To avoid confusion, +\verb"\correctchoice"\indc{correctchoice} is defined to be a synonym +for \verb"\CorrectChoice".) When solutions are not being printed, +\verb"\CorrectChoice" is equivalent to \verb"\choice". When solutions +are being printed, though, any choices that were created with +\verb"\CorrectChoice" (rather than with \verb"\choice") will be +printed in bold. (This can be changed; see +section~\ref{sec:MulChceCust}.) In addition, in the +\texttt{checkboxes}\indt{checkboxes} and +\texttt{oneparcheckboxes}\indt{oneparcheckboxes} environments, each +correct choice will have its checkbox replaced by a check. + +For example, if \verb"\printanswers"\indc{printanswers} is in effect +and you type\indc{CorrectChoice} +\begin{verbatim} +\begin{questions} + \question One of these things is not like the others; one of these + things is not the same. Which one is different? + \begin{oneparchoices} + \choice John + \choice Paul + \choice George + \choice Ringo + \CorrectChoice Socrates + \end{oneparchoices} +\end{questions} +\end{verbatim} +then you'll get +\printanswers +\begin{questions} + \question One of these things is not like the others; one of these + things is not the same. Which one is different? + \begin{oneparchoices} + \choice John + \choice Paul + \choice George + \choice Ringo + \CorrectChoice Socrates + \end{oneparchoices} +\end{questions} +\noprintanswers +% +If you use a \texttt{oneparcheckboxes}\indt{oneparcheckboxes} +environment instead of the \texttt{oneparchoices}\indt{oneparchoices} +environment in that example, then you'll get\indc{printanswers} +% +\printanswers +\begin{questions} + \question One of these things is not like the others; one of these + things is not the same. Which one is different? + \begin{oneparcheckboxes} + \choice John + \choice Paul + \choice George + \choice Ringo + \CorrectChoice Socrates + \end{oneparcheckboxes} +\end{questions} +\noprintanswers + +%-------------------------------------------------------------------- +\subsection{Fill in the blank questions} +\label{sec:Fillin} + +\indcstart{fillin} +\index{fill in the blank|(} + +There is a \verb"\fillin" command that prints underlined empty space +for creating ``fill in the blank'' questions. The \verb"\fillin" +command can take two optional arguments: +\begin{itemize} +\item the first optional argument is the answer to the question, which + will be printed above the line when answers are being printed, and +\item the second optional argument is the length of line to be + printed, if you want some length other than the default. +\end{itemize} +If answers are being printed and you supply the answer as the first +(and possibly only) optional argument, then the answer is printed +subject to the declarations in the argument of the most recent +\verb"\CorrectChoiceEmphasis" command. It is centered on the line +unless it is too long, in which case it extends to the right of the +line. The default length of the line and the distance down from the +baseline of the text to the empty line can both be customized (see +section~\ref{sec:CustFillin}). + +For example, if you type +\begin{verbatim} +\begin{questions} + \question \fillin is the color of my true love's hair. +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question \fillin is the color of my true love's hair. +\end{questions} +If, instead, you type +\begin{verbatim} +\begin{questions} + \question \fillin[Black] is the color of my true love's hair. +\end{questions} +\end{verbatim} +then if answers are not being printed you'll get +\begin{questions} + \question \fillin[Black] is the color of my true love's hair. +\end{questions} +and if answers are being printed you'll get +\printanswers +\begin{questions} + \question \fillin[Black] is the color of my true love's hair. +\end{questions} +\noprintanswers + +For another example, if answers are being printed and you type +\begin{verbatim} +\begin{questions} + \question The magic word is \fillin[prestidigitator]. +\end{questions} +\end{verbatim} +then you'll get +\printanswers +\begin{questions} + \question The magic word is \fillin[prestidigitator]. +\end{questions} +\noprintanswers +which shows what happens when the answer is too long for the fillin +line. If, however, you type +\begin{verbatim} +\begin{questions} + \question The magic word is \fillin[prestidigitator][2in]. +\end{questions} +\end{verbatim} +then you'll get +\printanswers +\begin{questions} + \question The magic word is \fillin[prestidigitator][2in]. +\end{questions} +\noprintanswers + +\verb"\fillin" eats (and ignores) space characters appearing before +the first optional argument. It also eats (and ignores) space +characters appearing after the first optional argument and before the +second optional argument. However, if exactly one optional argument +appears, and if there are one or more space characters following that +one optional argument, then those spaces are replaced by a single +space character, but not eaten. +%-------------------------------------------------------------------- +\subsubsection{True/False questions} +\label{sec:truefalse} + +\index{true/false questions|(} +The \verb"\fillin" command can also be used to create True/False +questions. If you give the command +\begin{verbatim} +\newcommand{\tf}[1][{}]{% + \fillin[#1][0.25in]% +} +\end{verbatim} +then you can type +\begin{verbatim} +\begin{questions} + \question \tf[T] The world is all that is the case. + \question \tf[F] My favorite color is blue. +\end{questions} +\end{verbatim} +\newcommand{\tf}[1][{}]{% + \fillin[#1][0.25in]% +} +and if answers are not being printed you'll get +\begin{questions} + \question \tf[T] The world is all that is the case. + \question \tf[F] My favorite color is blue. +\end{questions} +but if answers are being printed then you'll get +\printanswers +\begin{questions} + \question \tf[T] The world is all that is the case. + \question \tf[F] My favorite color is blue. +\end{questions} +\noprintanswers + +\index{true/false questions|)} + +%-------------------------------------------------------------------- +\subsubsection{Customizing the \texttt{\bs fillin} command} +\label{sec:CustFillin} +\index{customization!\texttt{\char`\\fillin}|(} + +You can customize the \verb"\fillin" command by changing +\begin{itemize} +\item the default length of the underlined space, +\item the distance below the text baseline that the line is printed, and +\item the emphasis applied to the answer (when answers are being + printed). +\end{itemize} +The default length of the underlined space is called +\verb"\fillinlinelength"\indc{fillinlinelength}, and its value was set +by the command +\begin{center} + \verb"\setlength\fillinlinelength{1in}" +\end{center} +You can change this by giving a new \verb"\setlength" command. + +The line is printed a distance of +\verb"\answerclearance"\indc{answerclearance} below the baseline, and +its value was set by the command +\begin{center} + \verb"\setlength\answerclearance{0.2ex}" +\end{center} +You can change this by giving a new \verb"\setlength" command. Note: +\verb"\answerclearance" is also used by the \verb"\answerline" command +(see section~\ref{sec:ShortAns}). + +When answers are being printed and you include the optional argument +containing the answer, then the answer is printed subject to the +declarations in the argument of the most recent +\verb"\CorrectChoiceEmphasis"\indc{CorrectChoiceEmphasis} command. +The default situation was created by the command +\begin{center} + \verb"\CorrectChoiceEmphasis{\bfseries}" +\end{center} +and you can change this by giving a new \verb"\CorrectChoiceEmphasis" +command (see section~\ref{sec:MulChceCust}). + +\index{customization!\texttt{\char`\\fillin}|)} +\index{fill in the blank|)} +\indcstop{fillin} + + +%-------------------------------------------------------------------- +\subsection{Customizing the multiple choice environments} +\label{sec:MulChceCust} +\index{customization!multiple choice questions|(} + +When solutions are being printed, the correct choices in any of the +environments \texttt{choices}\indt{choices}, +\texttt{oneparchoices}\indt{oneparchoices}, +\texttt{checkboxes}\indt{checkboxes}, and +\texttt{oneparcheckboxes}\indt{oneparcheckboxes} will be printed +subject to the declarations in the argument of the most +recent\indc{CorrectChoiceEmphasis} +\begin{center} + \verb"\CorrectChoiceEmphasis" +\end{center} +command. The default situation is created by the command +\begin{center} + \verb"\CorrectChoiceEmphasis{\bfseries}" +\end{center} +and so when solutions are being printed the correct choices are +printed in boldface by default. You can change this, for example, by +giving the command +\begin{center} + \verb"\CorrectChoiceEmphasis{\itshape}" +\end{center} +which would cause correct choices to be printed in italics when +solutions are being printed. + +For another example, if you give the command +\verb"\usepackage{color}"\indt{color} in the preamble\index{preamble} +of your document (i.e., after the \verb"\documentclass" command and +before the \verb"\begin{document}"), and then give the + command\indc{CorrectChoiceEmphasis}\indc{color} +\begin{center} + \verb"\CorrectChoiceEmphasis{\color{red}}" +\end{center} +then when solutions are being printed the correct choices will be +printed in red (assuming your printer can produce that color). + +For another example, if you give the command +\verb"\usepackage{color}"\indt{color} in the preamble of your document +(i.e., after the \verb"\documentclass" command and before the +\verb"\begin{document}" command) and then give the command\indc{color} +\begin{center} + \verb"\CorrectChoiceEmphasis{\color{red}\bfseries}" +\end{center} +then the correct choices will be printed in boldface red (again +assuming that your printer can produce that color). + +{\sloppy To avoid confusion, + \verb"\correctchoiceemphasis"\indc{correctchoiceemphasis} is defined + to be a synonym for + \verb"\CorrectChoiceEmphasis"\indc{CorrectChoiceEmphasis}.\par} + +\bigskip + +The \texttt{checkboxes}\indt{checkboxes} and +\texttt{oneparcheckboxes}\indt{oneparcheckboxes} environments also +allow customization of the characters used for checkboxes and checks: +\begin{itemize} +\item The checkbox\index{checkbox} that is printed in the + \texttt{checkboxes} and \texttt{oneparcheckboxes} environments is + the argument of the most recent + \verb"\checkboxchar"\indc{checkboxchar} command. The default is + created by the command + \begin{center} + \verb"\checkboxchar{$\bigcirc$}" + \end{center} + For example, if you give the command + \verb"\usepackage{amssymb}"\indt{amssymb} in the + preamble\index{preamble} of your document (i.e., after the + \verb"\documentclass" command and before the + \verb"\begin{document}"), then the command\indc{Box} + \begin{center} + \verb"\checkboxchar{$\Box$}" + \end{center} + will cause squares to be printed instead of circles. + + \item The check that is printed for correct choices in the + \texttt{checkboxes}\indt{checkboxes} and + \texttt{oneparcheckboxes}\indt{oneparcheckboxes} environments + when solutions are being printed is the argument of the most + recent \verb"\checkedchar"\indc{checkedchar} command. The + default is created by the command\indc{surd} + \begin{center} + \verb"\checkedchar{$\surd$}" + \end{center} +\end{itemize} + +For example, if you've given the command +\verb"\usepackage{amssymb}"\indt{amssymb} in the +preamble\index{preamble} of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}"), + then the commands\indc{Box}\indc{blacksquare} +\begin{center} + \begin{tabular}{l} + \verb"\checkboxchar{$\Box$}"\\ + \verb"\checkedchar{$\blacksquare$}" + \end{tabular} +\end{center} +will cause the example in section~\ref{sec:CorrectChoice} to appear as +% +\printanswers +\checkboxchar{$\Box$} +\checkedchar{$\blacksquare$} +\begin{questions} + \question One of these things is not like the others; one of + these things is not the same. Which one is different? + \begin{oneparcheckboxes} + \choice John + \choice Paul + \choice George + \choice Ringo + \CorrectChoice Socrates + \end{oneparcheckboxes} +\end{questions} +\noprintanswers + +\index{customization!multiple choice questions|)} +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Escaping the indentation: \texttt{\bs uplevel} and + \texttt{\bs fullwidth}} +\label{sec:uplevel} +\index{indentation|(} + +There are two commands provided for printing text with a left margin +smaller than the one currently in effect: +\verb"\uplevel"\indc{uplevel} and \verb"\fullwidth"\indc{fullwidth}. +Each of these commands takes one argument and typesets the argument +with an altered left margin. + +The \verb"\fullwidth" command prints its argument using the full width +of the printed region, temporarily canceling the indentation created +by the \texttt{questions} environment (and the \texttt{parts}, +\texttt{subparts}, and \texttt{subsubparts} environments, if you're +inside any of those). The \verb"\uplevel" command prints its argument +using the indentation in effect before you entered the current +innermost environment. + +There are also two environments, +\texttt{EnvUplevel}\indt{EnvUplevel}\index{environment!EnvUplevel}% +\index{EnvUplevel environment} and +\texttt{EnvFullwidth}\indt{EnvFullwidth}\index{environment!EnvFullwidth}% +\index{EnvFullwidth environment}. The \texttt{EnvUplevel} environment +is similar to the \verb"\uplevel" command and the +\texttt{EnvFullwidth} environment is similar to the \verb"\fullwidth" +command. The environments have the advantage that you can have +verbatim material inside of the environment, while there cannot be any +verbatim material in the argument of \verb"\uplevel" or +\verb"\fullwidth". + +The main uses for these commands are including instructions for a +group of questions (see section~\ref{sec:Instructions}) and naming the +parts of a long exam (see section~\ref{sec:Naming}), but you can use +them however you like. + +%-------------------------------------------------------------------- +\subsection{Including instructions for a group of questions} +\label{sec:Instructions} +\index{instructions|(} +\indcstart{uplevel} +\indtstart{EnvUplevel} +\index{EnvUplevel environment|(} +\index{environment!EnvUplevel|(} + + +If you are inside of a parts environment and you want to give +directions for the next few parts, then those directions should be +indented to the level of the question of which they are parts, i.e., +up one level. If you type +\begin{verbatim} +\begin{questions} + \question + Why did you come to Casablanca? + + \question + \begin{parts} + \part + Why, Oh why, Oh why, Oh; why did I ever leave Ohio? + + \uplevel{The following two parts should be answered in classical + Greek:} + \part + Why do birds sing? + + \part + Why do fools fall in love? + + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + Why did you come to Casablanca? + + \question + \begin{parts} + \part + Why, Oh why, Oh why, Oh; why did I ever leave Ohio? + + \uplevel{The following two parts should be answered in classical + Greek:} + \part + Why do birds sing? + + \part + Why do fools fall in love? + + \end{parts} +\end{questions} +You can accomplish exactly the same thing by replacing +\begin{verbatim} + \uplevel{The following two parts should be answered in classical + Greek:} +\end{verbatim} +by +\begin{verbatim} + \begin{EnvUplevel} + The following two parts should be answered in classical Greek: + \end{EnvUplevel} +\end{verbatim} + +If you want to give instructions for a group of questions, then the +indenting for those instructions should be to the outer left margin, +i.e., up one level. For example, if you type +\begin{verbatim} +\begin{questions} + \question + Approximate $\displaystyle \int_0^1 \sin x^2 \, dx$ within $.001$ of + its true value. + + \uplevel{Questions \ref{exact-start} through~\ref{exact-end} should + be evaluated completely, not just approximated.} + + \question + \label{exact-start} + $\displaystyle \int_0^1 \frac{x^2 \, dx}{\sqrt{1-x^2}}$ + + \question + $\displaystyle \int_0^1 \frac{1}{1+x^2}\, dx$ + + \question + \label{exact-end} + $\displaystyle \int_0^{\frac{\pi}{2}} \sin^3 x \cos x \, dx$ +\end{questions} +\end{verbatim} +you'll get +\begin{questions} + \question + Approximate $\displaystyle \int_0^1 \sin x^2 \, dx$ within $.001$ of + its true value. + + \uplevel{Questions \ref{exact-start} through~\ref{exact-end} should + be evaluated completely, not just approximated.} + + \question + \label{exact-start} + $\displaystyle \int_0^1 \frac{x^2 \, dx}{\sqrt{1-x^2}}$ + + \question + $\displaystyle \int_0^1 \frac{1}{1+x^2}\, dx$ + + \question + \label{exact-end} + $\displaystyle \int_0^{\frac{\pi}{2}} \sin^3 x \cos x \, dx$ +\end{questions} +You can accomplish exactly the same thing by replacing +\begin{verbatim} + \uplevel{Questions \ref{exact-start} through~\ref{exact-end} should + be evaluated completely, not just approximated.} +\end{verbatim} +by +\begin{verbatim} + \begin{EnvUplevel} + Questions \ref{exact-start} through~\ref{exact-end} should be + evaluated completely, not just approximated. + \end{EnvUplevel} +\end{verbatim} +\indcstop{uplevel} +\indtstop{EnvUplevel} +\index{EnvUplevel environment|)} +\index{environment!EnvUplevel|)} + +\indcstart{fullwidth} +\indtstart{EnvFullwidth} +\index{EnvFullwidth environment|(} +\index{environment!EnvFullwidth|(} +If you want to give instructions that use the full width of the page +(rather than just going up one level of indentation), then use the +\verb"\fullwidth" command. For example, if you type +\begin{verbatim} +\begin{questions} + \question + This is the first question. + + \question + \begin{parts} + \part + This is the first part. + + \part + This is the second part. + \begin{subparts} + \subpart + This is a subpart. + + \fullwidth{When you finish this exam, you should go back and + reexamine your work, both on this exam and in your life up + until the day of this exam, for any errors that you may have + made.} + + \subpart + This is another subpart. + \end{subparts} + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + This is the first question. + + \question + \begin{parts} + \part + This is the first part. + + \part + This is the second part. + \begin{subparts} + \subpart + This is a subpart. + + \fullwidth{When you finish this exam, you should go back and + reexamine your work, both on this exam and in your life up + until the day of this exam, for any errors that you may have + made.} + + \subpart + This is another subpart. + \end{subparts} + \end{parts} +\end{questions} +You can accomplish exactly the same thing by replacing +\begin{verbatim} + \fullwidth{When you finish this exam, you should go back and + reexamine your work, both on this exam and in your life up + until the day of this exam, for any errors that you may have + made.} +\end{verbatim} +by +\begin{verbatim} + \begin{EnvFullwidth} + When you finish this exam, you should go back and + reexamine your work, both on this exam and in your life up + until the day of this exam, for any errors that you may have + made. + \end{EnvFullwidth} +\end{verbatim} +\indcstop{fullwidth} +\indtstop{EnvFullwidth} +\index{EnvFullwidth environment|)} +\index{environment!EnvFullwidth|)} + +\index{instructions|)} + +%--------------------------------------------------------------------- +\subsection{Naming the parts of a long exam} +\label{sec:Naming} +\index{naming parts of the exam|(} + +There are two ways of naming the parts of a long exam. The first way +uses the \verb"\fullwidth"\indc{fullwidth} and +\verb"\uplevel"\indc{uplevel} commands (see +section~\ref{sec:Namefullwidth}), and the other way uses the standard +% +\verb"\part"\indcsub{part}{standard sectioning command} +% +and \verb"\section"\indc{section} commands (see +section~\ref{sec:NameSection}). + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs uplevel} and \texttt{\bs fullwidth}} +\label{sec:Namefullwidth} +\indcstart{uplevel} +\indcstart{fullwidth} +\indtstart{EnvFullwidth} +\index{EnvFullwidth environment|(} +\index{environment!EnvFullwidth|(} + +To place a section name in the exam, just use a \verb"\fullwidth" +command (see section~\ref{sec:uplevel}) and include whatever font +changing commands that you want to use. For example, if you type +\begin{verbatim} +\begin{questions} + \question + Is there, is there balm in Gilead? + + \fullwidth{\Large \textbf{Essay questions}} + + \question + Explain how the cooling of matter in the centuries following the big + bang has influenced the British parliamentary system of government. + + \fullwidth{\Large \textbf{Laboratory questions}} + + \question + In the cabinet below your laboratory bench you will find a single + edged razor blade, several C-clamps, and a bottle of whiskey. + Remove your appendix. Do not suture until your work has been + inspected. +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + Is there, is there balm in Gilead? + + \fullwidth{\Large \textbf{Essay questions}} + + \question + Explain how the cooling of matter in the centuries following the big + bang has influenced the British parliamentary system of government. + + \fullwidth{\Large \textbf{Laboratory questions}} + + \question + In the cabinet below your laboratory bench you will find a single + edged razor blade, several C-clamps, and a bottle of whiskey. + Remove your appendix. Do not suture until your work has been + inspected. +\end{questions} +You can accomplish exactly the same thing by replacing +\begin{verbatim} + \fullwidth{\Large \textbf{Essay questions}} +\end{verbatim} +by +\begin{verbatim} + \begin{EnvFullwidth} + \Large \textbf{Essay questions} + \end{EnvFullwidth} +\end{verbatim} +and replacing +\begin{verbatim} + \fullwidth{\Large \textbf{Laboratory questions}} +\end{verbatim} +by +\begin{verbatim} + \begin{EnvFullwidth} + \Large \textbf{Laboratory questions} + \end{EnvFullwidth} +\end{verbatim} + + +\indcstop{fullwidth} +\indtstop{EnvFullwidth} +\index{EnvFullwidth environment|)} +\index{environment!EnvFullwidth|)} +\indcstop{uplevel} + +%-------------------------------------------------------------------- +\subsubsection{Using the standard sectioning commands} +\label{sec:NameSection} + +The exam document class is built upon the standard article document +class, and so the sectioning commands used with the article document +class can be used here as well. In particular, you can give the +commands \verb"\part", +% +\verb"\part"\indcsub{part}{standard sectioning command} +% +\verb"\part*", \verb"\section"\indc{section}, and \verb"\section*". +The definitions made in \verb"exam.cls" ensure that if a \verb"\part" +command appears \emph{outside of a parts environment} it will be +interpreted as a sectioning command, while if it appears \emph{inside + of a parts environment} it will be interpreted as beginning a new +part of a question. + +You can give these commands in the middle of a questions environment +so as not to interrupt the numbering of the questions, or you can end +a questions environment, give a sectioning command, and then start a +new questions environment (which would reset the question counter to +start again with number~1). If you have more than one questions +environment, though, then you will be unable to use any of the +commands that create grading\indc{gradetable} tables or +point\indc{pointtable} tables (see section~\ref{sec:Tables}) or the +commands that change the headers and footers depending on whether or +not a question spans multiple pages (see +section~\ref{sec:QuesSpan}).\indc{ifincomplete}\indc{ifcontinuation} + +If you give any of these commands while inside of a questions +environment, then the section titles will be indented to the same +extent that questions are indented unless they are given as the +argument of a \verb"\fullwidth"\indc{fullwidth} or +\verb"\uplevel"\indc{uplevel} command. These commands have the +advantage, however, that the unstarred versions provide automatic +numbering of the parts or sections. + + +\index{naming parts of the exam|)} +\index{indentation|)} + + +%-------------------------------------------------------------------- +%--------------------------------------------------------------------- +\section{Leaving space for the answers} +\label{sec:LeaveSpace} +\index{space!for answers|(} +\index{answer space|(} + +There are five different kinds of space that you can create: +\begin{itemize} +\item Blank space (see section~\ref{sec:BlankSpace}), +\item an empty box (see section~\ref{sec:EmptyBox}), +\item space filled with lines (see section~\ref{sec:FillLines}), +\item space filled with dotted lines (see + section~\ref{sec:FillDotLines}), and +\item space filled with a grid (see section~\ref{sec:FillGrid}). +\end{itemize} +You can also create answer lines for short answer questions (see +section~\ref{sec:ShortAns}). +In section~\ref{sec:solutions} we describe five environments for +typing solutions to questions: +\begin{itemize} +\item \texttt{solution}, +\item \texttt{solutionorbox}, +\item \texttt{solutionorlines}, +\item \texttt{solutionordottedlines}, and +\item \texttt{solutionorgrid}. +\end{itemize} +Each of those environments can take an optional argument specifying an +amount of space to be created when solutions are not being printed; +see section~\ref{sec:SolSpace}. + + +%-------------------------------------------------------------------- +\subsection{Leaving blank space} +\label{sec:BlankSpace} +\index{blank space|(} +\index{space!blank|(} + +To leave blank space on the page for the answer to a question, you +should use the \verb"\vspace*"\indc{vspace*} command. For example, +the command \verb"\vspace*{1in}" inserts one inch of vertical space +after the line in which it appears. (If it appears in between +paragraphs, then it inserts the space right there.) You can also use +the \verb"\vspace"\indc{vspace} command, the difference being that +space inserted by \verb"\vspace" will be deleted if it occurs at the +top of a new page, whereas space inserted by \verb"\vspace*" will +never be deleted. + +If you want to leave all the remaining space on the page blank, you +should give the commands\indc{stretch} +\begin{center} + \begin{tabular}{l} + \verb"\vspace*{\stretch{1}}"\\ + \verb"\newpage" + \end{tabular} +\end{center} +If you want to equally distribute the blank space among several +questions on the page, then just put +\verb"\vspace*{\stretch{1}}"\index{space!allocating} after each of the +questions and use \verb"\newpage"\indc{newpage} to end the page. You +can also distribute the available space in some other ratio. For +example, to give one of the questions on the page twice as much space +as any of the others, put \verb"\vspace*{\stretch{2}}" after that +question and \verb"\vspace*{\stretch{1}}" after each of the others. + +You can also leave blank space when solutions are not being printed by +using an optional argument with a \verb"solution" environment; see +section~\ref{sec:SolSpace}. + +\index{space!blank|)} +\index{blank space|)} + +%-------------------------------------------------------------------- +\subsection{Printing an empty box} +\label{sec:EmptyBox} +\index{space!empty box|(} +\index{empty box|(} +\indcstart{makeemptybox} + +You can print an empty box with the command +\begin{center} + \verb"\makeemptybox{length}" +\end{center} +which prints an empty box of height \verb"length" whose width equals +that of the current line. That is, the left edge is at the current +left margin (which depends on whether we're in a question, part, +subpart, or subsubpart) and the right edge is at the right margin. +(The box printed by the \verb"\makeemptybox" command can be printed in +color; for that, see section~\ref{sec:colorboxes}.) + + +\medskip + +For example, if you type +\begin{verbatim} +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \makeemptybox{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \makeemptybox{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \makeemptybox{1in} + + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \makeemptybox{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \makeemptybox{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \makeemptybox{1in} + + \end{parts} +\end{questions} + +\medskip + +If you want to fill the remaining space on the page with an empty box, +you should give the commands\indc{stretch} +\begin{center} + \begin{tabular}{l} + \verb"\makeemptybox{\stretch{1}}"\\ + \verb"\newpage" + \end{tabular} +\end{center} +If you want to equally distribute the space for the answers among +several questions on the page, then just put +\verb"\makeemptybox{\stretch{1}}"\index{space!allocating} after each +of those questions and use \verb"\newpage"\indc{newpage} to end the +page. You can also distribute the available space in some other +ratio. For example, to give one of the questions on the page twice as +much space as any of the others, put \verb"\makeemptybox{\stretch{2}}" +after that question, \verb"\makeemptybox{\stretch{1}}" after each of +the others, and use \verb"\newpage" to end the page. + +You can also insert an empty box when solutions are not being printed +by including an optional argument with the \verb"solutionoremptybox" +environment; see section~\ref{sec:SolSpace}. + + +\indcstop{makeemptybox} +\index{empty box|)} +\index{space!empty box|)} + +%-------------------------------------------------------------------- +\subsection{Printing lined space} +\label{sec:FillLines} +\index{space!lined|(} +\index{lined space|(} +\indcstart{fillwithlines} + + +You can fill space with lines with the command +\begin{center} + \verb"\fillwithlines{length}" +\end{center} +which fills vertical space of height \verb"length" with horizontal +lines that run the length of the current line. That is, they extend +from the current left margin (which depends on whether we're in a +question, part, subpart, or subsubpart) to the right margin. + +By default, the lines are in black. However, if you give the +commands\indc{colorfillwithlines}\index{color package} +\begin{center} + \begin{tabular}{l} + \verb"\usepackage{color}"\\ + \verb"\colorfillwithlines" + \end{tabular} +\end{center} +then the lines will be in color, by default a light gray. That +default color was defined by the +command\indc{definecolor}\indt{FillWithLinesColor} +\begin{center} + \verb"\definecolor{FillWithLinesColor}{gray}{0.8}" +\end{center} +\index{customization!\texttt{\char`\\fillwithlines}} You can change +the color by giving a new \verb"\definecolor" command to redefine the +color \texttt{FillWithLinesColor}. + +\medskip + +For example, if you type +\begin{verbatim} +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \fillwithlines{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \fillwithlines{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \fillwithlines{1in} + + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \fillwithlines{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \fillwithlines{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \fillwithlines{1in} + + \end{parts} +\end{questions} + +\medskip The distance between the lines is +\verb"\linefillheight"\indc{linefillheight}, the default value of +which is set with the +command\index{customization!\texttt{\char`\\fillwithlines}} +\begin{center} + \verb"\setlength\linefillheight{.25in}" +\end{center} +That value can be changed by giving a new \verb"\setlength" command. +The thickness of the lines is +\verb"\linefillthickness"\indc{linefillthickness}, the default value +of which is set with the command +\begin{center} + \verb"\setlength\linefillthickness{0.1pt}" +\end{center} +and that value can also be changed by giving a new \verb"\setlength" +command. + +If you want to fill the remaining space on the page with lines, you +should give the commands\indc{stretch} +\begin{center} + \begin{tabular}{l} + \verb"\fillwithlines{\stretch{1}}"\\ + \verb"\newpage" + \end{tabular} +\end{center} +If you want to equally distribute the space for the answers among +several questions on the page, then just put +\verb"\fillwithlines{\stretch{1}}"\index{space!allocating} after each +of those questions and use \verb"\newpage" to end the page. You can +also distribute the available space in some other ratio. For example, +to give one of the questions on the page twice as much space as any of +the others, put \verb"\fillwithlines{\stretch{2}}" after that +question, \verb"\fillwithlines{\stretch{1}}" after each of the others, +and use \verb"\newpage" to end the page. + +You can also insert lined space when solutions are not being printed +by including an optional argument with the \verb"solutionorlines" +environment; see section~\ref{sec:SolSpace}. + +\indcstop{fillwithlines} +\index{lined space|)} +\index{space!lined|)} + +%-------------------------------------------------------------------- +\subsection{Printing dotted lined space} +\label{sec:FillDotLines} +\index{space!dotted lined|(} +\index{dotted lined space|(} +\indcstart{fillwithdottedlines} + + +You can fill space with dotted lines with the command +\begin{center} + \verb"\fillwithdottedlines{length}" +\end{center} +which fills vertical space of height \verb"length" with dotted +horizontal lines that run the length of the current line. That is, +they extend from the current left margin (which depends on whether +we're in a question, part, subpart, or subsubpart) to the right +margin. The command \verb"\fillwithdottedlines" is almost identical +to the \verb"\fillwithlines" command (see +section~\ref{sec:FillLines}), except that the lines created are dotted +and the distance between the lines is +\verb"\dottedlinefillheight"\indc{dottedlinefillheight}. The default +value of \verb"\dottedlinefillheight" is set by the +command\index{customization!\texttt{\char`\\fillwithdottedlines}} +\begin{center} + \verb"\setlength\dottedlinefillheight{.25in}" +\end{center} +and that value can be changed by giving a new \verb"\setlength" +command. + +By default, the dotted lines are in black. However, if you give the +commands\indc{colorfillwithdottedlines}\index{color package} +\begin{center} + \begin{tabular}{l} + \verb"\usepackage{color}"\\ + \verb"\colorfillwithdottedlines" + \end{tabular} +\end{center} +then the dotted lines will be in color, by default a light gray. That +default color was defined by the +command\indc{definecolor}\indt{FillWithDottedLinesColor} +\begin{center} + \verb"\definecolor{FillWithDottedLinesColor}{gray}{0.8}" +\end{center} +\index{customization!\texttt{\char`\\fillwithdottedlines}} You can +change the color by giving a new \verb"\definecolor" command to +redefine the color \texttt{FillWithDottedLinesColor}. + +\medskip + +For example, if you type +\begin{verbatim} +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \fillwithdottedlines{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \fillwithdottedlines{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \fillwithdottedlines{1in} + + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \fillwithdottedlines{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \fillwithdottedlines{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \fillwithdottedlines{1in} + + \end{parts} +\end{questions} + +If you want to fill the remaining space on the page with dotted lines, +you should give the commands\indc{stretch} +\begin{center} + \begin{tabular}{l} + \verb"\fillwithdottedlines{\stretch{1}}"\\ + \verb"\newpage" + \end{tabular} +\end{center} +If you want to equally distribute the space for the answers among +several questions on the page, then just put +\verb"\fillwithdottedlines{\stretch{1}}"\index{space!allocating} after +each question on the page and use \verb"\newpage" to end the page. +You can also distribute the available space in some other ratio. For +example, to give one of the questions on the page twice as much space +as any of the others, put \verb"\fillwithdottedlines{\stretch{2}}" +after that question, \verb"\fillwithdottedlines{\stretch{1}}" after +each of the others, and use \verb"\newpage" to end the page. + +You can also insert dotted lined space when solutions are not being +printed by including an optional argument with the +\verb"solutionordottedlines" environment; see +section~\ref{sec:SolSpace}. + +\indcstop{fillwithdottedlines} +\index{dotted lined space|)} +\index{space!dotted lined|)} + +%-------------------------------------------------------------------- +\subsection{Printing space filled with a grid} +\label{sec:FillGrid} +\index{space!grid|(} +\index{grid space|(} +\indcstart{fillwithgrid} + + +You can fill space with a grid with the command +\begin{center} + \verb"\fillwithgrid{length}" +\end{center} +which fills vertical space of height \texttt{length} with a grid that +runs the length of the current line. That is, it extends from the +current left margin (which depends on whether we're in a question, +part, subpart, or subsubpart) to the right margin. +The default grid size and grid line thickness were set by the +commands +\begin{center} + \begin{tabular}{l} + \verb"\setlength{\gridsize}{5mm}"\\ + \verb"\setlength{\gridlinewidth}{0.1pt}" + \end{tabular} +\end{center} +\index{customization!\texttt{\char`\\fillwithgrid}} You can change +either or both of those by giving new \verb"\setlength" commands. The +period of the grid is \verb"\gridsize" (both horizontally and +vertically). That is, the horizontal distance from the left edge of +one vertical line to the left edge of the next vertical line is +\verb"\gridsize", as is the vertical distance from the top edge of one +horizontal line to the top edge of the next horizontal line. Thus, +each square has outer side length equal to +\verb"\gridsize+\gridlinewidth". + +By default, the created grids are in black. However, if you give the +commands\indc{colorgrids}\index{color package} +\begin{center} + \begin{tabular}{l} + \verb"\usepackage{color}"\\ + \verb"\colorgrids" + \end{tabular} +\end{center} +then the grids will be in color, by default a light gray. That +default color was defined by the +command\indc{definecolor}\indt{GridColor} +\begin{center} + \verb"\definecolor{GridColor}{gray}{0.8}" +\end{center} +\index{customization!\texttt{\char`\\fillwithgrid}} You can change the +color by giving a new \verb"\definecolor" command to redefine the +color \texttt{GridColor}. + + +For example, if you type +\begin{verbatim} +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \smallskip\fillwithgrid{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \smallskip\fillwithgrid{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \smallskip\fillwithgrid{1in} + + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + In no more than one paragraph, explain why the earth is round. + + \smallskip\fillwithgrid{1in} + + \question + \begin{parts} + \part + What changes to the van Allen radiation belt are needed to make + the earth into a regular icosahedron? + + \smallskip\fillwithgrid{1in} + + \part + Where should the field generator be constructed if you want one of + the vertices to be located at the Royal Observatory at Greenwich? + + \smallskip\fillwithgrid{1in} + + \end{parts} +\end{questions} + +If you want to fill the remaining space on the page with a grid, you +should give the commands\indc{stretch} +\begin{center} + \begin{tabular}{l} + \verb"\fillwithgrid{\stretch{1}}"\\ + \verb"\newpage" + \end{tabular} +\end{center} +If you want to equally distribute the space for the answers among +several questions on the page, then just put +\verb"\fillwithgrid{\stretch{1}}"\index{space!allocating} after each +question on the page and use \verb"\newpage" to end the page. You can +also distribute the available space in some other ratio. For example, +to give one of the questions on the page twice as much space as any of +the others, put \verb"\fillwithgrid{\stretch{2}}" after that question, +\verb"\fillwithgrid{\stretch{1}}" after each of the others, and use +\verb"\newpage" to end the page. + +You can also insert a grid only when solutions are not being +printed by including an optional argument with the +\verb"solutionorgrid" environment; see +section~\ref{sec:SolSpace}. + +%-------------------------------------------------------------------- +\subsubsection{Covering every page with a grid} +\label{sec:CoverWGrid} +\index{grid!covering every page} + +If you'd like \emph{every} page to be completely covered by a grid, +with the exam printed right on top of that grid, you can do that by +using a \verb"\fillwithgrid" command in the footer. For this, make +sure you're using either \verb"\pagestyle{headandfoot}" (the default) +or \verb"\pagestyle{foot}" (see section~\ref{sec:pagestyle}), and put +the following into your preamble (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" + command):\index{color package}\indc{gridfromfoot} +\begin{verbatim} +\usepackage{color} +\colorgrids +\newlength{\scratchlength} +\newcommand{\gridfromfoot}{% + \setlength{\scratchlength}{\textheight}% + \addtolength{\scratchlength}{\baselineskip}% + \leavevmode\rlap{\vbox to 0pt{% + \vss + \fillwithgrid{\scratchlength}% + \vspace*{\footskip}% + }% vbox + }% rlap +}% gridfromfoot + +\footer{\gridfromfoot Math 115} + {} + {Page \thepage\ of \numpages} +\end{verbatim} + + +%-------------------------------------------------------------------- +\subsubsection{Printing graph paper} +\label{sec:GraphPaper} + +You can also use the \verb"\fillwithgrid" command to print graph +paper:\index{graph paper} +\begin{verbatim} +\documentclass{exam} +\pagestyle{empty} +\begin{document} + +\fillwithgrid{\stretch{1}} + +\newpage + +\fillwithgrid{\stretch{1}} + +\end{document} +\end{verbatim} + + + +\indcstop{fillwithgrid} +\index{grid space|)} +\index{space!grid|)} + + +%-------------------------------------------------------------------- +\subsection{Short answer questions} +\label{sec:ShortAns} +\indcstart{answerline} +\index{short answers|(} + +The exam class can print answer lines for short answer questions. The +command +\begin{center} + \verb"\answerline" +\end{center} +leaves blank vertical space of length +\verb"\answerskip"\indc{answerskip} and then inserts a horizontal line +of length \verb"\answerlinelength"\indc{answerlinelength}% +\index{customization!\texttt{\char`\\answerline}} at the right margin, +preceded by the number of the current question, part, subpart, or +subsubpart. The default values of \verb"\answerskip" and +\verb"\answerlinelength" are set by the +commands\index{customization!\texttt{\char`\\answerline}} +\begin{center} + \begin{tabular}{l} + \verb"\setlength\answerskip{2ex}"\\ + \verb"\setlength\answerlinelength{1in}" + \end{tabular} +\end{center} +and these can be changed by giving new \verb"\setlength" commands. +If you use the command \verb"\answerline" outside of a +\verb"questions" environment, then the number before the line will be +omitted. + +For example, if you type +\begin{verbatim} +\begin{questions} + \question + Who's buried in Grant's tomb? + \answerline + + \question + What was the color of George Washington's white horse? + \answerline + + \question + Which is heavier: A pound of feathers, or a pound of lead? + \answerline +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + Who's buried in Grant's tomb? + \answerline + + \question + What was the color of George Washington's white horse? + \answerline + + \question + Which is heavier: A pound of feathers, or a pound of lead? + \answerline +\end{questions} +and if you type +\begin{verbatim} +\begin{questions} + \question + Answer the following questions on the lines at the right: + \begin{parts} + \part + Who's buried in Grant's tomb? \answerline + + \part + \begin{subparts} + \subpart + What light through yonder window breaks? \answerline + + \subpart + To be, or not to be; that is the question? \answerline + \end{subparts} + + \part + What was the color of George Washington's white horse? \answerline + \end{parts} +\end{questions} +\end{verbatim} +then you'll get +\begin{questions} + \question + Answer the following questions on the lines at the right: + \begin{parts} + \part + Who's buried in Grant's tomb? \answerline + + \part + \begin{subparts} + \subpart + What light through yonder window breaks? \answerline + + \subpart + To be, or not to be; that is the question? \answerline + \end{subparts} + + \part + What was the color of George Washington's white horse? \answerline + \end{parts} +\end{questions} + +%-------------------------------------------------------------------- +\subsection{Printing the answers to short answer questions} +\label{sec:AnsShortAns} +\index{short answers!answers to|(} +\index{answers!to short answers|(} + +The \verb"\answerline"\indcsub{answerline}{optional~argument} command +can take an optional argument so that you can have the answer to the +question printed on the answer line when answers are being printed +(see section~\ref{sec:answers}). When answers are not being printed, +the optional argument is ignored. + +When answers are being printed, the optional argument is printed +subject to the declarations in the argument of the last +\verb"\CorrectChoiceEmphasis"\indc{CorrectChoiceEmphasis} command +(which by default is +\verb"\bfseries"\index{customization!\texttt{\char`\\CorrectChoice}}; +see section~\ref{sec:CorrectChoice}), and it is printed a distance of +\verb"\answerclearance"\indc{answerclearance}% +\index{customization!\texttt{\char`\\answerline}} above the line. The +default value of \verb"\answerclearance" is set with the command +\begin{center} + \verb"\setlength\answerclearance{0.2ex}" +\end{center} +and it can be changed with a \verb"\setlength" command. The optional +argument is centered on the answer line unless it is longer than the +line, in which case it extends to the right of the line. + +For example, if you type +\begin{verbatim} +\begin{questions} + \question Who was the fifth Beatle? \answerline[Murray the K] + \question What is the answer to the ultimate question of life, the + universe, and everything? \answerline[42] +\end{questions} +\end{verbatim} +and if \verb"\noprintanswers" (the default) is in effect, you'll get +\begin{questions} + \question Who was the fifth Beatle? \answerline[Murray the K] + \question What is the answer to the ultimate question of life, the + universe, and everything? \answerline[42] +\end{questions} +while if \verb"\printanswers" is in effect, you'll get \printanswers +\begin{questions} + \question Who was the fifth Beatle? \answerline[Murray the K] + \question What is the answer to the ultimate question of life, the + universe, and everything? \answerline[42] +\end{questions} +\noprintanswers + +\index{answers!to short answers|)} +\index{short answers!answers to|)} + +\index{short answers|)} +\indcstop{answerline} + +\index{answer space|)} +\index{space!for answers|)} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Solutions} +\label{sec:solutions} + +%-------------------------------------------------------------------- +\subsection{Solution environments} +\label{sec:SolEnv} +\index{solutions|(} +\index{solution environment@\texttt{solution} environment|(} +\index{answers|(} +\index{environment!solution@\texttt{solution}|(} +\index{environment!solutionorbox@\texttt{solutionorbox}|(} +\index{environment!solutionorlines@\texttt{solutionorlines}|(} +\index{environment!solutionordottedlines@\texttt{solutionordottedlines}|(} +\index{environment!solutionorgrid@\texttt{solutionorgrid}|(} +\index{solutionorbox environment|(} +\index{solutionorlines environment|(} +\index{solutionordottedlines environment|(} + + +There are six environments for typing solutions to the problems. +These environments all allow you to either print the solutions or omit +them with a single command. Whether or not solutions are +printed is controlled by the two +commands\indc{printanswers}\indc{noprintanswers} +\begin{center} + \begin{tabular}{l} + \verb"\printanswers"\\ + \verb"\noprintanswers" + \end{tabular} +\end{center} +Using these commands to turn printing of solutions on and off, you can +print the solutions for the entire exam or for only certain parts of +it. The default is that solutions are \emph{not} printed. There is +also an \verb"answers"\indt{answers}\indcsub{documentclass}{options} +option to the \verb"exam" document class, used as in +\begin{center} + \verb"\documentclass[answers]{exam}" +\end{center} +that is equivalent to giving the command +\verb"\printanswers"\indc{printanswers} at the beginning of the +document (see section~\ref{sec:answers}). + +The six environments for solutions are divided into two types. +\begin{itemize} +\item The \texttt{solutionbox} environment (see + section~\ref{sec:solutionbox}) always prints a box, of whatever size + you choose, and if solutions are being printed it prints the + solution inside of the box. +\item Each of the remaining five (see section~\ref{sec:SolSpace}), + \begin{center} + \begin{tabular}{rll} + the& \verb"solution"& environment,\\ + the& \verb"solutionorbox"& environment,\\ + the& \verb"solutionorlines"& environment,\\ + the& \verb"solutionordottedlines"& environment, and\\ + the& \verb"solutionorgrid"& environment, + \end{tabular} + \end{center} + by default prints either the solution or nothing at all. However, + they all can take one optional argument, which is an amount of space + to be left when solutions are not being printed. If you use these + environments without any optional arguments, then they are + identical: They print either the solution or nothing at all. They + differ only in the type of space they leave when you do include the + optional argument and solutions are not being printed. + + The differences between these five environments are that if the + optional argument is used and solutions are not being printed, then + % + \index{solution environment@\texttt{solution} environment!optional argument} + % + \begin{itemize} + \item the \verb"solution" enviroment inserts that amount of blank + space, as if you had given a \verb"\vspace*"\indc{vspace*} command + (see section~\ref{sec:BlankSpace}), + \item the \verb"solutionorbox" environment inserts an empty box of + that height, as if you had given a + \verb"\makeemptybox"\indc{makeemptybox} command (see + section~\ref{sec:EmptyBox}), + \item the \verb"solutionorlines" environment inserts that amount of + space with ruled lines, as if you had given a + \verb"\fillwithlines"\indc{fillwithlines} command (see + section~\ref{sec:FillLines}), + \item the \verb"solutionordottedlines" environment inserts that + amount of space with dotted lines, as if you had given a + \verb"\fillwithdottedlines"\indc{fillwithdottedlines} command (see + section~\ref{sec:FillDotLines}), and + \item the \verb"solutionorgrid" environment inserts that amount of + space filled with a grid, as if you had given a + \verb"\fillwithgrid"\indc{fillwithgrid} command (see + section~\ref{sec:FillGrid}). + \end{itemize} +\end{itemize} + +You can use a parts, subparts, or subsubparts environment inside any +of the solution environments without having their points (if any) +counted as actual points on the exam. If there are points assigned to +any of these commands inside any of the solution environments, those +points are not added to the points of the question or the points on +the page, and do not affect any gradetables or pointtables. + + +\index{solutionorbox environment|)} +\index{solutionorlines environment|)} +\index{solutionordottedlines environment|)} +\index{environment!solution@\texttt{solution}|)} +\index{environment!solutionorbox@\texttt{solutionorbox}|)} +\index{environment!solutionorlines@\texttt{solutionorlines}|)} +\index{environment!solutionordottedlines@\texttt{solutionordottedlines}|)} +\index{environment!solutionorgrid@\texttt{solutionorgrid}|)} + +%-------------------------------------------------------------------- +\subsection{The appearance of the solution} +\label{sec:SolAppear} +\index{solution!appearance|(} + +The solutions printed by the +\begin{center} + \begin{tabular}{l} + \verb"solution",\\ + \verb"solutionorbox",\\ + \verb"solutionorlines",\\ + \verb"solutionordottedlines", and\\ + \verb"solutionorgrid" + \end{tabular} +\end{center} +environments can be printed either +\begin{itemize} +\item in a box (i.e., an \verb"\fbox") (see section~\ref{sec:SolBox}; + this is the default), +\item on a shaded background (see section~\ref{sec:shaded}), or +\item with no framing or shading (see section~\ref{sec:SolPlain}). +\end{itemize} +In all of these cases, solutions can be broken across pages, and the +part on each page will be boxed or shaded as appropriate. In +addition, the \verb"\SolutionEmphasis" command can be used to +highlight the text of the solution (using, e.g., boldface, or italics, +or color); see section~\ref{sec:SolEmph}. + + +%-------------------------------------------------------------------- +\subsubsection{Printing the solution in a box} +\label{sec:SolBox} +\index{solution!in a box|(} + +By default, the solution is printed inside of a box (i.e., an +\verb"\fbox"\indc{fbox}), and if the solution is broken across pages, +then each piece is enclosed in a box. (The box can be printed in +color; for that, see section~\ref{sec:colorboxes}.) There is also a +\verb"\shadedsolutions"\indc{shadedsolutions} command to instead have +the solution printed in a \verb"\colorbox"\indc{colorbox} (i.e., +printed on a shaded background); for this, you must load the +% +\verb"color"\index{color package} package and your printer must be +capable of printing color, or at least grayscale (see +section~\ref{sec:shaded}). + +\medskip + +For example, if you type +\begin{verbatim} +\begin{questions} + \question Did you mutter something? + + \begin{solution} + Once upon a midnight dreary, while I pondered, weak and weary, + Over many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this + and nothing more.'' + \end{solution} +\end{questions} +\end{verbatim} +and you've given the command \verb"\printanswers"\indc{printanswers} +or used the document class option \verb"answers"\indt{answers} (see +section~\ref{sec:answers}), then you'll get \bigskip +\begin{questions} + \question Did you mutter something? + + \begin{TheSolution} + Once upon a midnight dreary, while I pondered, weak and weary, + Over many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this + and nothing more.'' + \end{TheSolution} +\end{questions} +The result would be exactly the same if that \texttt{solution} +environment were replaced by a \texttt{solutionorbox}, +\texttt{solutionorlines}, \texttt{solutionordottedlines}, or +\texttt{solutionorgrid} environment. + +By default, the solution is printed in a box whose width equals that +of the text of the current question (or part, or subpart, or +subsubpart). That is, the indentation at the left of the solution +equals the current level of indentation. You can change this by +enclosing the \texttt{solution}, \texttt{solutionorbox}, +\texttt{solutionorlines}, \texttt{solutionordottedlines}, or +\texttt{solutionorgrid} environment in the argument of a +\verb"\fullwidth"\indc{fullwidth} or \verb"\uplevel"\indc{uplevel} +command, or inside of a \texttt{EnvFullwidth}\indt{EnvFullwidth}% +\index{EnvFullwidth environment}\index{environment!EnvFullwidth} or +% +\texttt{EnvUplevel}\indt{EnvUplevel}\index{EnvUplevel environment}% +\index{environment!EnvUplevel}% +environment (see section~\ref{sec:uplevel}). For example, if you type +\begin{verbatim} +\begin{questions} + \question Did you mutter something? + + \begin{EnvFullwidth} + \begin{TheSolution} + Once upon a midnight dreary, while I pondered, weak and weary, + Over many a quaint and curious volume of forgotten lore--- While + I nodded, nearly napping, suddenly there came a tapping, As of + some one gently rapping, rapping at my chamber door. ``\,'Tis + some visitor,'' I muttered, ``tapping at my chamber door--- Only + this and nothing more.'' + \end{TheSolution} + \end{EnvFullwidth} +\end{questions} +\end{verbatim} +and you've given the command \verb"\printanswers"\indc{printanswers} +or used the document class option \verb"answers"\indt{answers}, then +you'll get \bigskip +\begin{questions} + \question Did you mutter something? + + \begin{EnvFullwidth} + \begin{TheSolution} + Once upon a midnight dreary, while I pondered, weak and weary, + Over many a quaint and curious volume of forgotten lore--- While + I nodded, nearly napping, suddenly there came a tapping, As of + some one gently rapping, rapping at my chamber door. ``\,'Tis + some visitor,'' I muttered, ``tapping at my chamber door--- Only + this and nothing more.'' + \end{TheSolution} + \end{EnvFullwidth} +\end{questions} + +With all of these environments, if solutions are not being printed +then the contents of the environment are ignored. If, however, you +include the optional argument (see section~\ref{sec:SolSpace}), then +the requested amount of space (blank, lined, or dotted lined) will be +inserted when the solution isn't printed. + +\index{solution!in a box|)} + +%-------------------------------------------------------------------- +\subsubsection{Printing the solution on a shaded background} +\label{sec:shaded} +\index{solution!shaded|(} + +If you load the \verb"color" package with the +command\index{color package} +\begin{center} + \verb"\usepackage{color}" +\end{center} +in the preamble of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" + command), then you can give the command\indc{shadedsolutions} +\begin{center} + \verb"\shadedsolutions" +\end{center} +This will cause solutions to be printed on a shaded background, which +by default is a light gray. (Most laser printers can at least print +grayscale when printing with the correct driver.) If you want to +change the color of the shading, you can do so by redefining the color +\verb"SolutionColor"\indc{SolutionColor}. For example, if you give +the command +\begin{center} + \verb"\definecolor{SolutionColor}{rgb}{0.8,0.9,1}" +\end{center} +then the solutions will be printed on a light blue background +(assuming that your printer is capable of producing that color). + +If you want to switch back to printing solutions inside of an +\verb"\fbox"\indc{fbox}, you can do so by giving the +command\indc{framedsolutions} +\begin{center} + \verb"\framedsolutions" +\end{center} +which returns you to the default situation. + +\index{solution!shaded|)} + +%-------------------------------------------------------------------- +\subsubsection{Printing the solution with no framing or shading} +\label{sec:SolPlain} +\index{solution!no framing or shading|(} + +If you give the command\indc{unframedsolutions} +\begin{center} + \verb"\unframedsolutions" +\end{center} +then solutions will be printed as normal text, with no framing or +shading. If you use this option, you'll almost certainly want to use +the command \verb"\SolutionEmphasis"\indc{SolutionEmphasis} (see +section~\ref{sec:SolEmph}) to distinguish the solution from the +surrounding text. + +If you want to switch back to printing solutions inside of an +\verb"\fbox", you can do so by giving the +command\indc{framedsolutions} +\begin{center} + \verb"\framedsolutions" +\end{center} +which returns you to the default situation. + +\index{solution!no framing or shading|)} + +%-------------------------------------------------------------------- +\subsection{Imported graphics in solutions} +\label{sec:graphics} +\index{graphics|(} +\indc{includegraphics} + +Graphics can be included inside solution environments using the +\verb"\includegraphics" command, as long as you've given the command +\verb"\usepackage{graphicx}" in the preamble (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" + command). + +A problem sometimes arises because many \LaTeX{} manuals say that you +should put an \verb"\includegraphics" command inside of a +\texttt{figure} environment, so that it will float to a convenient +place on a page. The problem with this is that floating environments +can't appear inside of a solution environment. + +There are (at least) two solutions to this problem, depending on +whether you really want the graphic to float away from the location at +which you've typed it. +\begin{itemize} +\item If you want the graphic to float, put the \texttt{figure} + environment \emph{outside} of the solution environment, using + \verb"\ifprintanswers" to ensure that it's printed only when + solutions are being printed, as in +\begin{verbatim} +\ifprintanswers + \begin{figure} + \includegraphics[width=7cm]{myfigure.pdf} + \caption{This is a lovely figure} + \label{fig:lovely} + \end{figure} +\fi +\end{verbatim} +\item If you \emph{don't} want the graphic to float, then omit the + \texttt{figure} environment and just put the \verb"\includegraphics" + command wherever you want the graphic to appear. If you want the + graphic to have a caption, then put the command + \verb"\usepackage{caption}" in your preamble and then use the + \verb"\captionof" command, as in +\begin{verbatim} +\includegraphics[width=7cm]{myfigure.pdf} +\captionof{figure}{This is a lovely figure} +\label{fig:lovely} +\end{verbatim} +\end{itemize} + +\index{graphics|)} + +%-------------------------------------------------------------------- +\subsection{Customizing the solution} +\label{sec:SolCust} +\index{customization!solution|(} +\index{solution!customizing|(} + +The solutions printed by any of the solution environments (see +section~\ref{sec:SolEnv}) can be customized: +\begin{itemize} +\item the title (by default, ``\textbf{Solution:}'') can be changed + (see section~\ref{sec:SolTitle}), +\item emphasis can be applied to the solution to distinguish it from + the surrounding text (see section~\ref{sec:SolEmph}), and +\item advanced users can entirely change the appearance of the + solutions by defining a \LaTeX{} environment (see + section~\ref{sec:AdvCust}). +\end{itemize} + +%-------------------------------------------------------------------- +\subsubsection{The title} +\label{sec:SolTitle} + +The word ``\textbf{Solution:}'' that you see at the beginning of the +solutions printed by the \texttt{solution}, \texttt{solutionorbox}, +\texttt{solutionorlines}, and \texttt{solutionordottedlines} +environments can be changed by redefining the command +\verb"\solutiontitle"\indc{solutiontitle}. The default value was +created by the command +\begin{center} +\verb"\newcommand{\solutiontitle}{\noindent\textbf{Solution:}\enspace}" +\end{center} +If, for example, you give the command +\begin{center} +\verb"\renewcommand{\solutiontitle}{\noindent\textbf{Solution:}\par\noindent}" +\end{center} +then the \verb"solution" environment above would print +\renewcommand{\solutiontitle}{\noindent\textbf{Solution:}\par\noindent} +\par\bigskip +\begin{questions} +\question Did you mutter something? + +\begin{TheSolution} + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{TheSolution} +\end{questions} +\renewcommand{\solutiontitle}{\noindent\textbf{Solution:}\enspace} + +%-------------------------------------------------------------------- +\subsubsection{Solution emphasis} +\label{sec:SolEmph} + +You can change the appearance of the text of the solution with the +\verb"\SolutionEmphasis"\indc{SolutionEmphasis} command. The contents +of the solution are enclosed in a group, and that group is begun with +the argument of the most recent +\verb"\SolutionEmphasis"\indc{SolutionEmphasis} command. The default +was created by the command +\begin{center} + \verb"\SolutionEmphasis{}" +\end{center} +That is, the default is not to add any emphasis at all. If, for +example, you give the command +\begin{center} + \verb"\SolutionEmphasis{\itshape\small}" +\end{center} +then the solutions will be set in italics, in small type. For another +example, if you've given the command \verb"\usepackage{color}" in the +preamble of your document (i.e., after the \verb"\documentclass" +command and before the \verb"\begin{document}") and you give the +command\indc{SolutionEmphasis} +\begin{center} + \verb"\SolutionEmphasis{\color{red}}" +\end{center} +then the solutions will be printed in red (assuming your printer is +capable of producing that color). + +\textbf{Note:} If you've given the command +\verb"\unframedsolutions"\indc{unframedsolutions} (see +section~\ref{sec:SolPlain}), so that solutions are printed as normal +text with no framing or shading, then you'll almost certainly want to +use the \verb"\SolutionEmphasis"\indc{SolutionEmphasis} command to +create some visible difference between the solutions and the +surrounding text. + + +%-------------------------------------------------------------------- +\subsubsection{Advanced customizations} +\label{sec:AdvCust} +\index{TheSolution environment} +\index{environment!TheSolution} + +The appearance of all of these solution environments can actually be +totally customized, if you're up to defining a \LaTeX{} environment. +The appearance of the solution typed into any of these environments is +defined by an environment called \verb"TheSolution"\indt{TheSolution}, +and you can change the definition of \verb"TheSolution" with a +\verb"\renewenvironment" command. That is, the \verb"solution" +environment decides whether the command \verb"\printanswers" has been +given and, if so, it feeds the contents of the \verb"solution" +environment into a \verb"TheSolution" environment. (The behavior of a +\texttt{solutionorbox}, \texttt{solutionorlines} or +\texttt{solutionordottedlines} environment is similar.) If you use +\verb"\renewenvironment" to change the definition of the +\verb"TheSolution" environment, you'll be changing the way the +solution is printed. For the default definition of the +\verb"TheSolution" environment, see the file \verb"exam.cls". + +\index{solution!customizing|)} +\index{customization!solution|)} + +\index{solution!appearance|)} + +%-------------------------------------------------------------------- +\subsection{Leaving space for the answers when solutions aren't + printed} +\label{sec:SolSpace} +\index{space!for answers|(} +\index{answer space|(} +\index{solution environment@\texttt{solution} environment!optional argument|(} + +Each of the \texttt{solution}, \texttt{solutionorbox}, +\texttt{solutionorlines}, \texttt{solutionordottedlines}, and +\texttt{solutionorgrid} environments takes an optional argument: +\begin{itemize} +\item In a + % + \verb"solution" + % + \index{solution environment@\texttt{solution} environment!optional argument} + % + environment this is an amount of blank space to be left (just as if + you had used a \verb"\vspace*"\indc{vspace*} command; see + section~\ref{sec:BlankSpace}) when solutions are not being printed, +\item in a + % + \verb"solutionorbox"\indtsub{solutionorbox}{optional argument} + % + environment this is the height of an empty box to be drawn (just as + if you had used a \verb"\makeemptybox"\indc{makeemptybox} command; + see section~\ref{sec:EmptyBox}) when solutions are not being + printed, +\item in a + % + \verb"solutionorlines"\indtsub{solutionorlines}{optional argument} + % + environment this is an amount of lined space to be left (just as if + you had used a \verb"\fillwithlines"\indc{fillwithlines} command; + see section~\ref{sec:FillLines}) when solutions are not being + printed, +\item in a\indtsub{solutionordottedlines}{optional argument} + \verb"solutionordottedlines" environment this is an amount of dotted + lined space to be left (just as if you had used a + \verb"\fillwithdottedlines"\indc{fillwithdottedlines} command; see + section~\ref{sec:FillDotLines}) when solutions are not being + printed. +\item in a\indtsub{solutionorgrid}{optional argument} + \verb"solutionorgrid" environment this is an amount of space to be + filled with a grid (just as if you had used a + \verb"\fillwithgrid"\indc{fillwithgrid} command; see + section~\ref{sec:FillGrid}) when solutions are not being + printed. +\end{itemize} +For example, if you type +\begin{verbatim} +\begin{solution}[2in] + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solution} +\end{verbatim} +then there will be 2 inches of blank space inserted (as if you had +given the command \verb"\vspace*{2in}"; see +section~\ref{sec:BlankSpace}) when solutions are not being printed, if +you type +\begin{verbatim} +\begin{solutionorbox}[2in] + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionorbox} +\end{verbatim} +then there will be an empty box 2 inches tall inserted (as if you had +given the command \verb"\makeemptybox{2in}"; see +section~\ref{sec:EmptyBox}) when solutions are not being printed, if +you type +\begin{verbatim} +\begin{solutionorlines}[2in] + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionorlines} +\end{verbatim} +then there will be 2 inches of lined space inserted (as if you had +given the command \verb"\fillwithlines{2in}"; see +section~\ref{sec:FillLines}) when solutions are not being printed, if +you type +\begin{verbatim} +\begin{solutionordottedlines}[2in] + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionordottedlines} +\end{verbatim} +then there will be 2 inches of dotted lined space inserted (as if you +had given the command \verb"\fillwithdottedlines{2in}"; see +section~\ref{sec:FillDotLines}) when solutions are not being printed. +and if you type +\begin{verbatim} +\begin{solutionorgrid}[2in] + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionordottedlines} +\end{verbatim} +then there will be 2 inches of grid inserted (as if you had given the +command \verb"\fillwithgrid{2in}"; see section~\ref{sec:FillGrid}) +when solutions are not being printed. + + +%-------------------------------------------------------------------- +\subsubsection{Cancelling the space from the optional arguments} +\label{sec:cancelspace} +\indcstart{cancelspace} +\indcstart{nocancelspace} + +If you've typed any of the environments \texttt{solution}, +\texttt{solutionorbox}, \texttt{solutionorlines}, +\texttt{solutionordottedlines}, or \texttt{solutionorgrid} (see +section~\ref{sec:SolEnv}), and you've +\begin{itemize} +\item included an optional argument to leave space for answers when + solutions are not being printed, but +\item you would now like to print the exam \emph{without} printing the + solutions and \emph{without} leaving space for the answers, +\end{itemize} +then you can cancel the space that would be created by the optional +arguments by using the +\texttt{cancelspace}\indt{cancelspace}\indcsub{documentclass}{options} +document class option. That is, if you use the \verb"\documentclass" +command +\begin{center} + \verb"\documentclass[cancelspace]{exam}" +\end{center} +then optional arguments to any of the four solution environments will +be ignored. There are also commands \verb"\cancelspace" and +\verb"\nocancelspace"; using the document class option +\texttt{cancelspace} is equivalent to giving the command +\verb"\cancelspace" at the beginning of the file. The command +\verb"\nocancelspace" reverts to the default situation (in which the +optional arguments are not ignored). + +The document class option \texttt{cancelspace} has no effect at all if +solutions are being printed. + +\emph{Note:} The document class option \texttt{cancelspace} and the +command \verb"\cancelspace" only affect the optional arguments of of +the five solution environments \texttt{solution}, +\texttt{solutionorbox}, \texttt{solutionorlines}, +\texttt{solutionordottedlines}, and \texttt{solutionorgrid}; they do +\emph{not} affect any \verb"\vspace" commands that you put into the +file. + +\indcstop{nocancelspace} +\indcstop{cancelspace} + +\index{solution environment@\texttt{solution} environment!optional argument|)} + +%-------------------------------------------------------------------- +\subsection{The solutionbox environment} +\label{sec:solutionbox} +\indt{solutionbox} +\index{solution!in a box} + +The solutionbox environment is different from the other solution +environments (\texttt{solution}, \texttt{solutionorbox}, +\texttt{solutionorlines}, \texttt{solutionordottedlines}, and +\texttt{solutionorgrid}), in that +\begin{enumerate} +\item The box is always printed, whether answers are being printed or + not. +\item The argument giving the size of the box is a required argument, + not an optional argument, and so it should be enclosed in braces, + not in brackets. It can be either a length or + \verb"\stretch{number}". Note: \emph{It is the user's + responsibility to be sure that the box is large enough to hold the + solution!} If the solution takes up too much vertical space, then + it will spill out of the bottom of the box, overwriting whatever + follows the box. +\item The \texttt{solutionbox} environment makes no use of the + \texttt{TheSolution} environment; the \texttt{solutionbox} + environment is completely freestanding. +\end{enumerate} +If answers are not being printed then only the box is printed, with +nothing in it. If answers are being printed, then the solution is +printed inside of the box. (The box printed by the +\texttt{solutionbox} environment can be printed in color; for that, +see section~\ref{sec:colorboxes}.) + + + +For example, if you type +\begin{verbatim} +\begin{solutionbox}{2in} + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionbox} +\end{verbatim} +(note that the amount of space is required, and is typed as +``\verb"{2in}"'', rather than ``\verb"[2in]"'') and solutions are not +being printed, then you'll get +\begin{solutionbox}{2in} + Once upon a midnight dreary, while I pondered, weak and weary, Over + many a quaint and curious volume of forgotten lore--- While I + nodded, nearly napping, suddenly there came a tapping, As of some + one gently rapping, rapping at my chamber door. ``\,'Tis some + visitor,'' I muttered, ``tapping at my chamber door--- Only this and + nothing more.'' +\end{solutionbox} +If solutions \emph{are} being printed, then the exact same box would +be printed, but it would have the solution printed inside of it. + +\index{answer space|)} +\index{space!for answers|)} + +%-------------------------------------------------------------------- +\subsection{Solution box frames in color} +\label{sec:colorboxes} + +The frames that are printed by the commands that create solution boxes +can be printed in color. (By ``frame'' we mean the four lines that +constitute the box, not any solution that may appear inside that box.) +This includes +\begin{itemize} +\item the box printed by the \texttt{solutionbox} + environment\index{customization!\texttt{solutionbox}} + (see section~\ref{sec:solutionbox}), +\item the box printed by the \verb"\makeemptybox" + command\index{customization!\texttt{\char`\\makeemptybox}} + (see section~\ref{sec:EmptyBox}), +\item the box printed by the optional argument of the + \texttt{solutionorbox} + environment\index{customization!\texttt{solutionorbox}} (see + section~\ref{sec:SolEnv}), and +\item the box printed around the solution by + the\index{customization!\texttt{solution} environments} + \begin{itemize} + \item \texttt{solution}, + \item \texttt{solutionorbox}, + \item \texttt{solutionorlines}, + \item \texttt{solutionordottedlines}, and + \item \texttt{solutionorgrid} + \end{itemize} + environments when solutions are being printed and the default + solution appearance (\verb"\framedsolutions") is being used (see + section~\ref{sec:SolBox}). +\end{itemize} + +If you've given the command +\begin{center} + \verb"\usepackage{color}"\index{color package} +\end{center} +in the preamble of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" +command), then you can give the command\indc{colorsolutionboxes} +\begin{center} + \verb"\colorsolutionboxes" +\end{center} +to have the frame printed in color. The color of the frame will be +\texttt{SolutionBoxColor}, the default value of which was created by +the command\indc{definecolor}\indt{SolutionBoxColor} +\begin{center} + \verb"\definecolor{SolutionBoxColor}{gray}{0.8}" +\end{center} +You can change the color by giving a new \verb"\definecolor" command, +but you must do this \emph{after} the \verb"\colorsolutionboxes" +command. + +To cancel color \texttt{solutionbox} frames and return to black, give +the command\indc{nocolorsolutionboxes} +\begin{center} + \verb"\nocolorsolutionboxes" +\end{center} + + + +%-------------------------------------------------------------------- +\subsection{Changes depending on whether or not solutions are + being printed} +\label{sec:ifprintanswers} +\indcstart{ifprintanswers} + +The command \verb"\ifprintanswers" is provided in case you want to +vary what appears on the exam in ways other than those provided by the +solution environments (see section~\ref{sec:solutions}), the +\verb"\CorrectChoice" command in multiple choice environments (see +section~\ref{sec:CorrectChoice}), and the optional argument to the +\verb"\answerline" command (see section~\ref{sec:AnsShortAns}). You +use this command by typing +\begin{verbatim} +\ifprintanswers + Stuff to appear only when answers are being printed. +\else + Stuff to appear only when answers are not being printed. +\fi +\end{verbatim} +The \verb"\else" clause is optional; you can also type +\begin{verbatim} +\ifprintanswers + Stuff to appear only when answers are being printed. +\fi +\end{verbatim} +If you want something printed only when answers are not being printed, +you can type +\begin{verbatim} +\ifprintanswers +\else + Stuff to appear only when answers are not being printed. +\fi +\end{verbatim} +Since the \verb"exam" document class automatically loads the +\verb"ifthen" package, you can accomplish the same things using the +\verb"\ifthenelse" command: +\begin{verbatim} +\ifthenelse{\boolean{printanswers}} + {Stuff to appear only when answers are being printed.} + {Stuff to appear only when answers are not being printed.} +\end{verbatim} +If you use \verb"\ifthenelse", then \verb"both" cases must be present, +even if you leave one of them empty. Thus, e.g., if you want to print +something only when answers are not being printed, you'd type +\begin{verbatim} +\ifthenelse{\boolean{printanswers}} + {} + {Stuff to appear only when answers are not being printed.} +\end{verbatim} + + +%-------------------------------------------------------------------- +\subsubsection{Printing only selected solutions} +\label{sec:selectedsolutions} +\index{selected solution} +\index{solution!selected} + +The \verb"\ifprintanswers" command can be used to print only certain +of the solutions in an exam. To do that, you'd put the lines +\begin{verbatim} +\newif\ifprintselected +\printselectedtrue +%\printselectedfalse + +\newenvironment{select} +{\ifprintselected + \printanswers + \fi +} +{} +\end{verbatim} +into your preamble (i.e., after the \verb"\documentclass" command and +before the \verb"\begin{document}" command). That defines a + \texttt{select} environment, in which you can wrap any of the + solution environments, as in +\begin{verbatim} +\begin{select} + \begin{solutionorlines}[1in] + Only when the number is two. + \end{solutionorlines} +\end{select} +\end{verbatim} +As long as you leave the command \verb"\printselectedtrue" +uncommented, then everything wrapped in a \texttt{select} environment +will be printed. If you comment out \verb"\printselectedtrue" and +uncomment \verb"\printselectedfalse", then the \texttt{select} +environment will have no effect. + +\indcstop{ifprintanswers} + +\index{answers|)} +\index{solution environment@\texttt{solution} environment|)} +\index{solutions|)} + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Grading tables and point tables} +\label{sec:Tables} +\index{grading table|(} +\index{point table|(} +\indcstart{gradetable} +\indcstart{pointtable} + +\newlength\cwidth + +The \verb"exam" document class can print either +\begin{itemize} +\item a grading table, indexed either by question number or by page + number, which lists the points possible and leaves space for you to + fill in (by hand) the points earned (see + section~\ref{sec:GradeTables}), or +\item a point table, indexed either by question number or by page + number, which lists the points possible but does not leave space for + you to fill in the points earned (see + section~\ref{sec:PointTables}). +\end{itemize} +It's also possible to print either a grading table or point table to +cover only part of the exam (see section~\ref{sec:PartialTable}). + +If the exam has any bonus points (see section~\ref{sec:Bonus}), then +the bonus points will be ignored by the tables described in sections +\ref{sec:GradeTables}, \ref{sec:PointTables}, +and~\ref{sec:PartialTable}, but it's possible to print bonus grading +tables and bonus point tables that list the bonus points and ignore +the non-bonus points (see section~\ref{sec:BonusTables}) or combined +grading tables and combined point tables that list both regular points +and bonus points (see section~\ref{sec:CombinedTables}). + +%-------------------------------------------------------------------- +\subsection{Grading tables indexed by question number or by page + number} +\label{sec:GradeTables} +\index{grading table!by question number or page number|(} + +The \verb"exam" document class can print a grading table, indexed +either by question number or by page number. That is, you can print +\begin{itemize} +\item a table listing the question numbers (or question titles for + questions created using the \verb"\titledquestion" command instead + of the \verb"\question" command; see section~\ref{sec:Titled}) and + the total points possible for each question (including all of its + parts, subparts, and subsubparts) and leaving space for you to fill + in (by hand) the points earned on each question, or +\item a table listing each page that has at least one question, part, + subpart, or subsubpart with points assigned to it, the total number + of points possible on that page, and leaving space for you to fill + in (by hand) the points earned on that page. +\end{itemize} +In order to use this feature you must either include the optional +argument +\verb"addpoints"\indt{addpoints}\indcsub{documentclass}{options} in +your \verb"\documentclass" command (as in +\verb"\documentclass[addpoints]{exam}") or give the command +\verb"\addpoints"\indc{addpoints} (see section~\ref{sec:addpoints}), +and there must be only one \verb"questions" +% +environment\index{questions environment!only one} in the entire exam. +In addition, you must run \LaTeX{} twice after making any changes to +the file in order to make sure that the point values are correct on a +grading table indexed by question number and at least three times for +a grading table indexed by page number. (Since the table appears on +the third run of \LaTeX{}, and the space it occupies can change the +page on which each question falls, it may take a fourth run of +\LaTeX{} for the table to have the points per page correct.) + +The command to create a grading table is +\begin{center} + \verb"\gradetable" +\end{center} +and it takes two optional +arguments:\indc{gradetable[v]}\indc{gradetable[h]} +\begin{enumerate} +\item The first optional argument can be either \verb"[v]" or + \verb"[h]", to choose between a vertically oriented table and a + horizontally oriented table, and +\item the second optional argument can be either \verb"[questions]" or + \verb"[pages]", to choose between a table indexed by question number + and a table indexed by page number. +\end{enumerate} +That is,\indc{gradetable[v][questions]}\indc{gradetable[v][pages]}% +\indc{gradetable[h][questions]}\indc{gradetable[h][pages]} +\begin{itemize} +\item \verb"\gradetable[v][questions]" prints a vertically oriented + table indexed by question number, +\item \verb"\gradetable[h][questions]" prints a horizontally oriented + table indexed by question number, +\item \verb"\gradetable[v][pages]" prints a vertically oriented table + indexed by page number, and +\item \verb"\gradetable[h][pages]" prints a horizontally oriented + table indexed by page number. +\end{itemize} +If you leave out the optional arguments (i.e., if you give the command +as ``\verb"\gradetable"'') you'll get a vertically oriented table +indexed by question number. + +For example, if the exam has 8 questions, each worth a total of 15 +points, and you type +\begin{verbatim} +\begin{center} + \gradetable[v][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|c|c|c|} + \hline + Question& Points& Score\\ + \hline + 1& 15& \hbox to \cwidth{\hfill}\\ + \hline + 2& 15& \hbox to \cwidth{\hfill}\\ + \hline + 3& 15& \hbox to \cwidth{\hfill}\\ + \hline + 4& 15& \hbox to \cwidth{\hfill}\\ + \hline + 5& 15& \hbox to \cwidth{\hfill}\\ + \hline + 6& 15& \hbox to \cwidth{\hfill}\\ + \hline + 7& 15& \hbox to \cwidth{\hfill}\\ + \hline + 8& 15& \hbox to \cwidth{\hfill}\\ + \hline + Total:& 120&\\ + \hline + \end{tabular} +\end{center} +and if you type +\begin{verbatim} +\begin{center} + \gradetable[h][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& Total\\ + \hline + Points:& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 120\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \\ + \hline + \end{tabular} +\end{center} +The number of points listed for a question is the sum of the point +values for that question and all of its parts, subparts, and +subsubparts. + +If those 8 questions are distributed two to a page on each of pages 2 +through 5 and if you type +\begin{verbatim} +\begin{center} + \gradetable[v][pages] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|c|c|c|} + \hline + Page& Points& Score\\ + \hline + 2& 30& \hbox to \cwidth{\hfill}\\ + \hline + 3& 30& \hbox to \cwidth{\hfill}\\ + \hline + 4& 30& \hbox to \cwidth{\hfill}\\ + \hline + 5& 30& \hbox to \cwidth{\hfill}\\ + \hline + Total:& 120&\\ + \hline + \end{tabular} +\end{center} +and if you type +\begin{verbatim} +\begin{center} + \gradetable[h][pages] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|} + \hline + Page:& 2& 3& 4& 5& Total\\ + \hline + Points:& + 30& + 30& + 30& + 30& + 120\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill} + \\ + \hline + \end{tabular} +\end{center} + +\emph{Warning:} If you have a large number of questions on +the exam, then these tables can easily become too large to fit on the +page. If this becomes a problem, then you can either +\begin{itemize} +\item create grading ranges (see section~\ref{sec:PartialTable}) and + print several partial grading tables, making each one small enough + to fit on the page, or +\item use the \verb"\multirowgradetable" or + \verb"\multicolumngradetable" command (see section~\ref{sec:MulRows} + and section~\ref{sec:MulCols}) to create a grading table with + multiple rows or multiple columns. +\end{itemize} +\index{grading table!by question number or page number|)} + +%-------------------------------------------------------------------- +\subsubsection{Grading tables with multiple rows} +\label{sec:MulRows} + +If you want to print a horizontal grading table but the table would be +too large for the page, you can print a grading table with multiple +rows by giving the command +\begin{center} + \verb"\multirowgradetable{numrows}[questions or pages]" +\end{center} +\indc{multirowgradetable}Note that the first argument +(\texttt{numrows}) is \emph{required}, and so it is enclosed in +braces, but the second argument (\texttt{questions} or \texttt{pages}) +is optional, and is enclosed in square brackets, just as in the +\verb"\gradetable" command (see section~\ref{sec:GradeTables}). For +example, to print a grading table with 3 rows indexed by questions, +you would give the command +\begin{center} + \verb"\multirowgradetable{3}[questions]" +\end{center} +The command +\begin{center} + \verb"\gradetable[h][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multirowgradetable{1}[questions]" +\end{center} + +The distance between the rows of a multirow table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +For example, if an exam has 16 questions, each worth a total of 15 +points, and you type +\begin{verbatim} +\begin{center} + \setlength{\doublerulesep}{0.25in} + \multirowgradetable{2}[questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \setlength{\doublerulesep}{0.25in} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& 9\\ + \hline + Points:& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 15\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \\ + \hline + \hline + Question:& 10& 11& 12& 13& 14& 15& 16&& Total\\ + \hline + Points:& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + & + 240\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \\ + \hline + \end{tabular} +\end{center} + + +%-------------------------------------------------------------------- +\subsubsection{Grading tables with multiple columns} +\label{sec:MulCols} + +If you want to print a vertical grading table but the table would be +too large for the page, you can print a grading table with multiple +columns by giving the command +\begin{center} + \verb"\multicolumngradetable{numcols}[questions or pages]" +\end{center} +\indc{multicolumngradetable}Note that the first argument +(\texttt{numcols}) is \emph{required}, and so it is enclosed in +braces, but the second argument (\texttt{questions} or \texttt{pages}) +is optional, and is enclosed in square brackets, just as in the +\verb"\gradetable" command (see section~\ref{sec:GradeTables}). For +example, to print a grading table with 3 columns indexed by questions, +you would give the command +\begin{center} + \verb"\multicolumngradetable{3}[questions]" +\end{center} +The command +\begin{center} + \verb"\gradetable[v][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multicolumngradetable{1}[questions]" +\end{center} + +The distance between the columns of a multicolumn table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +For example, if an exam has 10 questions, each worth a total of 15 +points, and you type +\begin{verbatim} +\begin{center} + \setlength{\doublerulesep}{0.5in} + \multicolumngradetable{2}[questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \setlength{\doublerulesep}{0.5in} + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|c|c|c|c|c|c|c|} + \cline{1-3}\cline{5-7} + Question& Points& Score& + \hspace*{-\arrayrulewidth}\hspace*{\doublerulesep}& + Question& Points& Score\\ + \cline{1-3}\cline{5-7} + 1& 15& \hbox to \cwidth{\hfill}&&7& 15& \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + 2& 15& \hbox to \cwidth{\hfill}&&8& 15& \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + 3& 15& \hbox to \cwidth{\hfill}&&9& 15& \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + 4& 15& \hbox to \cwidth{\hfill}&&10& 15& \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + 5& 15& \hbox to \cwidth{\hfill}&& & & \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + 6& 15& \hbox to \cwidth{\hfill}&&Total:& 150& \hbox to \cwidth{\hfill}\\ + \cline{1-3}\cline{5-7} + + \cline{1-3}\cline{5-7} + \end{tabular} +\end{center} + + + +%-------------------------------------------------------------------- +\subsection{Point tables indexed by question number or by page + number} +\label{sec:PointTables} +\index{point table!by question number or page number|(} + +Point tables are similar to grading tables (see +section~\ref{sec:GradeTables}), except that there is no place in the +table to fill in the points earned. + +The command to create a point table is +\begin{center} + \verb"\pointtable" +\end{center} +and it takes two optional +arguments:\indc{pointtable[v]}\indc{pointtable[h]} +\begin{enumerate} +\item The first optional argument can be either \verb"[v]" or + \verb"[h]", to choose between a vertically oriented table and a + horizontally oriented table, and +\item the second optional argument can be either \verb"[questions]" or + \verb"[pages]", to choose between a table indexed by question number + and a table indexed by page number. +\end{enumerate} +That is,\indc{pointtable[v][questions]}\indc{pointtable[v][pages]}% +\indc{pointtable[h][questions]}\indc{pointtable[h][pages]} +\begin{itemize} +\item \verb"\pointtable[v][questions]" prints a vertically oriented + table indexed by question number, +\item \verb"\pointtable[h][questions]" prints a horizontally oriented + table indexed by question number, +\item \verb"\pointtable[v][pages]" prints a vertically oriented table + indexed by page number, and +\item \verb"\pointtable[h][pages]" prints a horizontally oriented + table indexed by page number. +\end{itemize} +If you leave out the optional arguments (i.e., if you give the command +as ``\verb"\pointtable"'') you'll get a vertically oriented table +indexed by question number. + +For example, if the exam has 8 questions, each worth a total of 15 +points, and you type +\begin{verbatim} +\begin{center} + \pointtable[v][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|c|c|} + \hline + Question& Points\\ + \hline + 1& 15\\ + \hline + 2& 15\\ + \hline + 3& 15\\ + \hline + 4& 15\\ + \hline + 5& 15\\ + \hline + 6& 15\\ + \hline + 7& 15\\ + \hline + 8& 15\\ + \hline + Total:& 120\\ + \hline + \end{tabular} +\end{center} +and if you type +\begin{verbatim} +\begin{center} + \pointtable[h][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& Total\\ + \hline + Points:& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 120\\ + \hline + \end{tabular} +\end{center} +The number of points listed for a question is the sum of the point +values for that question and all of its parts, subparts, and +subsubparts. + +If those 8 questions are distributed two to a page on each of pages 2 +through 5 and if you type +\begin{verbatim} +\begin{center} + \pointtable[v][pages] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|c|c|} + \hline + Page& Points\\ + \hline + 2& 30\\ + \hline + 3& 30\\ + \hline + 4& 30\\ + \hline + 5& 30\\ + \hline + Total:& 120\\ + \hline + \end{tabular} +\end{center} +and if you type +\begin{verbatim} +\begin{center} + \pointtable[h][pages] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|} + \hline + Page:& 2& 3& 4& 5& Total\\ + \hline + Points:& + 30& + 30& + 30& + 30& + 120\\ + \hline + \end{tabular} +\end{center} + +\emph{Warning:} If you have a large number of questions on +the exam, then these tables can easily become too large to fit on the +page. If this becomes a problem, then you can either +\begin{itemize} +\item create grading ranges (see section~\ref{sec:PartialTable}) and + print several partial point tables, making each one small enough + to fit on the page, or +\item use the \verb"\multirowpointtable" or + \verb"\multicolumnpointtable" command (see + section~\ref{sec:PtMulRows} and section~\ref{sec:PtMulCols}) to + create a point table with multiple rows or multiple columns. +\end{itemize} +\index{point table!by question number or page number|)} + +%-------------------------------------------------------------------- +\subsubsection{Point tables with multiple rows} +\label{sec:PtMulRows} + +If you want to print a horizontal point table but the table would be +too large for the page, you can print a point table with multiple +rows by giving the command +\begin{center} + \verb"\multirowpointtable{numrows}[questions or pages]" +\end{center} +\indc{multirowpointtable}Note that the first argument +(\texttt{numrows}) is \emph{required}, and so it is enclosed in +braces, but the second argument (\texttt{questions} or \texttt{pages}) +is optional, and is enclosed in square brackets, just as in the +\verb"\pointtable" command (see section~\ref{sec:PointTables}). For +example, to print a point table with 3 rows indexed by questions, you +would give the command +\begin{center} + \verb"\multirowpointtable{3}[questions]" +\end{center} +The command +\begin{center} + \verb"\pointtable[h][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multirowpointtable{1}[questions]" +\end{center} + +The distance between the rows of a multirow table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +%-------------------------------------------------------------------- +\subsubsection{Point tables with multiple columns} +\label{sec:PtMulCols} + +If you want to print a vertical point table but the table would be +too large for the page, you can print a point table with multiple +columns by giving the command +\begin{center} + \verb"\multicolumnpointtable{numcols}[questions or pages]" +\end{center} +\indc{multicolumnpointtable}Note that the first argument +(\texttt{numcols}) is \emph{required}, and so it is enclosed in +braces, but the second argument (\texttt{questions} or \texttt{pages}) +is optional, and is enclosed in square brackets, just as in the +\verb"\pointtable" command (see section~\ref{sec:PointTables}). For +example, to print a point table with 3 columns indexed by questions, +you would give the command +\begin{center} + \verb"\multicolumnpointtable{3}[questions]" +\end{center} +The command +\begin{center} + \verb"\pointtable[v][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multicolumnpointtable{1}[questions]" +\end{center} + +The distance between the columns of a multicolumn table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +%-------------------------------------------------------------------- +\subsection{Table entries as clickable links} +\label{sec:Clickable} +\index{grading table!clickable links} +\index{point table!clickable links} +\index{clickable links} + +If you put the command\indc{usepackage\{hyperref\}}\indt{hyperref} +\begin{center} + \verb"\usepackage{hyperref}" +\end{center} +into the preamble of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" +command) and then produce a pdf file (either using dvipdf or +directly by using pdflatex), then +\begin{itemize} +\item in a grading table or point table indexed by question number the + question numbers in the table will be clickable links that take you + to the corresponding question, and +\item in a grading table or point table indexed by page number the + page numbers in the table will be clickable links that take you to + the corresponding page. +\end{itemize} +If you create questions using the \verb"\titledquestion" command +instead of the \verb"\question" command (see +section~\ref{sec:Titled}), then a grading table or point table indexed +by question number will show the \emph{titles} of those questions +instead of the numbers of those questions, and those question titles +will be clickable links that take you to the corresponding question. + +%-------------------------------------------------------------------- +\subsection{Grading ranges, partial grading tables, and partial point + tables} +\label{sec:PartialTable} +\index{grading range|(} +\indcstart{begingradingrange} +\indcstart{endgradingrange} +\index{range!grading|(} + +It is possible to define one or more ``grading ranges'', and then to +count the points in a range and create grading tables and point tables +that cover only that range. + +In more detail: You can define a grading range by choosing a name with +which to label the range, e.g., ``myrange'', and then putting the +command +\begin{itemize} +\item[] \verb"\begingradingrange{myrange}" at the start of the range + and the command +\item[] \verb"\endgradingrange{myrange}" at the end of the range. +\end{itemize} +You can then use the commands +\begin{itemize} +\item \verb"\pointsinrange{myrange}"\indc{pointsinrange}, which will + expand to the number of points in the range, +\item \verb"\firstqinrange{myrange}"\indc{firstqinrange}, which will + expand to the number of the first question in the range, +\item \verb"\lastqinrange{myrange}"\indc{lastqinrange}, which will + expand to the number of the last question in the range, and +\item \verb"\numqinrange{myrange}"\indc{numqinrange}, which will + expand to the number of questions in the range. +\end{itemize} +You can define as many grading ranges as you like, wherever you like. +That is, grading ranges do \emph{not} need to be nested; you can begin +the range \texttt{otherrange} somewhere in the middle of the range +\texttt{myrange} and then end the range \texttt{otherrange} after the +end of \texttt{myrange}. + +You can create a grading table or point table that covers only the +questions in a range by using the +\verb"\partialgradetable"\indc{partialgradetable} or +\verb"\partialpointtable"\indc{partialpointtable} command. These are +similar to the \verb"\gradetable" and \verb"\pointtable" commands, +except that they each have one required argument (the name of the +grading range) before the two optional arguments (the first of which +must be either \verb"[v]" or \verb"[h]" and the second of which must +be either \verb"[questions]" or \verb"[pages]"). For example, the +command +\begin{center} + \verb"\partialgradetable{myrange}[v][questions]" +\end{center} +would create a vertically grading oriented table indexed by the +questions in the range, and the command +\begin{center} + \verb"\partialgradetable{myrange}[v][pages]" +\end{center} +would create a vertically oriented grading table indexed by all pages +with points starting with the page containing the command +\verb"\begingradingrange{myrange}" and ending with the page containing +the command \verb"\endgradingrange{myrange}" + +If the exam has any bonus points (see section~\ref{sec:Bonus}), then +the bonus points will be ignored by the \verb"\pointsinrange", +\verb"\partialgradetable", and \verb"\partialpointtable" commands, but +they will be counted by the \verb"\bonuspointsinrange" command (see +section~\ref{sec:BonusTables}) and tabulated by the +\verb"\partialbonusgradetable", \verb"\partialbonuspointtable", +\verb"\partialcombinedgradetable", and +\verb"\partialcombinedponttable" commands (see +section~\ref{sec:BonusTables} and section~\ref{sec:CombinedTables}). + +\index{range!grading|)} +\indcstop{endgradingrange} +\indcstop{begingradingrange} +\index{grading range|)} + + +%-------------------------------------------------------------------- +\subsubsection{Partial grading tables and partial point tables with + multiple rows} +\label{sec:PartMulRows} + +If you want to print a horizontal partial grading table or partial +point table but the table would be too large for the page, you can +print a partial grading table or partial point table with multiple +rows by giving the one of the commands +\begin{center} + \verb"\multirowpartialgradetable{numrows}{rangename}[questions or pages]" + \verb"\multirowpartialpointtable{numrows}{rangename}[questions or pages]" +\end{center} +\indc{multirowpartialgradetable}\indc{multirowpartialpointtable}Note +that the first two arguments (\texttt{numrows} and \texttt{rangename}) +are \emph{required}, and so they are enclosed in braces, but the third +argument (\texttt{questions} or \texttt{pages}) is optional, and is +enclosed in square brackets, just as in the \verb"\partialgradetable" +and \verb"\partialpointtable" commands (see +section~\ref{sec:PartialTable}). For example, to print a partial +grading table with 3 rows covering the range \texttt{myrange} indexed +by questions, you would give the command +\begin{center} + \verb"\multirowpartialgradetable{3}{myrange}[questions]" +\end{center} +The command +\begin{center} + \verb"\partialgradetable{myrange}[h][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multirowpartialgradetable{1}{myrange}[questions]" +\end{center} + +The distance between the rows of a multirow table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +%-------------------------------------------------------------------- +\subsubsection{Partial grading tables and partial point tables with + multiple columns} +\label{sec:PartMulCols} + +If you want to print a vertical partial grading table or partial point +table but the table would be too large for the page, you can print a +partial grading table or partial point table with multiple columns by +giving one of the commands +\begin{center} +\verb"\multicolumnpartialgradetable{numcols}{rangename}[questions or pages]"\\ +\verb"\multicolumnpartialpointtable{numcols}{rangename}[questions or pages]" +\end{center} +\indc{multicolumnpartialgradetable}\indc{multicolumnpartialpointtable}Note +that the first two arguments (\texttt{numcols} and +\texttt{rangename}) are \emph{required}, and so they are enclosed in +braces, but the third argument (\texttt{questions} or \texttt{pages}) +is optional, and is enclosed in square brackets, just as in the +\verb"\partialgradetable" and \verb"\partialpointtable" commands (see +section~\ref{sec:PartialTable}). For example, to print a partial +grading table with 3 columns covering the range \texttt{myrange} +indexed by questions, you would give the command +\begin{center} + \verb"\multicolumnpartialgradetable{3}{myrange}[questions]" +\end{center} +The command +\begin{center} + \verb"\partialgradetable{myrange}[v][questions]" +\end{center} +is equivalent to +\begin{center} + \verb"\multicolumnpartialgradetable{1}{myrange}[questions]" +\end{center} + +The distance between the columns of a multicolumn table is +\verb"\doublerulesep", the default value of which is 2.0pt. You can +change that using a \verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + +%-------------------------------------------------------------------- +\subsection{\texttt{\bs pointsofquestion}} +\label{sec:pointsofq} + +If you use the document class option \verb"addpoints"\indt{addpoints} +(as in +\verb"\documentclass[addpoints]{exam}"\indcsub{documentclass}{options}) +or give the command \verb"\addpoints"\indc{addpoints} (see +section~\ref{sec:addpoints}), then you can use +the\indc{pointsofquestion} +\begin{center} + \verb"\pointsofquestion" +\end{center} +command. This command takes one argument, which must be the number of +a question on the exam, and it prints the total number of points for +that question. That is: +\begin{itemize} +\item \verb"\pointsofquestion{1}" prints the sum of the point values + for question 1 and all of its parts, subparts, and subsubparts. +\item \verb"\pointsofquestion{2}" prints the sum of the point values + for question 2 and all of its parts, subparts, and subsubparts. +\item Etc. +\end{itemize} +The \verb"\pointsofquestion" command is used by the \verb"\gradetable" +and \verb"\pointtable" commands (see section~\ref{sec:Tables}), +and it can be used to create a table using \LaTeX's \verb"tabular" +environment when the tables produced using the \verb"\gradetable" and +\verb"\pointtable" commands either don't fit on the page or are +unsuitable for some other reason. It can also be used in a +\verb"\qformat" command to list the total number of points of all +parts, subparts, and subsubparts of a question on the line with the +question number (see section~\ref{sec:adding}). + +The \verb"\pointsofquestion"\indc{pointsofquestion} command ignores +any bonus points that you may have created (see +section~\ref{sec:Bonus}). The \verb"\bonuspointsofquestion" command, +however, counts the bonus points (see section~\ref{sec:BonusTables}). + +%-------------------------------------------------------------------- +\subsection{\texttt{\bs pointsonpage}} +\label{sec:pointsonp} + +If you use the document class option \verb"addpoints"\indt{addpoints} +(as in +\verb"\documentclass[addpoints]{exam}"\indcsub{documentclass}{options}) +or give the command \verb"\addpoints"\indc{addpoints} (see +section~\ref{sec:addpoints}), then you can use the +\verb"\pointsonpage"\indc{pointsonpage} command. This command takes +one argument, which must be the number of a page of the exam, and it +prints the total number of points for all the questions, parts, +subparts, and subsubparts on that page. That is: +\begin{itemize} +\item \verb"\pointsonpage{1}" prints the sum of the point values for + all questions, etc., on page 1, +\item \verb"\pointsonpage{2}" prints the sum of the point values for + all questions, etc., on page 2, +\item Etc. +\end{itemize} +This command can be used to create a table using \LaTeX's +\verb"tabular" environment when the tables produced using the +\verb"\gradetable" and \verb"\pointtable" commands either don't fit on +the page or are unsuitable for some other reason. It can also be used +in headers and footers to print on each page the total number of +points available on that page; for example, the command +\begin{verbatim} + \runningfooter{} + {} + {Points earned: \makebox[1in]{\hrulefill} + out of a possible \pointsonpage{\thepage} points} +\end{verbatim} +\indcsub{pointsonpage}{in footer} (see +section~\ref{sec:runningfooter}) will produce the footer +\samplefoot{}{}{}{Points earned: \makebox[1in]{\hrulefill} out of a + possible 20 points} on all pages after the first. (For another +example, see section~\ref{sec:PtsPgEx}) + +\textbf{Caution:} The command \verb"\pointsonpage{\thepage}" will work +reliably only in headers and footers, since the command +% +\verb"\thepage"\indcsub{thepage}{reliable only in headers and footers} +will work reliably only in headers and footers. + +The \verb"\pointsonpage" command ignores any bonus points that you may +have created (see section~\ref{sec:Bonus}). The +\verb"\bonuspointsonpage" command, however, counts the bonus points +(see section~\ref{sec:BonusTables}). + +%-------------------------------------------------------------------- +\subsection{Bonus grading tables and bonus point tables} +\label{sec:BonusTables} +\index{grading table!bonus|(} +\index{point table!bonus|(} + +If your exam contains any bonus +% +points\index{bonus points}\index{points!bonus} (see +section~\ref{sec:Bonus}), then those bonus points will be ignored by +the grading table and point table commands described in sections +\ref{sec:GradeTables}, \ref{sec:PointTables}, +and~\ref{sec:PartialTable} and by the +\verb"\pointsofquestion"\indc{pointsofquestion} (see +section~\ref{sec:pointsofq}) and +\verb"\pointsonpage"\indc{pointsonpage} (see +section~\ref{sec:pointsonp}) commands. There are, however, analogous +commands that count only the bonus points and ignore the non-bonus +points. (There are also commands that create tables listing both +non-bonus and bonus points; see section~\ref{sec:CombinedTables}.) +These commands, and the non-bonus commands to which they correspond, +are as follows: +\begin{center} + \begin{tabular}{l@{\qquad\qquad}l} + Bonus points& Non-bonus points\\[\bigskipamount] + \verb"\bonusgradetable"& \verb"\gradetable"\\ + \verb"\multirowbonusgradetable"& \verb"\multirowgradetable"\\ + \verb"\multicolumnbonusgradetable"& \verb"\multicolumngradetable"\\ + \verb"\bonuspointtable"& \verb"\pointtable"\\ + \verb"\multirowbonuspointtable"& \verb"\multirowpointtable"\\ + \verb"\multicolumnbonuspointtable"& + \verb"\multicolumnpointtable"\\[\medskipamount] + \verb"\partialbonusgradetable"& \verb"\partialgradetable"\\ + \verb"\multirowpartialbonusgradetable"& + \verb"\multirowpartialgradetable"\\ + \verb"\multicolumnpartialbonusgradetable"& + \verb"\multicolumnpartialgradetable"\\ + \verb"\partialbonuspointtable"& + \verb"\partialpointtable"\\ + \verb"\multirowpartialbonuspointtable"& + \verb"\multirowpartialpointtable"\\ + \verb"\multicolumnpartialbonuspointtable"& + \verb"\multicolumnpartialpointtable"\\[\medskipamount] + \verb"\bonuspointsinrange"& \verb"\pointsinrange"\\ + \verb"\bonuspointsofquestion"& \verb"\pointsofquestion"\\ + \verb"\bonuspointsonpage"& \verb"\pointsonpage" + \end{tabular} +\end{center} +\indc{bonusgradetable}\indc{bonuspointtable}% +\indc{bonuspointsinrange}\indc{partialbonusgradetable}% +\indc{partialbonuspointtable}\indc{bonuspointsofquestion}% +\indc{bonuspointsonpage}% +\indc{multirowbonusgradetable}% +\indc{multicolumnbonusgradetable}% +\indc{multirowbonuspointtable}% +\indc{multicolumnbonuspointtable}% +\indc{multirowpartialbonusgradetable}% +\indc{multicolumnpartialbonusgradetable}% +\indc{multirowpartialbonuspointtable}% +\indc{multicolumnpartialbonuspointtable}% +All of the the commands in the first column count bonus points and +ignore non-bonus points, while all of the commands in the second +column count non-bonus points and ignore bonus points. The commands +\begin{center} + \begin{tabular}{l} + \verb"\partialbonusgradetable",\\ + \verb"\multirowpartialbonusgradetable",\\ + \verb"\multicolumnpartialbonusgradetable",\\ + \verb"\partialbonuspointtable",\\ + \verb"\multirowpartialbonuspointtable", and\\ + \verb"\multicolumnpartialbonuspointtable" + \end{tabular} +\end{center} +use the same \verb"\begingradingrange"\indc{begingradingrange} and +\verb"\endgradingrange"\indc{endgradingrange} commands that are used +by the corresponding non-bonus versions (see +section~\ref{sec:PartialTable}). Just as is described in +section~\ref{sec:Clickable} for their non-bonus counterparts, if you +put the command\indc{usepackage\{hyperref\}}\indt{hyperref} +\begin{center} + \verb"\usepackage{hyperref}" +\end{center} +into the preamble of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" +command) and then produce a pdf file (either using dvipdf or +directly by using pdflatex), +% +then\index{clickable links} +\begin{itemize} +\item in a bonus grading table or bonus point table indexed by + question number, the question numbers (or question titles, if you + used \verb"\bonustitledquestion"; see section~\ref{sec:Bonus}) in + the table will be clickable links that take you to the corresponding + question, and +\item in a bonus grading table or bonus point table indexed by page + number the page numbers in the table will be clickable links that + take you to the corresponding page. +\end{itemize} + +For example, if the exam has 8 questions, with each odd numbered +question worth a total of 10 regular points and each even numbered +question worth a total of 5 bonus points, and you type +\begin{verbatim} +\begin{center} + \bonusgradetable[h][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& Total\\ + \hline + Bonus Points:& + 0& + 5& + 0& + 5& + 0& + 5& + 0& + 5& + 20\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}&\\ + \hline + \end{tabular} +\end{center} + +\index{point table!bonus|)} +\index{grading table!bonus|)} + +%-------------------------------------------------------------------- +\subsection{Combined grading tables and combined point tables} +\label{sec:CombinedTables} +\index{grading table!combined|(} +\index{point table!combined|(} + + +There are commands for producing \emph{combined} grading and point +tables, both partial and full, that tabulate both regular points and +bonus points (see section~\ref{sec:Bonus}). The single-row and +single-column versions of these commands, and the +non-bonus and bonus commands to which they correspond, are +\indc{combinedgradetable}\indc{combinedpointtable}% +\indc{partialcombinedgradetable}\indc{partialcombinedpointtable}% +\begin{center} + \begin{tabular}{l@{\enskip}l@{\enskip}l} + Non-Bonus points only& \multicolumn{1}{c}{Bonus points only}& + \multicolumn{1}{c}{Combined}\\[\medskipamount] + \verb"\gradetable"& \verb"\bonusgradetable"& + \verb"\combinedgradetable"\\ + \verb"\pointtable"& \verb"\bonuspointtable"& + \verb"\combinedpointtable"\\ + \verb"\partialgradetable"& \verb"\partialbonusgradetable"& + \verb"\partialcombinedgradetable"\\ + \verb"\partialpointtable"& \verb"\partialbonuspointtable"& + \verb"\partialcombinedpointtable" + \end{tabular} +\end{center} +The first two commands in each column take two optional arguments, the +first being either \verb"[v]" or \verb"[h]" and the second being +either \verb"[questions]" or \verb"[pages]". The last two commands in +each column take one required argument, the name of the grading range +(defined using the \verb"\begingradingrange" and +\verb"\endgradingrange" commands; see section~\ref{sec:PartialTable}), +and then the same two optional arguments as the other commands (the +first being either \verb"[v]" or \verb"[h]" and the second being +either \verb"[questions]" or \verb"[pages]"). + +The multirow and multicolumn versions of combined grading tables and +combined point tables are produced by the commands +\indc{multirowcombinedgradetable}% +\indc{multirowcombinedpointtable}% +\indc{multirowpartialcombinedgradetable}% +\indc{multirowpartialcombinedpointtable}% +\indc{multicolumncombinedgradetable}% +\indc{multicolumncombinedpointtable}% +\indc{multicolumnpartialcombinedgradetable}% +\indc{multicolumnpartialcombinedpointtable}% +\begin{verbatim} +\multirowcombinedgradetable{numrows}[questions or pages] +\multirowcombinedpointtable{numrows}[questions or pages] +\multirowpartialcombinedgradetable{numrows}{rangename}[questions or pages] +\multirowpartialcombinedpointtable{numrows}{rangename}[questions or pages] +\multicolumncombinedgradetable{numcols}[questions or pages] +\multicolumncombinedpointtable{numcols}[questions or pages] +\multicolumnpartialcombinedgradetable{numcols}{rangename}[questions or pages] +\multicolumnpartialcombinedpointtable{numcols}{rangename}[questions or pages] +\end{verbatim} +The distance between the rows of a multirow table and between the +columns of a multicolumn table is \verb"\doublerulesep", the default +value of which is 2.0pt. You can change that using a +\verb"\setlength" command, as in +\begin{center} + \verb"\setlength{\doublerulesep}{0.5in}" +\end{center} +(see section~\ref{sec:CustTable}). + + + +Just as is described in section~\ref{sec:Clickable} for their regular +points and section~\ref{sec:BonusTables} for bonus points, if you put +the +% +command\index{clickable links}\indc{usepackage\{hyperref\}}% +\indt{hyperref} +\begin{center} + \verb"\usepackage{hyperref}" +\end{center} +into the preamble of your document (i.e., after the +\verb"\documentclass" command and before the \verb"\begin{document}" +command) and then produce a pdf file (either using dvipdf or +directly by using pdflatex), then +\begin{itemize} +\item in a combined grading table or combined point table indexed by + question number, the question numbers (or question titles, if you + used either \verb"\titledquestion" (see section~\ref{sec:Titled}) or + \verb"\bonustitledquestion" (see section~\ref{sec:Bonus})) in the + table will be clickable links that take you to the corresponding + question, and +\item in a combined grading table or combined point table indexed by + page number the page numbers in the table will be clickable links + that take you to the corresponding page. +\end{itemize} + +For example, if the exam has 8 questions, with each odd numbered +question worth a total of 10 regular points and each even numbered +question worth a total of 5 bonus points, and you type +\begin{verbatim} +\begin{center} + \combinedgradetable[h][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& Total\\ + \hline + Points:& + 10& + 0& + 10& + 0& + 10& + 0& + 10& + 0& + 40\\ + \hline + Bonus Points:& + 0& + 5& + 0& + 5& + 0& + 5& + 0& + 5& + 20\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}&\\ + \hline + \end{tabular} +\end{center} + +\index{point table!combined|)} +\index{grading table!combined|)} + +%-------------------------------------------------------------------- +\subsection{Changing the total points in a table} +\label{sec:Totalpoints} +\index{grading table!changing total points|(} +\index{point table!changing total points|(} + + +There are commands for changing the total points and total bonus +points in grading and point tables, so that the stated point total +will not equal the sum of the point values in the table. These +commands are intended for exams in which the students are required to +do some subset of the problems, but not all of them, and so the total +number of points possible on the exam is less than the sum of the +points for all of the questions. The commands +are\indc{settabletotalpoints}\indc{settabletotalbonuspoints} +\begin{center} + \begin{tabular}{l} + \verb"\settabletotalpoints"\\ + \verb"\settabletotalbonuspoints" + \end{tabular} +\end{center} +Each of those commands takes one argument. After giving the command +\begin{center} + \verb"\settabletotalpoints{number}" +\end{center} +any grading or point table (regular or combined, partial or full) will +list the total points as \texttt{number} instead of the actual total +number of points in the table. After giving the command +\begin{center} + \verb"\settabletotalbonuspoints{number}" +\end{center} +any grading or point table (bonus or combined, partial or full) will +list the total bonus points as \texttt{number} instead of the actual +total number of bonus points in the table. + +To have these commands affect only a single table, confine the command +and the command to create the table inside of a group (possibly by +just placing those commands inside of a \texttt{center} environment). +For example, if an exam has 8 questions, each worth 10 points, and the +students are required to do any 6 of the 8, then the commands +\begin{verbatim} +\begin{center} + \settabletotalpoints{60} + \gradetable[h][questions] +\end{center} +\end{verbatim} +will produce +\begin{center} + \cwidth=2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Question:& 1& 2& 3& 4& 5& 6& 7& 8& Total\\ + \hline + Points:& + 10& + 10& + 10& + 10& + 10& + 10& + 10& + 10& + 60\\ + \hline + Score:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}&\\ + \hline + \end{tabular} +\end{center} +and no other tables will be affected by that +\verb"\settabletotalpoints" command. + +\index{point table!changing total points|)} +\index{grading table!changing total points|)} + +%-------------------------------------------------------------------- +\subsection{Customizing the tables} +\label{sec:CustTable} +\index{customization!grading table|(} +\index{customization!point table|(} +\index{grade table!customization|(} +\index{point table!customization|(} + +There are four ways in which you can customize the appearance of +grading tables and point tables: +\begin{itemize} +\item You can change the words (and the fonts) that appear in the + table. +\item You can change the minimum width of the blank cells into which + you will write the scores. +\item You can change the value of + \verb"\baselinestretch"\indc{baselinestretch} used for the table. +\item You can change the distance between the rows in a multirow table + and the distance between the columns in a multicolumn table. +\end{itemize} +For all grading and point tables:\indc{gradetablestretch}\indc{cellwidth} +\indc{doublerulesep}% +\begin{center} + \begin{tabular}{l@{\qquad}p{3in}} + \verb"\cellwidth{length}"& sets the minimum width of the blank cells to + \verb"length"\\[\medskipamount] + \verb"\gradetablestretch{number}"& uses \verb"number" as the + \verb"\baselinestretch"\\[\medskipamount] + \verb"\setlength{\doublerulesep}{length}"& sets the distance + between the columns of a multicolumn table and the distance + between the rows of a multirow table to \verb"length". + \end{tabular} +\end{center} +For vertical non-bonus tables: +% (i.e., tables created by +% \verb"\gradetable[v]", \verb"\multicolumngradetable", +% \verb"\pointtable[v]", \verb"\multicolumnpointtable", +% \verb"\partialgradetable{rangename}[v]", +% \verb"\multicolumnpartialgradetable", +% \verb"\partialpointtable{rangename}[v]", or +% \verb"\multicolumnpartialpointtable"):% +\indc{vqword}\indc{vpgword}\indc{vpword}\indc{vsword}\indc{vtword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\vqword{text}"& substitutes \verb"text" for ``Question''\\ + \verb"\vpgword{text}"& substitutes \verb"text" for ``Page''\\ + \verb"\vpword{text}"& substitutes \verb"text" for ``Points''\\ + \verb"\vsword{text}"& substitutes \verb"text" for ``Score''\\ + \verb"\vtword{text}"& substitutes \verb"text" for ``Total:'' + \end{tabular} +\end{center} +For horizontal non-bonus tables: +% (i.e., tables created by +% \verb"\gradetable[h]", \verb"\pointtable[h]", +% \verb"\partialgradetable{rangename}[h]", or +% \verb"\partialpointtable{rangename}[h]"):% +\indc{hqword}\indc{hpgword}\indc{hpword}\indc{hsword}\indc{htword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\hqword{text}"& substitutes \verb"text" for ``Question:''\\ + \verb"\hpgword{text}"& substitutes \verb"text" for ``Page:''\\ + \verb"\hpword{text}"& substitutes \verb"text" for ``Points:''\\ + \verb"\hsword{text}"& substitutes \verb"text" for ``Score:''\\ + \verb"\htword{text}"& substitutes \verb"text" for ``Total'' + \end{tabular} +\end{center} +For vertical bonus tables: +% (i.e., tables created by +% \verb"\bonusgradetable[v]", \verb"\bonuspointtable[v]", +% \verb"\partialbonusgradetable{rangename}[v]", or +% \verb"\partialbonuspointtable{rangename}[v]"): +\indc{bvqword}\indc{bvpgword}\indc{bvpword}\indc{bvsword}% +\indc{bvtword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\bvqword{text}"& substitutes \verb"text" for ``Question''\\ + \verb"\bvpgword{text}"& substitutes \verb"text" for ``Page''\\ + \verb"\bvpword{text}"& substitutes \verb"text" for ``Bonus Points''\\ + \verb"\bvsword{text}"& substitutes \verb"text" for ``Score''\\ + \verb"\bvtword{text}"& substitutes \verb"text" for ``Total:'' + \end{tabular} +\end{center} +For horizontal bonus tables: +% (i.e., tables created by +% \verb"\bonusgradetable[h]", \\ +% \verb"\bonuspointtable[h]", +% \verb"\partialbonusgradetable{rangename}[h]", or\\ +% \verb"\partialbonuspointtable{rangename}[h]"): +\indc{bhqword}% +\indc{bhpgword}\indc{bhpword}\indc{bhsword}\indc{bhtword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\bhqword{text}"& substitutes \verb"text" for ``Question:''\\ + \verb"\bhpgword{text}"& substitutes \verb"text" for ``Page:''\\ + \verb"\bhpword{text}"& substitutes \verb"text" for ``Bonus Points:''\\ + \verb"\bhsword{text}"& substitutes \verb"text" for ``Score:''\\ + \verb"\bhtword{text}"& substitutes \verb"text" for ``Total'' + \end{tabular} +\end{center} +For vertical combined tables: +% (i.e., tables created by +% \verb"\combinedgradetable[v]",\\ +% \verb"\combinedpointtable[v]", +% \verb"\partialcombinedgradetable{rangename}[v]", or\\ +% \verb"\partialcombinedpointtable{rangename}[v]"): +\indc{cvqword}% +\indc{cvpgword}\indc{cvpword}\indc{cvbpword}\indc{cvsword}% +\indc{cvtword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\cvqword{text}"& substitutes \verb"text" for ``Question''\\ + \verb"\cvpgword{text}"& substitutes \verb"text" for ``Page''\\ + \verb"\cvpword{text}"& substitutes \verb"text" for ``Points''\\ + \verb"\cvbpword{text}"& substitutes \verb"text" for ``Bonus Points''\\ + \verb"\cvsword{text}"& substitutes \verb"text" for ``Score''\\ + \verb"\cvtword{text}"& substitutes \verb"text" for ``Total:'' + \end{tabular} +\end{center} +For horizontal combined tables: +% (i.e., tables created by +% \verb"\combinedgradetable[h]", \\ +% \verb"\combinedpointtable[h]", +% \verb"\partialcombinedgradetable{rangename}[h]", or\\ +% \verb"\partialcombinedpointtable{rangename}[h]"): +\indc{chqword}% +\indc{chpgword}\indc{chpword}\indc{chbpword}\indc{chsword}% +\indc{chtword} +\begin{center} + \begin{tabular}{l@{\qquad}l} + Command& \multicolumn{1}{c}{Effect}\\[\medskipamount] + \verb"\chqword{text}"& substitutes \verb"text" for ``Question:''\\ + \verb"\chpgword{text}"& substitutes \verb"text" for ``Page:''\\ + \verb"\chpword{text}"& substitutes \verb"text" for ``Points:''\\ + \verb"\chbpword{text}"& substitutes \verb"text" for ``Bonus Points:''\\ + \verb"\chsword{text}"& substitutes \verb"text" for ``Score:''\\ + \verb"\chtword{text}"& substitutes \verb"text" for ``Total'' + \end{tabular} +\end{center} +If you don't use any of these commands then you get the default +values, which are defined by the commands in the following +table:\indc{doublerulesep}\indc{gradetablestretch}\indc{cellwidth} +\begin{center} + \begin{tabular}{l@{\quad}l} + \multicolumn{2}{c}{\bfseries Defaults for grading and point + tables}\\*[\bigskipamount] + \verb"\hqword{Question:}"& \verb"\vqword{Question}"\\ + \verb"\hpgword{Page:}"& \verb"\vpgword{Page}"\\ + \verb"\hpword{Points:}"& \verb"\vpword{Points}"\\ + \verb"\hsword{Score:}"& \verb"\vsword{Score}"\\ + \verb"\htword{Total}"& \verb"\vtword{Total:}"\\[\medskipamount] +% + \verb"\bhqword{Question:}"& \verb"\bvqword{Question}"\\ + \verb"\bhpgword{Page:}"& \verb"\bvpgword{Page}"\\ + \verb"\bhpword{Bonus Points:}"& \verb"\bvpword{Bonus Points}"\\ + \verb"\bhsword{Score:}"& \verb"\bvsword{Score}"\\ + \verb"\bhtword{Total}"& \verb"\bvtword{Total:}"\\[\medskipamount] +% + \verb"\chqword{Question:}"& \verb"\cvqword{Question}"\\ + \verb"\chpgword{Page:}"& \verb"\cvpgword{Page}"\\ + \verb"\chpword{Points:}"& \verb"\cvpword{Points}"\\ + \verb"\chbpword{Bonus Points:}"& \verb"\cvbpword{Bonus Points}"\\ + \verb"\chsword{Score:}"& \verb"\cvsword{Score}"\\ + \verb"\chtword{Total}"& \verb"\cvtword{Total:}"\\[\medskipamount] + \verb"\cellwidth{2em}"\\ + \verb"\gradetablestretch{1.5}"\\ + \verb"\setlength{\doublerulesep}{2.0pt}" + \end{tabular} +\end{center} + +\bigskip +For example, if you type +\begin{verbatim} +\begin{center} + \hqword{Aufgabe Nr.:} + \hpword{Punktzahl:} + \htword{\textbf{Summe}} + \hsword{Davon erreicht:} + \cellwidth{2.2em} + \gradetable[h][questions] +\end{center} +\end{verbatim} +then you'll get +\begin{center} + \cwidth=2.2em + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|} + \hline + Aufgabe Nr.:& 1& 2& 3& 4& 5& 6& 7& 8& \textbf{Summe}\\ + \hline + Punktzahl:& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 15& + 120\\ + \hline + Davon erreicht:& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \hbox to \cwidth{\hfill}& + \\ + \hline + \end{tabular} +\end{center} + +\index{point table!customization|)} +\index{grade table!customization|)} +\index{customization!point table|)} +\index{customization!grading table|)} + + +\indcstop{pointtable} +\indcstop{gradetable} +\index{point table|)} +\index{grading table|)} + + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Changing the page margins} +\label{sec:pagesize} +\index{margins|(} +\index{customization!margins|(} + +The exam document class arranges things so that you get one inch +margins at the top, bottom, and sides no matter what size paper you +use, as long as you use the corresponding document class option +(\verb"a4paper", \verb"a5paper", \verb"b5paper", \verb"letterpaper", +\verb"legalpaper", \verb"executivepaper", or \verb"landscape"). You +can change the sizes of these margins by using the commands that +change the size of the printed area. + +To change the width of the printed area, you would use the +\verb"\extrawidth"\indc{extrawidth} command. The \verb"\extrawidth" +command takes one argument, and enlarges the width of the printed area +by the amount of the argument. It keeps the printed area centered as +it changes its width. If the argument is negative, then the width of +the printed area is decreased. + +For example, to enlarge the left and right margins by one half inch +each, you would use the command +\begin{center} + \verb"\extrawidth{-1in}" +\end{center} +since the printed region must shrink by one inch to allow an +additional one half inch on both sides. To decrease the left and +right margins to three quarters of an inch each, you would use the +command +\begin{center} + \verb"\extrawidth{.5in}" +\end{center} +since the printed region must grow by one half inch to decrease both +margins by one quarter of an inch. + +To change the height of the printed area, you must choose whether the +top or the bottom of the printed area (or possibly both) should move. +The commands for this are principally intended to allow additional +room for large headers and footers, and so they are called +\verb"\extraheadheight"\indc{extraheadheight} and +\verb"\extrafootheight"\indc{extrafootheight}. For a full description +of these commands, see section~\ref{sec:extra-room}. + +To move the top of the printed region (and any header that's present) +downwards, you use the command \verb"\extraheadheight". This command +takes one argument, and moves the top of the text and the header down +by this amount (keeping the distance between the header and the text +constant). Thus, to increase the top margin by three quarters of an +inch, you would give the command +\begin{center} + \verb"\extraheadheight{.75in}" +\end{center} +To decrease the top margin by one half inch, you would give the +command +\begin{center} + \verb"\extraheadheight{-.5in}" +\end{center} +The +% +\verb"\extraheadheight"\indcsub{extraheadheight}{optional argument}% +\index{head height!first page different} command takes an optional +argument to provide a top margin on the first page that's different +from that on all other pages. For an explanation of this, see +section~\ref{sec:extra-room}. + +To move the bottom of the printed region (and any footer that's +present) upwards, you use the command +\verb"\extrafootheight"\indc{extrafootheight}. This command takes one +argument, and moves the bottom of the text and the footer up by this +amount (keeping the distance between the footer and the text +constant). Thus, to increase the bottom margin by three quarters of +an inch, you would give the command +\begin{center} + \verb"\extrafootheight{.75in}" +\end{center} +To decrease the bottom margin by one half inch, you would give the +command +\begin{center} + \verb"\extrafootheight{-.5in}" +\end{center} +The +% +\verb"\extrafootheight"\indcsub{extrafootheight}{optional argument}% +\index{foot height!first page different} command takes an optional +argument to provide a bottom margin on the first page that's different +from that on all other pages. For an explanation of this, see +section~\ref{sec:extra-room}. + +\index{customization!margins|)} +\index{margins|)} + + +%-------------------------------------------------------------------- +%--------------------------------------------------------------------- +\section{Headers and footers} +\label{sec:headfoot} +\index{header|(} +\index{footer|(} + +The following sections explain all of the commands that deal with +headers and footers. There are a number of things to explain here, +and so you may find it easier to skip these sections and instead look +at the examples in sections~\ref{sec:beginexamples} +through~\ref{sec:endexamples} (on pages~\pageref{sec:beginexamples} +through~\pageref{sec:endexamples}). You can then refer back to these +sections for the full story on whatever isn't clear from the examples. +All of the commands described in these sections should be given in the +preamble, i.e., after the \verb"\documentclass" command and before the +\verb"\begin{document}" command. + +It's also important to remember that if you use a \verb"coverpages" +environment (described in section~\ref{sec:coverpages}), then the +commands described here affect only the pages in the main section of +the exam, and not the pages of the \verb"coverpages" environment. +There are commands for headers and footers in the cover pages that are +analogous to the commands described in this section; for that, see +section~\ref{sec:Coverhdft}. + +%--------------------------------------------------------------------- +\subsection{Page styles: Headers and/or footers} +\label{sec:pagestyle} +\indcstart{pagestyle} +\index{header!on or off} +\index{footer!on or off} + +It's the \verb"\pagestyle" command that determines whether the exam +will have headers, footers, both, or neither. The contents of the +header and footer are specified using the commands described in +sections~\ref{sec:header} through~\ref{sec:rules}, but it's the +\verb"\pagestyle" command that determines whether the header and +footer that you construct will actually be placed onto the page. The +\verb"\pagestyle" command should be given in the preamble, i.e., after +the \verb"\documentclass" command and before the +\verb"\begin{document}" command. + +To have both a header and a footer, give the +command\indt{headandfoot}\indc{pagestyle\{headandfoot\}} +\begin{center} + \verb"\pagestyle{headandfoot}" +\end{center} +If you want every page to have a header but no footer, give the +command\indt{head}\indc{pagestyle\{head\}} +\begin{center} + \verb"\pagestyle{head}" +\end{center} +To give every page a footer but no header, give the +command\indt{foot}\indc{pagestyle\{foot\}} +\begin{center} + \verb"\pagestyle{foot}" +\end{center} +Finally, to omit both the header and the footer from the page, give +the command\indt{empty}\indc{pagestyle\{empty\}} +\begin{center} + \verb"\pagestyle{empty}" +\end{center} + + +As is true for all \LaTeX{} document classes, you can change the page +style used on a single page by giving the command\indc{thispagestyle} +\begin{center} + \verb"\thispagestyle{somestyle}" +\end{center} +somewhere on that page (where \verb"somestyle" is the style that you +want to use on that page). This is most often needed if you use the +\verb"\maketitle"\indc{maketitle}\indcsub{maketitle}{overriding} +command, since that command inserts a \verb"\thispagestyle{plain}" +immediately following the title. If you use the \verb"\maketitle" +command and you want the entire document to use +\verb"\pagestyle{headandfoot}", then you'll need to put the command +\verb"\thispagestyle{headandfoot}"\indc{thispagestyle\{headandfoot\}} +immediately after the \verb"\maketitle" command to override the +\verb"\thispagestyle{plain}" that is inserted by \verb"\maketitle". + +The default page style is +\verb"headandfoot"\indcsub{pagestyle}{default}. That is, if you don't +give any \verb"\pagestyle" commands, then the header and footer will +appear on every page. The default header is empty, and the default +footer consists of ``Page $n$'' centered in the footer (where $n$ is +the page number). + +\indcstop{pagestyle} + +%--------------------------------------------------------------------- +\subsection{The three parts of the header} +\label{sec:header} +\index{header!three parts|(} + +The header is specified in three parts: +\begin{itemize} +\item One part to be left justified. +\item One part to be centered. +\item One part to be right justified. +\end{itemize} +There are two different ways in which you can specify the three parts +of the header. The first uses the single command \verb"\header" to +specify all three parts of the header, or the commands +\verb"\firstpageheader" and \verb"\runningheader" to specify a +different header for the first page (see +section~\ref{sec:runningheader}). The second uses the commands +\verb"\lhead", \verb"\chead", and \verb"\rhead", each of which can +have an optional argument to specify a different header for the first +page (see section~\ref{sec:lhead}). All of these commands should be +given in the preamble, i.e., after the \verb"\documentclass" command +and before the \verb"\begin{document}" command. + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs header}, \texttt{\bs firstpageheader} and + \texttt{\bs runningheader}} +\label{sec:runningheader} +\indcstart{header} +\indcstart{firstpageheader} +\indcstart{runningheader} + +The command \verb"\header{Text 1}{Text 2}{Text 3}" puts ``Text~1'' +into the left justified header, ``Text~2'' into the centered header, +and ``Text~3'' into the right justified header on every page. If you +want the header on the first page to be different from that on the +other pages, then you should use the commands \verb"\firstpageheader" +and +% +\verb"\runningheader"\index{header!different on first page}, which +also take three arguments and affect either the first page or all +pages except the first. + + +For example, to put the header +\samplehead{Math 115}{Second Exam}{July 4, 1776}{} +on every page of the exam, you would give the command +\begin{verbatim} +\header{Math 115}{Second Exam}{July 4, 1776} +\end{verbatim} + +If you want to use a header on the first page that's different from +the header used on all other pages, you would use the commands +\verb"\firstpageheader" and \verb"\runningheader" instead of +\verb"\header". For example, if you want the above header for the +first page, but on all pages after the first you want to have the +header \samplehead{Math 115}{Second Exam (Continued)}{July 4, 1776}{} +then you would give the commands +\begin{verbatim} +\firstpageheader{Math 115}{Second Exam}{July 4, 1776} +\runningheader{Math 115}{Second Exam (Continued)}{July 4, 1776} +\end{verbatim} + +You can leave one or more of the three parts empty. To have the +header +\samplehead{Math 115}{Second Exam}{July 4, 1776}{} +on the first page, with the header +\samplehead{Math 115}{}{Second Exam (Continued)}{} +on all other pages, you would give the commands +\begin{verbatim} +\firstpageheader{Math 115}{Second Exam}{July 4, 1776} +\runningheader{Math 115}{}{Second Exam (Continued)} +\end{verbatim} + +Any of the three parts of the header can have multiple lines. To +specify where the line breaks should go, you just type \verb"\\". +Thus, to have the header +\samplehead{\bfseries\large Math 115\\Professor Hilbert}{} + {\bfseries\large First Exam\\July 4, 1776}{} +appear on every page, you would give the command +\begin{verbatim} +\header{\bfseries\large Math 115\\Professor Hilbert} + {} + {\bfseries\large First Exam\\July 4, 1776} +\end{verbatim} + +\indcstop{header} +\indcstop{firstpageheader} +\indcstop{runningheader} + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs lhead}, \texttt{\bs chead} and + \texttt{\bs rhead}} +\label{sec:lhead} +\indcstart{lhead} +\indcstart{chead} +\indcstart{rhead} + + +The command \verb"\lhead{Text}" puts ``Text'' into the left justified +part of the header on every page. The command +\index{header!different on first page}% +\indcsub{lhead}{optional argument}% +\indcsub{chead}{optional argument}% +\indcsub{rhead}{optional argument}% +\indcsub{lhead}{different on first page}% +\indcsub{chead}{different on first page}% +\indcsub{rhead}{different on first page}% +\verb"\lhead[Text 1]{Text 2}" puts ``Text~1'' into the left justified +header on the first page and ``Text~2'' into the left justified header +on all other pages. The commands \verb"\chead" and \verb"\rhead" have +similar effects on the centered and right justified parts of the +header. + + +For example, to put the header +\samplehead{Math 115}{Second Exam}{July 4, 1776}{} +on every page of the exam, you would give the commands +\begin{verbatim} +\lhead{Math 115} +\chead{Second Exam} +\rhead{July 4, 1776} +\end{verbatim} + +If you want any of the three parts to have a special version to be +used only on the first page, then you just include that special +version as an optional argument (enclosed in square brackets) to the +command. For example, if you want the above header for the first +page, but on all pages after the first you want to have the header +\samplehead{Math 115}{Second Exam (Continued)}{July 4, 1776}{} +then you would give the commands +\begin{verbatim} +\lhead{Math 115} +\chead[Second Exam]{Second Exam (Continued)} +\rhead{July 4, 1776} +\end{verbatim} + +You can leave one or more of the three parts empty. To have the +header +\samplehead{Math 115}{Second Exam}{July 4, 1776}{} +on the first page, with the header +\samplehead{Math 115}{}{Second Exam (Continued)}{} +on all other pages, you would give the commands +\begin{verbatim} +\lhead{Math 115} +\chead[Second Exam]{} +\rhead[July 4, 1776]{Second Exam Continued)} +\end{verbatim} + +Any of the three parts of the header can have multiple lines. To +specify where the line breaks should go, you just type \verb"\\". +Thus, to have the +% +header\index{header!multiple lines} +\samplehead{\bfseries\large Math 115\\Professor Hilbert}{} + {\bfseries\large First Exam\\July 4, 1776}{} +appear on every page, you would give the commands +\begin{verbatim} +\lhead{\bfseries\large Math 115\\Professor Hilbert} +\chead{} +\rhead{\bfseries\large First Exam\\July 4, 1776} +\end{verbatim} + +\indcstop{lhead} +\indcstop{chead} +\indcstop{rhead} + +\index{header!three parts|)} + + +%--------------------------------------------------------------------- +\subsubsection*{Leaving extra room for multiple line headers} + +See section~\ref{sec:extra-room} for a description of the +% +\verb"\extraheadheight"\index{header!multiple lines} command. + +%--------------------------------------------------------------------- +\subsection{The three parts of the footer} +\label{sec:footer} +\index{footer!three parts|(} + +The footer is composed of three parts, the whole setup being similar +to that for the header (see section~\ref{sec:header}). There are two +different ways in which you can specify the three parts of the footer. +The first uses the single command \verb"\footer" to specify all three +parts of the footer, or the commands \verb"\firstpagefooter" and +\verb"\runningfooter" to specify a different footer for the first page +(see section~\ref{sec:runningfooter}). The second uses the commands +\verb"\lfoot", \verb"\cfoot", and \verb"\rfoot", each of which can +have an optional argument to specify a different footer for the first +page (see section~\ref{sec:lfoot}). All of these commands should be +given in the preamble, i.e., after the \verb"\documentclass" command +and before the \verb"\begin{document}" command. + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs footer}, \texttt{\bs firstpagefooter} + and \texttt{\bs runningfooter}} +\label{sec:runningfooter} +\indcstart{footer} +\indcstart{firstpagefooter} +\indcstart{runningfooter} + +The command \verb"\footer{Text 1}{Text 2}{Text 3}" puts ``Text~1'' +into the left justified footer, ``Text~2'' into the centered footer +and ``Text~3'' into the right justified footer on every page. If you +want the footer on the first page to be different from that on the +other pages, then you should use the commands \verb"\firstpagefooter" +and \verb"\runningfooter", which also take three arguments and affect +either the first page or all pages except the first. + +For example, to have an empty footer on the first page and the footer +\samplefoot{}{}{Page 3 of 5}{} +on all pages after the first, you would give the commands +\begin{verbatim} +\firstpagefooter{}{}{} +\runningfooter{}{Page \thepage\ of \numpages}{} +\end{verbatim} +(For an explanation of the \verb"\numpages" command, see +section~\ref{sec:numpages}.) + +\indcstop{footer} +\indcstop{firstpagefooter} +\indcstop{runningfooter} + +%-------------------------------------------------------------------- +\subsubsection{Using \texttt{\bs lfoot}, \texttt{\bs cfoot}, and + \texttt{\bs rfoot}} +\label{sec:lfoot} +\indcstart{lfoot} +\indcstart{cfoot} +\indcstart{rfoot} + + +The command \verb"\lfoot{Text}" puts ``Text'' into the left justified +part of the footer on every page. The command +\verb"\lfoot[Text 1]{Text 2}" puts ``Text~1'' into the left justified +footer on the first page and ``Text~2'' into the left justified footer +on all other pages. The commands \verb"\cfoot" and \verb"\rfoot" have +similar effects on the centered and right justified parts of the +footer. + +For example, to have an empty footer on the first page and the footer +\samplefoot{}{}{Page 3 of 5}{} +on all pages after the first, you would give the commands +\begin{verbatim} +\lfoot{} +\cfoot{} +\rfoot[]{Page \thepage\ of \numpages} +\end{verbatim} +(For an explanation of the \verb"\numpages" command, see +section~\ref{sec:numpages}.) + +\indcstop{lfoot} +\indcstop{cfoot} +\indcstop{rfoot} + +\index{footer!three parts|)} + +%--------------------------------------------------------------------- +\subsubsection*{Leaving extra room for multiple line footers} + +See section~\ref{sec:extra-room} for a description of the +\verb"\extrafootheight" command. + +%--------------------------------------------------------------------- +\subsection{Leaving extra room for multiple line headers and footers} +\label{sec:extra-room} + +\subsubsection*{Headers} +\index{header!with multiple lines|(} + +If you specify more than one or two lines for any part of the header, +then you may want to move the header down slightly so that it doesn't +run off of the top of the paper. The command for this is +\verb"\extraheadheight"\indc{extraheadheight}. You can also use the +\verb"\extraheadheight" command to adjust the size of the text area. +The \verb"\extraheadheight" command never changes the distance between +the header and the text. + +For example, to move the header and the text an additional half inch +down from the top of the page, you would give the command +\begin{center} + \verb"\extraheadheight{.5in}" +\end{center} +You can also specify a negative distance to \verb"\extraheadheight" to +move the header up closer to the top of the paper. For example, the +command +\begin{center} + \verb"\extraheadheight{-.25in}" +\end{center} +moves the header one quarter inch closer to the top of the paper. + +If you want to have a different value for \verb"\extraheadheight" on +the first page from that on the pages after the first, then use the +same syntax as in the \verb"\lhead", \verb"\chead", and \verb"\rhead" +commands (see section~\ref{sec:lhead}): Include an optional argument +giving the extra head height for the first page, and the required +argument will apply only to those pages after the first. For example, +the +% +command\indcsub{extraheadheight}{different on first page} +\begin{center} + \verb"\extraheadheight[.5in]{.25in}" +\end{center} +gives a half inch of extra head height on the first page and a +quarter inch of extra head height on all pages after the first. + +If you give an \verb"\extraheadheight"\indc{extraheadheight} command, +it should be in the preamble, i.e., after the \verb"\documentclass" +command and before the \verb"\begin{document}" command. The + \verb"\extraheadheight" command can also be used to change the size + of the text region (see section~\ref{sec:pagesize}). + +\index{header!with multiple lines|)} + +%-------------------------------------------------------------------- +\subsubsection*{Footers} +\index{footer!with multiple lines|(} + + +To leave extra room for multiple line footers, you use the command +\verb"\extrafootheight". To move the footer one half inch higher up +on the paper, you would give the command\indc{extrafootheight} +\begin{center} + \verb"\extrafootheight{.5in}" +\end{center} +If you wanted to move the footer an eighth of an inch lower down on +the paper, you would give the command +\begin{center} + \verb"\extrafootheight{-.125in}" +\end{center} + +If you want to have a different value for \verb"\extrafootheight" on +the first page from that on the pages after the first, then use the +same syntax as in the \verb"\lfoot", \verb"\cfoot", and \verb"\rfoot" +commands (see section~\ref{sec:lfoot}): Include an optional argument +giving the extra foot height for the first page, and the required +argument will apply only to those pages after the first. For example, +the +% +command\indcsub{extrafootheight}{different on first page} +\begin{center} + \verb"\extrafootheight[.5in]{.25in}" +\end{center} +gives a half inch of extra foot height on the first page and a +quarter inch of extra foot height on all pages after the first. + +If you give an \verb"\extrafootheight"\indc{extrafootheight} command, +it should be in the preamble, i.e., after the \verb"\documentclass" +command and before the \verb"\begin{document}" command. The + \verb"\extrafootheight" command can also be used to change the size + of the text region (see section~\ref{sec:pagesize}). + +\index{footer!with multiple lines|)} + + +%--------------------------------------------------------------------- +\subsection{Horizontal rules} +\label{sec:rules} +\index{rule!in header or footer|(} +\index{header!rule|(} +\index{footer!rule|(} + +The \verb"exam" document class make it easy to put a horizontal rule +under the header and one above the footer. It is also easy to do +this for the pages after the first page without affecting the first +page. + +\begin{itemize} +\item The command \verb"\runningheadrule"\indc{runningheadrule} puts a + horizontal rule below the header on all pages after the first. +\item The command \verb"\firstpageheadrule"\indc{firstpageheadrule} + puts a rule under the header of only the first page. +\item The command \verb"\headrule"\indc{headrule} is equivalent to the + two commands \verb"\firstpageheadrule" and \verb"\runningheadrule". +\item The command \verb"\runningfootrule"\indc{runningfootrule} puts a + horizontal rule above the footer on all pages after the first. +\item The command \verb"\firstpagefootrule"\indc{firstpagefootrule} + puts a rule above the footer of only the first page. +\item The command \verb"\footrule"\indc{footrule} is equivalent to the + two commands \verb"\firstpagefootrule" and \verb"\runningfootrule". +\end{itemize} +For example, to have the header +\samplehead{Math 115}{First Exam}{July 4, 1776}{} +on the first page, with the header +\samplehead{Math 115}{First Exam}{July 4, 1776}{\hrule} +on all pages after the first, give either the commands +\begin{verbatim} +\runningheadrule +\header{Math 115}{First Exam}{July 4, 1776} +\end{verbatim} +or the commands +\begin{verbatim} +\runningheadrule +\lhead{Math 115} +\chead{First Exam} +\rhead{July 4, 1776} +\end{verbatim} +For a description of the command \verb"\header" see +section~\ref{sec:runningheader}; for a description of the commands +\verb"\lhead", \verb"\chead", and \verb"\rhead", see +section~\ref{sec:lhead}. + +\bigskip + +To have no footer on the first page, and the footer +\samplefoot{\hrule}{}{Page 3 of 5}{} +on all pages after the first, give the commands +\begin{verbatim} +\runningfootrule +\lfoot{} +\cfoot[]{Page \thepage\ of \numpages} +\rfoot{} +\end{verbatim} +(For an explanation of the \verb"\numpages" command, see +section~\ref{sec:numpages}.) + +\index{rule!in header or footer|)} +\index{header!rule|)} +\index{footer!rule|)} + + +%--------------------------------------------------------------------- +\subsection{Listing the number of pages in the exam} +\label{sec:numpages} + +The \verb"exam" document class defines the command +\verb"\numpages"\indc{numpages} so that it will expand to the number +of pages in the exam. Thus, to have the footer +% +\samplefoot{}{}{Page \thepage\ of \numpages}{} +% +you should either give the command +\begin{verbatim} +\footer{}{Page \thepage\ of \numpages}{} +\end{verbatim} +or the commands +\begin{verbatim} +\lfoot{} +\cfoot{Page \thepage\ of \numpages} +\rfoot{} +\end{verbatim} +For a description of the command \verb"\footer" see +section~\ref{sec:runningfooter}; for a description of the commands +\verb"\lfoot", \verb"\cfoot", and \verb"\rfoot", see +section~\ref{sec:lfoot}. + +Note that if your document has a \texttt{coverpages} environment (see +section~\ref{sec:coverpages}), then those pages will not be counted in +% +\verb"\numpages"\indcsub{numpages}{doesn't count cover pages}; the +\texttt{exam} document class defines the command +\verb"\numcoverpages"\indc{numcoverpages} so that it will expand to +the number of cover pages in the exam. If there is no +\texttt{coverpages}\indt{coverpages}\index{environment!coverpages} +environment, then \verb"\numcoverpages" expands to 0. The +\texttt{exam} class also defines the command +\verb"\totalnumpages"\indc{totalnumpages}, which expands to the sum of +\verb"\numpages" and \verb"\numcoverpages". Note that if there are +pages preceding a \texttt{coverpages} environment, then those pages +will not be counted by \verb"\totalnumpages". + +As with all other cross referencing commands in \LaTeX, you'll have to +run the file through \LaTeX{} \emph{twice} to be sure that +\verb"\numpages", \verb"\numcoverpages", and \verb"\totalnumpages" are +correct. + + + +%--------------------------------------------------------------------- +\subsection{Treating the last page differently} +\label{sec:lastpage} +\index{last page|(} + +If you want to vary the text that appears in the header or footer on +the last page of the exam, you should use the command +\verb"\iflastpage"\indc{iflastpage}. The command +\begin{center} + \verb"\iflastpage{Text 1}{Text 2}" +\end{center} +expands to `Text~1' on the last page and to `Text~2' on all pages +before the last. Thus, to have the footer +% +\samplefoot{}{}{Please go on to the next page\ldots}{} +% +on all pages before the last page and the footer +% +\samplefoot{}{}{End of exam}{} +% +on the last page, you should give the command +\begin{verbatim} +\footer{} + {\iflastpage{End of exam}{Please go on to the next page\ldots}} + {} +\end{verbatim} +or the commands +\begin{verbatim} +\lfoot{} +\cfoot{\iflastpage{End of exam}{Please go on to the next page\ldots}} +\rfoot{} +\end{verbatim} +For a description of the command \verb"\footer" see +section~\ref{sec:runningfooter}; for a description of the commands +\verb"\lfoot", \verb"\cfoot", and \verb"\rfoot", see +section~\ref{sec:lfoot}. + +As with all other cross referencing commands in \LaTeX, you'll have to +run the file through \LaTeX{} \emph{twice} to be sure that +\verb"\iflastpage"\indc{iflastpage} correctly detects the last page. + +\index{last page|)} + +%-------------------------------------------------------------------- +\subsection{Treating odd and even numbered pages differently} +\index{odd pages!different from even pages|(} +\index{even pages!different from odd pages|(} + +If you'd like odd and even numbered pages to be treated differently +(perhaps because you'll be printing onto both sides of the paper), you +should use the \verb"\oddeven"\indc{oddeven} command. The command +\begin{center} + \verb"\oddeven{Text 1}{Text 2}" +\end{center} +expands to `Text~1' on odd numbered pages and to `Text~2' on even +numbered pages. + +For example, to have the page number printed in the right head on odd +numbered pages and in the left head on even numbered pages, you should +give the command\indc{oddeven} +\begin{verbatim} +\header{\oddeven{}{\thepage}}% + {}% + {\oddeven{\thepage}{}} +\end{verbatim} +or the commands +\begin{center} +\begin{verbatim} +\lhead{\oddeven{}{\thepage}} +\rhead{\oddeven{\thepage}{}} +\chead{} +\end{verbatim} +\end{center} +If you want the footer of the even numbered pages to be empty and the +footer of the odd numbered pages to contain the centered message +``Please continue\dots'', except that the last page of the exam should +have an empty footer whether its page number is even or odd, then you +should give the command\indc{iflastpage} +\begin{verbatim} +\footer{} + {\oddeven{\iflastpage{}{Please continue\ldots}}{}} + {} +\end{verbatim} +or the commands +\begin{center} +\begin{verbatim} +\lfoot{} +\rfoot{} +\cfoot{\oddeven{\iflastpage{}{Please continue\dots}}{}} +\end{verbatim} +\end{center} +(see section~\ref{sec:lastpage} for an explanation of +\verb"\iflastpage"). + +The \verb"\oddeven"\indcsub{oddeven}{only in headers and footers} +command can be used reliably only in headers and footers. This is +because \LaTeX{} generally processes more text than can fit on the +current page before chooses a page break it outputs a page. When the +\verb"\oddeven" command is encountered it will act as though it will +appear on the current page whether it will actually be printed on that +page or on the following page; in headers and footers this never +creates a problem. + +\index{odd pages!different from even pages|)} +\index{even pages!different from odd pages|)} + +%-------------------------------------------------------------------- +\subsection{Questions that span multiple pages} +\label{sec:QuesSpan} +\index{questions!that span multiple pages|(} + +The exam document class provides the commands +\begin{itemize} +\item \verb"\ifcontinuation"\indc{ifcontinuation} and + \verb"\ContinuedQuestion"\indc{ContinuedQuestion} to enable headers + and footers that announce whether the current page is continuing a + question begun on an earlier page and, if so, the number of that + question (see section~\ref{sec:ifcontin}), and +\item \verb"\ifincomplete"\indc{ifincomplete} and + \verb"\IncompleteQuestion"\indc{IncompleteQuestion} to enable + headers and footers that announce whether the question at the bottom + of the current page continues onto the next page and, if so, the + number of that question (see section~\ref{sec:ifincomp}). +\end{itemize} +\emph{These commands are only guaranteed to work reliably in headers + and footers.}% +\indcsub{ifcontinuation}{reliable only in headers and footers}% +\indcsub{ContinuedQuestion}{reliable only in headers and footers}% +\indcsub{ifincomplete}{reliable only in headers and footers}% +\indcsub{IncompleteQuestion}{reliable only in headers and footers} If +you use any of them elsewhere, they may be fooled by \LaTeX's practice +of typesetting a bit too much material to fit on a page before it +chooses a page break and ships out the page. They also assume that +there is only one \verb"questions" environment in the entire exam. + +%-------------------------------------------------------------------- +\subsubsection{Questions continuing from the previous page} +\label{sec:ifcontin} + +Headers and footers can announce whether the current page continues a +question begun on an earlier page. The command\indc{ifcontinuation} +\begin{center} + \verb"\ifcontinuation{Text 1}{Text 2}" +\end{center} +expands to `Text 1' if the current page begins with a continuation of +a question begun on an earlier page, and to `Text 2' otherwise. If +the current page does continue a question begun on an earlier page, +then the command\indc{ContinuedQuestion} +\begin{center} + \verb"\ContinuedQuestion" +\end{center} +expands to the number of that question. + +For example, to have the header +\samplehead{}{First Exam}{Page 4}{} +% +on all pages that begin a new question and the header +\samplehead{Question 6 continues\ldots}{First Exam}{Page 4}{} +% +on all pages that continue a question begun on a previous page, you +would give the commands\indc{ContinuedQuestion}\indc{ifcontinuation} +\begin{verbatim} +\lhead{\ifcontinuation{Question \ContinuedQuestion\ continues\ldots}{}} +\chead{First Exam} +\rhead{Page \thepage} +\end{verbatim} +(See section~\ref{sec:lhead} for an explanation of \verb"\lhead", +\verb"\chead" and \verb"\rhead".) + + + + + +The \verb"\ifcontinuation" command figures out which text to use by +checking whether there is a \verb"\question" command appearing on the +page before any of the commands \verb"\part", \verb"\subpart", +\verb"\subsubpart", \verb"\choice", or \verb"\CorrectChoice", and this +works well for most pages. However, the \verb"\ifcontinuation" +command can make mistakes on pages on which none of those commands +appear. The default is to assume that a page with none of those +commands continues a question begun on an earlier page, but there are +two commands you can use to tell the \verb"\ifcontinuation" command +that it should \emph{not} assume that: +\begin{itemize} +\item the \verb"\nomorequestions"\indc{nomorequestions} command can be + used to mark the point at which the last question ends. This can be + useful if you want to include supplementary material (e.g., tables + or figures) at the end of the exam but you don't want that material + to be described as continuing the last question. The + \verb"\nomorequestions" command also tells the \verb"\ifincomplete" + command (see section~\ref{sec:ifincomp}) that all questions are now + complete. +\item The \verb"\noquestionsonthispage" command tells the + \verb"\ifcontinuation" command (and the \verb"\ifincomplete" + command; see section~\ref{sec:ifincomp}) that this page does not + continue a question begun on an earlier page. This is similar to + the job done by the \verb"\nomorequestions" command for the pages + that follow the end of all of the questions. Note that if you're + tempted to use this command on a page that follows the end of all of + the questions, then you should probably use the command + \verb"\nomorequestions" instead. +\end{itemize} + +Thus, in more detail, the command +\verb"\ifcontinuation{Text 1}{Text 2}" +\begin{itemize} +\item expands to `Text 2' if + \begin{itemize} + \item a \verb"\question" appears on this page before any + \verb"\part", \verb"\subpart", \verb"\subsubpart", \verb"\choice", + or \verb"\CorrectChoice", or + \item the command \verb"\noquestionsonthispage" has been given on + this page, or + \item the current page is before the page containing question number + 1, or + \item the current page is later than a page with the + \verb"\nomorequestions" command, + \end{itemize} +\item and otherwise it expands to `Text 1'. +\end{itemize} + + +%-------------------------------------------------------------------- +\subsubsection{Questions that continue onto a later page} +\label{sec:ifincomp} +\indcstart{ifincomplete} + +Headers and footers can announce whether a question on the current +page continues onto a later page. The command\indc{ifincomplete} +\begin{center} + \verb"\ifincomplete{Text 1}{Text 2}" +\end{center} +expands to `Text 1' if the last question begun on or before the +current page continues onto a page after this one, and to `Text~2' +otherwise. If the last question begun on or before the current page +does continue onto a later page, then the +command\indc{IncompleteQuestion} +\begin{center} + \verb"\IncompleteQuestion" +\end{center} +expands to the number of that question. + +For example, to have the footer +\samplefoot{\hrule}{}{Question 3 continues\ldots}{} +% +on all pages that end with a question that will be continued onto the +next page, the footer +\samplefoot{\hrule}{}{End of Exam}{} +% +on the last page, and the footer +\samplefoot{\hrule}{}{Exam continues\ldots}{} +% +on all other pages, you would give the +commands\indc{ifincomplete}\indc{IncompleteQuestion}\indc{iflastpage} +\begin{verbatim} +\footrule +\lfoot{} +\newcommand{\continues}{\ifincomplete + {Question \IncompleteQuestion\ continues\ldots} + {Exam continues\ldots}} +\cfoot{\iflastpage{End of Exam}{\continues}} +\rfoot{} +\end{verbatim} +(See section~\ref{sec:lfoot} for an explanation of \verb"\lfoot", +\verb"\cfoot" and \verb"\rfoot", and section~\ref{sec:lastpage} for an +explanation of \verb"\iflastpage"). + +There are two situations in which you may have to give an additional +command for the \verb"\ifincomplete" command to correctly decide if +the current question is incomplete: +\begin{enumerate} +\item The \verb"\ifincomplete" command expands to `Text~2' if there is + a \verb"\part", \verb"\subpart", \verb"\subsubpart", \verb"\choice", + or \verb"\CorrectChoice" command belonging to this question on the + following page. For those situations in which the current question + flows onto the next page, but there is no \verb"\part", + \verb"\subpart", \verb"\subsubpart", \verb"\choice", or + \verb"\CorrectChoice" belonging to this question on that page, you + should give the command\indc{addquestionobject} + \begin{center} + \verb"\addquestionobject" + \end{center} + at the end of the text of the question to inform the + \verb"\ifincomplete" command that some portion of the question + appears on that following page. + +\item If there are pages on which none of those commands appear, the + default is to assume that that page continues a question begun on an + earlier page. There are two commands that you can use to tell the + \verb"\ifincomplete" command that it should \emph{not} assume that: + \begin{itemize} + \item the \verb"\nomorequestions"\indc{nomorequestions} command can + be used to mark the point at which the last question ends. This + can be useful if you want to include supplementary material (e.g., + tables or figures) at the end of the exam but you don't want the + last question on the exam to be described as incomplete. The + \verb"\nomorequestions" command also tells the + \verb"\ifcontinuation" command (see section~\ref{sec:ifcontin}) + that all questions are now complete. + \item The \verb"\noquestionsonthispage"\indc{noquestionsonthispage} + command tells the \verb"\ifincomplete" command (and the + \verb"\ifcontinuation" command; see section~\ref{sec:ifcontin}) + that this page does not contain any incomplete questions, and does + not continue a question begun on an earlier page. This is similar + to the job done by the \verb"\nomorequestions" command for the + pages that follow the end of all of the questions. Note that if + you're tempted to use this command on a page that follows the end + of all of the questions, then you should probably use the command + \verb"\nomorequestions" instead. + \end{itemize} +\end{enumerate} +If you give the command +\verb"\noquestionsonthispage"\indc{noquestionsonthispage} on a page, +then +\begin{itemize} +\item an \verb"\ifcontinuation"\indc{ifcontinuation} command on that + page will expand to its second argument, +\item an \verb"\ifincomplete" on that page will expand to its second + argument, and +\item an \verb"\ifincomplete" command on an earlier page will not + assume that a question from that earlier page continues onto this + page. +\end{itemize} +The way that this command affects the \verb"\ifincomplete" command on +earlier pages is as follows: If there is a page with no +\verb"\question", \verb"\part", \verb"\subpart", \verb"\subsubparts", +\verb"\choice", \verb"\CorrectChoice", or +\verb"\addquestionobject"\indc{addquestionobject} commands, then the +last page before that with a \verb"\question" (or \verb"\part", etc.) +would normally be deemed to have an incomplete question; if, however, +the page with no \verb"\question" (or \verb"\part", etc.) (along with +all adjacent pages with no \verb"\question" or \verb"\part" etc.) has +a \verb"\noquestionsonthispage" command, then that last page with a +\verb"\question" (or \verb"\part", etc.) will not be deemed +incomplete. + + +\indcstop{ifincomplete} + +\index{questions!that span multiple pages|)} + +%-------------------------------------------------------------------- +\subsection{Examples} +\indcstart{lhead} +\indcstart{chead} +\indcstart{rhead} +\indcstart{lfoot} +\indcstart{cfoot} +\indcstart{rfoot} + +\begin{example} + \label{sec:beginexamples} + To have the header + \samplehead{Math 115}{First Exam}{July 4, 1776}{} + on the first page, the header + \samplehead{Math 115}{First Exam, Page 2 of 5}{July 4, 1776}{\hrule} + on all pages after the first, and no footer on any page, give the + commands\indc{firstpageheader}\indc{runningheader}% + \indc{runningheadrule} +\begin{verbatim} +\pagestyle{head} +\runningheadrule +\firstpageheader{Math 115}{First Exam}{July 4, 1776} +\runningheader{Math 115} + {First Exam, Page \thepage\ of \numpages} + {July 4, 1776} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{head} +\runningheadrule +\lhead{Math 115} +\chead[First Exam]{First Exam, Page \thepage\ of \numpages} +\rhead{July 4, 1776} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + To have the header + \samplehead{Math 115}{First Exam}{July 4, 1776}{} + on the first page, no header on the pages after the first, no footer + on the first page, and the footer + \samplefoot{\hrule}{Math 115}{First Exam}{Page 2 of 5} + on all pages after the first, give the + commands\indc{runningfootrule}\indc{firstpageheader}% + \indc{runningheader}\indc{firstpagefooter}\indc{runningfooter} +\begin{verbatim} +\pagestyle{headandfoot} +\runningfootrule +\firstpageheader{Math 115}{First Exam}{July 4, 1776} +\runningheader{}{}{} +\firstpagefooter{}{}{} +\runningfooter{Math 115}{First Exam}{Page \thepage\ of \numpages} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\runningfootrule +\lhead[Math 115]{} +\chead[First Exam]{} +\rhead[July 4, 1776]{} +\lfoot[]{Math 115} +\cfoot[]{First Exam} +\rfoot[]{Page \thepage\ of \numpages} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + To have the header + \samplehead{\large\bfseries Mathematics 115\\ + First Exam, July 4, 1776}% + {}{\large\bfseries Name:\enspace\makebox[2in]{\hrulefill}}{} + on the first page, the header + \samplehead{\large\bfseries Mathematics 115\\ + First Exam, July 4, 1776}% + {}{}{} + on all pages after the first, an empty footer on the first page, and + the footer + \samplefoot{}{}{Page 2}{} + on all pages after the first, give the + commands\indc{firstpageheader}\indc{runningheader}% + \indc{firstpagefooter}\indc{runningfooter} +\begin{verbatim} +\pagestyle{headandfoot} +\firstpageheader{\large\bfseries Mathematics 115\\ + First Exam, July 4, 1776} + {} + {\large\bfseries Name:\enspace\makebox[2in]{\hrulefill}} +\runningheader{\large\bfseries Mathematics 115\\ + First Exam, July 4, 1776}{}{} +\firstpagefooter{}{}{} +\runningfooter{}{Page \thepage}{} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\lhead{\large\bfseries Mathematics 115\\ First Exam, July 4, 1776} +\chead{} +\rhead[\large\bfseries Name:\enspace\makebox[2in]{\hrulefill}]{} +\lfoot{} +\cfoot[]{Page \thepage} +\rfoot{} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + To have the header + \samplehead{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115} + {} + {} + on the first page, the header + \samplehead{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115 (Continued)} + {} + {} + on all pages after the first, the footer + \samplefoot{}{}{Page 3 of 10}{Please go on to the next page\ldots} + on all pages \emph{except the last} page, and the footer + \samplefoot{}{}{Page 10 of 10}{End of exam.} + on the last page, give the + commands\indc{extraheadheight}\indc{firstpageheader}% + \indc{runningheader}\indc{footer}\indc{numpages}\indc{thepage}% + \indc{iflastpage} +\begin{verbatim} +\pagestyle{headandfoot} +\extraheadheight{.25in} +\firstpageheader{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115} + {} +\runningheader{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115 (Continued)} + {} +\footer{} + {Page \thepage\ of \numpages} + {\iflastpage{End of exam.}{Please go on to the next page\ldots}} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\extraheadheight{.25in} +\lhead{} +\chead[Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115] + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115 (Continued)} +\rhead{} +\lfoot{} +\cfoot{Page \thepage\ of \numpages} +\rfoot{\iflastpage{End of exam.}{Please go on to the next page\ldots}} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + To have the header + \samplehead{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115} + {} + {} + on the first page, the header + \samplehead{Mathematics 115 (Continued)}{}{Spring, 1993}{} + on all pages after the first, the footer + \samplefoot{}{}{Page 3 of 10}{Please go on to the next page\ldots} + on all pages \emph{except the last} page, and the footer + \samplefoot{}{}{Page 10 of 10}{End of exam.} + on the last page, give the commands\indc{extraheadheight}% + \indc{firstpageheader}\indc{runningheader}\indc{footer} +\begin{verbatim} +\pagestyle{headandfoot} +\extraheadheight[.25in]{} +\firstpageheader{} + {Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115} + {} +\runningheader{Mathematics 115 (Continued)}{}{Spring, 1993} +\footer{} + {Page \thepage\ of \numpages} + {\iflastpage{End of exam.}{Please go on to the next page\ldots}} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\extraheadheight[.25in]{} +\lhead[]{Mathematics 115 (Continued)} +\chead[Wellesley College\\ + Second Semester Final Examination, Spring 1993\\ + Mathematics 115] + {} +\rhead[]{Spring, 1993} +\lfoot{} +\cfoot{Page \thepage\ of \numpages} +\rfoot{\iflastpage{End of exam.}{Please go on to the next page\ldots}} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + To have the header +% + \samplehead{Math 115}{First Exam}{July 4, 1776}{} + on the first page, the header +% + \samplehead{Question 3 continues\ldots}{First Exam}{Page 3 of 10}{\hrule} +% + on all pages after the first that continue a question begun on an + earlier page, the header +% + \samplehead{}{First Exam}{Page 3 of 10}{\hrule} + on all pages after the first that don't continue a question begun on + an earlier page, the footer +% + \samplefoot{}{}{}{Question 6 continues on the next page\ldots} +% + on all pages whose last question continues onto the following page, + and no footer on pages that don't have a question that continues + onto the following page, give the + commands\indc{runningheadrule}\indc{ifcontinuation}% + \indc{ContinuedQuestion}\indc{firstpageheader}\indc{runningheader}% + \indc{footer}\indc{thepage}\indc{numpages}\indc{ifincomplete}% + \indc{IncompleteQuestion} +\begin{verbatim} +\pagestyle{headandfoot} +\runningheadrule +\newcommand{\continuedmessage}{% + \ifcontinuation{Question \ContinuedQuestion\ continues\ldots}{}% +} +\firstpageheader{Math 115}{First Exam}{July 4, 1776} +\runningheader{\continuedmessage} + {First Exam} + {Page \thepage\ of \numpages} +\footer{} + {} + {\ifincomplete{Question \IncompleteQuestion\ continues + on the next page\ldots}{}} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\runningheadrule +\newcommand{\continuedmessage}{% + \ifcontinuation{Question \ContinuedQuestion\ continues\ldots}{}% +} +\lhead[Math 115]{\continuedmessage} +\chead[First Exam]{First Exam} +\rhead[July 4, 1776]{Page \thepage\ of \numpages} +\lfoot{} +\cfoot{} +\rfoot{\ifincomplete{Question \IncompleteQuestion\ continues + on the next page\ldots}{}} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- +\begin{example} + \label{sec:PtsPgEx} + To have the header +% + \samplehead{Math 115}{Second Exam}{July 4, 1776}{} +% + on the first page, the header +% + \samplehead{Second Exam}{}{July 4, 1776}{} +% + on all pages after the first, no footer on the first page, and the + footer +% + \samplefoot{}{Page 3 of 5}{}{Points earned: \makebox[.5in]{\hrulefill}\\ + out of a possible 20 points} +% + on all pages after the first, give the commands\indc{firstpageheader}% + \indc{runningheader}\indc{runningfooter}\indc{pointsonpage}% + \indc{thepage}\indc{numpages} +\begin{verbatim} +\pagestyle{headandfoot} +\firstpageheader{Math 115}{Second Exam}{July 4, 1776} +\runningheader{Second Exam}{}{July 4, 1776} +\runningfooter{Page \thepage\ of \numpages} + {} + {Points earned: \makebox[.5in]{\hrulefill}\\ + out of a possible \pointsonpage{\thepage} points} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\lhead[Math 115]{Second Exam} +\chead[Second Exam]{} +\rhead{July 4, 1776} +\lfoot[]{Page \thepage\ of \numpages} +\cfoot{} +\rfoot[]{Points earned: \makebox[.5in]{\hrulefill}\\ + out of a possible \pointsonpage{\thepage} points} +\end{verbatim} +\end{example} + +%-------------------------------------------------------------------- + +\begin{example} + \label{sec:endexamples} + To have the header +% + \samplehead{Math 115}{Second Exam}{July 4, 1776}{} +% + on the first page, the header +% + \samplehead{}{Second Exam}{July 4, 1776}{} +% + on all odd numbered pages after the first, the header +% + \samplehead{Question 3 continues\ldots}{Math 115}{}{} +% + on all even numbered pages that continue a question begun on an + earlier page, the header +% + \samplehead{}{Math 115}{}{} +% + on all even numbered pages that don't continue a question begun on + an earlier page, the footer +% + \samplefoot{}{}{}{Page 5 of 10\\Question 6 continues\ldots} +% + on all odd numbered pages that have a question that continues onto + the following page, the footer +% + \samplefoot{}{}{}{Page 5 of 10} +% + on all odd numbered pages that don't have a question that continues + onto the following page, and the footer +% + \samplefoot{}{Page 4 of 10}{}{} +% + on all even numbered pages, give the commands\indc{ifcontinuation}% + \indc{thepage}\indc{numpages}\indc{IncompleteQuestion}% + \indc{firstpageheader}\indc{runningheader}\indc{oddeven}% + \indc{footer} +\begin{verbatim} +\pagestyle{headandfoot} +\newcommand{\continuedmessage}{% + \ifcontinuation{Question \ContinuedQuestion\ continues\ldots}{}% +} +\newcommand{\oddrightfoot}{% + \ifincomplete{Page \thepage\ of \numpages\\ + Question \IncompleteQuestion\ continues\ldots}% + {Page \thepage\ of \numpages} +} +\firstpageheader{Math 115}{Second Exam}{July 4, 1776} +\runningheader{\oddeven{}{\continuedmessage}} + {\oddeven{Second Exam}{Math 115}} + {\oddeven{July 4, 1776}{}} +\footer{\oddeven{}{Page \thepage\ of \numpages}} + {} + {\oddeven{\oddrightfoot}{}} +\end{verbatim} + Alternatively, you could give the commands +\begin{verbatim} +\pagestyle{headandfoot} +\newcommand{\continuedmessage}{% + \ifcontinuation{Question \ContinuedQuestion\ continues\ldots}{}% +} +\newcommand{\oddrightfoot}{% + \ifincomplete{Page \thepage\ of \numpages\\ + Question \IncompleteQuestion\ continues\ldots}% + {Page \thepage\ of \numpages} +} +\lhead[Math 115]{\oddeven{}{\continuedmessage}} +\chead{\oddeven{Second Exam}{Math 115}} +\rhead{\oddeven{July 4, 1776}{}} +\lfoot{\oddeven{}{Page \thepage\ of \numpages}} +\cfoot{} +\rfoot{\oddeven{\oddrightfoot}{}} +\end{verbatim} +\end{example} + + +\indcstop{lhead} +\indcstop{chead} +\indcstop{rhead} +\indcstop{lfoot} +\indcstop{cfoot} +\indcstop{rfoot} +\index{footer|)} +\index{header|)} + +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +\section{Cover pages} +\label{sec:coverpages} +\index{cover pages|(} +\index{environment!coverpages|(} +\indtstart{coverpages} + +There is a \verb"coverpages" environment that allows you to have one +or more pages before page~1 of the exam. By default, there are no +headers or footers printed on the cover pages, but if you put the page +number into the headers and/or footers (using the commands described +in section~\ref{sec:Coverhdft}), the page numbers of cover pages are +printed in roman numerals. + +The \verb"coverpages" environment must begin and end \emph{before} the +beginning of the \verb"questions" environment. You begin the +environment with the command +\begin{center} + \verb"\begin{coverpages}" +\end{center} +and you end it with the command +\begin{center} + \verb"\end{coverpages}" +\end{center} +In between those two commands you can put whatever you want, except +that you are not allowed to begin the \verb"questions" environment +until you've ended the \verb"coverpages" environment. The command +\verb"\begin{coverpages}" sets the page number to 1 and causes any +page numbers printed (using the commands described in +section~\ref{sec:Coverhdft}) to appear as roman numerals. The command +\verb"\end{coverpages}" causes the current page to end, sets the page +number of the following page to 1, and changes page numbering back to +arabic numerals. + +%-------------------------------------------------------------------- +\subsection{Headers and footers} +\label{sec:Coverhdft} +\index{header!on cover pages|(} +\index{footer!on cover pages|(} + +By default, the headers and footers on the cover pages are empty. If +you'd like to have headers and/or footers on the cover pages, there +are commands to create them that are completely analogous to the +commands described in section~\ref{sec:headfoot} for headers and +footers in the main part of the document. The commands for headers +and footers in cover pages and the corresponding commands for the main +exam pages are:\indc{coverheader}\indc{coverrunningheader}% +\indc{coverfirstpageheader}\indc{coverlhead}\indc{coverchead}% +\indc{coverrhead}\indc{coverfooter}\indc{coverrunningfooter}% +\indc{coverfirstpagefooter}\indc{coverlfoot}\indc{covercfoot}% +\indc{coverrfoot}\indc{coverextraheadheight}% +\indc{coverextrafootheight} +\begin{center} + \begin{tabular}{l@{\qquad\qquad}l} +Cover Pages Commands& Main Pages Commands\\[\medskipamount] +\verb"\coverheader"&\verb"\header"\\ +\verb"\coverrunningheader"&\verb"\runningheader"\\ +\verb"\coverfirstpageheader"&\verb"\firstpageheader"\\[\medskipamount] + +\verb"\coverlhead"&\verb"\lhead"\\ +\verb"\coverchead"&\verb"\chead"\\ +\verb"\coverrhead"&\verb"\rhead"\\[\medskipamount] + +\verb"\coverfooter"&\verb"\footer"\\ +\verb"\coverrunningfooter"&\verb"\runningheader"\\ +\verb"\coverfirstpagefooter"&\verb"\firstpageheader"\\[\medskipamount] + +\verb"\coverlfoot"&\verb"\lfoot"\\ +\verb"\covercfoot"&\verb"\cfoot"\\ +\verb"\coverrfoot"&\verb"\rfoot"\\[\medskipamount] + +\verb"\coverextraheadheight"&\verb"\extraheadheight"\\ +\verb"\coverextrafootheight"&\verb"\extrafootheight" + \end{tabular} +\end{center} +The commands \verb"\coverlhead", \verb"\coverchead", +\verb"\coverrhead", \verb"\coverlfoot", \verb"\covercfoot", +\verb"\coverrfoot", \verb"\coverextraheadheight", and +\verb"\coverextrafootheight" all all take the same optional arguments +(for special treatment of page number 1) as the corresponding commands +for the main pages. For an explanation of these commands, see +section~\ref{sec:headfoot}. + +\index{header!on cover pages|)} +\index{footer!on cover pages|)} + +%-------------------------------------------------------------------- +\subsection{Listing the number of cover pages} +\label{sec:NumCvrpgs} +\index{cover pages!counting|(} +\indcstart{numcoverpages} +\indcstart{totalnumpages} + +The \texttt{exam} document class defines the command +\verb"\numcoverpages" so that it will expand to the number of cover +pages in the exam. If there is no \texttt{coverpages} environment, +then \verb"\numcoverpages" expands to 0. The \texttt{exam} class also +defines the command \verb"\totalnumpages", which expands to the sum of +\verb"\numpages" and \verb"\numcoverpages". +\emph{Note:} if there are pages preceding a \texttt{coverpages} +environment, then those pages will not be counted by +\verb"\totalnumpages". + +For an example, to have the footer +% +\samplefoot{}{}{Page ii of iv}{} +on all cover pages you should either give the +command\indc{romannumeral} +\begin{verbatim} +\coverfooter{}{Page \thepage\ of \romannumeral\numcoverpages}{} +\end{verbatim} +or the commands +\begin{verbatim} +\coverlfoot{} +\covercfoot{Page \thepage\ of \romannumeral\numcoverpages} +\coverrfoot{} +\end{verbatim} +As with all other cross referencing commands in \LaTeX, you'll have to +run the file through \LaTeX{} \emph{twice} to be sure that +\verb"\numpages", \verb"\numcoverpages", and \verb"\totalnumpages" are +correct. + +\index{cover pages!counting|)} +\indcstop{numcoverpages} +\indcstop{totalnumpages} + +\indtstop{coverpages} +\index{environment!coverpages|)} +\index{cover pages|)} + +%-------------------------------------------------------------------- +\clearpage +\addcontentsline{toc}{section}{Index} +\printindex + +% The following is necessary to avoid warnings, since we have multiple +% questions environments in this documentation file: +\makeatletter +\@pointschangedfalse +\makeatother + + + + +\end{document} +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- +%-------------------------------------------------------------------- |